structs2如何获取web资源

什么是web资源?

web资源指的是HttpServletRequest、HttpSession、ServletContext等原生的Servlet API。

如何访问web资源

  1. 和Servlet API解耦的方式:只能访问到有限的Servlet API对象,且只能访问其有限的方法。
    1. 通过ActionContext方法
    2. 实现XxxAware接口
  2. 和Servlet API耦合的方式:可以访问更多的Servlet API对象,且能访问其原声的方法。
    1. 通过ServletActionContext方法
    2. 实现ServletXxxAware 接口

通过ActionContext访问web资源

下面举的例子是以ActionContextest为Action类,input.jsp为显示页面,访问URL为:
".../input?otherParam=otherParamValue"

ActionContextest代码示例

package com.actiontest;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

public class ActionContextest {

    public ActionContextest() { }

    public String execute(){        

        ActionContext actionContext = ActionContext.getContext();
        /*
         * 通过getApplication方法获取Application对象的Map对象。
         */
        Map<String, Object> applicationMap = actionContext.getApplication();
        /*
         * 通过put方法可以向application域中传入参数
         */
        applicationMap.put("name", "icebear");
        /*
         * 通过get方法可以获取参数
         */
        String name = (String)applicationMap.get("name");
        System.out.println("name:" + name);

        /*
         * 通过getSession方法获取Session对象的Map对象。
         */
        Map<String, Object> sessionMap = actionContext.getSession();
        /*
         * 通过put方法可以向session域中传入参数
         */
        sessionMap.put("age", 11);
        /*
         * 通过get方法可以获取参数
         */
        int age = (Integer)sessionMap.get("age");
        System.out.println("age:" + age);

        /*
         * request的Map对象直接通过get方法传递request参数获取。
         */
        @SuppressWarnings("unchecked")
        Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
        /*
         * 通过put方法传递参数
         */
        requestMap.put("sex", "male");
        /*
         * 通过get方法获取参数
         */
        String sex = (String)requestMap.get("sex");
        System.out.println("sex:" + sex);

        /*
         *  parameter的Map对象通过getParameters方法获取 。
         */
        Map<String, Object> paramsMap = actionContext.getParameters();
        /*
         * 可以通过put方法传入参数,但是该参数无法在转发的时候转发到另一个页面,即在jsp页面中无法通过
         * EL表达式获取该参数,所以实际上该方法没什么用。
         */
        paramsMap.put("param", "paramValue");
        /*
         * 可以通过get方法获取参数,其中param是上面的参数,而otherParam是URL传递过来的参数。
         * 通过URL传递的参数可以在转发的jsp页面中通过EL表达式获取到。
         */
        Object param = paramsMap.get("param");
        Object otherParam = paramsMap.get("otherParam");
        System.out.println("param:" + param);
        /*
         *  要注意的是,通过URL传递的参数可以是多个,所以实际上是一个数组对象。
         */
        System.out.println("OtherParam:" + ((String[])otherParam)[0]);


        return "success";
    }

}

效果如下:

ActionContext访问WEB


通过实现XxxAware接口访问web资源

下面例子的action类为ActionTestAware,显示页面为MyJsp.jsp,URL为:
.../MyJsp.jsp?param=thisisparam

代码示例:

package com.actiontest;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class ActionTestAware implements ApplicationAware, SessionAware, RequestAware, ParameterAware{

    public String execute(){
        /*
         * 通过实现XxxAware接口的方式比较简单,步骤如下:
         * 
         *  1. 让action类实现ApplicationAware、SessionAware、RequestAware、ParameterAware接口
         * 
         *  2. 定义相应的成员变量,application、session、request、parameter,类型都为Map。
         *
         *  3. 重写setApplication、setSession、setRequest、setParameter方法。
         *
         *  4.之后在方法里面就可以直接调用这些对象了。
         * 
         */
        application.put("name", "ice_bear");
        System.out.println("name:" + application.get("name"));

        session.put("age", 12);
        System.out.println("age:" + session.get("age"));

        request.put("sex", "female");
        System.out.println("sex:" + request.get("sex"));

        System.out.println("parameter:" + parameter.get("param")[0]);

        return "success";
    }

    private Map<String, Object> application;
    private Map<String, Object> session;
    private Map<String, Object> request;
    private Map<String, String[]> parameter;

    @Override
    public void setParameters(Map<String, String[]> parameter) {

        this.parameter = parameter;
    }

    @Override
    public void setRequest(Map<String, Object> request) {

        this.request = request;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;

    }

    @Override
    public void setApplication(Map<String, Object> application) {

        this.application = application;
    }
}

效果如下:

Xxx访问web资源

PS:需要提一下的是,在声明对象的时候不能给对象任何值,空值也不行,不然struct2实例化的对象会被覆盖掉。
PS:这里实际上是structs2帮我们调用setXxx方法。


ActionContext VS XxxAware

两个方式相比,我更倾向于用实现XxxAware接口的方式来访问web资源,因为使用ActionContext对象访问意味着你每创建一个方法就要实例化一个ActionContext类对象,然后再用这个类对象去实例化响应的域对象。然而用实现XxxAware的方法当你一次创建对象之后都可以使用,更能体现java对象复用的思想。


通过ServletActionContext访问

具体使用方法和上面一样所以这里只贴出相关的创建对象的方法:

代码示例


public class TestActionContext {

    public String execute(){
        //创建HttpServletRequest对象
        HttpServletRequest request = ServletActionContext.getRequest();
        //创建HttpSession对象
        HttpSession  session = request.getSession();
        //创建ServletContext对象
        ServletContext servletContext = ServletActionContext.getServletContext();

        return "succes";
    }
}

通过ServletXxxAware方法访问

代码示例

public class TestServletActionAware implements ServletResponseAware, ServletContextAware, ServletRequestAware{

    public String execute(){

        System.out.println(request.getClass());
        System.out.println(response.toString());
        System.out.println(servletContext.getClass());

        return "success";
    }

    private ServletRequest request;
    private ServletContext servletContext;
    private ServletResponse response;


    @Override
    public void setServletRequest(HttpServletRequest request) {

        this.request = request;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {

        this.servletContext = servletContext;
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {

        this.response = response;
    }
}

发布了35 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/jiujiuming/article/details/52588351