雖然說jsp已經過時了,但是有時維護比較老的項目還是需要的。
下面說下,我使用jsp踩過的坑:
1.關于打印輸出
在jsp中輸出使用
out.println("hello");
而不是
System.out.println("hello");
如果在定義函數部分需要打印輸出,需要注入JspWriter
個對象。
<%! // 示例方法:模擬獲取用戶信息的方法String getUserInfo(String token, JspWriter out) {// 你的實際邏輯return "username";}
%>
<%String user = getUserInfo(token, out);
%>
2.關于頁面跳轉
response.sendRedirect(url);
如果使用該函數進行跳轉,有個問題需要注意:就是現在很多應用都是單頁面應用(SPA),如果遇到URL路徑中有“#”的情況下,服務端會忽略掉“#”后面的片段再進行跳轉,這樣會導致無法跳轉到正常的頁面上。
這時候建議使用前端跳轉,例如:
<!-- 統一由前端跳轉 -->
<script>
window.location.href = '<%= redirectUrl %>';
</script>
3.關于return
在java代碼部分,如果提前return,那么不止后面java代碼的命令不會被執行了,連前端代碼也不會被執行了。jsp頁面會終止所有輸出。
之前我一直以為只會終止java代碼部分,不會終止前端代碼部分。導致前端代碼一直沒被執行,排查了好久,才將問題排除出來。
4.參數獲取
request.getParameter
方法可以 統一獲取請求中的參數值,不論是通過 GET 還是 POST 方式提交的請求。
- 對于 GET 請求:參數在 URL 的查詢字符串中(即 ?name=value 那部分)。
- 對于 POST 請求:如果是表單提交,參數通常在請求體中。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>獲取參數示例</title>
</head>
<body>
<%// 獲取名為paramName的參數值String paramValue = request.getParameter("paramName");if (paramValue != null && !paramValue.isEmpty()) {out.println("參數值為: " + paramValue);} else {out.println("沒有提供參數或者參數為空。");}
%>
</body>
</html>
5.關于<%! %>
和<% %>
之前我一直以為兩個標簽是一個意思,所以把代碼放一起像js那樣使用,把聲明和調用按順序排下來。后來發現代碼不生效,才發現兩者是兩碼事。
<%! %>
:這個標簽用于聲明類級別的變量和方法。任何在<%! %>
標簽內定義的內容都會被插入到由JSP生成的Servlet類的主體中,但位于類的任意一個方法之外。這意味著你可以在<%! %>
標簽內聲明實例變量、靜態變量以及方法。
<% %>
:這個標簽被稱為JSP Scriptlet,允許你在JSP頁面中嵌入Java代碼段。Scriptlet中的代碼會被直接插入到由JSP生成的Servlet類的_jspService()方法中。這意味著任何在Scriptlet中聲明的變量都是局部變量,僅在該Scriptlet的作用域內有效。
總結來說,<%! %>
用于聲明在整個JSP頁面范圍內都可以訪問的方法或變量(即類級別),而<% %>
則用于編寫具體的Java代碼塊,這些代碼塊將作為Servlet的服務方法的一部分被執行(即方法級別)。兩者的主要區別在于它們定義的位置和作用范圍。