JSP筆記

在兩個月之前我一直把 JavaScript 簡寫爲 JSP,太丟人了。。。

配置文件就不加了

1.指令標識

(1)Page指令:定義整個JSP 頁面的相關屬性,這些屬性在 JSP 中被服務器解析成 Servlet 是會轉爲相應的 Java 代碼

Page 屬性: ①language:設置 JSP 頁面使用的語言

②extends:設置 JSP 頁面繼承的 Java 類,所有的 JSP 在執前都會被服務器解析成Servlet,不常用可能會影響服務器性能優化

③import:設置JSP導入的類包

④pageEncoding:定義JSP頁面的編碼格式,指定文件編碼

⑤contentType:設置JSP頁面的 MIME 類型和字符編碼,瀏覽器會據此顯示網內容

⑥session:該屬性指定JSP頁面是否使用 Http的Session 會話對象,屬性值是 boolean 類型,默認值爲 true

⑦buffer:設置JSP的out輸出對象使用的緩衝區大小,默認8KB

⑧autoFlush:設置JSP頁面緩衝區滿時,是否自動刷新緩存,默認值爲 true

⑨isErrorPage:設置當前JSP頁面爲錯誤處理頁面,以處理另一個頁面的錯誤

⑩errorPage:指定處理當前JSP頁面異常錯誤的另一個JSP頁面,前提必須設置JSP錯誤處理頁面isErrorPage 爲true,errorPage屬性的屬性值爲一個url字符串

 

(2)Include指令:文件包含指令,通過該指令可以在一個JSP頁面中包含另一個JSP頁面,但是該指令是靜態包含,被包含的文件的所有內容會被原樣包含到該JSP頁面中,即使被包含的頁面有JSP代碼,在包含時也不會被編譯執行,不能有相同的變量名。

 

(3)taglib指令:可以通過taglib指令聲明該頁面中所使用的標籤庫,同時引用標籤庫,並指定標籤的前綴

 

 

 

 

2.腳本標識

(1)JSP表達式用於向頁面中輸出信息

語法:<%= 表達式 %>

注意:<% 與 = 之間不可以有空格,= 與其後面的表達式之間可以有空格。

 

(2)聲明標識

語法:<%! 聲明變量或方法的代碼 %>

注意:<% 與 ! 之間不可以有空格,<%! 與 %>可以不在同一行。

通過聲明標識定義的變量和方法可以被整個JSP 頁面訪問,所以通常使用該標識定義整個JSP頁面需要引用的變量或方法。

說明:服務器執行JSP頁面時,會將JSP頁面轉換爲 Servlet 類,在該類中會把使用 JSP 聲明標識定義的變量和方法轉換爲類的成員和方法

示例代碼:

<%!

int number =0;//聲明全局變量

int count(){

number ++;

return number;

}

%>

通過上面的代碼聲明全局變量和全局方法後,在後面如果通過 <%= count() %>調用全局方法,則每次刷新頁面,都會輸出前一次值 +1 的值。

 

(3)腳本程序/代碼片段

語法:<% Java代碼或是腳本代碼 %>

注意:所謂 代碼片段 就是在 JSP 頁面中嵌入 Java 代碼 腳本代碼。代碼片段將在頁面請求的處理期間被執行。

1)通過 Java代碼 可以定義變量或是流程控制語句等;

2)通過 腳本代碼 可以應用JSP的內置對象在頁面輸出內容、處理請求和響應、訪問session會話等。

說明:代碼片段 與 聲明標識的區別是,通過聲明標識創建的變量和方法,在當前JSP頁面中有效,它的生命週期是從創建開始到服務器關閉結束;

而代碼片段創建的變量或方法,也是在當前JSP頁面中有效,但它的生命週期是頁面關閉後,就會被銷燬。

 

3.動作標識

 JSP共有以下6種基本動作

    jsp:include:在頁面被請求的時候引入一個文件,動態包含。

    jsp:useBean:尋找或者實例化一個JavaBean。

    jsp:setProperty:設置JavaBean的屬性。

    jsp:getProperty:輸出某個JavaBean的屬性。

    jsp:forward:把請求轉到一個新的頁面。

    jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記

 

4.JSP內置對象

九個request、response、out、session、application、config、page、exception、pageContext

(1)request

類型:Javax.servlet.http.HttpServletRequest

描述:來自客戶端的請求經Servlet容器處理後,由request對象進行封裝。注:客戶端和服務器的一次通信就是一次請求(發送請求或得到相應)。

作用域:request。說明,這次請求結束後,它的生命週期 就結束了。

重要方法

getParameter(key) 獲取提交表單的數據

getParameterValues(key) 獲取提交表單的一組數據

request.getRequestDispatcher("list.jsp").forward(request,response) 轉發(通過代碼的方式進行轉發)

request.setAttribute(key,object) 設置請求對象的屬性

request.gettAttribute(key) 獲取請求對象的屬性

request.setCharacterEncoding("UTF-8") 對請求數據重新編碼 

(2)response

類型:Javax.servlet.http. HttpServletResponse

描述:它封閉了JSP 的響應,然後被髮送到客戶端以響應客戶的請求。

作用域:page

重要方法

response.sendRedirect("頁面"):頁面跳轉。注意,之前的forward是轉發,這裏是跳轉,注意區分。

response.setCharacterEncoding("gbk"):設置響應編碼

(3)session

類型:Javax.servlet.http.HttpSession

描述:表示一個會話,用來保存用戶信息,以便跟蹤每個用戶的狀態。(不要用來保存業務數據,request)

定義:是指在一段時間內客戶端和服務器之間的一連串的相關的交互過程。

作用域:session。

如果是第一次接觸“會話”這個概念,需要重複一下。說白了,客戶端與服務器之間可能需要不斷地進行數據交互(請求與相應),這個過程就可以理解爲一段回話。Tomcat默認的會話時間爲30分鐘,這段時間內如果沒有交互,會話結束;下次客戶端一旦發送請求,重新創建會話。當客戶端第一次發送請求的時候,纔會創建一個會話。session的生命週期比request長

重要方法

session.getid():取得session的id號.id由tomcat自動分配。

session.isnew():判斷session時候是新建的

session.setAttribute(key,object):往當前會話中設置一個屬性

session.getAttribute(key):獲取當前會話中的一個屬性

session.removeAttribute(key):刪除當前會話中的屬性

session.setMaxInactiveInterval(1000*60*30):設置當前會話失效時間(ms) 。Tomcat默認的會話時間爲30分鐘。一般在web.xml中設置

session.invalidate():初始化當前會話對象(一般在推出的時候使用,可以刪除當前會話的數據) 

4out

類型:Javax.servlet.jsp.JspWriter

作用:主要用來向客戶端輸出數據

作用域:page。也就是說,每個頁面都有一個自己的out對象。

重要方法:print()/println()/write()    向客戶端頁面輸出數據

(5)pageContext

類型:javax.servlet.jsp.PageContext

描述:獲當前JSP頁面的其他內置對象

作用域:page

(6)application

類型:javax.servlet.ServletContext

描述:從servlet配置對象獲得的servlet上下文

作用域:application

這個對象的生命週期是最長的。服務器啓動的時候就會創建application對象。從服務器存在到服務器終止,都一直存在,且只保留一個對象,所有用戶共享一個application。不是很常用。

(7)config

類型:javax.servlet.ServletConfig

描述:本JSP的 ServletConfig

作用域:page

注:代表配置對象,基本用不到。

(8)page

類型:java.1ang.Object

描述:實現處理本頁當前請求的類的實例(javax.servlet.jsp.HttpJspPage),轉換後的Servlet類本身

作用域:page

9exception

類型:java.lang.Exception

描述:本JSP頁面的異常對象

作用域:page

JSP常見錯誤狀態碼:

403:禁止訪問。比如IP地址被拒絕,站點訪問被拒絕等

404:找不到。沒有找到文件或目錄

500:服務器由於遇到錯誤而不能完成該請求,Web服務器太忙

 

5.Cookie和Session

(1)cookie

/*
	 * 登錄檢查,判斷賬號密碼是否正確
	 * 相當於NETCTOSS中的MainServlet.login()
	 * 
	 * Cookie 保存在瀏覽器上
	 * 多個請求可以共用一組cookie,多個Servlet 可以共用一組 cookie
	 * 每個用戶(瀏覽器)訪問服務器,都會獲得一個 Cookie
	 */
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// 1.接收參數
		String code = req.getParameter("code");
		// 2.驗證賬號密碼
		// 3.轉發或重定向
		// 4.檢查通過以後將賬號存入cookie
		// 每個 cookie 對象只能存一條數據,包括 key 和value,都是字符串
		Cookie c1 = new Cookie("code", code);
		Cookie c2 = new Cookie("city", URLEncoder.encode("上海", "utf-8"));  // 處理中文亂碼的問題
		// 聲明Cookie的生存時間:大於0 Cookie保存在客戶端的時間, = 0 Cookie 被瀏覽器刪除
		// 一般用於記住密碼
		c1.setMaxAge(20);
		// 設置 Cookie 的有效路徑
		c1.setPath("/JSPDemo5");
		// 將cookie 發送給瀏覽器,瀏覽器接收帶以後會自動保存
		res.addCookie(c1);
		res.addCookie(c2);
	}
}
/**
 * 模擬打開主頁
 * 相當於 NETCTOSS 中的 MainServlet.toIndex();
 */
public class IndexServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// 向瀏覽器輸出主頁的內容(略)
		// 獲取 cookie
		Cookie[] cs = req.getCookies();
		// 見他們也輸出給瀏覽器
		if(cs != null) {
			res.setContentType("text/html; charset = utf-8");
			PrintWriter pw = res.getWriter();
			for(Cookie c : cs) {
				pw.println(c.getName() + ":" + URLDecoder.decode(c.getValue(), "utf-8"));
			}
			pw.close();
		}
	}
}

(2)session

/**
 * 瀏覽器第一次訪問服務器時,服務器會給他創建一個 Session
 * 服務器會適應 Cookie將 SID 返回給瀏覽器,瀏覽器再次訪問 服務器時會傳入 SID 
 * 多個請求可以共用同一個 session
 * 多個Servlet 可以共用一個session
 *服務器會給每個瀏覽器創建一個session
 */
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// 接收賬號
		String code = req.getParameter("code");
		// 存入 Session
		// Session 是存儲在服務器上的對象,他的內部可以存儲任意類型的數據
		HttpSession session = req.getSession();
		session .setAttribute("code", code);
		// 響應時服務器會自動創建 Cookie,將 session 的id 通過Cookie 發送給瀏覽器
		// Cookie c = new Cookie("JSESSIONID", session.getId());
	}
}
public class IndexServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// 由於本次請求瀏覽器傳入了SID, 服務器就根據 SID 找到那個舊的 Session,可以從中讀取之前存的數據
		HttpSession session  = req.getSession();
		String code = (String) session.getAttribute("code");
		// 將此數據顯示給瀏覽器
		res.setContentType("text/html; charset=utf-8");
		PrintWriter pw = res.getWriter();
		pw.println(code);
		session.removeAttribute("code");  // 移除指定的 session 對象,要保證該對象有效,否則會拋出異常
		session.invalidate();  // 手動銷燬 session
		pw.close();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章