首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-09-03 
Struts2学习笔记(三)——在action中使用隐含对象?我们知道,在Struts1.x中我们可以通过HttpServletRequest参

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

?

我们知道,在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. ??????
  9. ???attr:<br/>??
  10. ???<s:property?value="#attr.name1"/><br/>??
  11. ???<s:property?value="#attr.name2"/><br/>??
  12. ???<s:property?value="#attr.name3"?/><br/>???
  13. ??????
  14. ????<s:debug></s:debug>??
  15. ??</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应该要做的工作(就好像头两种方法)交给容器来完成。下图或许能够帮助我们理解:
    Struts2学习札记(三)——在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可以将主要经历放在自己的处理逻辑上。所以在实际应用中第四种方法是我们最常使用的。

    ?

  • 热点排行