Struts2动态方法调用 动态方法调用
在Struts2中动态方法调用有三种方式,动态方法调用就是为了解决一个Action对应多个请求的处理,以免Action太多 第一种方式:指定method属性 这种方式我们前面已经用到过,类似下面的配置就可以实现 <action name="chainAction" class="chapter2.action.Chapter2Action" method="chainAction"> <result name="chainAction" type="chain">redirect</result> </action> <action name="plainText" class="chapter2.action.Chapter2Action" method="plainText"> <result name="plainText" type="plainText">/WEB-INF/JspPage/chapter2/plaintext.jsp</result> </action> 第二种方式:感叹号方式(需要开启),官网不推荐使用这种方式,建议大家不要使用. 用这种方式需要先开启一个开关 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 将此常量设置为true,这种方式才能使用,使用见示例 Action package chapter3.action; public class Chapter3Action { public String result1(){ return "result1"; } public String result2(){
return "result2"; } } Jsp中访问方式 <body> <a href="${basePath}/chapter3/chapter3Action!result1">result1</a><br> <a href="${basePath}/chapter3/chapter3Action!result2">result2</a><br> </body> 如果配置了后缀,必须这样写: /chapter4/chapter4Action!create.action XML中配置方式 <package name="chapter3" namespace="/chapter3" extends="struts-default"> <action name="chapter3Action" class="chapter3.action.Chapter3Action"> <result name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result> <result name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result> <result name="chapter3">/WEB-INF/JspPage/chapter3/chapter3.jsp</result> </action> </package> 第三种方式:通配符方式(官网推荐使用) 首先得关闭开关 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 这一种方式是由第一种转变过来的,我们可以看到,第一种方式有很多重复的代码,那么我们可以进行变形,看下面的代码 <action name="chapter3_*" class="chapter3.action.Chapter3Action" method="{1}"> <result name="test">/…/test.jsp</result> </action> chapter3_*这里的*就是你呆会要匹配的字符串,即你在后面的请求中得这样写 http://...../chapter3_create 或http://...../chapter3_update 注意,这时你action中必须有create和update方法与之匹配,甚至还可以这样匹配 <action name="chapter3_*" class="chapter3.action.Chapter3Action" method="{1}"> <result name="test">/…/{1}.jsp</result> </action> 但是这时一定要有对应的JSP页面存在,并且相应的路径不能错,这就对我们的命名进行了强制性的规定,一定要规范. 课堂示例: Action public class Chapter4Action extends ActionSupport { public String list(){ return "list"; } public String create(){
return "create"; } public String index(){
return "index"; } } XML: <action name="chapter4_*" class="chapter4.action.Chapter4Action" method="{1}"> <result name="{1}">/WEB-INF/JspPage/chapter4/chapter4_{1}.jsp</result> </action> 访问Servlet API
有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象, 那么在Struts2中怎么样使用到这些对象呢,通常有三种方式.
间接访问1 //向Session中放 ActionContext.getContext().getSession().put("wdpc", "Session中的WDPC"); //向request中放 ActionContext.getContext().put("wdpc","request中的WDPC"); //向application中放 ActionContext.getContext().getApplication().put("wdpc", "Application中的WDPC"); 取值方式: ActionContext.getContext().getSession().get("wdpc"); 间接访问2 Struts2中提供了一个静态类,servletActionContext.getxxx()里面的方法可以获取到我们的HttpServletResponse, HttpServletRequest,
然后呢就可以还原到我们以前的使用方式了.
直接访问 虽然Struts2提供了ActionContext来访问Servlet API,但是这种方式毕竟不能直接获取Servelt API实例, 为了在Action中直接访问Servlet API,Struts2还提供了一系列接口
ServletContextAware 实现此接口后,可以取得ServletContext ServletRequestAware 实现此接口后,可以取得HttpServletRequest ServletResponseAware 实现此接口后,可以取得HttpServletResponse SessionAware 实现此接口后,可以取得HttpSession,注意,这里有点特殊, 取得的是一个Map<String,Object> session,拦截器负责将session中存储的键值进行解析,并一一对应.
所以我们通常的做法是: public class BaseAction implements ServletResponseAware, ServletRequestAware, SessionAware { protected HttpServletResponse response; protected HttpServletRequest request; protected Map<String, Object> session; public void setServletResponse(HttpServletResponse response) { this.response = response; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setSession(Map<String, Object> session) { this.session = session; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public Map<String, Object> getSession() { return session; } } 为了让BaseAction能有验证的功能,并且不能被实例化,开发中我们会这样做: public abstract class BaseAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware 然后让我们每个模块的Action来继承这个BaseAction类,然后我们就可以在Action中直接使用Servelt的API了. |
- 浏览: 69968 次
- 性别:
相关推荐
Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号
1 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一...Struts 2 Action可以通过初始化、设置属性、调用方法来测试。
* 可测性:Struts1.2 Action 的一个主要问题是 execute 方法暴露了 Servlet API,而 Struts2.0 Action 可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。 三、项目中使用 SSH 的原因 ...
2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。 3、程序员可以对servlet进行封装。Struts2就是从servlet中封装以后得到的结果。 1.2Servlet的缺点 1、每写一个servlet在web.xml中都要...
struts2知识点:处理流程,基本配置,与servlet的API解耦,结果类型,通配符和动态方法的调用,类型转换,文件上传,拦截器,表单验证,国际化,OGNL表达式,UI标签,模型驱动,防止表单重复提交,项目练习知识点:...
3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取Context Map里的对象的属性 54 4.4 如何调用字段和方法 55 ...
MVC模式(model view controller) 模型:封装应用程序的数据和业务逻辑(POJO一个普通的JAVA类) 视图:实现应用程序的信息显示功能(JSP) 控制器:接收来自用户的输入...Struts2中最主要的一个就是过滤器filter
Struts 2 标签库(文档手册) Tags-API-CLSW-JSP <%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-...
3.8 动态方法调用 51 3.9 对动作类进行测试 51 3.10 小结 51 第4章 OGNL 52 4.1 Value Stack栈 52 4.2 读取Object Stack里的对象的属性 53 4.3 读取Context Map里的对象的属性 54 4.4 如何调用字段和方法 55 4.5 ...
struts1.2 Action依赖于Servlet API,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execut方法。 struts2.0 Action不依赖于容器,允许Action脱离容器单独测试。如果需要,Struts2 Action...
包含Ajax,jQuery,spring,jsp,bootstrap,struts2,servlet详细教程及帮组文档,具有一定的价值,我发的东西,都很实惠,有许多是实在CSDN没有0积分,不然我的许多是资源都是可以0积分的,这个我打包了12个开发手册...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
Struts is a set of cooperating classes, servlets, and JSP tags that make up a reusable MVC 2 design. This definition implies that Struts is a framework, rather than a library, but Struts also contains...
2.2 动态方法调用..........................................................................................................8 2.2.1 多方法模式...............................................................
2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...
《Java Web开发技术大全:JSP+Servlet+Struts+Hibernate+Spring+Ajax》内容包括Web客户端技术、JSP/Servlet技术、Struts 2(*、类型转换、输入校验、上传和下载文件、Struts 2的各种标签、对 AJAX的支持等)、Spring...
答:servlet实例化时调用init方法,得到请求时调用service方法,service方法自动派遣doget或dopost方法,最后当实例销毁时调用destroy方法。 error和exception有什么区别? 答:error是指错误,通常程序员不能通过...
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因为Struts 2和Struts 1有着太大的变化,...