什么是与Servlet API解耦?
为了避免与servlet API耦合在一起,方便Action做单元测试,
Struts2对HttpServletRequest,HttpSession,和ServletContext进行了封装,构造了3个Map对象来替代这三个对象,在Action中可以直接使用HttpServletRequest,HttpSession,ServletContext对应的Map对象来保存和读取数据。
两种解耦方式:
1、 使用Struts2提供的工具类中提供的静态方法,得到对用的封装后对象。
package cn.itcast.context;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class ContextAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; public String test() throws Exception{ System.out.println("ContextAction ****** test()"); HttpServletRequest request=ServletActionContext.getRequest(); request.setAttribute("username","username_request"); HttpServletResponse response=ServletActionContext.getResponse(); Map sessionMap=ServletActionContext.getContext().getSession(); sessionMap.put("username", "username_session"); ServletContext sc=ServletActionContext.getServletContext(); sc.setAttribute("username", "username_application"); return "attr"; }}
2、 Action实现ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware四个接口,分别重写对应的set方法,达到操作该4个封装后对象。
package cn.itcast.context;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.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.apache.struts2.interceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;public class Context02Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware{ HttpServletRequest request; HttpServletResponse response; ServletContext context; MapsessionMap; private static final long serialVersionUID = 1L; public String test() throws Exception{ System.out.println("ContextAction ****** test()"); HttpServletRequest request=ServletActionContext.getRequest(); request.setAttribute("username","username_request"); HttpServletResponse response=ServletActionContext.getResponse(); Map sessionMap=ServletActionContext.getContext().getSession(); sessionMap.put("username", "username_session"); ServletContext sc=ServletActionContext.getServletContext(); sc.setAttribute("username", "username_application"); return "attr"; } public void setSession(Map session) { this.sessionMap=session; } public void setServletContext(ServletContext context) { this.context=context; } public void setServletResponse(HttpServletResponse response) { this.response=response; } public void setServletRequest(HttpServletRequest request) { this.request=request; }}
两种方式没有好坏之分,全凭个人喜好!
其他代码:
/context/success.jsp /context/attr.jsp /context/success.jsp /context/attr.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>My JSP 'test.jsp' starting page textContext testContext
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>My JSP 'success.jsp' starting page xxxxxxxxxxxxxx
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>My JSP 'attr.jsp' starting page ${requestScope.username } ${sessionScope.username } ${applicationScope.username }