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