Struts2获取Servlet API的两种方式

来源:互联网 发布:javaweb高级编程 源码 编辑:程序博客网 时间:2024/06/07 14:25

一、IoC方式
在Struts2中,所有请求都会被StrutsPrepareAndExecuteFilter拦截,然后去struts.xml寻找相印的action,在action执行前,会执行一些interceptor。在 struts-default.xml中,有个拦截器为
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
一部分源码

  public String intercept(ActionInvocation invocation) throws Exception {        final Object action = invocation.getAction();        final ActionContext context = invocation.getInvocationContext();        if (action instanceof ServletRequestAware) {            HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);            ((ServletRequestAware) action).setServletRequest(request);        }        if (action instanceof ServletResponseAware) {            HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE);            ((ServletResponseAware) action).setServletResponse(response);        }        if (action instanceof ServletContextAware) {            ServletContext servletContext = (ServletContext) context.get(SERVLET_CONTEXT);            ((ServletContextAware) action).setServletContext(servletContext);        }        return invocation.invoke();

于是我们可以通过IoC的方式,将Servlet对象注入Action中。

package action;/** * @author ZZ * ****/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;public class Struts2Action  implements ServletRequestAware,ServletResponseAware,ServletContextAware{    @Override    public void setServletContext(ServletContext context) {    }    @Override    public void setServletResponse(HttpServletResponse response) {    }    @Override    public void setServletRequest(HttpServletRequest request) {    }}

通过实现ServletRequestAware 获得HttpServletRequest,
实现 ServletResponseAware 获得HttpServletResponse,
实现 ServletContextAware来获得HttpServletContext。
SessionAware之类的就不写了。

二、非IoC方式
通过ServletActionContext的静态方法获取。
这里写图片描述

package action;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;/** * @author ZZ * ****/public class Struts2Action  {    public void test(){        HttpServletRequest request = ServletActionContext.getRequest();        HttpServletResponse response = ServletActionContext.getResponse();        ServletContext servletContext = ServletActionContext.getServletContext();    }}
0 0
原创粉丝点击