1.爲什麼使用JSP
JSP是簡Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一文件中編寫。只對頁面中要動態產生的內容採用Java編寫,而對靜態固定不變的內容採用HTML編寫。
2.JSP的helloword
1)新建JSP文件,在<body>節點中<% %>內編寫Java代碼即可。
2)在JSP頁面中編寫的Java代碼需要嵌套在<%和%>中,嵌套在<%和%>之間的Java代碼被稱之爲腳本片段(Scriptlets),沒有嵌套在<%和%>之間的內容被稱之爲JSP的模版元素
3)JSP文件就像普通的HTML文件一樣,它們可以放置在WEB應用程序中的除了WEB-INF及其子目錄外的其他任何目錄中,JSP頁面的訪問路徑與普通HTML頁面的訪問路徑形式也完全一樣。
4)在JSP頁面中也可以使用一種稱之爲JSP表達式的元素,只需將要輸出的變量或表達式直接封裝在<%= 和 %>之中,就可以向客戶端輸出這個變量或表達式的運算結果。在JSP表達式中嵌套的變量或表達式後面不能有分號。
5)JSP本質上就是Servlet。每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,接着再把這個Servlet源程序編譯成Servlet的class類文件,然後再由WEB容器(Servlet引擎)像調用普通Servlet程序一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程序。
3.JSP頁面的隱含變量
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException
{
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
...
...
//使用<% %>編寫代碼在此位置,可以用到request,response,pageContext,session,
//application,config,out,page八個隱含對象(實際上,還可以使用exception對象)
}
1)request:HttpServletRequest對象
2)response:HttpServletResponse對象(在JSP頁面中幾乎不會調用response的任何方法)
3)pageContext:頁面的上下文,是PageContext的一個對象,可以從該對象中獲取其他的八個隱含對象,亦可以從中獲取到當前頁面的其他信息(學習自定義標籤時使用它)
4)session:代表瀏覽器和服務器的一次會話,是HttpSession的一個對象(後面詳細學習)
5)application:代表當前WEB應用,是ServletContext的一個對象,
6)config:是當前JSP對應的Servlet的ServletConfig對象(開發時,幾乎不使用)
7)out:JspWriter對象,調用out.println()可以直接把字符串打印到瀏覽器上。換行:out.println("<br>")
8)page:指向當前JSP對應Servlet對象的引用,但爲Object類型,只能調用Object類方法(幾乎不使用)
9)exception:在聲明瞭page指令的isErroPage=true時纔可使用
pageContext request session application(屬性域返回從小到大)
4.和屬性相關的方法
1)方法:
Object getAttribute(String name):獲取指定的屬性
Enumeration getAttributeNames():獲取所有屬性的名稱
setAttribute(String name,Object o):設置指定的屬性
removeAttribute(String name):移除指定的屬性
2)相關對象:
pageContext request session application都有上述方法。
pageContext:僅限於當前JSP頁面
request:僅限於同一個請求
session:一次會話(瀏覽器從打開到關閉,此期間會話不失效)
application:當前WEB應用,全局的作用範圍
5.請求重定向與轉發
1)區別
2)具體實現方法
(1)請求轉發:
request.getRequestDispatcher("/finalPage.jsp").forward(request, response);
(2)請求重定向
response.sendRedirect("finalPage.jsp");
6.JSP指令(page include taglib)
1)page:page指令最好是放在整個JSP頁面的起始位置。
import:導入類包
session=[true|false] : 當前JSP頁面是否允許使用session
errorPage="relative_url" :如果WEB應用出現錯誤,將轉到該屬性指定的頁面
isErrorPage="true | false" :頁面是否可以使用exception對象
contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]:當前頁面的響應編碼類型
pageEncoding="characterSet | ISO-8859-1" :當前頁面的編碼類型
isELIgnored="true | false" :當前頁面是否可以使用EL表達式,通常爲true2)inclue:include指令用於通知JSP引擎在翻譯當前JSP頁面時將其他文件中的內容合併進當前JSP頁面轉換成的Servlet源文件中,這種在源文件級別進行引入的方式稱之爲靜態引入,當前JSP頁面與靜態引入的頁面緊密結合爲一個Servlet。
(1)<%@ include file="relativeURL"%>
(2)file屬性的設置值必須使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),否則,表示相對於當前文件。
7.JSP標籤
1)<jsp:inclue>:用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入。
(1)<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
(2)page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
(3)flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。
2)<jsp:forward>:用於把請求轉發給另外一個資源
(1)<jsp:forward page="relativeURL | <%=expression%>" /> :page屬性用於指定請求轉發到的資源的相對路徑,它也可以通過執行一個表達式來獲得
(2)RequestDispatcher.forward方法、PageContext.forward方法、<jsp:forward>標籤的區別:調用RequestDispatcher.forward方法的JSP腳本代碼的前後不能有JSP模版內容。調用PageContext.forward方法的JSP腳本代碼的後面不能有JSP模版內容。<Jsp:forward>標籤的前後都能有JSP模版內容。
3)<jsp:param>:
(1)<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
(2)標籤的name屬性用於指定參數名,value屬性用於指定參數值
8.中文亂碼
1)在JSP頁面上輸入中文,請求頁面後不出現亂碼,保證contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%,charset和pageEncoding編碼一致,且都支持中文,通常建議取值爲UTF-8。還需要保證瀏覽器的顯示的字符編碼支持也和請求編碼相一致。