JSP技術入門和常用指令
1. JSP的由來
在前面的學習過程中,頁面相關的內容主要是通過html文件完成,而Servlet技術主要是在獲取瀏覽器(客戶端)提交的請求數據,或者是給瀏覽器(客戶端)響應數據。在企業開發中,前端的頁面(html文件)相關設計和美化工作都是前端工程師(美工)負責,后台的Java程序是由Java開發人員完成,前端給出的頁面,不能滿足后台開發人員的需求,這時就需要后台開發人員在Servlet中使用response獲取輸出流,拼接前端頁面需要的html片段,這樣會導致Servlet中的Java代碼十分的臃腫,而且不利於前端人員維護頁面。導致前后人員之間合作出現問題。針對這些問題,sun公司設計出JSP技術來解決。
JSP技術:Java Server Page。它的主要功能:可以直接在JSP文件中書寫html代碼,但是JSP文件最后會被翻譯成對應的Java代碼。這個翻譯工作不需要開發人員做任何的事情,而直接由Java對應的機制完成。這樣就可以保證前端工程師可以直接針對JSP文件進行頁面設計和修改,后台人員可以在JSP頁面中添加對應的業務程序。后台人員不用再在Servlet中通過response輸出大量的html片段。
其實不僅僅Java使用jsp技術代替html文件。微軟的.net技術也推出的asp技術代替普通的html文件,php也推出了php技術代替html文件。
2. 演示JSP文件

3. JSP的腳本元素
通過演示明白JSP文件本身和html文件區別並不大,但是sun公司發明的JSP技術不僅僅是為了代替html文件的,在JSP文件中還可以嵌入Java代碼的。
如果需要在JSP文件中嵌入Java代碼,必須按照特定的規則書寫,否則就會出現翻譯JSP文件時報錯。
在JSP文件中嵌入Java代碼有三種方式:1、腳本聲明;2、腳本表達式;3、腳本片段
3.1. 腳本聲明
腳本聲明格式:
<%!
書寫對應的Java代碼
%>
腳本聲明的東西: 成員變量, 成員方法, 內部類

3.2. 腳本表達式
腳本表達式格式:
<%=表達式 %>
表達式內容: 常量 變量 結果的輸出
注意:腳本表達式不能書寫java代碼的結束標記分號。

3.3. 腳本片段
腳本片段格式:首先說明,這種格式使用的非常少,而且書寫的時候,一定要留心!!!
<% Java代碼 %>
html代碼
<% Java代碼%>
只要在片段中的Java代碼合並之后,沒有語法錯誤即可。

4. 腳本翻譯的體現
如果在項目中有多個JSP頁面,只有第一次訪問到某個JSP頁面的時候,這個JSP頁面會被tomcat服務器進行翻譯。
在JSP頁面上書寫的不同的JAVA腳本代碼,在翻譯后的Java源代碼中處於不同的位置。
在tomcat的work目錄下有所有用到的JSP文件翻譯之后對應的Java代碼。tomcat的安裝目錄\work\Catalina\localhost\beike\org\apache\jsp

書寫demo.jsp,翻譯之后對應的demo_jsp.java文件,它會被編譯之后生成demo_jsp.class文件。

提問:JSP到的是什么東西?
JSP它翻譯之后是一個Servlet程序。JSP的內容格式是html,本質是Servlet;Jsp文件會被編譯成java文件,再被編譯成class文件
5. JSP中的注釋
由於JSP中可以書寫html、Java代碼,因此在JSP中可以嵌入html注釋,還可以嵌入Java注釋,還可以書寫JSP自己的注釋
1、html注釋:只能修飾html內容。 <!—注釋內容 -->
2、java注釋:只能修飾java代碼。 // /* */ /** */
3、jsp注釋:都可以包括。既可以注釋掉java的內容,也可以注釋掉html的內容 <%-- 注釋內容--%>
html注釋:<!--注釋 -->
html的注釋,不能注釋掉java腳本的內容,所以不要用html注釋注釋java腳本的內容;如果單純的在注釋里寫java代碼,相當於注釋普通內容,當前可以注釋掉,所以要將java代碼寫在java腳本里,這樣再用html注釋注釋Java腳本,就不能其注釋的作用了;
java注釋:Java的注釋必須嵌入在上面介紹的三個腳本中,不能在jsp其他位置書寫,只能注釋java代碼。
jsp的注釋:<%-- 注釋--%>(如果區分不開,就使用jsp自己的注釋。)
Jsp的注釋既可以注釋掉html代碼,也可以注釋掉java代碼;
三種注釋的存活時間:


6. JSP中的指令
指令:可以理解成命令、約束、限制、規范。
JSP中的指令:是用來限制約束JSP文件的。JSP中常用的指令有三個:page、include、taglib。
注意: page指令中各種屬性都有默認值,一般不需要改動,如果有需要改動使用的我會標注的;
6.1. JSP中的page指令
Page指令限制當前的JSP頁面。
page指令限制當前的JSP文件中可以使用的哪些包下的Java類,以及當前JSP頁面的編碼格式等操作。一般書寫的JSP文件的第一行。
page指令的格式:<%@ page key=value key=value …….%>
例如:自動生成

在JSP頁面上的page指令,也可以把它的屬性拆成多個page指令書寫,也可以寫在一起。
例如:

6.1.1. language屬性
language屬性:聲明當前這個JSP中可以使用編程語言,它默認就是Java。
其實sun公司在設計JSP技術的時候,希望其他語言也可以使用JSP技術,但是最后也只有Java在使用。

6.1.2. import屬性
import屬性: 聲明當前這個頁面可以使用的類所在的包。相當於書寫Java代碼中的導包操作。

默認導入util包下的所有,在JSP頁面上就可以使用集合等工具類。
提示:JSP翻譯之后,其實對應的就是一個Java類,並且這個類還是HttpServlet的子類。因此在JSP頁面上是可以使用Servlet中的相關對象,並且不用導入。
查看翻譯的Java源代碼可以看到,程序中導入了如下的包。

注意:在JSP頁面上,如果需要導入其他包下的類,書寫完類名或接口名之后,在類名或接口名上使用 alt + / 輔助導入對應的包,
不要自己手動的書寫導入的包,容易出錯;
6.1.3. pageEncoding(重點)和contentType屬性
pageEncoding屬性:設置當前JSP頁面保存的時候的編碼表。

一般建議這個屬性的值設置為UTF-8.
contentType屬性:它是設置瀏覽器在解析jsp中的代碼時使用的編碼表,但是一般不用設置它;
只要在JSP頁面上設置了pageEncoding,在解析JSP的時候,如果沒有設置contentType,瀏覽器解析的時候會使用pageEncoding的編碼表。
但是如果同時設置contentType屬性,則起作用的是contentType屬性而不是pageEncoding屬性,所以一般不建議設置contentType屬性,
即使設置也建議設置為UTF-8。

提示:一般在新建一個JSP文件的時候,page指令默認有language、import、pageEncoding屬性,並且它們的屬性值也不用修改(如果pageEncoding的編碼表不是UTF-8需要修改為UTF-8)。
在jsp中常用的碼表為utf-8和gbk,否則容易出現中文亂碼問題;
6.1.4. autoFlush屬性
autoFlush屬性:它是指在使用out對象輸出的時候,是否自動刷新。默認是true。會自動刷新。一般不用設置,采用默認方式即可。

6.1.5. buffer屬性
buffer屬性:當前頁面的輸出流(out對象)使用的緩沖區大小。默認的8kb。也可以自己修改。一般不用設置,采用默認方式即可


6.1.6. errorPage屬性
errorPage屬性:在jsp頁面中發生異常或者錯誤的時候,使用這個屬性可以配置當前頁面發生異常之后,跳轉到其他的頁面顯示(配置友好頁面)。
一般不用,后期會使用其他方式代替。
在jsp頁面中配置errorPage屬性及值,值為出現異常跳轉到哪個頁面,並且在頁面上故意書寫發生異常的代碼來演示。

創建的錯誤頁面error.jsp :

6.1.7. isErrorPage屬性
isErrorPage屬性:設置當前的JSP頁面是否是可以直接使用exception對象。
默認情況下為false,不可以在此jsp中使用exception內置對象,如果想顯示異常信息,則可以設置為true,可以使用exception對象;
如果設置true,當前的JSP文件翻譯后的Java源代碼會看到存在exception的引用,設置為false則不能看到;


6.1.8. 多學一招
一般開發的時候,會把整個項目中的常見的錯誤處理配置到當前項目的web.xml文件中。

將此項目設置錯誤信息配置后,訪問本項目時出現404錯誤時瀏覽器會自動識別錯誤狀態碼並跳轉到404.jsp頁面,
訪問本項目時出現500錯誤時瀏覽器會自動識別錯誤狀態碼並跳轉到500.jsp頁面,
好處:如果沒有設置友好頁面,那么如果訪問出現500錯誤並顯示到瀏覽器頁面上,顯得網站做的太low了,竟然還會出現500錯誤;
6.1.9. extends屬性
extends屬性:指定當前這個JSP翻譯之后需要繼承的父類。
在指定的JSP的父類時,要求這個父類一定是HttpServlet的子類。一般不用設置,采用默認方式即可。

6.1.10. isELIgnored屬性
isELIgnored="false" 它是說當前的JSP頁面中是否可以解析EL表達式。
默認值為false,表示當前JSP頁面可以解析出EL表達式中的內容。
如果設置true,在JSP頁面中書寫EL表達式將不會被解析。直接將EL表達式的內容當做內容顯示在頁面上。一般不用設置,采用默認方式即可。

6.1.11. session屬性
session屬性:在當前的頁面中是否可以直接使用session對象。
默認值為true,也就是直接訪問當前的JSP頁面,如果沒有session對象,就會直接創建Session對象,如果有,可以直接使用;
但是如果設置為false,訪問當前的JSP頁面,就不會有任何session的信息。一般不用設置,采用默認方式即可。

6.2. JSP中的include指令(理解)
JSP中的include指令,它主要是用來在當前的頁面中引入其他的頁面。這種引入方式成為靜態引入。
在多個頁面中,每一個頁面的全部內容中有一部分是固定不變的,有一部分是變動的,如果在每個頁面中都將不變的代碼再寫一遍太麻煩了,
而且一旦這些不變的內容需要改動一點點,則需要在每個頁面上都修改,太麻煩了,所以我們可以把不變的代碼單獨抽取出來生成一個頁面,
在每個頁面中引入這個頁面即可,即使修改也只要修改抽取出來的頁面即可,這就是頁面引入的用處;
例如:一個網頁,一般它的logo是一個頁面,而版權部分是一個頁面,主體部分是另外一個頁面。


演示:一共創建top.jsp,body.jsp,footer.jsp和main.jsp四個頁面,將top.jsp,body.jsp,footer.jsp三個頁面引入到main.jsp頁面上;

在某個頁面上引入其他的jsp頁面的時候,要求其他的jsp頁面中只寫網頁的主體內容,而不需要網頁的框架;
舉例:被引入的jsp文件中只寫兩個部分,一個是默認的聲明,另一個則是網頁的內容即可,而不要像引入頁面寫的那么多結構代碼,
否則頁面的html源代碼格式就不正確了,雖然不會影響頁面效果,至於格式如何不正確就不截圖演示了;

靜態導入的特點:所有的jsp文件翻譯成java文件時只會生成一個java文件,然后再編譯成一個class文件;
將靜態導入和后面的動態導入比較區別;

JSP中的include指令,它是將多個JSP文件翻譯成一個Java源代碼,把JSP的include指令稱為靜態包含。
注意:使用include引入其他的JSP頁面,一定要保證多個JSP頁面中嵌入的Java代碼中的變量名不能重復。
比如在一個jsp文件中定義了變量x,就不可以在別的jsp文件中定義相同的變量名,因為所有的jsp文件都會被翻譯到一個java文件中,
Java中不允許重復定義相同的變量名

6.3. JSP中的taglib指令
重點理解:
在JSP頁面上是可以書寫Java代碼,也可以書寫html代碼,一般公司中頁面是由美工維護,而我們負責后台開發。因此不建議在JSP頁面上嵌入過多的Java代碼。這時就需要把Java代碼從頁面中剔除。將頁面上需要書寫的所有標簽都封裝到對應的單獨的Java程序中,然后在頁面中使用taglib指令引入。引入的這些Java程序可以通過對應的標簽體現。其實這些標簽的底層還是Java代碼。僅僅只是JSP頁面上沒有了Java代碼而已。
taglib指令:主要是在頁面上引入其他已經定義好的標簽或者函數(其實就是在引入Java程序或者理解成類)。
在今天的資料里有專門介紹標簽庫的文檔,標簽庫相當於我們java中的API,可以使用定義好的標簽或函數,明天會重點講解
例如:這里引入一個使用頻率非常高的標簽作為演示

在taglib指令中的屬性:
uri:是當前標簽對應的Java代碼封裝之后綁定的名稱空間(給java代碼專門的命名)
prefix:它是當前在頁面上可以使用的標簽的前綴。
JSP中的代碼體現:

頁面顯示的效果:

1. JSP的內置對象(九大內置對象)
1.1. 什么是內置對象
內置對象:當前事物(對象)存在(創建)的之后,它的內部就已經擁有其他的對象,而在當前這個事物(對象)中是可以直接使用已經存在的其他對象。
例如:創建完A類的對象之后,在A類的源代碼底層其實已經存在了B類,C類,等其他類的對象,那么在A類中是可以直接使用B、C類的對象,而這些B、C類對象可以稱為A類的中的內置對象。
JSP文件被翻譯之后對應的就是一個Servlet程序。那么在JSP頁面上是可以直接使用Servlet中的學習過的相關對象。這些對象在頁面上的Java代碼中我們是可以直接使用的,而不需要再去手動的創建或者獲取這些對象。
JSP的內置對象9個:這9個內置對象,可以在JSP翻譯之后的對應的Java源代碼的service方法中找到:
在翻譯之后的service方法中的定義的對象:
HttpServletRequest 使用request引用操作 它是請求
HttpServletResponse 使用response引用操作 它是響應
HttpSession 使用session引用操作 session容器對象
ServletContext 使用application引用操作 表示當前項目對象
ServletConfig 使用config引用操作 專門獲取當前這個Servlet的配置信息
Object 使用page引用操作 = this
它表示的是當前那個JSP頁面對象(翻譯之后就是一個Servlet程序,這個page本身就是一個Servlet,但是由於在翻譯之后賦值給了Object 類型,導致不能使用使用Servlet中的功能)。后期把它當作第四個容器(域對象)使用。
PageContext 使用pageContext引用操作
它表示的是當前jsp頁面的上下文。它的主要功能之一就是可以獲取到JSP頁面上的其他八個內置對象。
Throwable 使用exception引用操作 主要是表示當前JSP頁面上的異常信息的
JspWriter 使用out引用操作 它相應於我們在Servlet中使用的response.getWriter
由於和Servlet相關的對象(HttpServletRequest、HttpServletResponse、HttpSession、ServletContext、ServletConfig),在學習Servlet時已經講解過,這里不再重復介紹。用法和Servlet中用法相同。

記憶九大內置對象:
四大容器:page request session application(servletContext )
其他五個:pageContext response ServletCofig exception out
1.1. page對象
在JSP頁面中,由於page對象被提升成了Object類型。但是這個page在賦值的時候,賦值為this。

而this表示的是當前的jsp頁面對象。jsp頁面翻譯之后又是Servlet程序,也就說當前的page本身就是一個Servlet對象,但由於被提升成Object類型,因此Servlet中的所有的方法page都無法使用。如果真的要使用,需要使用向下轉型。因此在JSP頁面中經常把page當做Servlet中的第4個容器(域對象)使用。
如果把page當做容器(域對象)使用的時候,這時它中保存的內容只能在這個JSP頁面中使用,在其他的地方無法使用。
web中的四個域對象(容器對象)范圍:從小到大順序:
page < request < session < ServletContext(application)
重點:四大域對象的存活時間,及內部數據的有效時間,使用范圍
page對象在跳轉到別的頁面時就銷毀,所以保存的數據只能在本jsp頁面使用,且未跳轉到別的頁面;
request對象在一次請求和一次響應結束后就銷毀,所以保存的數據只能在本次響應未結束前使用,
比如請求轉發就可以使用,使用范圍為當前項目下的所有servlet;
Session對象在一次會話期間都可以使用,也就是未關閉瀏覽器時,注意不要超過默認的session對象保存時間30分鍾,
范圍也是當前項目下的所有servlet,舉例如果向session域中存放了數據,沒有重啟瀏覽器銷毀session對象,
也沒有超過session默認的保存時間,則可以在本此會話中可以獲取數據
application對象在一個項目中都可以使用,關閉服務器時會自動銷毀application對象,開啟時會自動創建,
也就說如果往application域中存放數據,只要沒有重啟服務器,則在項目中的任意文件任意時候都可以取出數據
域對象存活時間的解釋:
page最小,本次頁面訪問結束即銷毀
request其次,本次請求響應結束即銷毀
Session其次,本次會話結束后即銷毀
Application最大,服務器關閉后即銷毀
域對象的使用范圍的解釋:
Page在本頁面內使用;
Request,session和application都是在本項目內使用,指多個servlet之間,或者servlet與jsp之間;
<body>
<%
// 需求: 向page容器中保存值
// 第一個參數: 指定參數的key
// 第二個參數: 指定參數的value
// 第三個參數: 指定參數的 域
pageContext.setAttribute("name", "張三", PageContext.PAGE_SCOPE);
%>
<%-- 從page容器中取值 --%>
<%= pageContext.getAttribute("name", PageContext.PAGE_SCOPE) %>
</body>
1.1. pageContext對象
pageConext它有四個功能:
1.獲取其他8個內置對象;
2.給四個域對象中設置值;
3.獲取四個域對象中的值;
4.移除四個域中的值。
相關的方法可以到可以從JspContext的API中查詢出對應的方法:

1.1.1. 獲取其他8個內置對象
獲取jsp頁面中的其他的8個內置對象:下面7個可以在PageContext對象中找到:

下面方法可以在JspContext對象中找到:


注意事項:在jsp中可以通過pageContext對象獲取其余的八大對象,同時也可以直接使用這九大內置對象;
所以通過pageContext對象獲取其余的八大對象的方法不常使用,了解即可;
1.1.1. 給四個域對中的設置數據
獲取四大域的int scope值的方法:PageContext類的靜態成員變量
Int scope = PageContext.PAGE_SCOPE
Int scope = PageContext.REQUEST_SCOPE
Int scope = PageContext.SESSION_SCOPE
Int scope = PageContext.APPLICATION_SCOPE
向域中存放數據的方法:
setAttribute(String name,Object value):沒有設置scope值,默認向page域中存放數據
setAttribute(String name,Object value,int scope): 設置scope值,向指定域中存放數據
setAttribute方法中的三個參數解釋:
第一個參數:是需要給某個域中保存的數據對應的key值
第二個參數:是需要給某個域中保存的數據,也就是key對應的value值
第三個參數:是需要將數據具體保存到哪個域中,可以通過PageContext中的靜態成員變量獲取到
例如:

其中setAttribute( Striing name , Object value ) 默認將數據保存在page域中。
如果需要設置在request、session、application域中,需要使用第二個setAttribute方法完成,當然設置在page域中也可以使用此方法;
注意:
1.pageContext是PageContext類的對象引用,所以首字母小寫,而PageContext.PAGE_SCOPE是指PageContext類,所以首字母大寫;
2.操作域中的數據有兩種方式:一是直接通過四大域對象操作,二是通過pageContext對象操作;
1.1.1. 四個域中獲取數據

從域中取出數據的方法:
getAttribute( String name):它默認是從page域中找key對應的value,如果沒有返回null。
getAttribute( String name , int scope):它是從指定的域中key對應的value。第一個參數是key值,第二個參數的域的scope值
getAttributeNamesInScope (int scope):它是指從指定的域中獲取所有的key值。
getAttributesScope(String name):獲取key所在域的int值
findAttribute( String name ):它是從page、request、session、application四個域中依次找指定key對應的value,如果有任何一個域找到,就不會再繼續找。如果四個域中都沒有返回null。
1.1.1.
從四個域中刪除數據

從域中刪除數據的方法:
removeAttribute( String name):從任意域中刪除指定name的數據。如果多個域中都有此name,將會將這幾個域中的數據全部刪除。
removeAttribute( String name , int scope ):從指定的域中刪除指定name的數據。
<body>
<!-- // 需求1: 通過pagecontext對象 向4大域對象保存數據 -->
<%
// 第一個參數: 屬性的key
// 第二個參數: 屬性的value
// 第三個參數: 屬性的域
pageContext.setAttribute("address", "上海1"); //兩個參數,默認向page域中放
pageContext.setAttribute("address", "上海2", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("address", "上海3", PageContext.SESSION_SCOPE);
pageContext.setAttribute("address", "上海4", PageContext.APPLICATION_SCOPE);
%>
<!-- // 需求3: 通過pageContext對象 刪除指定域對象的數據 和 刪除不指定域對象的數據(比較) -->
<%
pageContext.removeAttribute("address", PageContext.PAGE_SCOPE);
pageContext.removeAttribute("address", PageContext.REQUEST_SCOPE);
pageContext.removeAttribute("address", PageContext.SESSION_SCOPE);
pageContext.removeAttribute("address", PageContext.APPLICATION_SCOPE);
/*
// 刪除所有域中指定的屬性
pageContext.removeAttribute("address");
*/
%>
<!-- // 需求2: 通過pagecontext對象 從指定域對象獲取數據 -->
<%=pageContext.getAttribute("address") %>
<%=pageContext.getAttribute("address", PageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("address", PageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("address", PageContext.APPLICATION_SCOPE) %>
<hr/>
<!-- // 需求4: 通過pagecontext對象 從域對象獲取數據的簡化方式 -->
<%=pageContext.findAttribute("address") %>
</body>
1.1. out對象
out它主要是用來把數據輸出到頁面。
<%
out.println("out 輸出1");
response.getWriter().println("response 輸出1");
out.println("out 輸出2");
%>
頁面的顯示結果:

上面的顯示結果分析:

建議:在JSP頁面上如果需要輸出文本數據,全部使用out對象輸出。千萬不要response對象與out對象同時使用;
1.1. exception對象
在jsp頁面上要能夠使用exception內置對象,在jsp的page指令中,必須書寫isErrorPage=true,否則在頁面上是無法使用exception內置對象。
謹記:不要把異常帶到JSP頁面。一般異常需要在后台的Java代碼處理完成,如果真的有異常,就使用友好頁面處理。
1.2. 腳下留心
說明JSP的九大內置對象分別是什么?
page request session application
response config
pageContext exception out
記住:使用pageContext對象 如何操作四個域中的數據。
2. JSP中的標簽
2.1. JSP標簽作用
雖然sun公司在設計JSP技術的時候,允許在JSP頁面中嵌入java代碼,但是這樣會導致html、js、java等代碼嚴重的耦合在同一個文件中,導致后期維護十分的麻煩。於是sun公司就將可以在jsp頁面上書寫的java提前已經封裝到對應的標簽中,然后讓開發者在jsp頁面上通過使用標簽的方式來使用相應的java代碼。其實這些標簽的用途並不大,后期如果真的需要功能強大的java代碼,需要開發人員自己手動封裝標簽的。這里階段介紹下JSP中已經內置好的幾個標簽。

jsp:useBean:創建對象
jsp:setProperty:設置屬性的值,相當於類中的setXxx方法
jsp:getProperty:獲取屬性的值,相當於類中的setXxx方法
它們三個合起來可以操作一個Java對象,並且可以給這個對象的屬性設置值或者取出某個對象的屬性值。
jsp:forward:請求轉發到別的頁面
// 需求1: 通過標簽創建user對象, 將user對象保存request對象中
// 需求2: 通過標簽給user對象的name屬性設置為 張三, passwrode屬性值 設置為 123;
// 需求3: 通過標簽取出user對象的name屬性值 和age屬性值
User類:
public class User {
private String username ;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress(){
return "路";
}
}
Jsp頁面:
<body>
<!-- 需求1:通過標簽創建user對象,將user對象保存到request域中
相當於java中的 User user = new User();
注意:jsp的 創建對象的標簽依賴於項目中有該對象的類
-->
<!-- id屬性為對象名,可以任意起名,class屬性為對象所在類的位置,scope屬性為將對象存放的域 -->
<jsp:useBean id="user" class="cn.itcast.javabean.User" scope="request"></jsp:useBean>
<!-- 需求2: 通過標簽給user對象的name屬性設置為張三, passwrode屬性值設置為 123;
相當於java中的 user.setUsername("張三")
注意:jsp的 設置對象屬性值的標簽依賴於該對象的類中有對應的setXxx方法
-->
<!-- 注意:property對應的是類中的setXxx或者getXxx方法,而不是成員變量,
即使只有setXxx或者getXxx方法,沒有對應的成員變量,property屬性也會生效
-->
<!-- name屬性為對象名,要與上面的對象名一致,property屬性為setXxx方法中Xxx的值,
注意除了首字母大小寫外必須一致,value屬性為設置的屬性值
-->
<jsp:setProperty name="user" property="username" value="張三"/>
<jsp:setProperty name="user" property="password" value="123"/>
<!-- 需求3: 通過標簽 取出user對象的username屬性值 和password屬性值
相當於java中的user.getUsername()
注意:jsp的 獲取對象屬性值的標簽依賴於該對象的類中有對應的getXxx方法,
-->
<jsp:getProperty name="user" property="username"/>
<jsp:getProperty name="user" property="password"/>
<jsp:getProperty name="user" property="address"/>
</body>
注意:
1.jsp標簽中3個操作對象的功能分別依賴於對象所在類,以及setXxx、getXxx方法的存在;
2.Jsp:getProperty 標簽的結果會顯示在瀏覽器上,別的則不會顯示;
1.1. include標簽(動態包含)
書寫格式:

原理:

面試題:靜態包含和動態包含區別?
1.書寫格式
靜態包含是JSP中的include指令,書寫格式自然與動態包含不同
動態包含是JSP中的include標簽,書寫格式自然與靜態包含不同
靜態格式:

動態格式:

1.合並原理
靜態包含是將多個jsp文件翻譯合並在同一個java文件中,然后在生成一個class文件,最后在瀏覽器上生成一個頁面;
動態包含是將多個JSP文件翻譯成多個java文件,然后在生成多個對應的class文件,最后在瀏覽器上合並生成一個頁面;
2.聲明變量
這個不算是一個單獨的區別,只是一個補充點,由於合並遠離不同,靜態包含的多個jsp頁面中不可以重復聲明同一變量名,
因為在生成一個java文件時會報錯,但動態包含由於沒有生成同一個java文件中,所以可以重復聲明同一變量名;
1.1. forword標簽
// 需求4:通過標簽請求轉發到別的頁面
<!-- 需求4:請求轉發的jsp標簽 -->
<jsp:forward page="index.jsp"></jsp:forward>
它主要是代替我們在Servlet中學習的request的請求轉發的。
