Struts2之Action类访问Servlet API

Action类访问Servlet API

  • 本人独立博客https://chenjiabing666.github.io
  • Struts2并未直接和Servlet API耦合,这是Struts2的一个改良之处。但是对于web应用控制器而言,不访问Servlet API是不可能,因此下面我们介绍三种方式访问Servlet API

ActionContext

  • 使用这个可以获取Servlet中HttpServletRequest,HttpSession,ServletContext

其中的方法

  • static ActionContext getContext()返回一个实例化ActionContext对象,用于调用下面的方法
  • Object get(key) 返回ActionContext中存放的键值对的值 其实这里获取的是Servlet中HttpServletRequest对象的属性
  • Object put(key,value) 向ActionContext中存放键值对,同样该方法用于存放HttpServletRequest的属性
  • Map getSession()返回一个Map对象,不过这个模拟了HttpSession的用法,只不过现在向其中存放键值对使用put,获取属性用get
  • Map getApplication()返回一个Map对象,不过这个模拟了Servlet中的ServletContext对象的方法。只不过存放和获取属性的方法用的分别是put和get
  • Map getParameters()获取所有的请求参数,类似调用HttpServletRequest对象的getParameterMap()方法
  • Map setSession(Map session)直接传入一个Map实例,将其中的kay-value转换成session的属性名和属性值
  • Map setApplication(Map application)直接传入一个Map实例,将Map实例中的key-value转换成属性名,属性值

使用

  • 如果想要使用这个类,当然需要实例化的对象,其中提供了一个获取对象的静态方法,就是上面方法中的第一个
  • 我们在Action方法中使用这个设置request域,session域中的属性
public class SimpleAction implements Action {
    @Override
    public String  execute(){
​
        ActionContext actionContext=ActionContext.getContext();  //获取实例化对象
        //向request域中存放键值对
        actionContext.put("name", "jack");
        //获取request域中的name值
        System.out.println(actionContext.get("name"));
​
        //向session中存放键值对
        actionContext.getSession().put("password", "123456");
​
        //向application中存放键值对
        actionContext.getApplication().put("a", "b");
​
        return SUCCESS;
    }
}
  • success.jsp 使用EL表达式获取
    <h1>success</h1>
    <h1>request域中的name:${requestScope.name}</h1>
    <h1>session域中的password: ${sessionScope.password }</h1>
    <h1>application域中的a: ${a }</h1>

总结

  • 虽说现在可以向各种域中添加属性获取属性,但是我们不可以移除属性,所以说这种方法不如直接使用Servlet API功能更加强大

实现接口访问Servlet API

  • 实现接口访问对一个Action类的污染实在太严重了,这个是不推荐使用的,可以了解一下

可以实现的接口

  • ServletContextAware实现该接口的Action可以直接访问用户请求的ServletContext实例
  • ServletRequestAware实现该接口的Action可以直接访问用户请求的HttpServletRequest实例
  • ServletResponseAware实现该接口的Action可以直接访问请求的HttpServletResponse实例

ServletActionContext(推荐)

  • 使用这个类可以直接获取HttpServletRequestHttpServletResponse等对象,其功能比第一种更加强大,因此推荐使用这种方式获取Servlet API

方法

  • PageContext getPageContext()取得web应用的PageContext对象
  • HttpServletRequest getRequest()获取HttpServletRequest对象
  • HttpServletResponse getResponse()获取HttpServletResponse对象
  • ServletContext getServletContext()获取ServletContext对象

使用

  • 我们在Action类中使用
public class SimpleAction implements Action {
    @Override
    public String  execute(){
​
        //获取Request域的对象
        HttpServletRequest request=ServletActionContext.getRequest();
        request.setAttribute("name", "jack");
​
        //获取Session域的对象
        HttpSession session=request.getSession();
        session.setAttribute("password", "123456");
​
        //获取Response的对象
        HttpServletResponse response=ServletActionContext.getResponse();
​
        return SUCCESS;
    }
}
​

总结

  • 直接获取Servlet API中的对象,可以使用的功能更加强大,因此推荐使用

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

day19_java基础加强_动态代理+注解+类加载器

        Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一。         代理模式的定义:为其他对象提供一种代理以控...

1174
来自专栏你不就像风一样

使用Filter过滤器+重写Request完美解决乱码问题

1203
来自专栏函数式编程语言及工具

Scalaz(59)- scalaz-stream: fs2-程序并行运算,fs2 running effects in parallel

    scalaz-stream-fs2是一种函数式的数据流编程工具。fs2的类型款式是:Stream[F[_],O],F[_]代表一种运算模式,O代表Str...

1936
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十一天 IO-递归&字节流&字符流【悟空教程】

递归就是“在一个方法内可以再次调用自身”,如下,method方法又调用了method方法。

1033
来自专栏PHP在线

PHP7新特性介绍

文内容根据PHP发布时的 new files 而来,链接地址 : PHP 7 new 特性一览 Added??operator Added <=> opera...

3686
来自专栏JavaEdge

Sharded源码分析1. 概述2. 继承关系3. 构造函数4. 哈希环的初始化数据定位

3004
来自专栏青青天空树

java导出Excel文件

  最近在java上做了一个EXCEL的导出功能,写了一个通用类,在这里分享分享,该类支持多sheet,且无需手动进行复杂的类型转换,只需提供三个参数即可:

3981
来自专栏醒者呆

编程语言的基础——搞定JavaIO

关键字:IO基础,JUnit生命周期,字节流,字符流,字符编码,对象流,序列化,反序列化 Java I/O 流是一组有顺序的,有起点和终点的字节集合。是对设...

4005
来自专栏逍遥剑客的游戏开发

C++的反射和序列化

1542
来自专栏我就是马云飞

Retrofit源码模拟

如果要进行网络请求,你可能会这样写一个简单的OKHttp请求 public class CallExector { public static fin...

22710

扫码关注云+社区

领取腾讯云代金券