Struts2学习笔记(三)——在action中使用隐含对象
来源:互联网 发布:路由器mac地址过滤 编辑:程序博客网 时间:2024/06/04 20:03
我们知道,在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;@Overridepublic 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
public class UserAction2 extends ActionSupport {HttpServletRequest request;HttpSession session;ServletContext application;@Overridepublic 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;@Overridepublic String execute() throws Exception{request.put("name1", "值1");session.put("name2", "值2");application.put("name3", "值3");return SUCCESS;}@Overridepublic void setApplication(Map<String, Object> application) {this.application = application;}@Overridepublic void setSession(Map<String, Object> session) {this.session = session;}@Overridepublic void setRequest(Map<String, Object> request) {this.request = request;}}
在这里我们没有直接获得三个隐含对象或者对应的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;@Overridepublic String execute() throws Exception {request.setAttribute("name1", "ONE");session.setAttribute("name2", "TWO");application.setAttribute("name3", "THREE");return SUCCESS;}@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;session = request.getSession();application = session.getServletContext();}}这种方法相对来说是最简洁的,只要实现ServletRequestAware接口并实现其方法便可以得到三个隐含对象,比第三种方法要简洁的多,采用的也是IOC设计思想,
跟头两种方法相比,这样的设计降低了action与主控制器之间的耦合度,action可以将主要经历放在自己的处理逻辑上。
所以在实际应用中第四种方法是我们最常使用的。
- Struts2学习笔记(三)——在action中使用隐含对象
- struts2学习笔记(三)—— 在用户注册程序中使用验证框架
- 【笔记】Struts2学习笔记(三)--Action
- Struts2学习笔记——Action
- struts2学习(三)—struts2域对象
- Struts2——Action(三)
- Struts2学习篇(六) 在Action类中获得HttpServletResponse对象的四种方法
- 【Struts2学习笔记】struts2.5使用通配符配置action跳转
- struts2学习笔记(三) Action(上)
- struts2学习笔记(三) Action(上)
- Struts2 学习笔记 —— 03 —— Action
- Struts2 学习笔记——Action开发详解
- Struts2学习笔记——一个简单的Action模型
- Struts2 学习笔记——Action开发详解
- Struts2学习笔记(四)——Action详解
- Struts2学习笔记(六)——Action访问Servlet API
- Struts2学习笔记(七)——Action处理请求参数
- struts2在Action中接收参数的三种方式
- 付亚辉:Zen-cart下拉尺码表的修改
- 创建数据库及数据表的示例
- hibernate batch insert
- 几个简单的js实例
- S3C2440 RS485驱动
- Struts2学习笔记(三)——在action中使用隐含对象
- 向上转型 向下转型
- “CSE脚本世界”开通序言
- (转)深入研究ReentrantLock(重入锁)之引出话题篇
- Win7下VS2008编译pigale
- Microsoft.VisualStudio.Xaml 加载错误 vs2008 team 版
- 使用MVVM模式开发前端 part1
- CSDN课后感受
- 奥特曼Zigbee读书日记(二)--OSAL系统框架专题