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

Servlet 核心區別:request.getParameter() vs getAttribute() 深度解析

     編輯:Java 綜合教學

Servlet 核心區別:request.getParameter() vs getAttribute() 深度解析

在 Java Web 開發中,HttpServletRequest 的 getParameter() 與 getAttribute() 是最常用也最易混淆的兩個方法。本文從數據來源、生命週期、類型、典型場景四個維度徹底釐清二者區別。

一、核心區別速查表

維度getParameter()getAttribute()
數據來源HTTP 請求參數(URL 查詢字符串、POST 表單體、multipart 文件上傳)服務器內部設置(Servlet/JSP/Filter 通過 setAttribute 存入)
生命週期隨請求創建,請求結束銷毀隨請求創建,請求結束銷毀(但可跨 forward 傳遞)
數據類型永遠是 String(或 String[])任意 Object
可讀/可寫只讀(無 setParameter)可讀可寫(setAttribute/getAttribute)
典型場景接收前端提交的表單數據、查詢參數請求轉發(forward)時在組件間共享數據、Filter 預處理結果傳遞
作用域整個 Web 應用可見(客戶端可構造)僅在服務端請求處理鏈中可見

二、getParameter():接收客戶端輸入

1. 來源

  • GET 請求:?username=zhangsan&age=20 → request.getParameter("username") 返回 "zhangsan"
  • POST 表單:Content-Type: application/x-www-form-urlencoded,Body 同 GET 格式
  • Multipart 文件上傳:需配置 @MultipartConfig 或 Commons FileUpload 解析

2. 代碼示例


// JSP 表單提交
<form method="post" action="process.jsp">
  用戶名:<input name="username">
  <input type="submit">
</form>

// process.jsp 接收
String username = request.getParameter("username"); // 返回 String
String[] hobbies = request.getParameterValues("hobby"); // 多值字段(如 checkbox)

三、getAttribute()/setAttribute():服務端組件協作

1. 核心用途:RequestDispatcher.forward() 跨組件傳遞對象


// A.jsp / Servlet A:設置屬性並轉發
request.setAttribute("user", userObject); // 存入任意對象
request.getRequestDispatcher("/B.jsp").forward(request, response);

// B.jsp / Servlet B:獲取屬性
User user = (User) request.getAttribute("user"); // 需強制轉型

關鍵點:forward 時 同一個 Request 對象 傳遞給目標資源,屬性得以保留。而 redirect (sendRedirect) 會發起新請求,屬性丟失(需用 Session)。

2. 內部屬性 vs 參數

  • 參數由容器解析 HTTP 報文自動填充,不可修改(無 setParameter)。
  • 屬性由開發者手動 setAttribute,完全可控,可存放 JavaBean、List、Map、Connection 等任意對象。

四、實戰對比:同一數據兩種傳遞方式

場景方案 A:參數傳遞方案 B:屬性傳遞
JSP → Servlet<a href="servlet?uid=1001"> → getParameter("uid")不可直接用(需前端構造 URL)
Servlet → JSP (forward)不可用(參數不隨 forward 傳遞)setAttribute("user", u) → getAttribute("user") ✓
Filter → Servlet不可用setAttribute("cleanParam", val) → getAttribute("cleanParam") ✓
攜帶複雜對象需序列化為 JSON/字符串,繁瑣且易出錯直接存放對象引用,類型安全、性能高 ✓

五、深度理解:容器內部機制

  • getParameter:容器解析 HTTP Body/QueryString → 填充 ParameterMap(通常是 HashMap<String, String[]>) → 只讀暴露。
  • getAttribute:容器為每個 Request 創建 AttributeMap(HashMap<String, Object>) → 開發者隨意增刪改查。

六、JavaScript 與 JSP 參數傳遞誤區

誤區:嘗試在 JSP 中直接讀取 JavaScript 變量,或在 JS 中直接讀取 JSP 變量。
真相:JS 運行在瀏覽器(客戶端),JSP 運行在服務器,兩者不同運行時,無法直接訪問彼此變量。
正確橋接:

  1. JSP → JS:<script> var uid = '<%= userId %>'; </script>(模板渲染時內嵌)
  2. JS → JSP/Servlet:表單隱藏域 <input type="hidden" name="uid" id="uid"> + JS 賦值 document.getElementById('uid').value = xxx → 提交表單 → getParameter("uid")

七、總結:選擇指南

  • 接收瀏覽器提交的數據 → getParameter()
  • 服務端組件間(Servlet、JSP、Filter)通過 forward 傳遞Java 對象 → setAttribute()/getAttribute()
  • 需跨請求(redirect、多頁面流程)共享 → 使用 HttpSession 或 數據庫/Redis。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved