与Servlet耦合的访问方式
直接访问Servlet API将使Action与环境Servlet环境耦合在一起,测试时需要有Servlet容器,不便对Action的单元测试。
直接获取HttpServletRequest对象:
servletActionContext.getRequest()
获取HttpSession:ServletActionContext.getRequest().getSession()
直接获取ServletContext对象:
servletActionContext.getServletContext()
通过实现ServletRequestAware,ServletContextAware等接口的方式。
看代码:
package logan.struts2.study;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;public class TestServletActionContextAction { public String execute(){ HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); ServletContext servletContext = ServletActionContext.getServletContext(); System.out.println("execute..."); return "success"; }}
/test-actionContext.jsp /test-aware.jsp /success.jsp
success.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>Insert title here
index.jsp
<%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>Insert title here Test ActionContext Test Aware testServletActionContextAction <% if(application.getAttribute("date") == null){ application.setAttribute("date", new Date()); } %>
访问网页:http://localhost:8080/Struts2-3/index.jsp
下面看第二种方式:
看代码:
package logan.struts2.study;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 TestServletAwareAction implements ServletRequestAware,ServletContextAware,ServletResponseAware{ @Override public void setServletResponse(HttpServletResponse response) { // TODO Auto-generated method stub System.out.println(response); } @Override public void setServletContext(ServletContext context) { // TODO Auto-generated method stub System.out.println(context); } @Override public void setServletRequest(HttpServletRequest request) { // TODO Auto-generated method stub System.out.println(request); } public String execute(){ return "success"; }}
struts.xml
/test-actionContext.jsp /test-aware.jsp /success.jsp /success.jsp
index.jsp
<%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>Insert title here Test ActionContext Test Aware testServletActionContextAction estServletAware <% if(application.getAttribute("date") == null){ application.setAttribute("date", new Date()); } %>
运行输出结果:
org.apache.struts2.dispatcher.StrutsRequestWrapper@68614863org.apache.catalina.connector.ResponseFacade@1f70cda2org.apache.catalina.core.ApplicationContextFacade@428669b6
通过实现ServletXXXAware接口的方式可以有Struts2注入
需要的Servlet相关的对象
ServletRequestAware:注入HttpServletRequest对象(比较常用)
ServletContextAware:注入ServletContext对象(比较常用)
ServletReponseAware:注入HttpServletResponse对象