首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Struts2 解耦與耦合兩種方式訪問 Servlet API

     編輯:Java 綜合教學

為何要解耦

Action 直接依賴 HttpServletRequest 等 Servlet API 會導致:

  • 單元測試需啟動 Servlet 容器
  • 程式碼與 Web 層強綁定,難以復用

Struts2 提供三個 Map 替代:

  • request → ActionContext.getContext().getParameters() 或 getSession()
  • session → ActionContext.getContext().getSession()
  • application → ActionContext.getContext().getApplication()

方式一:完全解耦(推薦)

public class LoginAction implements Action {
    private String username, password;

    public String execute() {
        if ("1".equals(username) && "1".equals(password)) {
            Map<String, Object> session = ActionContext.getContext().getSession();
            session.put("uname", username);
            return SUCCESS;
        }
        return LOGIN;
    }
    // getter/setter 略
}

方式二:注入 Map(SessionAware)

public class LoginAction implements Action, SessionAware {
    private Map<String, Object> sessionMap;

    public void setSession(Map<String, Object> map) { this.sessionMap = map; }

    public String execute() {
        if ("1".equals(username) && "1".equals(password)) {
            sessionMap.put("uname", username); // 直接操作注入的 Map
            return SUCCESS;
        }
        return LOGIN;
    }
}

方式三:耦合訪問(不推薦)

3.1 通過 ServletActionContext

HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("uname", username);

3.2 實現 ServletRequestAware 注入 Request

public class LoginAction implements Action, ServletRequestAware {
    private HttpServletRequest request;
    public void setServletRequest(HttpServletRequest req) { this.request = req; }
    // 後續直接用 request.getSession()
}

struts.xml 配置

<action name="loginAction" class="cn.happy.action.LoginAction">
    <result name="success">/s.jsp</result>
    <result name="login">/login.jsp</result>
</action>

比較總結

方式耦合度測試難度適用場景
ActionContext Map零耦合極易通用業務、單元測試優先
注入 Map (Aware)低易需明確語義的 session/request
ServletActionContext高難需直接操作 Servlet API 特有功能
注入 Servlet API最高最難極少見,避免使用

最佳實踐

  • 優先使用 ActionContext 或 Aware 接口。
  • 只有在整合舊代碼、需直接操作 HttpServletResponse 設定 Header/Cookie 時才考慮耦合方式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved