在struts1中,获得到系统的request、session或者application对象非常方便,都是按照形参传递的,但是在struts2中,request、session和application都被隐藏了。
struts提供两种方式访问session、request和application对象,即IOC方式和非IOC方式,其中比较常用的是利用SPRING里面所说的IOC即控制反转。
一、非Ioc方式:
这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
(1)与serlvet API耦合的方式(通过ServletActionContext类直接获取)
HttpServletRequest request = ServletActionContext.getRequest(); //获取request对象 HttpSession session = request.getSession();//获取session对象 ServletContext application = ServletActionContext.getServletContext(); //获取application对象方式一 或 ServletContext application = session.getServletContext(); //获取application对象方式二 HttpServletResponse response = ServletActionContext.getResponse(); //获取response对象
(2)与serlvet API无耦合的方式(通过ActionContext类直接获取)
ActionContext context = ActionContext.getContext(); //requestScope Map request = (Map) context.get("request"); //获取request Map session = context.getSession(); //获取session Map application = context.getApplication(); //获取application <!-- 赋值示例 --> ActionContext ctx = ActionContext.getContext(); ctx.getApplication().put("app","application应用范围"); ctx.getSession().put("sess","session应用范围"); ctx.put("req","request应用范围");
二、IOC方式:
(1)获得request对象:
第一步:让action实现ServletRequestAware接口
第二步:在action中声明一个HttpServletRequest类型的实例变量
第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。
//1.实现ServletRequestAware接口 public class UserAction implements ServletRequestAware { //2.定义HttpServletRequest类型的成员变量并实现getter/setter方法 private HttpServletRequest request; public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } //3.实现ServletRequestAware接口的setServletRequest方法,并将它的request参数赋值给成员变量request @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }
(2)获得Session对象(注意,此时的session是SessionMap类型):
第一步:让action实现SessionAware接口
第二步:在action中声明一个Map类型的实例变量
第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,如下所示。
//1.实现SessionAware接口 public class UserAction implements SessionAware { //2.定义Map类型的成员变量并实现getter/setter方法 private Map session; public Map getSession() { return session; } //3.实现SessionAware接口的setSession方法,并将它的session参数赋值给成员变量session @Override public void setSession(Map session) { this.session = session; } }
(3)获取application对象:
第一步:让action实现ServletContextAware接口
第二步:在action中声明一个ServletContext类型的实例变量
第三步:在action中实现ServletContextAware接口的setServletContext方法,实现方式很简单,如下所示。
//1.实现ServletContextAware接口 public class UserAction implements ServletContextAware { //2.定义ServletContext类型的成员变量并实现getter/setter方法 private ServletContext application; public ServletContext getApplication() { return application; } public void setApplication(ServletContext application) { this.application = application; } //3.实现ServletContextAware接口的setServletContext方法,并将它的application参数赋值给成员变量application @Override public void setServletContext(ServletContext application) { this.application = application; } }
(4)获取response对象:
第一步:让action实现ServletResponseAware接口
第二步:在action中声明一个HttpServletResponse类型的实例变量
第三步:在action中实现HttpServletResponse接口的setResponse方法,实现方式很简单,如下所示。
//1.实现ServletResponseAware接口 public class UserAction implements ServletResponseAware { //2.定义HttpServletResponse类型的成员变量并实现getter/setter方法 private HttpServletResponse response; public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } //3.实现ServletResponseAware接口的setServletResponse方法,并将它的response参数赋值给成员变量response @Override public void setServletResponse(HttpServletResponse response) { this.response = response; } }
附注:Jps页面获取Scope对象值的几种方式:
(1)${ } 格式
${applicationScope.app} ${sessionScope.sess} ${requestScope.req}
(2)<s:property>标签
<s:property value="#request.req"> <s:property value="#session.sess"> <s:property value="#application.app">
(3)getAttribute()方式
<%=request.getAttribute("req") %><br> <%=session.getAttribute("ses") %><br> <%=application.getAttribute("app") %><br>