Struts2--Action详述
2016-05-17 20:35
417 查看
action 和 Action类
1.action :代表一个struts2的请求2.Action类 : 能够处理struts2请求的类
>属性的名字必须遵守与javabean属性名相同的命名规则,属性的类型可以是任意类型。从字符串到非字符串(基本数据类型)之间的数据转换可以自动发生
>必须有一个不带参的构造器
>至少有一个供struts在执行这个action时调用的方法
>同一个action类可以包含多个action方法
>struts2会为每一个HTTP请求创建一个新的action实例,即Action不是单例的,是线程安全的
在action中访问web资源
1.什么是web资源?
HttpServletRequest , HttpSession , ServletContext 等原生的Servlet API。2.为什么访问web资源
B/S的应用的Controller 中必然需要访问WEB资源:向域对象中读取属性,读写Cookie,获取realPath.......。3.如何访问
1. 和Servlet API 解耦的方式
只能访问有限的Servlet API对象,且只能访问其有限的方法(读取请求参数,读取域对象属性,使session失效.....)>使用ActionContext
>实现XxxAware接口
>使用ActionContext
为了避免与Servlet API 耦合在一起,方便Action做单元测试,Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,
构造了3个Map对象来替代这3个对象,在Action中可以直接使用HttpServletRequest,HttpSession,ServletContext对应的Map对象来保存和读取数据。
(原Servlet API中HttpServletRequest,HttpSession和ServletContext的核心方法即是使用了一个Map,在这Action直接使用该Map)
ActionContext是Action执行的上下文的对象,在ActionContext中保存了Action执行所需的所有对象,包括parameters,request,session,application等
获取HttpSession对应的Map对象:
--public Map getSession();
获取ServletContext对应的Map对象:
--public Map getApplication();
获取请求参数对应的Map对象:
--public Map getParameters()
获取HttpServletRequest对应的Map对象:
--public Object get(Objectkey):ActionContext类中没有提供类似getRequest()这样的方法来获取HttpServletRequest对应的Map对象。
要得到HttpServletRequest对应的Map对象,可以通过为get()方法传递“request”参数实现。
TestActionContextAction.java
public class TestActionContextAction { public String execute(){ //0.获取ActionContext对象 //ActionContext是Action的上下文对象,可以从中获取到前Action需要的一切信息 ActionContext actionContext = ActionContext.getContext(); //1.获取application对应的Map,并向其中添加一个属性 //通过调用ActionContext对象的getApplication()方法来获取application对象 //设置属性 Map<String,Object> applicationMap = actionContext.getApplication(); applicationMap.put("applicationKey", "applicationValue"); //获取属性 Object date = applicationMap.get("date"); System.out.println("application:date:"+date); //2.session Map<String,Object> sessionMap = actionContext.getSession(); sessionMap.put("sessionKey", "sessionValue"); Object date2 = sessionMap.get("date"); System.out.println("session:date:"+date2); System.out.println(sessionMap.getClass()); if(sessionMap instanceof SessionMap){ SessionMap sm = (SessionMap) sessionMap; sm.invalidate(); System.out.println("session 失效了"); } //3.request //ActionContext中并没有提供getRequest方法来获取request对应的Map //需要手工调用get()方法,传入字符串来获取 Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request"); requestMap.put("requestKey", "requestValue"); //4.获取请求参数对应的Map,并获取指定的参数值 //键:请求参数的名字,值:请求参数值对应的字符串数组 //注意:1.getParameters的返回值为在Map<String,Object>,而不是Map<String,String[]> // 2.parameters这个Map只能读,不能写入数据,如果写入,不出错也不起作用 Map<String,Object> parameters = actionContext.getParameters(); System.out.println("parameters:"+parameters.get("name")); //把值打印出来 System.out.println(((String[])parameters.get("name"))[0]); return "success"; } }注意:session对应的Map实际上是SessionMap类型的,强转后调用其invalidate()方法,可以使其session失效
>实现XxxAware接口
TestAwareAction.java
public class TestAwareAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware{ private Map<String , Object> application1; @Override public void setApplication(Map<String, Object> application) { // TODO 自动生成的方法存根 this.application1 = application; } @Override public void setSession(Map<String, Object> arg0) { // TODO 自动生成的方法存根 } @Override public void setRequest(Map<String, Object> arg0) { // TODO 自动生成的方法存根 } @Override public void setParameters(Map<String, String[]> arg0) { // TODO 自动生成的方法存根 } public String execute(){ //1.向application中加入一个属性:applicationKey2 - applicationValue2 application1.put("applicationKey2", "applicationValue2"); //2.从application中读取一个属性date,并打印。 System.out.println("applicationValue2:"+application1.get("applicationKey2")); return "success"; } }好处:使用ActionContext每个方法需要获取多次getApplication,使用aware只用注入一次就可以了。
选用建议:若一个Action类中有多个action方法,且多个方法都需要使用域对象的Map或parameters,则建议使用aware接口方式
2.和Servlet API 耦合的方式
可以访问更多Servlet API对象,且可以调用其原生的方法。直接访问Servlet API 将使Action与Servlet环境耦合在一起,测试时需要有Servlet容器,不便于对Action的单元测试
>使用ServletActionContext
>实现ServletXxxAware接口
>使用ServletActionContext
ServletActionContext:可以从中获取到当前Action,对象需要的一切Servlet API相关的对象。
1.直接获取HttpServletRequest对象;
--ServletActionContext.getRequest();
2.直接获取HttpSession对象
--ServletActionContext.getRequest().getSession();
3.直接获取ServletContext对象
--ServletActionContext.getServletContext();
TestServletActionContextAction.java
public String execute(){ HttpServletRequest request = ServletActionContext.getRequest(); // HttpSession session = request.getSession(); HttpSession session = ServletActionContext.getRequest().getSession(); ServletContext servletContext = ServletActionContext.getServletContext(); System.out.println("execute...."); return "success"; } }
>实现ServletXxxAware接口
通过实现ServletXxxAware 接口的方式可以由struts2注入需要的Servlet相关的对象
ServletRequestAware:注入HttpServletRequest对象
ServletContextAware :注入ServletContext对象
ServletResponseAware:注入HttpServletResponse对象(不常用)
TestServletAwareAction.java
public class TestServletAwareAction implements ServletRequestAware,ServletContextAware{ @Override public void setServletRequest(HttpServletRequest request) { // TODO 自动生成的方法存根 System.out.println(request); } private ServletContext context; @Override public void setServletContext(ServletContext context) { // TODO 自动生成的方法存根 System.out.println(context); this.context = context; } public String execute(){ System.out.println("ServletContext: "+context); return "success"; } }
给出余下完整代码
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="TestActionContext" class="com.wul.struts2_4.action.TestActionContextAction"> <result>/test-actionContext.jsp</result> </action> <action name="TestAware" class="com.wul.struts2_4.action.TestAwareAction"> <result>/test-aware.jsp</result> </action> <action name="TestServletActionContext" class="com.wul.struts2_4.action.TestServletActionContextAction"> <result>/success.jsp</result> </action> <action name="TestServletAware" class="com.wul.struts2_4.action.TestServletAwareAction"> <result>/success.jsp</result> </action> </package> </struts>
index.jsp
<%@ page import="java.util.Date" %> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> </head> <body> <a href="TestActionContext.action?name=wul">Test ActionContext</a> <br><br> <a href="TestAware.action?name=wul">Test Aware</a> <br><br> <a href="TestServletActionContext">TestServletActionContext</a> <br><br> <a href="TestServletAware">TestServletAware</a> <% if(application.getAttribute("date")==null) application.setAttribute("date",new Date()); if(session.getAttribute("date")==null) session.setAttribute("date","123"); %> </body> </html>
test-actionContext.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> </head> <body> <h4>Test ActionContext Pages</h4> application : ${applicationScope.applicationKey } session : ${sessionScope.sessionKey } request : ${requestScope.requestKey } </body> </html>
test-aware.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> </head> <body> <h4>Test ActionContext Pages</h4> application : ${applicationScope.applicationKey } session : ${sessionScope.sessionKey } request : ${requestScope.requestKey } </body> </html>
test-aware.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Insert title here</title> </head> <body> <h4>Test aware Pages</h4> application : ${applicationScope.applicationKey2 } </body> </html>
相关文章推荐
- JQuery+Strusts1.x无刷新登录
- 使用jQuery.wechat构建微信WEB应用
- 关于JSP配置文件web.xml加载顺序详解
- java struts常见错误以及原因分析
- Struts之logic标签库详解
- jsp web.xml文件的作用及基本配置
- 通过实例深入学习Java的Struts框架中的OGNL表达式使用
- Java的Struts框架中append标签与generator标签的使用
- 如何利用AngularJS打造一款简单Web应用
- struts2的select标签用法实例分析
- SSH框架网上商城项目第20战之在线支付平台
- 在Java的Struts框架下进行web编程的入门教程
- 详解Java的Struts框架中注释的用法
- java中struts 框架的实现
- 利用Java的Struts框架实现电子邮件发送功能
- 在Java的Struts框架中ONGL表达式的基础使用入门
- 详解Java的Struts框架中栈值和OGNL的使用
- Java的Struts框架简介与环境配置教程
- Java的Struts框架中的if/else标签使用详解
- 简单说明Java的Struts框架中merge标签的使用方法