`
_Yggd
  • 浏览: 89142 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

struts2中访问servlet API 的方法以及优劣性

阅读更多
虽然struts2做到了与servlet解耦,但是有时候我们还是得亲自与servlet打交道,
这也是struts2提供我们获取servlet API的方法的原因,
如下:


1. ActionContext
在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作. 我们需要在Action中取得request请求参数"username"的值:
[java] view plaincopy
ActionContext context = ActionContext.getContext(); 
Map params = context.getParameters(); 
String username[] = (String[]) params.get("username"); //获得一个String型的数组 
System.out.println("username="+username[0]); 

ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象. 一般情况, 我们的ActionContext都是通过: ActionContext context = (ActionContext) actionContext.get();来获取的.我们再来看看这里的actionContext对象的创建:
static ThreadLocal actionContext = new ActionContextThreadLocal();
ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线 程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.这样,我们 ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.
通过ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession();
2. ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与Servlet相关对象访问的 功能,它可以取得的对象有:
(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求对象
(2)javax.servlet.http.HttpServletResponse : HTTPservlet相应对象
(3)javax.servlet.ServletContext : Servlet上下文信息
(4)javax.servlet.ServletConfig : Servlet配置对象
(5)javax.servlet.jsp.PageContext : Http页面上下文
如何从ServletActionContext里取得Servlet的相关对象:
<1>取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();
<2>取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();

3. ServletActionContext和ActionContext联系
ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。至 于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,而 ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每 个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数 中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象 时独立的建立了一个req。

4. struts2中获得request、response和session
(1)非IoC方式
方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象。
细心的朋友可以发现这里的session是个Map对象, 在Struts2中底层的session都被封装成了Map类型. 我们可以直接操作这个Map对象进行对session的写入和读取操作, 而不用去直接操作HttpSession对象.
[java] view plaincopy
ActionContext ctx = ActionContext.getContext(); 
 
ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy"); 
Map session = ctx.getSession(); //session 
 
HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); 
HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); 


方法二:使用org.apache.struts2.ServletActionContext类
[java] view plaincopy
public class UserAction extends ActionSupport { 
     
    //其他代码片段 
     
    private HttpServletRequest req;  
//  private HttpServletRequest req = ServletActionContext.getRequest(); 这条语句放在这个位置是错误的,同样把这条语句放在构造方法中也是错误的。 
 
    public String login() { 
        req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现 
        user = new User(); 
        user.setUid(uid); 
        user.setPassword(password); 
        if (userDAO.isLogin(user)) { 
            req.getSession().setAttribute("user", user); 
            return SUCCESS; 
        } 
        return LOGIN; 
    } 
    public String queryAll() { 
        req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现 
        uList = userDAO.queryAll(); 
        req.getSession().setAttribute("uList", uList); 
        return SUCCESS; 
    } 
     
    //其他代码片段 



(2)IoC方式(即使用Struts2 Aware拦截器)
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。
[java] view plaincopy
public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware { 
 
    private HttpServletRequest request;  
    private HttpServletResponse response;  
 
    public void setServletRequest(HttpServletRequest request) { 
        this.request = request;  
    } 
 
    public void setServletResponse(HttpServletResponse response) { 
        this.response = response;  
    } 
 
    public String execute() {  
        HttpSession session = request.getSession();  
        return SUCCESS;  
    } 



1、用ActionContext的方法获取servlet API的方法一般推荐使用,如上文所说他是线程安全的、缺点是不能直接获取到servlet 中的对象

2、使用IOC 方式如上文所说,这种方式优点就是直接访问到servlet API ,缺点就是与servlet  耦合太大,一般不推荐使用

3、使用ServletActionContext,直继承了ActionContext,线程安全的,(推荐使用)
分享到:
评论

相关推荐

    Struts2访问ServletAPI

    本文将深入探讨如何在Struts2中访问Servlet API。 首先,理解Struts2的执行流程至关重要。当一个请求到达服务器时,Struts2的过滤器(通常名为`FilterDispatcher`或`StrutsPrepareAndExecuteFilter`)会捕获这个...

    Struts2 直接访问Servlet API(二十五)

    在“Struts2直接访问Servlet API(二十五)”这个主题中,我们可能探讨的是如何在Struts2框架下直接利用Servlet API来实现某些特定功能或者优化性能。Servlet API是Java Web开发的基础,它提供了处理HTTP请求和响应...

    Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号

    在Struts2框架中,直接和间接访问Servlet API以及动态方法调用是两个关键概念,它们对理解和优化应用性能至关重要。 首先,让我们深入理解直接访问Servlet API。在传统的MVC模式中,Servlet扮演着控制器的角色,...

    struts2之Action访问Servlet API

    在本文中,我们将详细介绍 Struts2 访问 Servlet API 的几种方法。 一、使用 ActionContext 类 ActionContext 类是 Struts2 框架中一个重要的类,它提供了多种方法来访问 Servlet API。该类可以模拟获取 request、...

    详解Struts2中Action访问Servlet API的几种方法

    详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象。如果想在Struts2程序中用到...

    MAX的struts2教程、struts2 API、servlet API

    在本教程和API文档中,我们将深入理解Struts2的核心概念、功能以及与之相关的Servlet API。 首先,"MAX的struts2教程"提供了全面的Struts2学习指南,帮助初学者快速上手。这个教程可能涵盖以下内容: 1. **基础...

    Struts2之Servlet API及单元测试初识案例struts005

    在这个“Struts2之Servlet API及单元测试初识案例struts005”中,我们将探讨Struts2如何与Servlet API结合使用,以及如何进行单元测试。 Servlet API是Java EE平台的核心部分,用于构建动态Web应用程序。Struts2...

    Struts2 part 3:在Action中使用ServletAPI

    6. **URL重写和URL生成**:Servlet API提供了`RequestDispatcher`用于转发和重定向,而在Struts2中,`ActionSupport`类的`redirectAction()`和`generateUrl()`方法可以帮助我们生成和重定向到特定的Action。...

    Struts2中Servlet的配置

    当你在Action类中实现这些接口后,Struts2会自动注入对应的请求和响应对象,使得你可以像在Servlet中那样直接操作它们,进行响应的处理和请求的数据获取。 2. **使用ActionContext访问Servlet API**: `...

    struts2和jspServlet上传

    总的来说,Struts2和JSP Servlet在文件上传方面各有优势,Struts2提供了更高级的MVC框架支持,而Servlet则更底层,灵活性更高。结合前端的Jquery插件,如JqjsTest和JqUploadTest,可以构建出高效且用户体验良好的...

    struts2-tags-API,struts2标签api

    在实际项目中,开发者可以将`struts2-tags-API`文档作为参考,快速查找和理解标签的使用方法。如果遇到问题,可以查看标签的错误信息,或者使用调试工具查看标签的生命周期和执行流程,以便定位和解决问题。 总结,...

    strut2 servletapi

    这个压缩包“strut2 servletapi”显然包含了使用Struts2框架访问Servlet API的示例代码。Servlet API是Java Servlet规范的一部分,提供了一系列接口和类,允许开发者处理HTTP请求、响应以及与Web服务器交互。 在...

    struts2 API帮助文档

    这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效利用Struts2的功能。 1. **Struts2核心组件** - `struts2-core`:这是Struts2框架的核心...

    servlet api servlet api

    MVC(Model-View-Controller)框架如Spring MVC、Struts等,虽然提供了更高级别的抽象,但底层仍然基于Servlet API处理请求和响应。 综上所述,Servlet API是构建Java Web应用的基础,提供了处理HTTP请求的核心...

    struts2和servlet的共存问题

    ### Struts2与Servlet共存问题详解 #### 一、问题背景 在Java Web开发中,Struts2框架因其简洁的MVC模式和强大的插件系统而被广泛使用。但在某些场景下,开发者可能需要同时使用Struts2和其他Servlet技术(如...

    struts2API

    Struts2 API是Java开发中的一个关键工具,它为基于MVC(Model-View-Controller)设计模式的Web应用程序提供了一种强大的框架。Struts2是Apache软件基金会下的一个项目,它继承了Struts1的优点并引入了许多改进,旨在...

    java上传与下载——struts2和servlet案例

    在Struts2中,我们通常会在Action类中处理这个逻辑,而在Servlet中,这将在doGet或doPost方法内完成。 现在,我们来看案例中的两个DEMO——JqUploadTest和CosUpload。JqUploadTest可能是指使用jQuery的Upload插件...

Global site tag (gtag.js) - Google Analytics