JSP的刨根問(wèn)底

2020-3-22    前端達(dá)人

JSP的刨根問(wèn)底

  • 一.概念
  • 二.原理
  • 三.腳本
  • 四.內(nèi)置對(duì)象
  • 五.注釋
  • 六.編譯指令
  • 七.動(dòng)作指令


  • 點(diǎn)擊查看原圖


    這篇文章從一個(gè)初學(xué)者的角度,復(fù)習(xí)一波JSP。






    一.概念
    Java Server Pages: java服務(wù)器端頁(yè)面

    可以理解為:一個(gè)特殊的頁(yè)面,其中既可以指定定義html標(biāo)簽,又可以定義java代碼
    用于簡(jiǎn)化書(shū)寫(xiě)?。?!
    二.原理
    本質(zhì)是一個(gè)Servlet

    三.腳本
    定義:Jsp定義java代碼的方式

    <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什么,該腳本中就可以定義什么。
    <%! 代碼 %>:定義的java代碼,在jsp轉(zhuǎn)換后的java類的成員位置。
    <%= 代碼 %>:定義的java代碼,會(huì)輸出到頁(yè)面上。輸出語(yǔ)句中可以定義什么,該腳本中就可以定義什么。
    四.內(nèi)置對(duì)象
    對(duì)象名 實(shí)現(xiàn)接口或繼承類 作用
    PageContext 當(dāng)前頁(yè)面共享數(shù)據(jù),還可以獲取其他八個(gè)內(nèi)置對(duì)象
    request HttpServletRequest 一次請(qǐng)求訪問(wèn)的多個(gè)資源(轉(zhuǎn)發(fā))
    session HttpSession 一次會(huì)話的多個(gè)請(qǐng)求間
    application ServletContext 所有用戶間共享數(shù)據(jù)
    response HttpServletResponse 響應(yīng)對(duì)象
    page Object 當(dāng)前頁(yè)面(Servlet)的對(duì)象 this
    out JspWriter 輸出對(duì)象,數(shù)據(jù)輸出到頁(yè)面上
    config ServletConfig Servlet的配置對(duì)象
    expection Throwable 異常對(duì)象
    五.注釋
    1.html注釋
    <!-- -->:只能注釋html代碼片段
    2.jsp注釋
    <%-- --%>:可以注釋所有

    六.編譯指令
    作用
    用于配置JSP頁(yè)面,導(dǎo)入資源文件

    格式
    <%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>
    分類
    1.page
    配置JSP頁(yè)面的
    1. contentType:等同于response.setContentType()
    *設(shè)置響應(yīng)體的mime類型以及字符集
    * 設(shè)置當(dāng)前jsp頁(yè)面的編碼(只能是高級(jí)的IDE才能生效,如果使用低級(jí)工具,則需要設(shè)置pageEncoding屬性設(shè)置當(dāng)前頁(yè)面的字符集)
    2.import:導(dǎo)包
    3. errorPage:當(dāng)前頁(yè)面發(fā)生異常后,會(huì)自動(dòng)跳轉(zhuǎn)到指定的錯(cuò)誤頁(yè)面
    4.isErrorPage:標(biāo)識(shí)當(dāng)前也是是否是錯(cuò)誤頁(yè)面。
    * true:是,可以使用內(nèi)置對(duì)象exception
    * false:否。默認(rèn)值。不可以使用內(nèi)置對(duì)象exception
    2.include
    頁(yè)面包含的。導(dǎo)入頁(yè)面的資源文件

     <%@include file="top.jsp"%>
    3.導(dǎo)入資源
    導(dǎo)入資源

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      prefix:前綴,自定義的
    1
    七.動(dòng)作指令
    作用
    動(dòng)作指令與編譯指令不間,編譯指令是通知 Servlet 引擎的處理消息,而動(dòng)作指令只是運(yùn)行時(shí)的腳本動(dòng)作。編譯指令在將JSP 編譯成 Servlet 時(shí)起作用:處理指令通??商鎿Q成 Java腳本,是 JSP腳本的標(biāo)準(zhǔn)化寫(xiě)法。

    分類
    指令 作用
    jsp:forward 執(zhí)行頁(yè)面轉(zhuǎn)向,將請(qǐng)求的處理轉(zhuǎn)發(fā)到下一個(gè)頁(yè)面。
    jsp:param 用于傳遞參數(shù),必須與其他支持參數(shù)曲標(biāo)簽一起使用。
    jsp:include 用于動(dòng)態(tài)引入一個(gè) JSP 頁(yè)面。
    jsp:plugin 用于下載 JavaBean 或 Applet 到客戶端執(zhí)行。
    jsp:useBean 使用 JavaBean。
    jsp:setProperty 修改 JavaBean 實(shí)例的屬性值。
    jsp:getProperty 獲取 JavaBean 實(shí)例的屬性值。
    具體細(xì)節(jié):
    jsp:forward:
    動(dòng)作把請(qǐng)求轉(zhuǎn)到另外的頁(yè)面。可以轉(zhuǎn)發(fā)靜態(tài)的HTML頁(yè)面,也可以轉(zhuǎn)發(fā)動(dòng)態(tài)的JSP頁(yè)面,或者轉(zhuǎn)發(fā)到容器中的servlet jsp:forward標(biāo)記只有一個(gè)屬性page。 page屬性包含的是一個(gè)相對(duì)URL。 page的值既可以直接給出,也可以在請(qǐng)求的時(shí)候動(dòng)態(tài)計(jì)算。

    jsp:param
    用于設(shè)定參數(shù)值,這個(gè)指令不能單獨(dú)使用 可以與以下三個(gè)指令結(jié)合使用:
    jsp:include :用于將參數(shù)值出入被導(dǎo)入頁(yè)面
    jsp:forword : 用于將參數(shù)值傳入被轉(zhuǎn)向頁(yè)面
    jsp:plugin : 用于將參數(shù)值傳入頁(yè)面中javaBean的實(shí)例

    jsp:include
    (拿目標(biāo)頁(yè)面插入原有頁(yè)面)該動(dòng)作是一個(gè)動(dòng)態(tài)的include指令,也用于帶入某個(gè)頁(yè)面,他不會(huì)導(dǎo)入被include頁(yè)面的編譯指令,僅僅導(dǎo)入頁(yè)面的body內(nèi)容插入到本頁(yè)面
    該動(dòng)作把指定文件插入正在生成的頁(yè)面。其語(yǔ)法如下:   flush:用于指定輸出緩存是否轉(zhuǎn)移到被導(dǎo)入的文件中, true:包含在被導(dǎo)入的文件中 false:包含在源文件中
    前面已經(jīng)介紹過(guò)include指令,它是在JSP文件被轉(zhuǎn)換成Servlet的時(shí)候引入文件,而這里的jsp:include動(dòng)作不同,插入文件的時(shí)間是在頁(yè)面被請(qǐng)求的時(shí)候。j
    sp:include動(dòng)作的文件引入時(shí)間決定了它的效率要稍微差一點(diǎn),而且被引用文件不能包含某些JSP代碼(例如不能設(shè)置HTTP頭),但它的靈活性卻要好得多。
    jsp:plugin

    用于下載服務(wù)器端的javaBean或applet到客戶端)
    jsp:plugin動(dòng)作用來(lái)根據(jù)瀏覽器的類型,插入通過(guò)Java插件運(yùn)行Java Applet所必需的OBJECT或EMBED元素。

    <jsp:plugin  
      type="bean | applet"   : 被執(zhí)行的java程序的類型
      code="classFileName" :被執(zhí)行的文件名,必須以  .class 結(jié)尾
      codebase="classFileDirectoryName"   :被執(zhí)行文件的所在目錄
      [ name="instanceName" ] :給程序起一個(gè)名字用來(lái)標(biāo)識(shí)該程序
      [ archive="URIToArchive, ..." ] :指向一些要預(yù)先載入的將要使用到的類
      [ align="bottom | top | middle | left | right" ] :
      [ height="displayPixels" ]
      [ width="displayPixels" ]
      [ hspace="leftRightPixels" ] 
      [ vspace="topBottomPixels" ]
      [ jreversion="JREVersionNumber | 1.1" ]   :能正確運(yùn)行改程序必須的JRE的版本
      [ nsplug inurl="URLToPlugin" ]  
      [ iepluginurl="URLToPlugin" ] >
      [ <jsp:params>
      [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+
      </jsp:params> ]
      [ <jsp:fallback> text message for user </jsp:fallback> ]  :當(dāng)不能正確顯示該Applet時(shí),顯示該指令中的文本提示
     <jsp:plugin>
    



    jsp:useBean
    useBean:用于在jsp頁(yè)面中初始化一個(gè)java實(shí)例(如果多個(gè)jsp中需要重復(fù)使用某段代碼,可以把這段代碼定義成java類在頁(yè)面中引用)
    jsp:useBean動(dòng)作用來(lái)裝載一個(gè)將在JSP頁(yè)面中使用的JavaBean。這個(gè)功能非常有用,因?yàn)樗沟梦覀兗瓤梢园l(fā)揮Java組件重用的優(yōu)勢(shì),同時(shí)也避免了損失JSP區(qū)別于Servlet的方便性。
    jsp:useBean動(dòng)作最簡(jiǎn)單的語(yǔ)法為:<jsp:useBean id=“JavaBean的名稱” class=“package.class"包名.類名” scope=“有效范圍”/>

    這行代碼的含義是:“創(chuàng)建一個(gè)由class屬性指定的類的實(shí)例,然后把它綁定到其名字由id屬性給出的變量上”。不過(guò),就象我們接下來(lái)會(huì)看到的,定義一個(gè)scope屬性可以讓Bean關(guān)聯(lián)到更多的頁(yè)面,它可接受四個(gè)值:request、session、page、application。此時(shí),jsp:useBean動(dòng)作只有在不存在同樣id和scope的Bean時(shí)才創(chuàng)建新的對(duì)象實(shí)例,同時(shí),獲得現(xiàn)有Bean的引用就變得很有必要。
    獲得Bean實(shí)例之后,要修改Bean的屬性既可以通過(guò)jsp:setProperty動(dòng)作進(jìn)行,也可以在Scriptlet中利用id屬性所命名的對(duì)象變量,通過(guò)調(diào)用該對(duì)象的方法顯式地修改其屬性。這使我們想起,當(dāng)我們說(shuō)“某個(gè)Bean有一個(gè)類型為X的屬性foo”時(shí),就意味著“這個(gè)類有一個(gè)返回值類型為X的getFoo方法,還有一個(gè)setFoo方法以X類型的值為參數(shù)”?! ∮嘘P(guān)jsp:setProperty動(dòng)作的詳細(xì)情況在后面討論。但現(xiàn)在必須了解的是,我們既可以通過(guò)jsp:setProperty動(dòng)作的value屬性直接提供一個(gè)值,也可以通過(guò)param屬性聲明Bean的屬性值來(lái)自指定的請(qǐng)求參數(shù),還可以列出Bean屬性表明它的值應(yīng)該來(lái)自請(qǐng)求參數(shù)中的同名變量。
    在JSP表達(dá)式或Scriptlet中讀取Bean屬性通過(guò)調(diào)用相應(yīng)的getXXX方法實(shí)現(xiàn),或者更一般地,使用jsp:getProperty動(dòng)作。
    注意,包含Bean的類文件應(yīng)該放到服務(wù)器正式存放Java類的目錄下,而不是保留給修改后能夠自動(dòng)裝載的類的目錄。例如,對(duì)于Java Web
    Server來(lái)說(shuō),Bean和所有Bean用到的類都應(yīng)該放入classes目錄,或者封裝進(jìn)jar文件后放入lib目錄,但不應(yīng)該放到servlets下。
    id:javaBean的實(shí)例名 class: javaBean的實(shí)現(xiàn)類 scope:指定javaBean實(shí)例的生存范圍
    page:javaBean僅在該頁(yè)面有效 request:javaBean在本次請(qǐng)求中有效 session:
    javaBean在本次session內(nèi)有效 application:
    javaBean在本應(yīng)用內(nèi)一直有效  下面是一個(gè)很簡(jiǎn)單的例子,它的功能是裝載一個(gè)Bean,然后設(shè)置/讀取它的message屬性。
    關(guān)于jsp:useBean的進(jìn)一步說(shuō)明   使用Bean最簡(jiǎn)單的方法是先用下面的代碼裝載Bean:   <jsp:useBean id=“name” class=“package.class” />
    然后通過(guò)jsp:setProperty和jsp:getProperty修改和提取Bean的屬性。 不過(guò)有兩點(diǎn)必須注意?! ?第一,我們還可以用下面這種格式實(shí)例化Bean: <jsp:useBean …>   Body   </jsp:useBean>
    它的意思是,只有當(dāng)?shù)谝淮螌?shí)例化Bean時(shí)才執(zhí)行Body部分,如果是利用現(xiàn)有的Bean實(shí)例則不執(zhí)行Body部分。正如下面將要介紹的,jsp:useBean并非總是意味著創(chuàng)建一個(gè)新的Bean實(shí)例。
    第二,除了id和class外,jsp:useBean還有其他三個(gè)屬性,即:scope、type、beanName。
    id:命名引用該Bean的變量。如果能夠找到id和scope相同的Bean實(shí)例,jsp:useBean動(dòng)作將使用已有的Bean實(shí)例而不是創(chuàng)建新的實(shí)例。
    class:指定Bean的完整包名。
    scope:指定Bean在哪種上下文內(nèi)可用,可以取下面的四個(gè)值之一:page、request、session和application。  默認(rèn)值是page,表示該Bean只在當(dāng)前頁(yè)面內(nèi)可用(保存在當(dāng)前頁(yè)面的PageContext內(nèi))。
    request表示該Bean在當(dāng)前的客戶請(qǐng)求內(nèi)有效(保存在ServletRequest對(duì)象內(nèi))。
    session表示該Bean對(duì)當(dāng)前HttpSession內(nèi)的所有頁(yè)面都有效。
    最后,如果取值application,則表示該Bean對(duì)所有具有相同ServletContext的頁(yè)面都有效。
    scope之所以很重要,是因?yàn)閖sp:useBean只有在不存在具有相同id和scope的對(duì)象時(shí)才會(huì)實(shí)例化新的對(duì)象;
    如果已有id和scope都相同的對(duì)象則直接使用已有的對(duì)象,此時(shí)jsp:useBean開(kāi)始標(biāo)記和結(jié)束標(biāo)記之間的任何內(nèi)容都將被忽略。
    type:指定引用該對(duì)象的變量的類型,它必須是Bean類的名字、超類名字、該類所實(shí)現(xiàn)的接口名字之一。請(qǐng)記住變量的名字是由id屬性指定的。
    beanName:指定Bean的名字。如果提供了type屬性和beanName屬性,允許省略class屬性。

    jsp:setProperty
    jsp:setProperty用來(lái)設(shè)置已經(jīng)實(shí)例化的Bean對(duì)象的屬性,有兩種用法。
    首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,    …

    第二種用法是把jsp:setProperty放入jsp:useBean元素的內(nèi)部, …

    jsp:setProperty動(dòng)作有下面四個(gè)屬性:name:表示要設(shè)置屬性的是哪個(gè)Bean?! roperty:表示要設(shè)置哪個(gè)屬性。有一個(gè)特殊用法:如果property的值是"",表示所有名字和Bean屬性名字匹配的請(qǐng)求參數(shù)都將被傳遞給相應(yīng)的屬性set方法。  value:value屬性是可選的。該屬性用來(lái)指定Bean屬性的值。字符串?dāng)?shù)據(jù)會(huì)在目標(biāo)類中通過(guò)標(biāo)準(zhǔn)的valueOf方法自動(dòng)轉(zhuǎn)換成數(shù)字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean類型的屬性值(比如“true”)通過(guò)Boolean.valueOf轉(zhuǎn)換,int和Integer類型的屬性值(比如"42")通過(guò)Integer.valueOf轉(zhuǎn)換?! alue和param不能同時(shí)使用,但可以使用其中任意一個(gè)?! aram:param是可選的。它指定用哪個(gè)請(qǐng)求參數(shù)作為Bean屬性的值。如果當(dāng)前請(qǐng)求沒(méi)有參數(shù),則什么事情也不做,系統(tǒng)不會(huì)把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供默認(rèn)屬性值,只有當(dāng)請(qǐng)求參數(shù)明確指定了新值時(shí)才修改默認(rèn)屬性值?! ±纾旅娴拇a片斷表示:如果存在numItems請(qǐng)求參數(shù)的話,把numberOfItems屬性的值設(shè)置為請(qǐng)求參數(shù)numItems的值;否則什么也不做?!   ∪绻瑫r(shí)省略value和param,其效果相當(dāng)于提供一個(gè)param且其值等于property的值。進(jìn)一步利用這種借助請(qǐng)求參數(shù)和屬性名字相同進(jìn)行自動(dòng)賦值的思想,你還可以在property(Bean屬性的名字)中指定“”,然后省略value和param。此時(shí),服務(wù)器會(huì)查看所有的Bean屬性和請(qǐng)求參數(shù),如果兩者名字相同則自動(dòng)賦值?! ∠旅媸且粋€(gè)利用JavaBean計(jì)算素?cái)?shù)的例子。如果請(qǐng)求中有一個(gè)numDigits參數(shù),則該值被傳遞給Bean的numDigits屬性;numPrimes也類似。  JspPrimes.jsp

    20200321215032100.jpg
    jsp:getProperty
    jsp:getProperty動(dòng)作提取指定Bean屬性的值,轉(zhuǎn)換成字符串,然后輸出。
    jsp:getProperty有兩個(gè)必需的屬性,即:name,表示Bean的名字;property,表示要提取哪個(gè)屬性的值。

    END?。?!有什么意見(jiàn)可以提出來(lái)!
    長(zhǎng)路漫漫,JAVA為伴!??!
    ————————————————
    版權(quán)聲明:本文為CSDN博主「福爾摩東」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
    原文鏈接:https://blog.csdn.net/qq_43688587/article/details/105017469

分享本文至:

日歷

鏈接

個(gè)人資料

存檔