什么是与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方法,