Struts2(二)使用Struts2访问ServletAPI对象

来源:互联网 发布:js读取cookie 编辑:程序博客网 时间:2024/06/05 09:18
        在前面的示例中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对象,只能使用此方法并传递一个参数来表示获取对应的对象

如:
//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");//.....
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);

如:

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处理请求时,在默认配置下调用的方法 */@Overridepublic String execute() throws Exception {//执行时Map对象已被框架自动赋值request.put("key", "value");session.put("key", "value");application.put("key", "value");return SUCCESS;}@Overridepublic void setApplication(Map<String, Object> _request) {this.request=_request;}@Overridepublic void setSession(Map<String, Object> _session) {this.session=_session;}@Overridepublic 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();

2.实现接口来访问ServletAPI对象
        类似于实现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处理请求时,在默认配置下调用的方法 */@Overridepublic String execute() throws Exception {//....在这里正常使用request,response,application等对象就可以了return SUCCESS;}@Overridepublic void setServletContext(ServletContext arg0) {this.application=arg0;}@Overridepublic void setServletResponse(HttpServletResponse arg0) {this.response=arg0;}@Overridepublic void setServletRequest(HttpServletRequest arg0) {this.request=arg0;}}


0 0