博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2访问Servlet API的三种方式
阅读量:7048 次
发布时间:2019-06-28

本文共 2269 字,大约阅读时间需要 7 分钟。

有时我们需要用到Request, Response, Session,Page, ServletContext这些我们以前常用的对象,那么在Struts2中怎么样使用到这些对象呢,通常有三种方式。

    *** 完全解耦合的方式

    *** 使用ServletActionContext中静态方法直接访问Servlet的API

    *** 使用接口注入的方式
一、完全解耦合的方式
如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API。
一些常用的方法如下:
 //private ActionContext context ;//该方法还可以取得值栈(getValueStack()),使用push(obj)往值栈中放数据    
    private Map request;  
    private Map session ;    
    private Map application ;  
    public LoginAction1(){  
       request = (Map)ActionContext.getContext().get("request");   //获取request  
       session = ActionContext.getContext().getSession();          //取得session  
       application = ActionContext.getContext().getApplication();   //取得application  
       request.put("r1","r1");  
       session.put("i1","i1");  
       application.put("a1","a1");  
       return SUCCESS;
     } 
二、使用ServletActionContext中静态方法直接访问Servlet的API
Struts2中提供了一个静态类,它里面的方法可以获取到我们的HttpServletResponse, HttpServletRequest。
ServletActionContext具体的方法如下
        * getPageContext();
        * getRequest()
        * getResponse();
        * getServletContext(); //也就是application对象
注意这里没有getSession(),我们可以通过request对象获取session对象
private HttpServletRequest request;  
private HttpSession session;  
private ServletContext application;  
public LoginAction(){  
request = ServletActionContext.getRequest(); //获取request对象 
session = request.getSession();  //由request获取session
application = session.getServletContext();  //由session获取application
}  
三、使用接口注入的方式
虽然Struts2提供了ActionContext来访问Servlet API,但是这种方式毕竟不能直接获取Servelt API实例,为了在Action中直接访问Servlet API,Struts2还提供了一系列接口。
ServletContextAware   实现此接口后,可以取得ServletContext
ServletRequestAware   实现此接口后,可以取得HttpServletRequest
ServletResponseAware 实现此接口后,可以取得HttpServletResponse
SessionAware         实现此接口后,可以取得HttpSession,注意,这里有点特殊,取得的是一个Map<String,Object> session,拦截器负责将session中存储的键值进行解析,并一一对应. 
所以我们通常的做法是:
public class BaseAction implements ServletResponseAware, ServletRequestAware,
   SessionAware {
protected HttpServletResponse response;
protected HttpServletRequest request;
protected Map<String, Object> session;
//省略了get和set方法
//下面就可以直接使用上面 response,request和session
}
了让BaseAction能有验证的功能,并且不能被实例化,开发中我们会这样做:
public abstract class BaseAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware 
然后让我们每个模块的Action来继承这个BaseAction类,然后我们就可以在Action中直接使用Servelt的API了。

转载于:https://www.cnblogs.com/kangsir/p/6653268.html

你可能感兴趣的文章
切图崽的自我修养-[ES6] 异步函数管理方案浅析
查看>>
关于性能优化的那点事——函数节流
查看>>
NPM简单入门
查看>>
Linux Namespace系列(05):pid namespace (CLONE_NEWPID)
查看>>
爬虫学习之基于Scrapy的网络爬虫
查看>>
基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)
查看>>
Docker利用Jexus独立版部署MVC Demo
查看>>
199. Binary Tree Right Side View
查看>>
ERR_INCOMPLETE_CHUNKED_ENCODING
查看>>
ReactiveCocoa与swift
查看>>
欧洲杯激战正酣,如何用大数据变身专家级球迷
查看>>
[LintCode] Longest Increasing Subsequence
查看>>
Best Time to Buy and Sell Stock(121)
查看>>
spring ApplicationListener&ApplicationEvent
查看>>
Design Pattern - Abstract Factory Pattern(译)
查看>>
Compass排版模块
查看>>
RD为什么也需要云
查看>>
运行 Docker 容器时的安全风险:别丢了你的套接字
查看>>
Laravel 添加自定义辅助函数
查看>>
【JVM类加载机制】从一个对象的验证问题说开去
查看>>