JSP及Cookie,Session
JSP
一、例項程式碼
<%@page ...... %>是jsp的page指令
contentType="text/html; charset=UTF-8" 是通知瀏覽器使用UTF-8進行中文解碼
pageEncoding="UTF-8" 是如果jsp中出現中文,使用UTF-8進行編碼
import="java.util.* 匯入其他類,多個類用逗號隔開
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> 你好 JSP <br> <%=new Date().toLocaleString()%>
二、為什麼jsp可以執行java程式碼
因為他被轉譯為Servlet
- 執行過程:
- 把hello_jsp.jsp轉譯為hello_jsp.java
- hello_jsp.java位於tomcat\work\Catalina\localhost_\org\apache\jsp,他是一個Servlet
- 把hello_jsp.java編譯為.class
- 執行hello_jsp,生成html
- http把html響應給瀏覽器
- 為什麼hello_jsp.java是一個Servlet
三、頁面元素
- 靜態內容
就是html,css,javascript等內容 - 指令
以<%@開始 %> 結尾,比如<%@page import="java.util.*"%> - 表示式 <%=JAVA表示式%>
用於輸出一段html - Scriptlet
在<% JAVA程式碼 %> 之間,可以寫任何java 程式碼 - 宣告
在<%! 欄位或方法%> 之間可以宣告欄位或者方法。但是不建議這麼做。 - 動作
<jsp:include page="Filename" > 在jsp頁面中包含另一個頁面。 - 註釋 <%-- --%>
不同於 html的註釋 通過jsp的註釋,瀏覽器也看不到相應的程式碼,相當於在servlet中註釋掉了
注意:
-
<%="hello jsp"%>相當於<%out.println("hello jsp");%>
out是jsp的隱式物件
<%=%>不需要分號結尾,<%%>需要分號結尾,同java
-
for迴圈
<%@ page language="java" contentType="text/html"; charset=UTF-8 pageEncoding="UTF-8" import="java.util.*" %> <% List<String> words=new ArrayList<String>(); words.add("Germany"); words.add("is"); words.add("the champion"); %> <table width="200px" align="center" border="1" cellspacing="0"> <%for (String word:words) {%> <tr><td><%=word%>></td></tr> <%} %> </table>
四、include
-
指令include
<%@include file="footer.jsp">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %> 你好 JSP <%@include file="footer.jsp" %>
-
動作include <jsp:include page="footer.jsp">
<%程式碼同上%> <jsp:include page="footer.jsp" />
區別
指令include:會被插入到hello.jsp,並轉譯為一個hello_jsp.java
動作include:不會被嵌入hello.jsp,還會有一個footer_jsp.java單獨存在,hello_jsp.java會在服務端訪問footer_jsp.java,然後把返回的結果嵌入到響應中
傳參
指令include會導致兩個jsp合併,所以不存在傳參,在hello.jsp中的變數是可以直接訪問的
動作include是對footer.jsp的一次獨立的訪問,就會有傳參的需要
-
在hello.jsp中使用
<jsp:include
,並通過<jsp:param
帶上引數<jsp:include page="footer.jsp"> <jsp:param name="year" value="2017" /> </jsp:include>
-
在footer.jsp中,使用request.getParameter("year")取出year
<hr> <p> copyright@<%=request.getParameter("year")%> </p>
五、跳轉
客戶端跳轉
<% response.sendRedirect("hello.jsp"); %>
服務端跳轉
<% request.getRequestDispatcher("hello.jsp").forward(request, response); %>
或者使用動作,簡化程式碼
<jsp:forward page="hello.jsp" />
六、Cookie
Cookie是瀏覽器和伺服器互動資料的方式,Cookie是由伺服器建立但不會儲存在伺服器。建立好之後傳送給瀏覽器,瀏覽器儲存在本地,下一次訪問網站時優惠吧Cookie傳送給伺服器
setCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie c = new Cookie("name", "Gareen");
c.setMaxAge(60 * 24 * 60);
c.setPath("/");
response.addCookie(c);
%>
<a href="getCookie.jsp">跳轉到獲取cookie的頁面</a>
setMaxAge(24*60*60)
表示Cookie可以保留一天,如果為0表示瀏覽器已關閉就銷燬
setPath("/")
Path表示訪問伺服器的所有應用都會提交這個cookie到服務端,如果是 /a ,就表示僅僅訪問 /a 路徑時才會提交cookie
response.addCookie(c)
表示通過response把cookie儲存在瀏覽器端
getCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie[] cookies = request.getCookies();
if (null != cookies)
for (int d = 0; d <= cookies.length - 1; d++) {
out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
}
%>
JSESSIONID 這個不是我們自己設定的cookie,這是tomcat設定的cookie
七、Session
Session翻譯為會話
會話是指從使用者開啟瀏覽器訪問一個網站開始,不論在這個網站中訪問了多少頁面,點選了多少連結,都屬於同一個會話,直到關閉瀏覽器為止。
setAttribute
session.setAttribute("name", "teemo");
類似於鍵值對
getAttribute
session.getAttribute("name");
根據name取出對應的值
Session與Cookie的關係
瀏覽器訪問伺服器
伺服器發現瀏覽器沒有JSESSIONID,就建立一個新的session,接著把資料放在session中
瀏覽收到響應,將JSESSIONID儲存在cookie中
之後瀏覽器再次訪問的時候將cookie給伺服器找到對應的session來取出資料
瀏覽器關閉Cookie的情況
可以使用response.encodeURL("getSession.jsp")
該方法會將jsp這個url轉換為
getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8
這樣提交JSessionID到伺服器。伺服器再匹配對應的session
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
session.setAttribute("name", "teemo");
%>
<a href="<%=response.encodeURL("getSession.jsp")%>">跳轉到獲取session的頁面</a>
更改預設session有效期
tomcat/conf/web.xml 中的session-config 配置進行調整