本文查閱方法:
一、查閱目錄 —— 查閱本文目錄,肯定想要查閱的目錄標題
二、快捷「查找」 —— 在當前瀏覽器頁面,按鍵 「Ctrl+F」 按鍵組合,開啓瀏覽器的查找功能,
在查找搜索框中 輸入須要查閱的 目錄標題,即可以直接到達 標題內容 的位置。
三、學習小結 —— 文中的學習小結內容,是筆者在學習以後總結出的,開發時可直接參考其進行應用開發的內容, 進一步加快了本文的查閱 速度。(水平有限,僅供參考。)
html
本文目錄 java
學習小結web
一、JSP技術 概述 express
二、JSP最佳實踐編程
三、JSP語法-- JSP模版元素 瀏覽器
四、JSP語法-- JSP腳本表達式 緩存
五、JSP語法-- JSP腳本片段安全
六、JSP語法-- JSP聲明 服務器
七、JSP語法-- JSP註釋 session
八、JSP語法-- JSP指令
九、JSP指令-- Page指令
十、使用page指令解決JSP中文亂碼
十一、JSP指令-- Include指令
十二、JSP指令-- taglib指令
1三、JSP運行原理和九大隱式對象
1四、JSP九大隱式對象-- out隱式對象
1五、out隱式對象的工做原理 圖解
1六、用JSP實現文件下載。
1七、JSP九大隱式對象-- pageContext對象
1八、pageContext做爲域對象 所具備的方法
1九、pageContext對象-- 引入和跳轉到其餘資源
20、JSP標籤 介紹
2一、JSP標籤-- <jsp:include>標籤
2二、<jsp:include>與include指令的比較
2三、JSP標籤-- <jsp:forward>標籤
2四、JSP標籤-- <jsp:param>標籤
2五、在web.xml中 映射JSP
2六、如何查找JSP頁面中的錯誤
2七、JSP中的4個域對象 的總結
2八、JavaBean與JSP
2九、JavaBean的屬性
30、在JSP中使用JSP標籤來操做JavaBean
3一、JSP標籤-- <jsp:useBean>標籤
3二、<jsp:useBean>標籤 執行原理
3三、帶標籤體的<jsp:useBean>標籤
3四、JSP標籤-- <jsp:setProperty>標籤
3五、JSP標籤-- <jsp:getProperty>標籤
3六、結合使用 <jsp:setProperty>標籤 和 <jsp:getProperty>標籤 的綜合案例
3七、JSP開發模式
學習小結
(1)JSP運行原理和九大隱式對象
request、response、config、application、exception、Session、page(至關於this)、out、pageContext
(2)經常使用JSP指令-- Page指令
<%@ page errorPage="relative_url" isErrorPage="true|false" %>
(3)使用page指令解決JSP中文亂碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
(4)JSP指令-- Include指令 —— <%@ include file="relativeURL"%>
Demo樣例: <%@include file="/public/head.jsp" %>
aaaaaaaaaaaaaaaa<br/>
<%@include file="/public/foot.jsp" %>
(5)JSP標籤-- <jsp:forward>標籤
<jsp:forward page="relativeURL | <%=expression%>" />
(6)JSP標籤-- <jsp:param>標籤
當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉發給其它資源時,可使用<jsp:param>標籤向這個資源傳遞參數。
語法1:
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
語法2:
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include>和<jsp:forward>標籤中可使用多個<jsp:param>標籤來傳遞多個參數。
一、JSP技術 概述
什麼是JSP?
JSP全稱是Java Server Pages,它和Servlet技術同樣,都是SUN公司定義的一種用於開發動態web資源的技術。
爲何JSP也是一種動態web資源的開發技術呢?
寫JSP雖然就像是在寫html,但Jsp技術容許在頁面中嵌套java代碼,而且容許開發人員在頁面中獲取request、response等web開發經常使用對象,實現與瀏覽器的交互,因此jsp也是一種動態web資源的開發技術。
二、JSP最佳實踐
無論是JSP仍是Servlet,雖然均可以用於開發動態web資源。但因爲這2門技術各自的特色,在長期的軟件實踐中,人們逐漸把servlet做爲web應用中的控制器組件來使用,而把JSP技術做爲數據顯示模板來使用。
其緣由爲,程序的數據一般要美化後再輸出:
a.讓jsp既用java代碼產生動態數據,又作美化會致使頁面難以維護。
b.讓servlet既產生數據,又在裏面嵌套html代碼美化數據,一樣也會致使程序可讀性差,難以維護。
所以最好的辦法就是根據這兩門技術的特色,讓它們各自負責各的,servlet只負責響應請求產生數據,並把數據經過轉發技術帶給jsp,數據的顯示jsp來作。
JSP語法
JSP模版元素
JSP表達式
JSP腳本片段
JSP註釋
JSP指令
JSP標籤
JSP內置對象
如何查找JSP頁面中的錯誤
三、JSP語法-- JSP模版元素
JSP頁面中的HTML內容稱之爲JSP模版元素。
JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。
四、JSP語法-- JSP腳本表達式
JSP腳本表達式(expression)用於將程序數據輸出到客戶端
語法:<%= 變量或表達式 %>
舉例:當前時間:<%= new java.util.Date() %>
JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,而後在相應位置用out.print(…) 將數據輸給客戶端。
注意:JSP腳本表達式中的變量或表達式後面不能有分號(;)。
五、JSP語法-- JSP腳本片段
(1)JSP腳本片段(scriptlet)用於在JSP頁面中編寫多行Java代碼。
語法:
<%
多行java代碼
%>
注意:JSP腳本片段中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片段中的Java代碼將被原封不動地放到Servlet的_jspService方法中。
(2)JSP腳本片段中的Java代碼必須嚴格遵循Java語法,例如,每執行語句後面必須用分號(;)結束。
(3)在一個JSP頁面中能夠有多個腳本片段,在兩個或多個腳本片段之間能夠嵌入文本、HTML標記和其餘JSP元素。
舉例:
<%
int x = 10;
out.println(x);
%>
<p>這是JSP頁面文本</p>
<%
int y = 20;
out.println(x);
%>
(4)多個腳本片段中的代碼能夠相互訪問,猶如將全部的代碼放在一對<% %>之中的狀況。如:out.println(x);
(5)單個腳本片段中的Java語句能夠是不完整的,可是,多個腳本片段組合後的結果必須是完整的Java語句,
例如:
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.sina.com</H1>
<%
}
%>
六、JSP語法-- JSP聲明
(1)JSP頁面中編寫的全部代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼則被翻譯到_jspService方法的外面。
語法: <%!
java代碼
%>
(2)JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法 。
(3)多個靜態代碼塊、變量和函數能夠定義在一個JSP聲明中,也能夠分別單獨定義在多個JSP聲明中。
(4)JSP隱式對象的做用範圍僅限於Servlet的_jspService方法,因此在JSP聲明中不能使用這些隱式對象。
Demo樣例:
<%!
static
{
System.out.println("loading Servlet!");
}
private int globalVar = 0;
public void jspInit()
{
System.out.println("initializing jsp!");
}
%>
<%!
public void jspDestroy()
{
System.out.println("destroying jsp!");
}
%>
七、JSP語法-- JSP註釋
JSP註釋的格式:
<%-- 註釋信息 --%>
JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被註釋的內容。
八、JSP語法-- JSP指令
(1)JSP指令簡介
JSP指令(directive)是爲JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其他部分。在JSP 2.0規範中共定義了三個指令:
page指令
Include指令
taglib指令
(2)JSP指令的基本語法格式:
<%@ 指令 屬性名="值" %>
舉例:<%@ page contentType="text/html;charset=gb2312"%>
若是一個指令有多個屬性,這多個屬性能夠寫在一個指令中,也能夠分開寫。
例如:<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也能夠寫做:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
【小知識:修改Jsp的模版:在安裝目錄裏面搜索:「.vtl」 。】
九、JSP指令-- Page指令
page指令用於定義JSP頁面的各類屬性,不管page指令出如今JSP頁面中的什麼地方,它做用的都是整個JSP頁面,爲了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。
JSP 2.0規範中定義的page指令的完整語法:
<%@ page
(1) [ language="java" ]
(2) [ extends="package.class" ]
(3) [ import="{package.class | package.*}, ..." ]
詳解:JSP 引擎自動導入下面的包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
(4) [ session="true | false" ] :默認值 (true )
詳解:當設置爲true時,JSP引擎在將jsp文件翻譯成Servlet時,會自動建立Session對象;若設爲false則不建立。意味着:當設置爲true時能夠在jsp頁面使用session進行編程。若爲false則不能使用其編程,由於翻譯後的Servlet沒有爲其建立對象。因爲session對象會影響服務器的性能,因此要慎重使用,能夠手動進行關閉。可是通常建議使用其默認值(true)。
(5) [ buffer="none | 8kb | sizekb" ] :默認值 ( 8kb)
詳解: jsp頁面中使用out.write()寫數據,首先是要寫在jsp頁面的緩衝區中,等待緩衝區滿了以後再寫到Response緩衝區中。
(6) [ autoFlush="true | false" ] :默認值 (true )
(7) [ isThreadSafe="true | false" ] :默認值 (true )
詳解: 決定該jsp翻譯後的servlet是不是線程安全的:true是不安全;false是線程安全的:底層原理是使翻譯後servlet實現了SingleThreadModel這個接口。
(8) [ info="text" ]
詳解:當前JSP頁面的備註信息。
(9) [ errorPage="relative_url" ] 重點學習
詳解: 局部錯誤頁面:當jsp頁面程序發生異常時,跳轉到哪一個顯示友好信息的頁面的路徑。並且「友好錯誤頁面」的大小必須超過1kb,不然不會被顯示。errorPage屬性的設置值必須使用相對路徑,若是以「/ 」開頭,表示相對於當前Web應用的根目錄(注意不是站點根目錄),不然標識相對於當前頁面。
全局錯誤頁面:能夠在web.xml文件中使用<error-page>元素爲整個Web應用程序設置錯誤處理頁面,其中的<exception-type>子元素指定異常類的徹底限定名,<location>元素指定以「/」開頭的錯誤處理頁面的路徑。
若是設置了某個JSP頁面的errorPage屬性,那麼在web.xml文件中設置的錯誤處理將不對該頁面起做用。
Demo: <web-app ...>
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/errors/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/errors/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/errors/500.jsp</location>
</error-page>
</web-app>
(10) [ isErrorPage="true | false" ] :默認值 ( false)
詳解: 若設置爲true,即顯示聲明當前頁面是錯誤處理頁面,則在將jsp頁面翻譯成的Servlet時,會傳入一個「 封裝了錯誤信息的 Exception 對象」,以方便在錯誤處理頁面編碼:將錯誤發生的詳細信息寫入到後臺處理日誌中。(九大隱式對象之一: Throwable exception ; )
(11) [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
詳解:JSP引擎會根據page指令的contentType屬性生成相應的調用ServletResponse.setContentType()方法的語句。同時該屬性還具備說明JSP源文件的字符編碼的做用。
(12) [ pageEncoding="characterSet | ISO-8859-1" ]
(13) [ isELIgnored="true | false" ] :默認值 (false )
詳解: 當前頁面是否忽略EL表達式。JSP2.0就默認支持EL表達式了。若發現所編輯的jsp頁面不識別EL表達式,則能夠顯示的聲明該屬性爲false。
%>
十、使用page指令解決JSP中文亂碼
(1)JSP程序存在有與Servlet程序徹底相同的中文亂碼問題
a.輸出響應正文時出現的中文亂碼問題
b.讀取瀏覽器傳遞的參數信息時出現的中文亂碼問題
c.JSP引擎將JSP頁面翻譯成Servlet源文件時也可能致使中文亂碼問題
(2)中文亂碼問題產生的緣由:
a.JSP引擎將JSP源文件翻譯成的Servlet源文件默認採用UTF-8編碼,而JSP開發人員能夠採用各類字符集編碼來編寫JSP源文件,所以,JSP引擎將JSP源文件翻譯成Servlet源文件時,須要進行字符編碼轉換。
b.若是JSP文件中沒有說明它採用的字符集編碼,JSP引擎將把它看成默認的ISO8859-1字符集編碼處理。
(3)如何解決JSP引擎翻譯JSP頁面時的中文亂碼問題
a.經過page指令的contentType屬性說明JSP源文件的字符集編碼
b.page指令的pageEncoding屬性說明JSP源文件的字符集編碼
c.若使用Eclipse開發Jsp,則僅使用這一個屬性就能夠了。Eclpise會自動參照該屬性值,爲Servlet生成contentType的屬性值的。
Demo樣例:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
十一、JSP指令-- Include指令
include指令用於引入其它JSP頁面,若是使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。因此include指令引入一般也稱之爲靜態引入。靜態引入的性能要比動態引入好不少。
語法:
<%@ include file="relativeURL"%>
其中的file屬性用於指定被引入文件的路徑。路徑以「/」開頭,表示表明當前web應用。
細節:
被引入的文件必須遵循JSP語法。
被引入的文件可使用任意的擴展名,即便其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裏面的內容,爲了見名知意,JSP規範建議使用.jspf(JSP fragments[ˈfræɡmənt]:n.碎片;片斷)做爲靜態引入文件的擴展名。
因爲使用include指令將會涉及到2個JSP頁面,並會把2個JSP翻譯成一個servlet,因此這2個JSP頁面的指令不能衝突(除了pageEncoding和導包除外)。
靜態包含:include指令(靜態包含(編譯時包含),它包含的全部jsp會編譯成一個servlet,性能好。
<body>
<%@include file="/public/head.jsp" %>
aaaaaaaaaaaaaaaa<br/>
<%@include file="/public/foot.jsp" %>
</body>
動態包含:這種狀況是運行時包含,三個文件將被分別翻譯成三個Servlet文件,在運行的時候才合併到一塊兒,因此性能比靜態包含要差不少!
<body>
<%
request.getRequestDispatcher("/public/head.jsp").include(request,response);
%>
<%
response.getWriter().write("aaaaaaaaaaaaa<br/>");
%>
<%
request.getRequestDispatcher("/public/foot.jsp").include(request,response);
%>
</body>
十二、JSP指令-- taglib指令
Taglib指令用於在JSP頁面中導入標籤庫,詳見《自定義標籤技術 學習筆記》一文。
1三、JSP運行原理和九大隱式對象
運行原理:每一個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,而後按照servlet的調用方式進行調用。因爲JSP第一次訪問時會翻譯成servlet,因此第一次訪問一般會比較慢,但第二次訪問,JSP引擎若是發現JSP沒有變化,就再也不翻譯,而是直接調用,因此程序的執行效率不會受到影響。
九大隱式對象:JSP引擎在調用JSP對應的_jspServlet時,會傳遞或建立9個與web開發相關的對象供_jspServlet使用。JSP技術的設計者爲便於開發人員在編寫JSP頁面時得到這些web對象的引用,特地定義了9個相應的變量,開發人員在JSP頁面中經過這些變量就能夠快速得到這9大對象的引用。
JSP九大隱式對象:
request
response
config
application
exception
Session
page(至關於this )
out
pageContext
1四、JSP九大隱式對象-- out隱式對象
out隱式對象用於向客戶端發送文本數據。
out對象是經過調用pageContext對象的getOut方法返回的,其做用和用法與ServletResponse.getWriter方法返回的PrintWriter對象很是類似。
JSP頁面中的out隱式對象的類型爲JspWriter,JspWriter至關於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性能夠調整它的緩存大小,甚相當閉它的緩存。
只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
a. 設置page指令的buffer屬性關閉了out對象的緩存功能
b. out對象的緩衝區已滿
c. 整個JSP頁面結束
out隱式對象的注意事項
同時使用out和response.getwriter()輸出數據。可能會形成輸出的內容順序顛倒。
1五、out隱式對象的工做原理 圖解
1六、用JSP實現文件下載。
備註:當jsp頁面有文本內容時(包括空格符、回車換行符等等),out對象就會調用getWriter()方法。如果一個文本字符都沒有的話,就不會調用該方法,因此咱們在JSP頁面中使用response.getOutputStream()方法時,就不會發生異常:「getOutputStream() has already been called for this response 」了。如果發生該異常但沒法肯定是哪一個字符時,能夠到該Jsp翻譯成Servlet中查看,就能夠看到都寫了哪些文本字符。【注意:連空格符和回車符】
Demo樣例:
代碼全文:注意JSP片斷以前是沒有空格和回車符的。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="java.io.FileInputStream"%><%
String path = application.getRealPath("/download/1.jpg"); //c:\\
String filename = path.substring(path.lastIndexOf("\\")+1);
response.setHeader("content-disposition","attachment;filename=" + filename);
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
response.getOutputStream().write(buffer,0,len);
}
in.close();
%>
1七、JSP九大隱式對象-- pageContext對象
pageContext對象是JSP技術中最重要的一個對象,它表明JSP頁面的運行環境.
這個對象不只封裝了對其它8大隱式對象的引用,它自身仍是一個域對象,能夠用來保存數據,而且你還能夠經過pageContext操做其餘三個域。而且,這個對象還封裝了web開發中常常涉及到的一些經常使用操做,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。
經過pageContext得到其餘對象
getException方法返回exception隱式對象
getPage方法返回page隱式對象
getRequest方法返回request隱式對象
getResponse方法返回response隱式對象
getServletConfig方法返回config隱式對象
getServletContext方法返回application隱式對象
getSession方法返回session隱式對象
getOut方法返回out隱式對象
pageContext封裝其它8大內置對象的意義,思考:若是在編程過程當中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將具備什麼功能?
1八、pageContext做爲域對象 所具備的方法
pageContext對象的方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)
pageContext對象中還封裝了訪問其它域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)
表明各個域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法(*重點,查找各個域中的屬性,順序爲:page-->request-->session-->application)
1九、pageContext對象-- 引入和跳轉到其餘資源
PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法。
方法接收的資源若是以「/」開頭, 「/」表明當前web應用。
20、JSP標籤 介紹
JSP標籤也稱之爲Jsp Action(JSP動做)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,形成jsp頁面難以維護。
JSP經常使用標籤
<jsp:include>標籤
<jsp:forward>標籤
<jsp:param>標籤
2一、JSP標籤-- <jsp:include>標籤
<jsp:include>標籤用於把另一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入。
語法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page屬性用於指定被引入資源的相對路徑,它也能夠經過執行一個表達式來得到。
flush屬性指定在插入其餘資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。
2二、<jsp:include>與include指令的比較
<jsp:include>標籤是動態引入,<jsp:include>標籤涉及到的多個JSP頁面會被分別翻譯成多個servlet,這多2個servlet的內容在執行時進行合併。而include指令是靜態引入,涉及到的多個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合併。
注意:無論是<jsp:include>標籤,仍是include指令,它們都會把兩個JSP頁面內容合併輸出,因此這兩個頁面不要出現重複的HTML全局架構標籤,不然輸出給客戶端的內容將會是一個格式混亂的HTML文檔。
2三、JSP標籤-- <jsp:forward>標籤
<jsp:forward>標籤用於把請求轉發給另一個資源。
語法:<jsp:forward page="relativeURL | <%=expression%>" />
page屬性用於指定請求轉發到的資源的相對路徑,它也能夠經過執行一個表達式來得到。
2四、JSP標籤-- <jsp:param>標籤
當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉發給其它資源時,可使用<jsp:param>標籤向這個資源傳遞參數。
語法1:
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
語法2:
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
<jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include>和<jsp:forward>標籤中可使用多個<jsp:param>標籤來傳遞多個參數。
2五、在web.xml中 映射JSP
JSP 實際上就是一個特殊的Servlet,因此咱們顯性地映射JSP頁面。也能夠不去映射,而是使用服務器默認的缺省DefaultServlet去調用它。
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
……
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>
2六、如何查找JSP頁面中的錯誤
JSP頁面中的JSP語法格式有問題,致使其不能被翻譯成Servlet源文件,JSP引擎將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息。
JSP頁面中的JSP語法格式沒有問題,但被翻譯成的Servlet源文件中出現了Java語法問題,致使JSP頁面翻譯成的Servlet源文件不能經過編譯,JSP引擎也將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息。
JSP頁面翻譯成的Servlet程序在運行時出現異常,這與普通Java程序的運行時錯誤徹底同樣,Java虛擬機將提示錯誤發生在Servlet源文件中的位置(行和列)以及相關信息。
2七、JSP中的4個域對象 的總結
到此爲止,web開發接觸到了4個域對象,這4個域對象是學習web的重點,也是筆試常常考察的知識點
pageContext(稱之爲page域)
request(稱之爲request域)
session(稱之爲session域)
servletContext(稱之爲application域)
2八、JavaBean與JSP
什麼是JavaBean?
JavaBean是一個遵循特定寫法的Java類,它一般具備以下特色:
a.這個Java類必須具備一個無參的構造函數
b.屬性必須私有化。
c.私有化的屬性必須經過public類型的方法暴露給其它程序,而且方法的命名也必須遵照必定命名規範。
JavaBean在J2EE開發中,一般用於封裝數據,對於遵循以上寫法的JavaBean組件,其它程序能夠經過反射技術實例化JavaBean對象,而且經過反射那些遵照命名規範的方法,從而獲知JavaBean的屬性,進而調用其屬性保存數據。
2九、JavaBean的屬性
JavaBean的屬性能夠是任意類型,而且一個JavaBean能夠有多個屬性。每一個屬性一般都須要具備相應的setter、 getter方法,setter方法稱爲屬性修改器,getter方法稱爲屬性訪問器。
屬性修改器必須以小寫的set前綴開始,後跟屬性名,且屬性名的第一個字母要改成大寫,例如,name屬性的修改器名稱爲setName,password屬性的修改器名稱爲setPassword。
屬性訪問器一般以小寫的get前綴開始,後跟屬性名,且屬性名的第一個字母也要改成大寫,例如,name屬性的訪問器名稱爲getName,password屬性的訪問器名稱爲getPassword。
一個JavaBean的某個屬性也能夠只有set方法或get方法,這樣的屬性一般也稱之爲只寫、只讀屬性。
30、在JSP中使用JSP標籤來操做JavaBean
JSP技術提供了三個關於JavaBean組件的動做元素,即JSP標籤,它們分別爲:
a. <jsp:useBean>標籤:用於在JSP頁面中查找或實例化一個JavaBean組件。
b. <jsp:setProperty>標籤:用於在JSP頁面中設置一個JavaBean組件的屬性。
c. <jsp:getProperty>標籤:用於在JSP頁面中獲取一個JavaBean組件的屬性。
3一、JSP標籤-- <jsp:useBean>標籤
<jsp:useBean>標籤用於在指定的域範圍內查找指定名稱的JavaBean對象:
若是存在則直接返回該JavaBean對象的引用。
若是不存在則實例化一個新的JavaBean對象並將它以指定的名稱存儲到指定的域範圍中。
經常使用語法:
<jsp:useBean id="beanName" class="package.class"
scope="page|request|session|application"/>
id屬性用於指定「JavaBean實例對象的引用名稱」和其「存儲在域範圍中的名稱」。
class屬性用於指定JavaBean的完整類名(即必須帶有包名)。
scope屬性用於指定JavaBean實例對象所存儲的域範圍,其取值只能是page、request、session和application等四個值中的一個,其默認值是page。
3二、<jsp:useBean>標籤 執行原理
<jsp:useBean id="currentDate" class="java.util.Date"/>
翻譯成的Servlet源碼:
java.util.Date currentDate = null;
synchronized (_jspx_page_context) {
currentDate = (java.util.Date)_jspx_page_context.getAttribute(
"currentDate", PageContext.PAGE_SCOPE );
if (currentDate == null){
currentDate = new java.util.Date();
_jspx_page_context.setAttribute("currentDate",currentDate, PageContext.PAGE_SCOPE);
}
}
3三、帶標籤體的<jsp:useBean>標籤
語法:
<jsp:useBean ...>
Body
</jsp:useBean>
功能:
Body部分的內容只在<jsp:useBean>標籤建立JavaBean實例對象時才執行,取出已有對象不執行。
注意:默認採用page域,每次都是沒有的,因此執行,而若是是session域,第一次有,之後都沒有,除非session過時,application類推…
Demo樣例:
<body>
<!-- userbean標籤的標籤體只在userbean標籤實例化bean時才執行 -->
<jsp:useBean id="person" class="cn.itcast.domain.Person" scope="session">
bbbb
</jsp:useBean>
<%=person.getName() %>
</body>
3四、JSP標籤-- <jsp:setProperty>標籤
<jsp:setProperty>標籤用於設置和訪問JavaBean對象的屬性。
語法格式:
<jsp:setProperty name="beanName"
{
property="propertyName" value="{string | <%= expression %>}" | //手動賦值
property="propertyName" [ param="parameterName" ] | //經過請求參數賦值
property= "*" //爲全部屬性賦值。
}/>
name屬性用於指定JavaBean對象的名稱。
property屬性用於指定JavaBean實例對象的屬性名。
value屬性用於指定JavaBean對象的某個屬性的值,value的值能夠是字符串,也能夠是表達式。爲字符串時,該值會自動轉化爲JavaBean屬性相應的類型,若是value的值是一個表達式,那麼該表達式的計算結果必須與所要設置的JavaBean屬性的類型一致。
param屬性用於將JavaBean實例對象的某個屬性值設置爲一個請求參數值,該屬性值一樣會自動轉換成要設置的JavaBean屬性的類型。
注意
一、在經過該標籤設置Bean的屬性值時對於八種基本類型,該標籤能夠將字符串自動轉換,而其餘類型沒法轉換。好比Date,value=「<%=new Date()%>」
二、param和*設置
3五、JSP標籤-- <jsp:getProperty>標籤
<jsp:getProperty>標籤用於讀取JavaBean對象的屬性,也就是調用JavaBean對象的getter方法,而後將讀取的屬性值轉換成字符串後插入進輸出的響應正文中。
語法: <jsp:getProperty name="beanInstanceName" property="PropertyName" />
name屬性用於指定JavaBean實例對象的名稱,其值應與<jsp:useBean>標籤的id屬性值相同。
property屬性用於指定JavaBean實例對象的屬性名。
若是一個JavaBean實例對象的某個屬性的值爲null,那麼,使用<jsp:getProperty>標籤輸出該屬性的結果將是一個內容爲「null」的字符串。
3六、結合使用 <jsp:setProperty>標籤 和 <jsp:getProperty>標籤 的綜合案例
Demo樣例:
<body>
<jsp:useBean id="person" class="cn.itcast.domain.Person"/>
<!-- 手工爲bean屬性賦值 -->
<jsp:setProperty name="person" property="name" value="xxxx"/>
<%=person.getName() %><br/>
<!-- 用請求參數給bean的屬性賦值 http://localhost:8080/day09/2.jsp?name=uuuuuuuuuuuuu -->
<jsp:setProperty name="person" property="name" param="name"/>
<!-- http://localhost:8080/day09/2.jsp?name=uuuuuuuu&age=12 -->
<jsp:setProperty name="person" property="age" param="age"/> <!-- 支持8種基本數據類型的轉換(把客戶機提交的字符串,轉成相應的8種基本類型,賦到bean的屬性上) -->
<!-- http://localhost:8080/day09/2.jsp?name=uuuuuuuu&age=12&birthday=1980-09-09 -->
<%--
<jsp:setProperty name="person" property="birthday" value="<%=new Date() %>"/>
--%>
<%=person.getName() %><br/>
<%=person.getAge() %><br/>
<%=person.getBirthday() %><br/>
<br/>----------------------------------------------------<br/>
<!-- 用全部的請求參數爲bean賦值 -->
<jsp:setProperty name="person" property="*"/>
<%=person.getName() %><br/>
<%=person.getAge() %><br/>
<jsp:getProperty name="person" property="name"/>
<jsp:getProperty name="person" property="age"/>
<jsp:getProperty name="person" property="birthday"/>
</body>
3七、JSP開發模式
SUN公司推出JSP技術後,同時也推薦了兩種web應用程序的開發模式,一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。
JSP+JavaBean模式適合開發業務邏輯不太複雜的web應用程序,這種模式下,JavaBean用於封裝業務數據,JSP即負責處理用戶請求,又顯示數據。
Servlet+JSP+JavaBean(MVC)模式適合開發複雜的web應用,在這種模式下,servlet負責處理用戶請求,jsp負責數據顯示,javabean負責封裝數據。 Servlet+JSP、JavaBean模式程序各個模塊之間層次清晰,web開發推薦採用此種模式。
敬請評論(1)若您以爲本文 有用處 —— 請留言評論,以堅決其餘 IT童鞋 閱讀本文的信心。(2)若您以爲本文 沒用處 —— 請留言評論,筆者將會改進不足,以便爲你們整理更加好用的筆記。