2020-3-22 前端達(dá)人
這篇文章從一個(gè)初學(xué)者的角度,復(fù)習(xí)一波JSP。
一.概念
Java Server Pages: java服務(wù)器端頁(yè)面
可以理解為:一個(gè)特殊的頁(yè)面,其中既可以指定定義html標(biāo)簽,又可以定義java代碼
用于簡(jiǎn)化書寫?。?!
二.原理
本質(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)化寫法。
分類
指令 作用
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è)面??梢赞D(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?! ∧J(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方法?! alue: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)屬性值。 例如,下面的代碼片斷表示:如果存在numItems請(qǐng)求參數(shù)的話,把numberOfItems屬性的值設(shè)置為請(qǐng)求參數(shù)numItems的值;否則什么也不做。 如果同時(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
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
藍(lán)藍(lán)設(shè)計(jì)的小編 http://sillybuy.com