我们知道,在Struts1.x中我们可以通过HttpServletRequest参数直接使用获得有关的隐含对象进行数据的传递。
但是在Struts2中,核心控制器没有给action传递任何的参数,很好的降低了核心控制器和业务控制器action之间的耦合度。
有时候我们是必要在Action中使用隐含对象设置一些参数以便在展示页面中使用。下面我们来看一下在action中使用隐含对象的方法,并比较其优劣。
先来看一下struts.xml文件中的配置:
- <package name="mytream" extends="struts-default" namespace="/mytream">
- <action name="login*" class="com.mytream.UserAction{1}">
- <result name="success">/user_add_success.jsp</result>
- </action>
- </package>
由上述配置,浏览器中的访问格式为.../servletContextPath/mytream/login*。我在下面会创建4个对应的形式为UserAction*的action来处理响应的请求,
并且分别使用不同的方法获得三个隐含对象request,session,application,并对其进行相关设置。
下面是展示页面user_add_success.jsp
- <body>
- 登陆成功页面!
- 在action中设置的有关参数:<br/>
- 可以通过银行对象request,session,application获得这些值,也可以通过struts2的Stack Contents获得<br/>
- <s:property value="#request.name1" /> | <%=request.getAttribute("name1") %> <br/>
- <s:property value="#session.name2" /> | <%=session.getAttribute("name2") %> <br/>
- <s:property value="#application.name3"/> | <%=application.getAttribute("name3") %> <br/>
-
- attr:<br/>
- <s:property value="#attr.name1"/><br/>
- <s:property value="#attr.name2"/><br/>
- <s:property value="#attr.name3" /><br/>
-
- <s:debug></s:debug>
- </body>
一.通过静态方法获得1
- public class UserAction1 extends ActionSupport{
- Map<String,Object> request;
- Map<String,Object> session;
- Map<String,Object> application;
-
- @Override
- public String execute() throws Exception {
- request = (Map<String,Object>)ActionContext.getContext().get("request");
- session = ActionContext.getContext().getSession();
- application = ActionContext.getContext().getApplication();
-
- request.put("name1", "value1");
- session.put("name2", "value2");
- application.put("name3", "value3");
-
- return SUCCESS;
- }
- }
我们通过ActionContext的静态方法获得与三个隐含对象对应的Map对象,而不是HttpServletRequest,HttpSession,ServletContext对象。
当我们对Map对象进行操作时,容器会主动帮我们完成对隐含对象“几乎一样”的设置。这个我们可以通过展示页面user_add_success.jsp清晰的看到。
二.通过静态方法获得2
- <pre name="code" class="java">public class UserAction2 extends ActionSupport {
- HttpServletRequest request;
- HttpSession session;
- ServletContext application;
-
- @Override
- public String execute() throws Exception {
- request = ServletActionContext.getRequest();
- session = request.getSession();
- application = session.getServletContext();
-
- request.setAttribute("name1", "一");
- session.setAttribute("name2", "二");
- application.setAttribute("name3", "三");
-
- return SUCCESS;
- }
- }
通过ServletActionContext的得到的直接就是三个隐含对象,这很容易理解。
三.容器进行设置1
- public class UserAction2 extends ActionSupport implements RequestAware,
- SessionAware, ApplicationAware {
- Map<string object=""> request;
- Map<string object=""> session;
- Map<string object=""> application;
-
- @Override
- public String execute() throws Exception{
- request.put("name1", "值1");
- session.put("name2", "值2");
- application.put("name3", "值3");
-
- return SUCCESS;
- }
-
- @Override
- public void setApplication(Map<string object=""> application) {
- this.application = application;
- }
-
- @Override
- public void setSession(Map<string object=""> session) {
- this.session = session;
- }
-
- @Override
- public void setRequest(Map<string object=""> request) {
- this.request = request;
- }
- }
- </string></string></string></string></string></string>
在这里我们没有直接获得三个隐含对象或者对应的Map对象,而是通过实现RequestAware,SessionAware, ApplicationAware三个接口把这个工作交给Servlet容器来完成,
即调用三个setXXX方法将三个隐含对象对应的Map对象传递给action。这样的实现在Spring框架中很典型,又被称之为DI(Dependency injection,依赖注入)或者IOC(Inverse of Control控制反转),
简单的理解就是把action应该要做的工作(就好像头两种方法)交给容器来完成。下图或许能够帮助我们理解:
四.容器进行设置2
- public class UserAction4 extends ActionSupport implements ServletRequestAware {
- HttpServletRequest request;
- HttpSession session;
- ServletContext application;
-
- @Override
- public String execute() throws Exception {
- request.setAttribute("name1", "ONE");
- session.setAttribute("name2", "TWO");
- application.setAttribute("name3", "THREE");
- return SUCCESS;
- }
-
- @Override
- public void setServletRequest(HttpServletRequest request) {
- this.request = request;
- session = request.getSession();
- application = session.getServletContext();
- }
- }
这种方法相对来说是最简洁的,只要实现ServletRequestAware接口并实现其方法便可以得到三个隐含对象,比第三种方法要简洁的多,采用的也是IOC设计思想,
跟头两种方法相比,这样的设计降低了action与主控制器之间的耦合度,action可以将主要经历放在自己的处理逻辑上。
所以在实际应用中第四种方法是我们最常使用的。
- 大小: 6.5 KB
分享到:
相关推荐
struts2学习笔记,非本人所写,但有学习的价值,总结的很好,分享一个!
本资源包含两个学习Struts的资料: 1.struts2基础.chm 2.Struts2+技术内幕——深入解析Struts2架构设计与实现原理.pdf 欢迎有兴趣的童鞋下载学习。
struts2学习笔记总结
Struts2学习笔记,介绍了struts2的基础部分
Struts 2综合应用实例——添加学生信息
struts2学习笔记三
这是学习struts2时记得重点笔记,包括了一些原理,ognl语句的编写,以及如何设置拦截器等等一些基本知识,起到复习和巩固的作用
旺旺教师————Struts2旺旺教师————Struts2旺旺教师————Struts2旺旺教师————Struts2
1. struts2框架的引入 1)把struts2的相关jar包导入到项目中去 2)把struts2框架的配置文件struts.xml复制粘贴...话可以在struts2框架的核心jar包中找到.jar中有验证 struts.xml的dtd文件,在dtd文件中有这个声明的写法
struts2学习笔记struts2学习笔记struts2学习笔记
struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换
本人学习struts2的笔记,希望大家可以多多学习以后共同交流
三、 Namespace Namespace决定了action的访问路径,默认为“”,可以接收所有路径的action,如果没有找到相应的namespace时,则使用namespace为空的action ...struts2中的package与java的package是相同的作用的。
《Struts2 技术内幕——深入解析Struts2架构设计与实现原理》
Struts2的拦截器——Struts2拦截器的基础知识
核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对Struts2中的精华——OGNL表达式引擎和XWork框架的原理及机制进行了全面深入的分析和讲解。运行主线篇首先对Struts2的两大运行主线——初始化主线和...