初學JSP,創建了兩個頁面jspForward.jsp與login.jsp
jspForward.jsp裏使用了請求轉發標誌,是一箇中轉頁面:
<jsp:forward page="login.jsp">
<jsp:param name="userName" value="張三" />
</jsp:forward>
login.jsp則是一個簡單的表單用以獲取從jspForward.jsp傳來的param:
<form>
<input name="name" type="text" value="<%=request.getParameter("userName") %>"/>
</form>
結果訪問jspForward.jsp自動跳轉之後,login.jsp獲得的用戶名亂碼
最終在嘗試了多重方法之後發現,在jspForward.jsp(也就是請求傳遞參數的jsp)裏設置request.setCharacterEncoding("UTF-8");
login.jsp獲得的用戶名才正常顯示爲“張三”
百度搜索也搜索不到原理。 畢竟這是一個入門級的小標籤。 在以後也許根本都用不着。
不過我還是自己認真研究分析了一下:
感覺 jsp:param 傳遞參數的方式與 URL?param=value 的形式差不多,但是jsp:param傳遞的參數並不會跟後者一樣在URL顯示出來。
所以後者解決亂碼既可以在傳遞參數的頁面設置,也可以在接收參數的頁面設置request.setCharacterEncoding("UTF-8");
而jsp:param解決亂碼卻只能跟我剛剛說的一樣,只能在傳遞參數的頁面設置,也許是使用jsp:param傳遞參數在傳遞的過程中改變了其request對象的性質,卻依然保留着request的命名,所以在login.jsp(也就是已經獲取參數的jsp中)中雖然你已經獲取了這個名爲request,但實質上已經變質的東西。所以這個時候設置request.setCharacterEncoding("UTF-8")已經無意義了(因爲這是未變質前的方法),但是你仍然能獲取到這個值(也就是說request.getParameter("userName")),儘管它顯示爲亂碼。所以你需要在傳遞值之前也就是在jspForward.jsp設置request.setCharacterEncoding("UTF-8");這個時候才能成功改變你傳的值的編碼,這樣的話,儘管jsp:param在傳遞過程中已經變質,但實際上內容已經改變了。所以在login.jsp中也能正常顯示。
當然,以上內容純屬自己的猜想,我並不清楚其真正的原理,不喜勿噴。不過這裏提到的解決方法是有效無疑的。