Struts2之Action类访问Servlet API

2018-05-10 18:57:32 浏览数 (1)

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域中的属性
代码语言:javascript复制
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表达式获取
代码语言:javascript复制
    <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类中使用
代码语言:javascript复制
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中的对象,可以使用的功能更加强大,因此推荐使用

0 人点赞