structs2如何获取web资源

来源:互联网 发布:张亮中餐厅知乎 编辑:程序博客网 时间:2024/05/16 02:20

什么是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;    }}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子看的鬼片不敢睡觉害怕怎么办 宝宝满月了脸还有点黄怎么办 我情人天天说没时间出去该怎么办 两个月宝宝下体三角区肿了怎么办 夏养的龙猫家里有味怎么办 不小心踩到仓鼠吐血了怎么办 不小心踩到仓鼠的头怎么办 母仓鼠生完孩子特别暴躁怎么办 被仓鼠咬出血怎么办要不要打针 被小仓鼠咬出血了该怎么办 仓鼠咬破手指流血了该怎么办 小仓鼠的手被棉花丝绑住了怎么办 荷兰猪如果不小心撞流血了怎么办 帮同事刷杯子但把杯子弄坏了怎么办 贵宾犬喜欢张开嘴巴跟人玩怎么办 鼻烟放了几天感觉跟受潮一样怎么办 两个月宝宝鼻屎堵住鼻子怎么办 肉包着智齿怎么办洗燥电影完整版 大腿内侧突然长黑痣越来越大怎么办 肚脐发炎、不脱落怎么办_妈网百科 老公出轨找个按摩的还不离婚怎么办 别人拿错钥匙装修好了房子怎么办 撞车后对方全责却不赔钱怎么办 我的世界国服客户端都是英文怎么办 下载的3d模型没有材质怎么办 写字时习惯把本子放歪该怎么办 被蚊子咬后留下硬疙瘩怎么办 吃冰镇西瓜导致呼吸不顺怎么办 吃冰镇西瓜嚓气导致呼吸不顺怎么办 在pr里面找不到做字幕的怎么办 电脑主机电源坏了接口坏了怎么办 邻居捡到我手机不给这种情况怎么办 婆婆总在儿子面前说媳妇坏话怎么办 试管准备取卵雌激素低该怎么办 订了火车票了忘记带身份证怎么办 网上买火车票忘记带身份证了怎么办 网上买的火车票忘记带身份证怎么办 深圳东站不卖站台票要送客怎么办 网吧刷身份证机器突然不好使怎么办 买了个衣服穿起来有点老气怎么办 美股主动退市股票钱怎么办