在前面的示例中Struts2的Action中并没有使用到ServletAPI对象,但是在实际应用中我们往往会用到ServletAPI对象,比如用户登录成功后将用户信息保存在会话中。所以为了解决这个问题,Struts2提供了多种方式来访问ServletAPI对象,总的来说分为两大类:
使用与ServletAPI解耦的方式
使用与ServletAPI耦合的方式
一、使用与ServletAPI解耦的方式
1.使用ActionContext类获取ServletAPI对应的Map对象
为了避免与Servlet耦合在一起,方便Action类的测试,Struts2提供了 普通的Map对象替代了ServletAPI中的对象(HttpServletRequest、HttpSession、ServletContext等)。通过ActionContext类可以在Action类中可以直接访问他们对应的Map对象。 com.opensymphony.xwork2.ActionContext类是Action执行的上下文,可以通过下面的方式获取ServletAPI对应的Map对象
①public Map getSession():获取HttpSession对应的Map对象
②public Map getApplication():获取ServletContext对应的Map对象
③public Object get(Object key):ActionContext类没有提供getRequest()这样的方法来获取HttpServletRequest对应的Map对象,只能使用此方法并传递一个参数来表示获取对应的对象
如:
2.实现接口来获取Map对象
除了使用ActionContext类来获取Map对象还可以使用实现接口的方式,实现接口后Struts2在运行时将会自动注入ServletAPI对应的Map对象
①org.apache.struts2.interceptor.RequestAware
注入request对应的Map对象,该接口只有一个方法:public void setRequest(Map<String,Object> request)
②org.apache.struts2.interceptor.SessionAware
注入session对应的Map对象,该接口只有一个方法:public void setSession(Map<String,Object> session);
③org.apache.struts2.interceptor.ApplicationAware
注入application对应的Map对象,该接口只有一个方法:public void setApplication(Map<String,Object> application);
1.通过ServletActionContext类访问ServletAPI对象
与ServletAPI解耦的方式只能获取到ServletAPI对象对应的Map对象,并不能真正的获取到ServletAPI对象,在开发中避免不了要使用对象中的其他方法,此时便可以使用org.apache.struts2.ServletActionContext类来获取API对象,该类是ActionContext的子类,并提供了以下方法:
①public static HttpServletRequest getRequest():得到HttpServletRequest对象
②public static ServletContext getServletContext():得到ServletContext对象
③public static HttpServletResponse getResponse():得到HttpServletResponse对象
注意:
此类中并没有提供getSession方法,因为session对象可以通过request.getSession()来获取
2.实现接口来访问ServletAPI对象
类似于实现RequestAware、SessionAware等接口的方式,Struts也可以通过实现以下接口来访问ServletAPI对象:
①org.apache.struts2.interceptor.ServletRequestAware
获取HttpServletRequest对象
②org.apache.struts2.interceptor.ServletResponseAware
获取HttpServletResponse对象
③ org.apache.struts2.util.ServletContextAware
获取ServletContext对象
使用与ServletAPI解耦的方式
使用与ServletAPI耦合的方式
一、使用与ServletAPI解耦的方式
1.使用ActionContext类获取ServletAPI对应的Map对象
为了避免与Servlet耦合在一起,方便Action类的测试,Struts2提供了 普通的Map对象替代了ServletAPI中的对象(HttpServletRequest、HttpSession、ServletContext等)。通过ActionContext类可以在Action类中可以直接访问他们对应的Map对象。 com.opensymphony.xwork2.ActionContext类是Action执行的上下文,可以通过下面的方式获取ServletAPI对应的Map对象
①public Map getSession():获取HttpSession对应的Map对象
②public Map getApplication():获取ServletContext对应的Map对象
③public Object get(Object key):ActionContext类没有提供getRequest()这样的方法来获取HttpServletRequest对应的Map对象,只能使用此方法并传递一个参数来表示获取对应的对象
如:
- //ActionContext类不能通过new的方式创建对象,其提供了getContext()方法
- ActionContext ac=ActionContext.getContext();
- //获取Session对应的Map对象
- Map<String,Object> session=ac.getSession();
- //获取Request对应的Map对象
- Map<String,Object> request=(Map<String,Object>)ac.get("request");
- //获取application对应的Map对象
- Map<String,Object> application=ac.getApplication();
- //放入数据
- session.put("key", "value");
- //.....
除了使用ActionContext类来获取Map对象还可以使用实现接口的方式,实现接口后Struts2在运行时将会自动注入ServletAPI对应的Map对象
①org.apache.struts2.interceptor.RequestAware
注入request对应的Map对象,该接口只有一个方法:public void setRequest(Map<String,Object> request)
②org.apache.struts2.interceptor.SessionAware
注入session对应的Map对象,该接口只有一个方法:public void setSession(Map<String,Object> session);
③org.apache.struts2.interceptor.ApplicationAware
注入application对应的Map对象,该接口只有一个方法:public void setApplication(Map<String,Object> application);
如:
- package com.wzj.action;
- import java.util.Map;
- import org.apache.struts2.interceptor.ApplicationAware;
- import org.apache.struts2.interceptor.RequestAware;
- import org.apache.struts2.interceptor.SessionAware;
- import com.opensymphony.xwork2.ActionSupport;
- public class HelloWorldAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
- /**
- * 定义成员变量
- */
- private Map<String,Object> request;
- private Map<String,Object> session;
- private Map<String,Object> application;
- /**
- * 当Struts2处理请求时,在默认配置下调用的方法
- */
- @Override
- public String execute() throws Exception {
- //执行时Map对象已被框架自动赋值
- request.put("key", "value");
- session.put("key", "value");
- application.put("key", "value");
- return SUCCESS;
- }
- @Override
- public void setApplication(Map<String, Object> _request) {
- this.request=_request;
- }
- @Override
- public void setSession(Map<String, Object> _session) {
- this.session=_session;
- }
- @Override
- public void setRequest(Map<String, Object> _application) {
- this.application=_application;
- }
- }
解释:注入,其实就是通过框架自动对Action中的属性赋值。二、使用与ServletAPI耦合的方式
1.通过ServletActionContext类访问ServletAPI对象
与ServletAPI解耦的方式只能获取到ServletAPI对象对应的Map对象,并不能真正的获取到ServletAPI对象,在开发中避免不了要使用对象中的其他方法,此时便可以使用org.apache.struts2.ServletActionContext类来获取API对象,该类是ActionContext的子类,并提供了以下方法:
①public static HttpServletRequest getRequest():得到HttpServletRequest对象
②public static ServletContext getServletContext():得到ServletContext对象
③public static HttpServletResponse getResponse():得到HttpServletResponse对象
注意:
此类中并没有提供getSession方法,因为session对象可以通过request.getSession()来获取
如:
- HttpServletRequest request=ServletActionContext.getRequest();
- ServletContext application=ServletActionContext.getServletContext();
- HttpServletResponse response=ServletActionContext.getResponse();
- //session通过request获取
- HttpSession session=request.getSession();
类似于实现RequestAware、SessionAware等接口的方式,Struts也可以通过实现以下接口来访问ServletAPI对象:
①org.apache.struts2.interceptor.ServletRequestAware
获取HttpServletRequest对象
②org.apache.struts2.interceptor.ServletResponseAware
获取HttpServletResponse对象
③ org.apache.struts2.util.ServletContextAware
获取ServletContext对象
如:
- package com.wzj.action;
- 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;
- import com.opensymphony.xwork2.ActionSupport;
- public class HelloWorldAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
- private HttpServletRequest request;
- private HttpServletResponse response;
- private ServletContext application;
- /**
- * 当Struts2处理请求时,在默认配置下调用的方法
- */
- @Override
- public String execute() throws Exception {
- //....在这里正常使用request,response,application等对象就可以了
- return SUCCESS;
- }
- @Override
- public void setServletContext(ServletContext arg0) {
- this.application=arg0;
- }
- @Override
- public void setServletResponse(HttpServletResponse arg0) {
- this.response=arg0;
- }
- @Override
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }