Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

绿色网站无广告
会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

Struts2学习笔记(三)——在action中使用隐含对象

来源: mytream 分享至:

我们知道,在Struts1.x中我们可以通过HttpServletRequest参数直接使用获得有关的隐含对象进行数据的传递。
但是在Struts2中,核心控制器没有给action传递任何的参数,很好的降低了核心控制器和业务控制器action之间的耦合度。
有时候我们是必要在Action中使用隐含对象设置一些参数以便在展示页面中使用。下面我们来看一下在action中使用隐含对象的方法,并比较其优劣。

先来看一下struts.xml文件中的配置:

  1. <package name="mytream" extends="struts-default" namespace="/mytream">
  2. <action name="login*" class="com.mytream.UserAction{1}">
  3. <result name="success">/user_add_success.jsp</result>
  4. </action>
  5. </package>

由上述配置,浏览器中的访问格式为.../servletContextPath/mytream/login*。我在下面会创建4个对应的形式为UserAction*的action来处理响应的请求,
并且分别使用不同的方法获得三个隐含对象request,session,application,并对其进行相关设置。
下面是展示页面user_add_success.jsp

  1. <body>
  2. 登陆成功页面!
  3. 在action中设置的有关参数:<br/>
  4. 可以通过银行对象request,session,application获得这些值,也可以通过struts2的Stack Contents获得<br/>
  5. <s:property value="#request.name1" /> | <%=request.getAttribute("name1") %> <br/>
  6. <s:property value="#session.name2" /> | <%=session.getAttribute("name2") %> <br/>
  7. <s:property value="#application.name3"/> | <%=application.getAttribute("name3") %> <br/>
  8. attr:<br/>
  9. <s:property value="#attr.name1"/><br/>
  10. <s:property value="#attr.name2"/><br/>
  11. <s:property value="#attr.name3" /><br/>
  12. <s:debug></s:debug>
  13. </body>


一.通过静态方法获得1


  1. public class UserAction1 extends ActionSupport{
  2. Map<String,Object> request;
  3. Map<String,Object> session;
  4. Map<String,Object> application;
  5. @Override
  6. public String execute() throws Exception {
  7. request = (Map<String,Object>)ActionContext.getContext().get("request");
  8. session = ActionContext.getContext().getSession();
  9. application = ActionContext.getContext().getApplication();
  10. request.put("name1", "value1");
  11. session.put("name2", "value2");
  12. application.put("name3", "value3");
  13. return SUCCESS;
  14. }
  15. }
我们通过ActionContext的静态方法获得与三个隐含对象对应的Map对象,而不是HttpServletRequest,HttpSession,ServletContext对象。
当我们对Map对象进行操作时,容器会主动帮我们完成对隐含对象“几乎一样”的设置。这个我们可以通过展示页面user_add_success.jsp清晰的看到。


二.通过静态方法获得2


  1. <pre name="code" class="java">public class UserAction2 extends ActionSupport {
  2. HttpServletRequest request;
  3. HttpSession session;
  4. ServletContext application;
  5. @Override
  6. public String execute() throws Exception {
  7. request = ServletActionContext.getRequest();
  8. session = request.getSession();
  9. application = session.getServletContext();
  10. request.setAttribute("name1", "一");
  11. session.setAttribute("name2", "二");
  12. application.setAttribute("name3", "三");
  13. return SUCCESS;
  14. }
  15. }

通过ServletActionContext的得到的直接就是三个隐含对象,这很容易理解。





三.容器进行设置1


  1. public class UserAction2 extends ActionSupport implements RequestAware,
  2. SessionAware, ApplicationAware {
  3. Map<string object=""> request;
  4. Map<string object=""> session;
  5. Map<string object=""> application;
  6. @Override
  7. public String execute() throws Exception{
  8. request.put("name1", "值1");
  9. session.put("name2", "值2");
  10. application.put("name3", "值3");
  11. return SUCCESS;
  12. }
  13. @Override
  14. public void setApplication(Map<string object=""> application) {
  15. this.application = application;
  16. }
  17. @Override
  18. public void setSession(Map<string object=""> session) {
  19. this.session = session;
  20. }
  21. @Override
  22. public void setRequest(Map<string object=""> request) {
  23. this.request = request;
  24. }
  25. }
  26. </string></string></string></string></string></string>
在这里我们没有直接获得三个隐含对象或者对应的Map对象,而是通过实现RequestAware,SessionAware, ApplicationAware三个接口把这个工作交给Servlet容器来完成, 即调用三个setXXX方法将三个隐含对象对应的Map对象传递给action。这样的实现在Spring框架中很典型,又被称之为DI(Dependency injection,依赖注入)或者IOC(Inverse of Control控制反转), 简单的理解就是把action应该要做的工作(就好像头两种方法)交给容器来完成。下图或许能够帮助我们理解:


四.容器进行设置2


  1. public class UserAction4 extends ActionSupport implements ServletRequestAware {
  2. HttpServletRequest request;
  3. HttpSession session;
  4. ServletContext application;
  5. @Override
  6. public String execute() throws Exception {
  7. request.setAttribute("name1", "ONE");
  8. session.setAttribute("name2", "TWO");
  9. application.setAttribute("name3", "THREE");
  10. return SUCCESS;
  11. }
  12. @Override
  13. public void setServletRequest(HttpServletRequest request) {
  14. this.request = request;
  15. session = request.getSession();
  16. application = session.getServletContext();
  17. }
  18. }
这种方法相对来说是最简洁的,只要实现ServletRequestAware接口并实现其方法便可以得到三个隐含对象,比第三种方法要简洁的多,采用的也是IOC设计思想, 跟头两种方法相比,这样的设计降低了action与主控制器之间的耦合度,action可以将主要经历放在自己的处理逻辑上。 所以在实际应用中第四种方法是我们最常使用的。

  • 大小: 6.5 KB
  • 查看图片附件

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史