Struts2访问Servlet的三种方式

Struts2访问Servlet的三种方式
基本介绍
     在Struts2中,Action并没有直接和Servlet API耦合。虽然Struts2 中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。
     尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如request、session和application等 。
     在Struts2中,访问Servlet API有3种方法,分别是实现特定接口,通过ServletActionContext类,通过ActionContext类。

思维导图


实现特定接口访问
package com.pc.web.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 使用特定接口访问Servlet对象
 * @author Switch
 *
 *  org.apache.struts2.dispatcher.StrutsRequestWrapper@461aa2
 *  org.apache.catalina.connector.ResponseFacade@7e83df
 *  org.apache.catalina.core.ApplicationContextFacade@3b102
 *  org.apache.catalina.session.StandardSessionFacade@5a214b
 *  是由一个名称为servletConfig的拦截器为我们封装的
 */
public class ActionTest7 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware {

    private HttpServletRequest request;
    private HttpServletResponse response;
    private ServletContext application;

    /**
     * @return
     */
    public String demo(){
        System.out.println(request);
        System.out.println(response);
        System.out.println(application);
        System.out.println(request.getSession());
        return SUCCESS;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }

    @Override
    public void setServletContext(ServletContext application) {
        this.application = application;
    }
}


通过ServletActionContext类

package com.pc.struts2.web.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 访问ServletAPI的方式
 *
 * 使用Struts2框架提供了一个工具类:
 *         ServletActionContext
 * 它里面提供了对应的静态方法,可以直接获取ServletAPI
 *
 * 有一个需要注意的问题:
 *        org.apache.struts2.dispatcher.StrutsRequestWrapper@4637b3
 *        org.apache.catalina.connector.ResponseFacade@1f2f2f7
 *        org.apache.catalina.session.StandardSessionFacade@12d77c1
 *        org.apache.catalina.core.ApplicationContextFacade@1133ff
 *
 *        requet对象已经不是原来tomcat提供的了,而是被struts2框架包装过了。
 *         包装使用的是装饰者模式。
 *        装饰者模式的作用是对方法进行增强。
 *
 * @author Switch
 */
public class ActionAPITest extends ActionSupport {
    /**
     * 在Struts2框架中使用ServletAPI
     * @return
     */
    public String useServletAPI() {
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        HttpSession session = request.getSession();
        ServletContext application = ServletActionContext.getServletContext();
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
        System.out.println(application);
        return "success";
    }
}

通过ActionContext类
package com.pc.web.action;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * ActionContext类介绍
 *      它是Struts2框架为我们提供的一个工具类。
 *      该类可以通过方法直接获取request,response,servletContext对象
 * @author Switch
 * 
 *  context.getParameters(); == request.getParameterMap(); 获取的是请求参数
 */
public class ActionTest8 extends ActionSupport implements StrutsStatics {

    private HttpServletRequest request;
    private HttpServletResponse response;
    private ServletContext application;

    /**
     * 使用ActionContext访问ServletAPI
     * @return
     */
    public String demo(){
        ActionContext context = ActionContext.getContext();

        request = (HttpServletRequest) context.get(HTTP_REQUEST);
        response = (HttpServletResponse) context.get(HTTP_RESPONSE);
        application = (ServletContext) context.get(SERVLET_CONTEXT);
        System.out.println(request);
        System.out.println(response);
        System.out.println(application);
        System.out.println(request.getSession());
        /*org.apache.struts2.dispatcher.StrutsRequestWrapper@112e422
        org.apache.catalina.connector.ResponseFacade@13f8b4c
        org.apache.catalina.core.ApplicationContextFacade@d244dd
        org.apache.catalina.session.StandardSessionFacade@a711cb*/

        return SUCCESS;
    }

    /**
     * 使用原始ServletAPI对象,往session域和application域中存入数据
     * session域中存入         key=sessionAttr          value=hello session attr
     * application域中存入  key=applicationAttr     value=hello application attr
     * @return
     */
    public String demo2(){
        //1.获取session对象
        HttpSession session = ServletActionContext.getRequest().getSession();
        //存入数据
        session.setAttribute("sessionAttr", "hello session attr");
        session.getId();
        //2.获取ServletContext
        ServletContext application = ServletActionContext.getServletContext();
        application.getRealPath("/WEB-INF/uploads");
        //存入数据
        application.setAttribute("applicationAttr", "hello application attr");
        return SUCCESS;
    }


    /**
     * 使用ActionContext类中的getSession()和getApplication()获取到的map来往map中存入数据
     * sessionMap中存入         key=sessionAttr          value=hello session map
     * applicationMap中存入  key=applicationAttr     value=hello application map
     * @return
     */
    public String demo3(){
        //1.获取ActionContext对象
        ActionContext context = ActionContext.getContext();
        //2.获取sessionMap
        Map<String,Object> sessionMap = context.getSession();
        sessionMap.put("sessionAttr", "hello session map");
        //3.获取applicationMap
        Map<String,Object> applicationMap = context.getApplication();
        applicationMap.put("applicationAttr", "hello application map");
        return SUCCESS;
    }

}


ActionContext类访问Servlet API的常用方法
方法声明
功能描述
void put(String key, Object value)
将 key-value键值对放入ActionContext 中,模拟Servlet API中的HttpServletRequest的setAttributeO方法。
Object get(String key)
通过参数key来查找当前ActionContext中的值。
Map<String, Object> getApplication()
返回一个Application级的Map对象。
static ActionContext getContext()
获取当前线程的ActionContext对象。
Map<String, Object> getParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象。
Map<String, Object> getSession()
返回一个Map类型的HttpSession对象。
void setApplication(Map<String, Object> application)
 设置Application上下文。
void setSession(Map<String, Object> session)
设置一个Map类型的Session值 。

PS:通过对这三种方式的使用,可以发现通过实现特定接口和使用ServletActionContext类,Action是与Servlet API进行直接耦合的,这样并不利于程序解耦。所以开发中建议优先使用ActionContext。

PS:虽然这样,在控制器与Servlet API解耦了,但是在Struts2中肯定有一部分代码还是和Servlet API有耦合,这是毋庸置疑的。如果我们 只是需要使用Servlet API中域对象中的域(键值对,存放数据的),那么就使用ServletContext,如果 需要使用除了域之外的其他东西,那么还是要使用ServletActionContext的



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值