javascript
JSP -- JSP语法
1、什么是JSP?
? ? ? Java Server Pages,它和servlet技術(shù)一樣,都是SUN公司定義的一種慣用語(yǔ)開(kāi)發(fā)動(dòng)態(tài)web資源的技術(shù)
2、JSP技術(shù)的特點(diǎn)
相比html而言,html只能為用戶提供靜態(tài)數(shù)據(jù),而JSP技術(shù)云溪在頁(yè)面中嵌套java代碼,為用戶提供動(dòng)態(tài)數(shù)據(jù)
相比servlet而言,servlet很難對(duì)數(shù)據(jù)進(jìn)行排版,而JSP除了可以用java代碼產(chǎn)生動(dòng)態(tài)數(shù)據(jù)的同時(shí),也很容易對(duì)數(shù)據(jù)進(jìn)行排版
3、為什么JSP技術(shù)也是一種動(dòng)態(tài)web資源的開(kāi)發(fā)技術(shù)?
因?yàn)镴SP技術(shù)允許在頁(yè)面中嵌套java代碼,以產(chǎn)生動(dòng)態(tài)數(shù)據(jù),并且web服務(wù)器在執(zhí)行jsp時(shí),web服務(wù)器會(huì)傳遞web開(kāi)發(fā)相關(guān)的對(duì)象給jsp,jsp通過(guò)這些對(duì)象,
可以與瀏覽器進(jìn)行交互,所以jsp當(dāng)然也是一種動(dòng)態(tài)web資源開(kāi)發(fā)技術(shù)。
注意:在servlet向JSP跳轉(zhuǎn)的時(shí)候要用forward而不能用sendRedic(),因?yàn)閿?shù)據(jù)存放在request域,而sendRedic()代表一次全新的請(qǐng)求,里面的信息帶不過(guò)去
4、JSP模板元素
JSP頁(yè)面中的HTML內(nèi)容稱之為JSP模版元素。
JSP模版元素定義了網(wǎng)頁(yè)的基本骨架,即定義了頁(yè)面的結(jié)構(gòu)和外觀。
5、JSP腳本表達(dá)式
用于將程序數(shù)據(jù)輸出到客戶端
語(yǔ)法:<%= 變量表達(dá)式 %>
舉例:當(dāng)前時(shí)間:<%= new java.util.Date() %>
原理:
JSP引擎在翻譯腳本表達(dá)式時(shí),會(huì)將程序數(shù)據(jù)轉(zhuǎn)成字符串,然后在相應(yīng)位置用out.print(…) 將數(shù)據(jù)輸給客戶端。
注意:JSP腳本表達(dá)式中的變量或表達(dá)式后面不能有分號(hào)(;)。
6、JSP腳本片段
6.1 JSP腳本片斷(scriptlet)用于在JSP頁(yè)面中編寫多行Java代碼。
語(yǔ)法:
<%
多行java代碼
%>
注意:
JSP腳本片斷中只能出現(xiàn)java代碼,不能出現(xiàn)其它模板元素, JSP引擎在翻譯JSP頁(yè)面中,會(huì)將JSP腳本片斷中的Java代碼將被原封不動(dòng)地放到Servlet的_jspService方法中。
JSP腳本片斷中的Java代碼必須嚴(yán)格遵循Java語(yǔ)法,例如,每執(zhí)行語(yǔ)句后面必須用分號(hào)(;)結(jié)束。
6.2 在一個(gè)JSP頁(yè)面中可以有多個(gè)腳本片斷,在兩個(gè)或多個(gè)腳本片斷之間可以嵌入文本、HTML標(biāo)記和其他JSP元素。
多個(gè)腳本片斷中的代碼可以相互訪問(wèn),猶如將所有的代碼放在一對(duì)<%%>之中的情況
單個(gè)腳本片斷中的Java語(yǔ)句可以是不完整的,但是,多個(gè)腳本片斷組合后的結(jié)果必須是完整的Java語(yǔ)句,
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.sina.org</H1>
<%
}
%>
?
7、JSP聲明
? ? JSP頁(yè)面中編寫的所有代碼,默認(rèn)會(huì)翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語(yǔ)法:
? ? ? ? ?<% !
? ? ? ? ? ? ? java代碼
? ? ? ? ?%>
? ? 所以,JSP聲明可用于定義JSP頁(yè)面轉(zhuǎn)換成的Servlet程序的靜態(tài)代碼塊、成員變量和方法 。
Tip
? ? ?多個(gè)靜態(tài)代碼塊、變量和函數(shù)可以定義在一個(gè)JSP聲明中,也可以分別單獨(dú)定義在多個(gè)JSP聲明中。
? ? ?JSP隱式對(duì)象的作用范圍僅限于Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對(duì)象。
8、JSP注釋
? JSP注釋的格式:
? ?<%-- 注釋信息 --%>
? ?JSP引擎在將JSP頁(yè)面翻譯成Servlet程序時(shí),忽略JSP頁(yè)面中被注釋的內(nèi)容。
9、JSP指令
JSP指令(directive)是為JSP引擎而設(shè)計(jì)的,它們并不直接產(chǎn)生任何可見(jiàn)輸出,而只是告訴引擎如何處理JSP頁(yè)面中的其余部分。
在JSP 2.0規(guī)范中共定義了三個(gè)指令:
? ? ? page指令
? ? ?Include指令
? ? ?taglib指令
9.1 JSP指令的基本語(yǔ)法格式:
<%@ 指令 屬性名="值" %>
舉例:<%@ page contentType="text/html;charset=gb2312"%>
9.2 如果一個(gè)指令有多個(gè)屬性,這多個(gè)屬性可以寫在一個(gè)指令中,也可以分開(kāi)寫。
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以寫作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
9.3 Page指令
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ] 當(dāng)出現(xiàn)錯(cuò)誤時(shí)會(huì)跳到指定的errorPage
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true | false" ]
%>
9.4 使用page指令解決JSP中文亂碼
JSP程序存在有與Servlet程序完全相同的中文亂碼問(wèn)題
輸出響應(yīng)正文時(shí)出現(xiàn)的中文亂碼問(wèn)題
讀取瀏覽器傳遞的參數(shù)信息時(shí)出現(xiàn)的中文亂碼問(wèn)題
JSP引擎將JSP頁(yè)面翻譯成Servlet源文件時(shí)也可能導(dǎo)致中文亂碼問(wèn)題
JSP引擎將JSP源文件翻譯成的Servlet源文件默認(rèn)采用UTF-8編碼,而JSP開(kāi)發(fā)人員可以采用各種字符集編碼來(lái)編寫JSP源文件,因此,JSP引擎將JSP源文件翻譯成Servlet
源文件時(shí),需要進(jìn)行字符編碼轉(zhuǎn)換。
如果JSP文件中沒(méi)有說(shuō)明它采用的字符集編碼,JSP引擎將把它當(dāng)作默認(rèn)的ISO8859-1字符集編碼處理。
如何解決JSP引擎翻譯JSP頁(yè)面時(shí)的中文亂碼問(wèn)題
通過(guò)page指令的contentType屬性說(shuō)明JSP源文件的字符集編碼
page指令的pageEncoding屬性說(shuō)明JSP源文件的字符集編碼q
10、include指令
include指令用于引入其它JSP頁(yè)面,如果使用include指令引入了其它JSP頁(yè)面,那么JSP引擎將把這兩個(gè)JSP翻譯成一個(gè)servlet。所以include指令引入通常也稱之為靜態(tài)引入。
語(yǔ)法:
<%@ include file="relativeURL"%>
其中的file屬性用于指定被引入文件的相對(duì)路徑。
file屬性的設(shè)置值必須使用相對(duì)路徑,如果以“/”開(kāi)頭,表示相對(duì)于當(dāng)前WEB應(yīng)用程序的根目錄(注意不是站點(diǎn)根目錄),否則,表示相對(duì)于當(dāng)前文件。
細(xì)節(jié):
1. 被引入的文件必須遵循JSP語(yǔ)法。
2. 被引入的文件可以使用任意的擴(kuò)展名,即使其擴(kuò)展名是html,JSP引擎也會(huì)按照處理jsp頁(yè)面的方式處理它里面的內(nèi)容,為了見(jiàn)明知意,JSP規(guī)范建議使用.jspf(JSP fragments)作為靜態(tài)引入文件的擴(kuò)展名。
3. 由于使用include指令將會(huì)涉及到2個(gè)JSP頁(yè)面,并會(huì)把2個(gè)JSP翻譯成一個(gè)servlet,所以這2個(gè)JSP頁(yè)面的指令不能沖突(除了pageEncoding和導(dǎo)包除外)。
11、JSP運(yùn)行原理和九大隱式對(duì)象
JSP運(yùn)行原理
1. 每個(gè)JSP 頁(yè)面在第一次被訪問(wèn)時(shí),WEB容器都會(huì)把請(qǐng)求交給JSP引擎(即一個(gè)Java程序)去處理。 JSP引擎先將JSP翻譯成一個(gè)_jspServlet(實(shí)質(zhì)上也是一個(gè)servlet),
? ?然后按照servlet的調(diào)用方式進(jìn)行調(diào)用。
2. 由于JSP第一次訪問(wèn)時(shí)會(huì)翻譯成servlet,所以第一次訪問(wèn)通常會(huì)比較慢,但第二次訪問(wèn),JSP引擎如果發(fā)現(xiàn)JSP沒(méi)有變化,就不再翻譯,而是直接調(diào)用,所以程
序的執(zhí)行效率不會(huì)受到影響。
3. JSP引擎在調(diào)用JSP對(duì)應(yīng)的_jspServlet時(shí),會(huì)傳遞或創(chuàng)建9個(gè)與web開(kāi)發(fā)相關(guān)的對(duì)象供_jspServlet使用。JSP技術(shù)的設(shè)計(jì)者為便于開(kāi)發(fā)人員在編寫JSP頁(yè)面時(shí)獲得
這些web對(duì)象的引用,特意定義了9個(gè)相應(yīng)的變量,開(kāi)發(fā)人員在JSP頁(yè)面中通過(guò)這些變量就可以快速獲得這9大對(duì)象的引用。
九大隱式對(duì)象及其對(duì)應(yīng)關(guān)系
request ---> HttpServletRequest
response ---> HttpServletResponse
session ---> HttpSession
application ---> servletContext
config ---> servletConfig
out JspWriter -----> PrintWriter
exception
page this
pageContext
12、out隱式對(duì)象
1、out隱式對(duì)象用于向客戶端發(fā)送文本數(shù)據(jù)。
2、out對(duì)象是通過(guò)調(diào)用pageContext對(duì)象的getOut方法返回的,其作用和用法與ServletResponse.getWriter方法返回的PrintWriter對(duì)象非常相似。
3、JSP頁(yè)面中的out隱式對(duì)象的類型為JspWriter,JspWriter相當(dāng)于一種帶緩存功能的PrintWriter,設(shè)置JSP頁(yè)面的page指令的buffer屬性可以調(diào)整它
? ? ?的緩存大小,甚至關(guān)閉它的緩存。
4、只有向out對(duì)象中寫入了內(nèi)容,且滿足如下任何一個(gè)條件時(shí),out對(duì)象才去調(diào)用ServletResponse.getWriter方法,并通過(guò)該方法返回的PrintWriter
? ? ?對(duì)象將out對(duì)象的緩沖區(qū)中的內(nèi)容真正寫入到Servlet引擎提供的緩沖區(qū)中:
a) 設(shè)置page指令的buffer屬性關(guān)閉了out對(duì)象的緩存功能
b) out對(duì)象的緩沖區(qū)已滿
c) 整個(gè)JSP頁(yè)面結(jié)束
注意:同時(shí)使用out和response.getwriter()輸出數(shù)據(jù)。會(huì)出現(xiàn)文本顯示順序的問(wèn)題,只要是看是否刷新了緩沖區(qū),然后進(jìn)行分析
13、pageContext
? 1、 pageContext對(duì)象(非常重要,進(jìn)入其它對(duì)象的入口)
? ?pageContext對(duì)象是JSP技術(shù)中最重要的一個(gè)對(duì)象,它代表JSP頁(yè)面的運(yùn)行環(huán)境,這個(gè)對(duì)象不僅封裝了對(duì)其它8大隱式對(duì)象的引用,它自身還是一個(gè)域?qū)ο?#xff0c;
? ?可以用來(lái)保存數(shù)據(jù)。并且,這個(gè)對(duì)象還封裝了web開(kāi)發(fā)中經(jīng)常涉及到的一些常用操作,例如引入和跳轉(zhuǎn)其它資源、檢索其它域?qū)ο笾械膶傩缘取?
通過(guò)pageContext獲得其他對(duì)象
getException() 返回exception隱式對(duì)象
getPage() 返回page隱式對(duì)象
getRequest() 返回request隱式對(duì)象
getResponse() 返回response隱式對(duì)象
getServletConfig() 返回config隱式對(duì)象
getServletContext() 返回application隱式對(duì)象
getSession() 返回session隱式對(duì)象
getOut() 返回out隱式對(duì)象
pageContext封裝其它8大內(nèi)置對(duì)象的意義
2. pageContext作為域?qū)ο?/strong>
pageContext對(duì)象的方法
public void setAttribute(java.lang.String?name,java.lang.Object?value)
public java.lang.Object?getAttribute(java.lang.String?name)
public void?removeAttribute(java.lang.String?name)
pageContext對(duì)象中還封裝了訪問(wèn)其它域的方法
public java.lang.Object?getAttribute(java.lang.String?name,int?scope)
public void setAttribute(java.lang.String?name, java.lang.Object?value,int?scope)
public void?removeAttribute(java.lang.String?name,int?scope)
代表各個(gè)域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法 (*重點(diǎn),查找各個(gè)域中的屬性)
轉(zhuǎn)載于:https://www.cnblogs.com/xushuai123/archive/2013/03/24/2979762.html
總結(jié)
以上是生活随笔為你收集整理的JSP -- JSP语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 测试中的黑天鹅
- 下一篇: POJ 2263 floyd思想