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