1. 程式人生 > >struts2框架學習筆記3:獲取servletAPI

struts2框架學習筆記3:獲取servletAPI

ucc ati ica 實現 以及 vax color style http

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中的方法

實際開發中,常用的其實是第一種方式

struts2框架學習筆記3:獲取servletAPI