zoukankan      html  css  js  c++  java
  • 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中的方法

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

  • 相关阅读:
    修改python默认版本
    Ansible基础
    day21
    paramiko上传文件到Linux
    参考书籍
    C++解析三
    块设备
    assert用法
    块设备驱动2
    块设备驱动1
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8456434.html
Copyright © 2011-2022 走看看