1.1 Jsp中腳本片段,聲明,表達式 1.1.1 腳本片段 <% %> <% String str1 = "局部變數"; // 局部代碼段,這裡面的代碼都是局部的 %> 1.1.2 聲明 <%! %> <%! String str1 = "全局變數"; // 全局代碼段,這裡面的代碼都是全局的 % ...
1.1 Jsp中腳本片段,聲明,表達式
1.1.1 腳本片段 <% %>
<% String str1 = "局部變數"; // 局部代碼段,這裡面的代碼都是局部的 %>
1.1.2 聲明 <%! %>
<%! String str1 = "全局變數"; // 全局代碼段,這裡面的代碼都是全局的 %>
1.1.3 表達式<%= >
<%= //稱作jsp表達式,用於將已經聲明的變數或者表達式輸出到網頁上面。 %>
1.2 註釋
1.2.1 html註釋
<!--
<%
System.out.println("html註釋裡面的代碼依舊會執行");
%>
-->
1.2.2 jsp註釋
<%--
System.out.println("jsp註釋中的代碼不會執行");
--%>
1.3 jsp 本質
jsp本質是servlet;
jsp編譯後或變成xxx_jsp.java,xxx_jsp.class;
jsp編譯後放的目錄:工作空間\.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\myWeb01\org\apache\jsp
1.3.1編譯後的路徑
1.3.2 編譯後的代碼
3、JSP9大內置對象
final javax.servlet.http.HttpServletRequest request; // request請求對象 作用域
final javax.servlet.http.HttpServletResponse response; // response響應對象
final javax.servlet.jsp.PageContext pageContext; // pageContext 當前頁面上下文 作用域
javax.servlet.http.HttpSession session = null; // session 會話 作用域
final javax.servlet.ServletContext application; // application 伺服器 作用域
final javax.servlet.ServletConfig config; // config 配置對象
javax.servlet.jsp.JspWriter out = null; // out 輸出對象
final java.lang.Object page = this; // page 當前頁面對象
exception // exception 異常對象
4、亂碼問題
4.1 請求亂碼問題
4.1.1 post請求亂碼
request.setCharacterEncoding("utf-8");
4.1.2 get請求亂碼問題
tomcat8以後預設編碼格式是utf-8,之前是iso-8859-1,所以所以現在的get請求很少有亂碼問題;
//get請求亂碼處理。兩種方式:
//方式1:修改server.xml,強制指定參數傳輸中的字元集編碼方式
//在修改tomcat預設埠配置項中,增加一個參數
URIEncoding="UTF-8"
//註意tomcat8.5版本後,預設對get請求已經變成了utf-8,不需要增加,以前是ISO-8859-1
//方式2:修改server.xml,在修改tomcat預設埠中,
增加useBodyEncodingForURI = "true"
//註意此配置是針對get請求亂碼,讓其使用post的請求處理方式(一般不需要)
//方式3:強制轉碼,前提你要知道來源編碼,才可以轉目標編碼URIEncoding="ISO-8859-1" ->目標編碼 UTF-8
userName = new String(userName.getBytes("ISO-8859-1"),"UTF-8");
4.2 響應亂碼
//設置響應頭的編碼,頁面接收響應的編碼,頁面以什麼編碼接收後端響應回來的內容
response.setHeader(“Content-Type”, “text/html;charset=UTF-8”);
//後端以什麼編碼響應給前端
response.setCharacterEncoding(“UTF-8”);
5、轉發和重定向的區別
5.1 轉發和重定向
//轉發到成功頁面
//轉發是客戶端行為
request.getRequestDispatcher("success.jsp").forward(request, response);
//重定向到登錄頁面
//重定向是客戶端行為
response.sendRedirect("userLogin.jsp");
5.2 跳轉資源不同
轉發訪問的資源僅限於服務內部所有資源,不可以訪問外部資源,但是重定向可以(除WIN-INFO之外);
//使用重定向跳轉到百度頁面 可以
response.sendRedirect("https://www.baidu.com");
//使用重定向跳轉到百度頁面 可以
response.sendRedirect("https://www.baidu.com");
5.3 對WEB-INFO的訪問不同
轉發可以訪問到WEB-INFO下的資源,重定向不可以訪問到;
//使用轉發,跳轉到WEB-INF安全目錄中的頁面 可以
request.getRequestDispatcher("../WEB-INF/OK.jsp").forward(request, response);
//使用重定向跳轉到WEB-INF安全目錄中的頁面 不可以
response.sendRedirect("../WEB-INF/OK.jsp");
5.4 "/"代表的含義不同
// 此處的 / 交給伺服器進行解析,代表的是應用根目錄(ip+埠+項目發佈資源名)
request.getRequestDispatcher("/success.jsp").forward(request, response);
//導航欄跳轉的路徑:http://localhost:8096/kh96-01/doLogin2.jsp "/"表示ip+埠+項目發佈資源名
//此處的 /交給瀏覽器進行解析,代表的是站點(ip+埠)
response.sendRedirect("/userLogin.jsp");
//導航欄跳轉的路徑:http://localhost:8096/userLogin.jsp "/"表示ip+埠 沒有項目名
5.5 總結
轉發和重定向的區別(牢記:轉發是伺服器端行為,重定向是客戶端行為):
- 轉發訪問的資源僅限於服務內部所有資源,不可以訪問外部資源,但是重定向可以(除WIN-INFO之外);
- 轉發轉發的地址欄顯示的地址是首次訪問的地址,後續所有的轉發操作都是內部實現的,地址欄看不到,只顯示第一次請求的地址,但是重定向的地址欄顯示的是最後一次的地址欄;
- 轉發"/"代表的含義不同,轉發是交給伺服器處理,而重定向是交給瀏覽器處理,代表站點;
- 轉發轉發會攜帶請求,不會重新發起請求,全程request對象只用一個;重定向每次都是瀏覽器發起的,都是一個新的請求,即request對象每次都是新的;
6、request 請求對象 (作用域)
可以轉發;
方法 | 說明 |
---|---|
getParameter("name") | 獲取表單提交的數據 |
setArrribute(Stirng key,Obbject value); | 保存一次請求的數據 |
getArrribute(Stirng key) | 過去請求中存放的數據 |
7、response 響應對象
可以重定向;
8、session 會話 (作用域)
session的會話跟蹤機制:
-
session是瀏覽器和伺服器之間的一次通話,首次訪問任何一個jsp頁面,服務端會自動給當前訪問的用戶創建一個唯一的session對象並將該session對象的唯一標識sessionid返回給瀏覽器,瀏覽器拿到該sessionid後,會自動保存到瀏覽器的記憶體中,當瀏覽器再次發起新的請求時,會自動將記憶體中保存的sessionid作為參數提交到服務端,如:JSESSIONID=6F3973CF90CE1401DA6987D35CB6BD10
-
服務端拿到該sessionid,就可以自動獲取到對應的那個session對象,進而就可以通過session對象獲取用戶數據,當瀏覽器關閉(退出進程),記憶體中保存的sessionid就自動釋放,重新打開瀏覽器,訪問jsp請求到伺服器端,由於沒有了sessionid,伺服器端就不知道session對象是哪個,預設是新用戶請求,會重新再創建新的session對象,返回給瀏覽器端,重覆上述操作。
方法 | 說明 |
---|---|
getId() | 獲取sessionId |
session.setAttribute("key","value"); | 存放參數 |
session.getAttribute("keys"); | 獲取參數 |
session.invalidate(); | 清除session對象 |
session.removeAttribute("key"); | 移除參數 |
session.setMaxInactiveInterval(10); | 設置session超時時間,秒 |
8.1session會話清除機制
8.1.1 方式1:程式主動清除session對象,session.invalidate();
//通知伺服器端,立刻刪除當前用戶的session對象,伺服器中對應的session對象就不存在,之前保存的用戶信息就無效,下一次就必須登錄
session.invalidate();
8.1.2 session.removeAttribute(String key);
// 方式2:程式主動刪除屬性,是伺服器端session對象中保存的某個屬性,session.removeAttribute(String key);
session.removeAttribute("sessionUser");
8.1.3 務器主動刪除,通過設置伺服器端session會話對象的超時時長
// 方式3:伺服器主動刪除,通過設置伺服器端session會話對象的超時時長,達到時長,自動刪除,單位是 秒
session.setMaxInactiveInterval(10);
8.1.4 伺服器主動刪除,通過修改伺服器預設session超時時長配置
// 方式4:伺服器主動刪除,通過修改伺服器預設session超時時長配置,tomcat中預設session對象的超時時長是:30分鐘
// tomcat的預設配置文件:tomcat目錄下/conf/web.xml中有預設配置,如果需要修改,就講如下配置,拷貝到自己項目中的web.xml中
<session-config>
<session-timeout>10</session-timeout>
</session-config>
// 註意:不是說session對象超時就是30分鐘,如果在30分鐘內有操作session對象,超時會順延,只有沒有操作到達30分鐘,才會刪除。
9、四大作用域
作用域 | 範圍 |
---|---|
pageContext | 當前頁面 |
request | 當前請求 |
session | 當前會話 |
application | 當前伺服器(應用) |
範圍大小:pageContext < request < session < application;
10、cookie
cookie創建:Cookie cookie = new Cookie("userRem",userName+"-"+userPwd);
方法 | 說明 |
---|---|
cookie.setMaxAge(10 * 60); | 設置過期時間,單位:秒 |
response.addCookie(cookie); | 響應返回cookie |
request.getCookies(); | 從請求中獲取cookie數組 |
cookie.getName(); | 獲取cookie的name |
cookie.getValue(); | 獲取cookie的value |
11、定製錯誤頁面
<!-- 可能會發生錯誤的頁面 -->
<%@page errorPage="500.jsp" %>
<!-- 定製的錯誤頁面 -->
<%@ isErrorPage = "true"%> <!-- 只用寫了這個才能使用exception對象 -->
<%=exception.getMessage() %> <!-- 通過ecxeption對象輸出錯誤信息 -->
12、引入頁面
12.1 靜態導入
先將頁面jsp導入,再將兩個頁面合成的jsp再編譯;(註意變數衝突,引入頁面的變數和本頁面的變數會衝突)
<%@ include file="top.jsp"%>
舉例:
main.jsp
<!--引入頂部頁面 -->
<%@ include file="top.jsp"%>
top.jsp
<h2>頂部頁面</h2>
12.2 動態導入
先編譯你兩個頁面,再引入頁面;(不會產生變數衝突)
<jsp:include page="botton.jsp"/>
舉例:
main.jsp
<!--引入頂部頁面 -->
<jsp:include page="botton.jsp"/>
botton.jsp
<h2>底部頁面</h2>
被編譯後的文件目錄: