• struts2框架学习笔记3:获取servletAPI


    Struts2存在一个对象ActionContext(本质是Map),可以获得原生的request,response,ServletContext

    还可以获得四大域对象(Map),以及param参数(Map)等等

    ActionContext生命周期:每次请求都会创建一个与请求对应的ActionContext对象

    绑定当前线程(ThreadLocal),直接从ThreadLocal中获得即可

    请求处理完后,ActionContext对象销毁

    第一种获得方式:

        public String execute() throws Exception {
            //request域=> map (struts2并不推荐使用原生request域)
            //不推荐
            Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
            //推荐
            ActionContext.getContext().put("name", "requestTom");
            //session域 => map
            Map<String, Object> sessionScope = ActionContext.getContext().getSession();
            sessionScope.put("name", "sessionTom");
            //application域=>map
            Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
            applicationScope.put("name", "applicationTom");
            
            return SUCCESS;
        }

    注意:直接调用put方法在jsp中取值时候直接取即可${name},其他的(例如session):${sessionScope.name}

    第二种获取方式(不推荐):

        //不推荐
        public String execute() throws Exception {
            //原生request
            HttpServletRequest request = ServletActionContext.getRequest();
            //原生session
            HttpSession session = request.getSession();
            //原生response
            HttpServletResponse response = ServletActionContext.getResponse();
            //原生servletContext
            ServletContext servletContext = ServletActionContext.getServletContext();
            return SUCCESS;
        }

    看过源码发现,这里还是调用了ActionContext中的方法

    不推荐的原因:Struts2创造的目的就是避免原生的servlet

    第三种:

    实现接口

    package api;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    //如何在action中获得原生ServletAPI
    public class Demo extends ActionSupport implements ServletRequestAware {
        
        
        private HttpServletRequest request;
    
        public String execute() throws Exception { 
            
            System.out.println("原生request:"+request);
            return SUCCESS;
        }
    
        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
        }
    
        
    }

    response等等都是实现相应的接口即可

    原理:servletConfig拦截器的intercept方法中获取了原生的servletAPI,本质上还是调用了ActionContext中的方法

    实际开发中,常用的其实是第一种方式

  • 相关阅读:
    C#面向对象的三大特性概述
    SQL Server 低版本还原高版本的数据库
    将表转化成脚本的存储过程
    iis安装失败解决方法
    kafka consumer 配置详解
    C#解析XML文件
    blat
    REST接口POST方法发送文件到服务器(C#)
    http://www.codeproject.com/Questions/117324/uploadfileincwithHttpWebRequest
    PDF Password Remover
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8456434.html
Copyright © 2020-2023  润新知