javascript
JSP(1)—基础知识
JSP(1)—基本知識(shí)
起源
在很多動(dòng)態(tài)網(wǎng)頁(yè)中絕大多數(shù)網(wǎng)頁(yè)都是固定不變的只有局部?jī)?nèi)容需要?jiǎng)討B(tài)產(chǎn)生和改變,如果使用Servlet程序來(lái)輸出只有局部?jī)?nèi)容需要?jiǎng)討B(tài)改變的網(wǎng)頁(yè),其中所有的的靜態(tài)內(nèi)容,也需要程序員用java代碼產(chǎn)生,整個(gè)Servlet程序代碼會(huì)非常臃腫,編寫(xiě)和維護(hù)都非常困難。
對(duì)與大量靜態(tài)內(nèi)容的美工設(shè)計(jì)和相關(guān)HTML語(yǔ)句的編寫(xiě),并不是程序員所要做的事,程序員對(duì)此也不一定在行,網(wǎng)頁(yè)美工設(shè)計(jì)和制作人員不懂java編程更是無(wú)法完成這樣的工作,為了彌補(bǔ)Servlet缺陷,SUN在servlet的基礎(chǔ)上推出了JSP(java server page)技術(shù)作為解決方案。
JSP是簡(jiǎn)化了Servlet編寫(xiě)的一種技術(shù),它將Servlet和HTML語(yǔ)句混合在一個(gè)文件中編寫(xiě),只對(duì)網(wǎng)頁(yè)中動(dòng)態(tài)產(chǎn)生的內(nèi)容采用java編寫(xiě),而相對(duì)固定的靜態(tài)頁(yè)面采用普通的靜態(tài)HTML頁(yè)面的方式編寫(xiě)。在JSP中編寫(xiě)java代碼需要嵌套在<% %>中,嵌套在<%%>中的java代碼被稱為腳本片段,沒(méi)有嵌套在<%%>中的代碼被稱為模板元素,JSP文件就像普通的HTML文件一樣,他們可以放置WEB應(yīng)用程序的除WEB-INF目錄之外的任何目錄中,JSP頁(yè)面的訪問(wèn)路徑和HTML頁(yè)面的訪問(wèn)路徑一樣。運(yùn)行原理
WEB容器(Servlet引擎),接收到以.jsp為擴(kuò)展名的URL訪問(wèn)請(qǐng)求時(shí),它將該請(qǐng)求轉(zhuǎn)發(fā)給JSP引擎去處理,每個(gè)JSP頁(yè)面第一次被訪問(wèn)時(shí)JSP引擎將它翻譯成Servlet源程序,接著將這個(gè)Servlet源程序編譯成Servlet的class類文件,然后在由WEB容器(servlet引擎)像調(diào)用普通的Servlet程序一樣的方式來(lái)裝載和解釋執(zhí)行這個(gè)由JSP頁(yè)面翻譯成Servlet程序,JSP規(guī)范沒(méi)有明指出JSP中的腳本語(yǔ)言必須是java語(yǔ)言,也可以是其他語(yǔ)言,但是JSP頁(yè)面最后必須轉(zhuǎn)換成java Servlet程序。- 隱含對(duì)象(自己沒(méi)有聲明就可使用的變量),共九個(gè)
request、response、pageContext、session、application、config、out、page、exception
①request(常用):HttpServletRequest的一個(gè)對(duì)象
②response:HttpServletResponse的一個(gè)對(duì)象
③pageContext(常用):頁(yè)面的上下文,是PageContext的一個(gè)對(duì)象,可以從該對(duì)象中獲取其他八個(gè)隱含對(duì)象,也可以從中獲取當(dāng)前頁(yè)面的其他信息。(學(xué)習(xí)自定義標(biāo)簽時(shí)用到它)
④session(常用):代表瀏覽器和服務(wù)器一次對(duì)話,是HttpSession的一個(gè)對(duì)象
⑤applicationn(常用):代表當(dāng)前web應(yīng)用,是ServletContext的對(duì)象。獲取servlet初始化對(duì)象
⑥config:當(dāng)前JSP對(duì)應(yīng)的Servlet的ServletConfig對(duì)象(在開(kāi)發(fā)過(guò)程中很少用),需要訪問(wèn)當(dāng)前JSP頁(yè)面配置的初始化參數(shù),
需要通過(guò)映射的地址才可以:http://localhost:8080/Demo5/hellojsp?name=test
⑦out(常用):JspWriter對(duì)象,調(diào)用out.println()可以直接把字符串打印到瀏覽器上
⑧page:指向JSP對(duì)應(yīng)的Servlet對(duì)象的引用,但為Object類型,只能調(diào)用Object的方法
⑨exception:只在聲明了isErrorPage=”true”時(shí),才可以使用
- 這些對(duì)象對(duì)屬性的作用域范圍
- 基本語(yǔ)法
①模板元素:JSP中的靜態(tài)的HTMl內(nèi)容,在靜態(tài)的HTML內(nèi)容之中可以嵌套JSP的其他元素來(lái)產(chǎn)生動(dòng)態(tài)內(nèi)容和執(zhí)行業(yè)務(wù)邏輯,jsp模板元素定義了網(wǎng)頁(yè)的基本框架和外觀。
②表達(dá)式:提供了將一個(gè)java變量或表達(dá)式的計(jì)算結(jié)果輸出到客戶端的簡(jiǎn)化方式,它將要輸出的變量或表達(dá)式封裝在<%=和 %>之中。jsp表達(dá)式的變量或表達(dá)式的計(jì)算結(jié)果將被轉(zhuǎn)換成一個(gè)字符串,然后被插入進(jìn)整個(gè)jsp頁(yè)面輸出結(jié)果的相應(yīng)位置,jsp變量或表達(dá)式的后面不能有分號(hào)jsp表達(dá)式被翻譯成Serrvlet程序中的out.print(…)語(yǔ)句。
例如:
③腳本片段:是指嵌套在<% %>之中的java程序代碼。多個(gè)腳本片段可以互相訪問(wèn)
例如:
④聲明(在jsp頁(yè)面中幾乎不使用):jsp將java代碼封裝在<%! %>之中它里面的代碼將被插入到Servlet的jspSevlet方法的外面,
所以jsp聲明可用于定義jsp頁(yè)面轉(zhuǎn)換成的Servlet程序的靜態(tài)代碼塊、成員變量和方法。jsp隱式對(duì)象的作用范圍僅限于Servlet的jspServlet方法,所以在jsp聲明中不能使用這些隱式對(duì)象。
例如:
⑤EL表達(dá)式
⑥注釋:(在瀏覽器上查看源代碼時(shí)可以看到)、<%– jsp注釋 –%>(在瀏覽器上查看源代碼時(shí)看不到),或者說(shuō)jsp注釋阻止java代碼執(zhí)行。
⑦特殊字符序列的轉(zhuǎn)義處理
⑧如何查找JSP頁(yè)面的錯(cuò)誤
- 對(duì)象的屬性
①方法:
getAttribute(String name):獲取指定的屬性
Enumeration getAttributeNames():獲取所有的屬性名組成的Enumeration對(duì)象
removeAttribute(String name):移除指定的屬性
void setAttribute(String name, Object o):設(shè)置屬性
②對(duì)象:
pageContext、request、session、application這個(gè)四個(gè)對(duì)象含有這個(gè)四個(gè)方法,這四個(gè)對(duì)象也叫域?qū)ο?
③范圍:
pageContext:屬性的作用范圍僅限于當(dāng)前jsp頁(yè)面
request:屬性的作用范圍僅限于同一個(gè)請(qǐng)求,(在請(qǐng)求轉(zhuǎn)發(fā)的情況下可以獲取屬性值)
session:屬性的作用范圍僅限于一次會(huì)話,(瀏覽器打開(kāi)到關(guān)閉稱為一次會(huì)話,在此期間不會(huì)失效)(只要不重啟瀏覽器就可獲取到)
application:屬性的作用范圍僅限于當(dāng)前web應(yīng)用,是范圍最大的屬性作用范圍,只要在一處設(shè)置屬性,在其他各處的jsp或
Servlet中都可以獲取到。(只要不重啟tomcat就可獲取到) - JSP指令
①簡(jiǎn)介
jsp指令是為jsp引擎而設(shè)計(jì)的,它們并不直接產(chǎn)生任何可見(jiàn)的輸出,而是告訴引擎如何處理jsp頁(yè)面中的其余部分。
②語(yǔ)法格式
<%@ 指令 屬性名=”值” %>,注意屬性名部分大小寫(xiě)敏感
例如:<%@ page contentType="text/html";charset="gbk2312"%>
③種類
目前jsp2.0中,定義了page、include、taglib這三種指令
④使用方式
如果在一個(gè)jsp頁(yè)面中定義一個(gè)指令的多個(gè)屬性可以使用多條指令語(yǔ)句單獨(dú)設(shè)置每個(gè)屬性,也可以使用同一條指令語(yǔ)句設(shè)置該指令的多個(gè)屬性
例如:
⑤page指令
用于定義jsp頁(yè)面的各種屬性,無(wú)論page指令出現(xiàn)在什么地方,它的作用也是整個(gè)頁(yè)面,為了程序的可讀性和遵循良好的編程習(xí)慣,page指令一般放在jsp頁(yè)面的起始位置。
JSP2.0中定義的page指令的完整語(yǔ)法
<%@ page[language=”java”]指定用什么語(yǔ)言來(lái)編譯,但是目前只支持java
[extends=”package.class”]指定jsp網(wǎng)頁(yè)產(chǎn)生的Servlet是繼承哪個(gè)類
[import=”“]決定jsp頁(yè)面使用那些javaAPI
*[session=”true/false”]決定頁(yè)面是否使用session對(duì)象,默認(rèn)true
*[contentType=”test/html”;charset=”gb2312”]表示指定當(dāng)前頁(yè)面的響應(yīng)類型
[isThreadSafe=”true/false”]是否支持多線程,默認(rèn)true
[buffer=”none/size in kb”]決定輸出流是否有緩沖區(qū),默認(rèn)有8kb
[autoFlush=”true/false”]決定輸出流的緩沖區(qū)慢了之后是否需要自動(dòng)清除,緩沖區(qū)滿了之后會(huì)產(chǎn)生異常,默認(rèn)true
*[pageEncoding=”ISO-8859-1”]編碼方式,通常情況下與contentType中charset的值一致
*[isELLgnored=”true/false”]表示在此jsp頁(yè)面是否忽略EL表達(dá)式,true為忽略,false為支持,默認(rèn)false
*[errorPage=”url”]如果頁(yè)面發(fā)生異常,網(wǎng)頁(yè)默認(rèn)指向一個(gè)url
*[isErrorPage=”true/false”]表示頁(yè)面是否是錯(cuò)誤處理頁(yè)面,默認(rèn)false
最后這個(gè)兩個(gè)屬性一般是配合使用,遇到異常時(shí),errorPage指定跳到有isErrorPage聲明的屬性的網(wǎng)頁(yè)中,對(duì)于Tomcat服務(wù)器而言,WEB-INF下的文件不能直接訪問(wèn),但可以通過(guò)請(qǐng)求轉(zhuǎn)發(fā),而errorPage調(diào)到的錯(cuò)誤頁(yè)面就是通過(guò)請(qǐng)求轉(zhuǎn)發(fā),所以錯(cuò)誤頁(yè)面可以放在WEB-INF下,而且可以使用隱含的內(nèi)置對(duì)象exception對(duì)象獲取異常信息。
在web.xml中配置相關(guān)頁(yè)面:
⑥include指令
include指令用于通知jsp引擎在翻譯當(dāng)前jsp頁(yè)面時(shí)將其他文件中的內(nèi)容合并進(jìn)當(dāng)前jsp頁(yè)面轉(zhuǎn)換成的Servlet源文件中這種源文件級(jí)別進(jìn)行引入的方式稱之為靜態(tài)引入,當(dāng)前jsp頁(yè)面與靜態(tài)引入的頁(yè)面緊密結(jié)合為一個(gè)Servlet
語(yǔ)法<%@ include file=”文件名” %>,其中file的屬性值用于指定被引入文件的相對(duì)路徑。
被引入的文件必須遵循jsp語(yǔ)法,其中的內(nèi)容可以包含HTML、JSP腳本元素、jsp指令、jsp行為元素,等普通jsp頁(yè)面
所具有的一切內(nèi)容,在將jsp文件翻譯成Servlet 源文件時(shí),jsp引擎將合并被引入的文件與當(dāng)前jsp頁(yè)面中的指令元素除了(import和pageEncoding屬性之外,page指令的其他屬性不能在這兩個(gè)頁(yè)面中有不同的設(shè)置)
除了指令元素之外,被引入的其他元素都被轉(zhuǎn)換相應(yīng)的java源代碼,然后插入到當(dāng)前jsp頁(yè)面翻譯成的Servlet源文件中插入位置與include指令在jsp頁(yè)面中的位置一致。
文件和被引入的文件是在被jsp引擎方翻譯成Servlet的過(guò)程中進(jìn)行合并的而不是先合并源文件再對(duì)合并的結(jié)果進(jìn)行翻譯
file屬性的設(shè)置值必須使用相對(duì)路徑,如果以斜杠開(kāi)頭表示相當(dāng)于當(dāng)前web應(yīng)用程序的跟目錄(不是站點(diǎn)目錄),否則表示相對(duì)于當(dāng)前文件。
在被引入的文件中可以使用引入jsp文件的頁(yè)面中聲明的變量,因?yàn)槭莾蓚€(gè)jsp文件合并時(shí)產(chǎn)生一個(gè).java文件可能報(bào)錯(cuò)但是可以正常顯示
jsp標(biāo)簽
jsp提供了一種稱之為Action的元素,在jsp頁(yè)面中使用Action元素可以完成各種通用的jsp頁(yè)面功能,也可以實(shí)現(xiàn)一些復(fù)雜的邏輯業(yè)務(wù)
的專用功能。Action元素采用xml元素的語(yǔ)法出現(xiàn),即每個(gè)Action元素在jsp頁(yè)面中都以xml標(biāo)簽的形式出現(xiàn)。
①<jsp:include>:把另外一個(gè)資源的輸出內(nèi)容插進(jìn)當(dāng)前jsp頁(yè)面的輸出內(nèi)容之中,這種在jsp頁(yè)面執(zhí)行時(shí)的引入稱之為動(dòng)態(tài)引入
語(yǔ)法:<jsp:include page="relativeURL|<%=exception%>" flush="true/false"/>
其中page屬性用于指定被引入資源的相對(duì)路徑,他也可以通過(guò)執(zhí)行一個(gè)表達(dá)式來(lái)獲得,flush屬性指定在插入其他資源的輸出內(nèi)容
時(shí),是否先將當(dāng)前jsp頁(yè)面的以輸出的內(nèi)容刷新到客戶端。
在被引入的文件中不可以使用引入jsp文件的頁(yè)面中聲明的變量,因?yàn)槭莾蓚€(gè)jsp文件合并時(shí)產(chǎn)生兩個(gè).java文件②<jsp:forward>:標(biāo)簽用于把請(qǐng)求轉(zhuǎn)發(fā)給另外一個(gè)資源,其作用跟請(qǐng)求轉(zhuǎn)發(fā)一樣
語(yǔ)法:<jsp:forward page="relativeURL|<%=exception%>"/>
其中page屬性用于指定被引入資源的相對(duì)路徑,他也可以通過(guò)執(zhí)行一個(gè)表達(dá)式來(lái)獲得.
③<jsp:param value="1234" name="username"/>是以上兩個(gè)標(biāo)簽的子標(biāo)簽,可以用來(lái)傳遞參數(shù)jsp亂碼
①顯示中文亂碼
只要保證charset和pageEncoding的值一致,還需瀏覽器顯示的字符編碼也和請(qǐng)求的頁(yè)面編碼一致
②獲取中文參數(shù)值亂碼,默認(rèn)在傳輸?shù)倪^(guò)程中使用ISO-8859-1編碼方式在post請(qǐng)求之前加上,請(qǐng)求之前調(diào)用否則無(wú)效
<% request.setCharacterEncoding("UTF-8"); %>對(duì)于get請(qǐng)求:
方法一:
方法二:
但是這樣太麻煩了也可以這樣設(shè)置:
注意:
useBodyEncodingForURI=”true”表示將使用請(qǐng)求體的方式,即request.setCharacterEncoding(“UTF-8”);起作用,因?yàn)樵O(shè)置的編碼方式為UTF-8,所以在使用方法二的情況下方法一會(huì)出現(xiàn)亂碼,要想方法一和方法二一起使用需要修改getBytes()的參數(shù)值為UTF-8
轉(zhuǎn)載于:https://www.cnblogs.com/tengpengfei/p/10453983.html
總結(jié)
以上是生活随笔為你收集整理的JSP(1)—基础知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ubuntu下tesseract 4.0
- 下一篇: ORA-00928: 缺失 SELECT