1. 程式人生 > 其它 >JSP及Cookie,Session

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

  1. 執行過程:
    • 把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響應給瀏覽器
  2. 為什麼hello_jsp.java是一個Servlet

三、頁面元素

  1. 靜態內容
    就是html,css,javascript等內容
  2. 指令
    以<%@開始 %> 結尾,比如<%@page import="java.util.*"%>
  3. 表示式 <%=JAVA表示式%>
    用於輸出一段html
  4. Scriptlet
    在<% JAVA程式碼 %> 之間,可以寫任何java 程式碼
  5. 宣告
    在<%! 欄位或方法%> 之間可以宣告欄位或者方法。但是不建議這麼做。
  6. 動作
    <jsp:include page="Filename" > 在jsp頁面中包含另一個頁面。
  7. 註釋 <%-- --%>
    不同於 html的註釋 通過jsp的註釋,瀏覽器也看不到相應的程式碼,相當於在servlet中註釋掉了

注意:

  1. <%="hello jsp"%>相當於<%out.println("hello jsp");%>

    out是jsp的隱式物件

    <%=%>不需要分號結尾,<%%>需要分號結尾,同java

  2. 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

  1. 指令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" %>
    
  2. 動作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的一次獨立的訪問,就會有傳參的需要

  1. 在hello.jsp中使用<jsp:include,並通過<jsp:param帶上引數

    <jsp:include page="footer.jsp">
    	<jsp:param name="year" value="2017" />
    </jsp:include>
    
  2. 在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 配置進行調整