• Struts2访问Servlet API的三种方式


    有时我们需要用到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了。
  • 相关阅读:
    【FROM】java控件重绘AWT/SWINGPainting in AWT and Swing (EN)
    linux yum使用管理详细使用
    远程控制 vc++实现
    java 鼠标事件Dragged和Moved 及java显示GIF在JLabel、JButton
    C语言字符串函数大全
    C# 训练场(四)创建系统热键,并向活动窗口输入信息
    潜移默化学会WPF(样式) DataGrid(转载)
    时间查询
    Sqlserver2012 根据数据库mdf文件生成log文件,解决无法附加mdf文件
    我知道的一些 ”运行“ 窗体下的命令,个人使用
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653268.html
Copyright © 2020-2023  润新知