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

SSH (Struts2+Spring+Hibernate) 分頁查詢報 NumberFormatException:Session 不一致導致 currentPage 為 null

     編輯:程式設計綜合問答

錯誤堆疊

java.lang.NumberFormatException: For input string: "null"
at java.lang.Integer.parseInt(String.valueOf(session.getAttribute("currentpage")))

根因分析

Action 中混用了兩種 Session 取得方式:

  • `session.getAttribute("songlist")` → **ActionContext.getContext().getSession()** 返回的 Map(Struts2 封裝)。
  • `request.getSession().getAttribute("currentpage")` → **原生 HttpSession**。

**兩者不一定指向同一個 Session 實例**,尤其在攔截器、插件、集群、序列化場景下。導致 `getSongByName` 存入的 `currentpage` 用 `request.getSession()` 取不到(為 `null`),轉字串 `"null"` 再 `parseInt` 拋異常。

解決方案:統一使用 Struts2 Session Map

// 在 Action 實作 SessionAware 接口
public class SongAction extends ActionSupport implements SessionAware {
    private Map sessionMap; // Struts2 注入的 Session Map

    @Override
    public void setSession(Map session) {
        this.sessionMap = session;
    }

    // 存取統一用 sessionMap
    public String search() {
        // ...
        sessionMap.put("songlist", songlist);
        sessionMap.put("currentpage", 1); // 直接存 Integer,避免轉型
        // ...
    }

    public String nextPage() {
        @SuppressWarnings("unchecked")
        List list = (List) sessionMap.get("songlist");
        Integer current = (Integer) sessionMap.get("currentpage"); // 直接取 Integer
        if (current == null) current = 1;
        current++;
        sessionMap.put("currentpage", current);
        // ...
    }
}

JSP 頁面同步修正

<%-- 使用 Struts2 標籤或 EL 表達式,避免直接操作 request.getSession() --%>
<s:if test="%{#session.currentpage != null && #session.pagenumber != null}">
  <s:if test="%{#session.currentpage lt #session.pagenumber}">
    <a href="SongManage_nextPage">下一頁</a>
  </s:if>
</s:if>

核心原則

  • **Struts2 Action 中永遠使用 `SessionAware` 注入的 `Map` 操作 Session**。
  • 不要混用 `request.getSession()`、`ActionContext.getContext().getSession()`。
  • 存入數值型別(`Integer`、`Long`)而非字串,取出時直接轉型,避免 `String.valueOf(null)` → `"null"` 陷阱。

總結

`NumberFormatException: "null"` 經典原因是 **Struts2 Session Map 與原生 HttpSession 不一致**。實作 `SessionAware` 統一存取,問題徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved