jsp簡介


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,本質是ServletJsp文件會被編譯成java文件,再被編譯成class文件

 

5. JSP中的注釋

由於JSP中可以書寫html、Java代碼,因此在JSP中可以嵌入html注釋,還可以嵌入Java注釋,還可以書寫JSP自己的注釋

1html注釋:只能修飾html內容。 <!注釋內容 -->

2java注釋:只能修飾java代碼。 //  /* */ /** */

3jsp注釋:都可以包括。可以注釋掉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中常用的指令有三個:pageincludetaglib

注意: 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指令默認有languageimportpageEncoding屬性,並且它們的屬性值也不用修改(如果pageEncoding的編碼表不是UTF-8需要修改為UTF-8)。

jsp中常用的碼表為utf-8gbk,否則容易出現中文亂碼問題;

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.jspbody.jspfooter.jspmain.jsp四個頁面,將top.jspbody.jspfooter.jsp三個頁面引入到main.jsp頁面上;

某個頁面上引入其他的jsp頁面的時候,要求其他的jsp頁面中只寫網頁的主體內容,而不需要網頁的框架

舉例:被引入的jsp文件中只寫兩個部分,一個是默認的聲明,另一個則是網頁的內容即可,而不要像引入頁面寫的那么多結構代碼,

否則頁面的html源代碼格式就不正確了,雖然不會影響頁面效果,至於格式如何不正確就不截圖演示了;

靜態導入的特點:所有的jsp文件翻譯成java文件時只會生成一個java文件,然后再編譯成一個class文件;

將靜態導入和后面的動態導入比較區別;

JSPinclude指令,它是將多個JSP文件翻譯成一個Java源代碼,把JSPinclude指令稱為靜態包含。

注意使用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類中是可以直接使用BC類的對象,而這些BC類對象可以稱為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相關的對象HttpServletRequestHttpServletResponseHttpSessionServletContextServletConfig),在學習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在本頁面內使用;

        Requestsessionapplication都是在本項目內使用,指多個servlet之間,或者servletjsp之間;

  <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.移除四個域中的值。

相關的方法可以到可以JspContextAPI查詢出對應的方法:

 

 

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域中。

如果需要設置在requestsessionapplication域中,需要使用第二個setAttribute方法完成當然設置在page域中也可以使用此方法; 

注意:

1.pageContextPageContext類的對象引用,所以首字母小寫,而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、requestsessionapplication四個域中依次找指定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內置對象,在jsppage指令中,必須書寫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代碼,但是這樣會導致htmljsjava等代碼嚴重的耦合在同一個文件中,導致后期維護十分的麻煩。於是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個操作對象的功能分別依賴於對象所在類,以及setXxxgetXxx方法的存在;

2.JspgetProperty 標簽的結果會顯示在瀏覽器上,別的則不會顯示;

 

 

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的請求轉發的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM