`
mytream
  • 浏览: 73386 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

    博客分类:
  • MVC
阅读更多

 

我们知道,在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


  1. public class UserAction1 extends ActionSupport{  
  2.     Map<String,Object> request;  
  3.     Map<String,Object> session;  
  4.     Map<String,Object> application;  
  5.       
  6.     @Override  
  7.     public String execute() throws Exception {  
  8.         request = (Map<String,Object>)ActionContext.getContext().get("request");  
  9.         session = ActionContext.getContext().getSession();  
  10.         application = ActionContext.getContext().getApplication();  
  11.           
  12.         request.put("name1""value1");  
  13.         session.put("name2""value2");  
  14.         application.put("name3""value3");  
  15.           
  16.         return SUCCESS;  
  17.     }  
  18. }  
我们通过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.       
  6.     @Override  
  7.     public String execute() throws Exception {  
  8.         request = ServletActionContext.getRequest();  
  9.         session = request.getSession();  
  10.         application = session.getServletContext();  
  11.           
  12.         request.setAttribute("name1""一");  
  13.         session.setAttribute("name2""二");  
  14.         application.setAttribute("name3""三");  
  15.           
  16.         return SUCCESS;  
  17.     }  
  18. }  

通过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.       
  7.     @Override  
  8.     public String execute() throws Exception{  
  9.         request.put("name1""值1");  
  10.         session.put("name2""值2");  
  11.         application.put("name3""值3");  
  12.           
  13.         return SUCCESS;  
  14.     }  
  15.       
  16.     @Override  
  17.     public void setApplication(Map<string object=""> application) {  
  18.         this.application = application;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void setSession(Map<string object=""> session) {  
  23.         this.session = session;  
  24.     }  
  25.   
  26.     @Override  
  27.     public void setRequest(Map<string object=""> request) {  
  28.         this.request  = request;  
  29.     }  
  30. }  
  31. </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.       
  6.     @Override  
  7.     public String execute() throws Exception {  
  8.         request.setAttribute("name1""ONE");  
  9.         session.setAttribute("name2""TWO");  
  10.         application.setAttribute("name3""THREE");  
  11.         return SUCCESS;  
  12.     }  
  13.       
  14.     @Override  
  15.     public void setServletRequest(HttpServletRequest request) {  
  16.         this.request = request;  
  17.         session = request.getSession();  
  18.         application = session.getServletContext();  
  19.     }  
  20. }  
这种方法相对来说是最简洁的,只要实现ServletRequestAware接口并实现其方法便可以得到三个隐含对象,比第三种方法要简洁的多,采用的也是IOC设计思想,
跟头两种方法相比,这样的设计降低了action与主控制器之间的耦合度,action可以将主要经历放在自己的处理逻辑上。
所以在实际应用中第四种方法是我们最常使用的。


 

  • 大小: 6.5 KB
分享到:
评论

相关推荐

    struts2学习笔记(完美总结)——转自OPEN经验库

    OGNL是Struts2中用于对象属性访问和表达式语言,它允许在Action、ValueStack和视图层之间传递数据。ValueStack是一个对象栈,它持有ActionContext上下文中的所有对象,包括Action实例、ActionForm、Session、Request...

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    总之,《Struts2技术内幕——深入解析Struts2架构设计与实现原理》配合《struts2基础.chm》,将帮助读者全面掌握Struts2的架构设计、核心组件、配置方式、插件使用以及源码解读,对于想要在Java Web领域深入发展的...

    struts2学习笔记总结

    在Struts2中,Model通常由业务对象(BO)或数据访问对象(DAO)组成,View负责展示数据,Controller(Action)处理用户请求并调用Model更新数据,再将结果传递给View。 三、配置与拦截器 1. 配置:Struts2的配置...

    Struts2学习笔记

    根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...

    struts2 学习重点笔记

    - **原理**:Struts2 的拦截器会在 Action 执行完成后,调用 getter 方法并将结果存储到适当的范围对象中。 **3.4 请求转发与重定向** - **转发**:Action 的 execute 方法返回一个字符串,根据这个字符串找到对应...

    struts2学习笔记黑马程序员

    ### Struts2学习笔记之文件上传与Ajax开发 #### Struts2文件上传 **文件上传简介** 文件上传是Web应用中常见的功能之一,Struts2框架内置了对文件上传的支持,使得开发者能够轻松地实现这一功能。为了确保文件...

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2学习笔记(1)

    ### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...

    张龙圣思园struts2学习笔记word

    笔记中可能详细讲解了Struts2的配置文件,如struts.xml,它是整个应用的配置中心,定义了Action的映射、结果类型、拦截器栈等。在Action配置中,我们可以指定Action类、方法以及对应的URL路径,实现请求与业务的关联...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    要深入学习和掌握Struts2,建议阅读官方文档,参与实际项目实践,也可以参考相关的技术书籍和教程,例如《Struts2技术内幕——深入解析Struts2架构设计与实现原理》等资源,来提升对Struts2框架的全面理解。

    Struts 2综合应用实例——添加学生信息

    在本实验中,我们将通过构建一个简单的Web应用程序——添加学生信息——来深入理解并掌握Struts 2框架的应用。此实验旨在帮助学习者熟悉Struts 2的各种核心组件和技术,包括但不限于标签库、配置文件设置以及与...

    struts2四天的学习笔记

    2. **Action类**:在Struts2中,Action类是处理用户请求的核心组件。它实现了`com.opensymphony.xwork2.Action`接口,负责接收请求,执行业务逻辑,并返回结果。 3. **配置文件**:Struts2的配置主要在两个文件中...

    struts2学习笔记

    2. **模型驱动**:使用一个公共对象作为模型,Action类持有这个模型的引用,Struts2将请求参数填充到模型对象中,这种方式更便于数据管理和共享。 此外,Struts2还支持动态方法调用、国际化、主题和模板、AJAX集成...

    struts2 学习笔记 实战

    本文将深入探讨Struts2的核心概念,包括Namespace、标签、Action以及它们在实际开发中的应用。 一、Namespace Namespace在Struts2中主要用于组织和隔离Action,它决定了Action的访问路径。默认情况下,Namespace为...

    Struts2自学笔记——Struts2的文件上传

    同时,Action类中需要定义一个或多个字段来接收上传的文件,这些字段通常使用`java.io.File`、`java.lang.String`或`org.apache.struts2.dispatcher.multipart.FileItem`类型。 4. **表单标签** 在JSP页面中,使用...

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts 2 学习笔记

    在Struts2中,学习笔记通常会涵盖以下几个关键概念: 1. **源代码查看和Javadoc**:开发者可以通过查看源代码来理解Struts2的工作原理,而Javadoc则提供了API文档,帮助理解类和方法的功能。 2. **包(Package)和...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

Global site tag (gtag.js) - Google Analytics