javascript
方立勋_30天掌握JavaWeb_JSP
JSP運行原理
- JSP全稱是Java Server Pages,它和servle技術(shù)一樣,都是SUN公司定義的一種用于開發(fā)動態(tài)web資源的技術(shù)。
- JSP這門技術(shù)的最大的特點在于,寫jsp就像在寫html,但它相比html而言,html只能為用戶提供靜態(tài)數(shù)據(jù),而Jsp技術(shù)允許在頁面中嵌套java代碼,為用戶提供動態(tài)數(shù)據(jù)。
- Jsp快速入門:在jsp頁面中輸出當(dāng)前時間。
ie瀏覽器請求servlet處理請求,通過轉(zhuǎn)發(fā)到j(luò)sp頁面(這樣只有一個請求),jsp頁面就可以拿到request。
JSP語法
jsp模板元素
- JSP頁面中的HTML內(nèi)容稱之為JSP模版元素。
- JSP模版元素定義了網(wǎng)頁的基本骨架,即定義了頁面的結(jié)構(gòu)和外觀。
jsp腳本表達(dá)式
- JSP腳本表達(dá)式(expression)用于將程序數(shù)據(jù)輸出到客戶端
語法:<%= 變量或表達(dá)式 %>
舉例:當(dāng)前時間:<%= new java.util.Date() %> - JSP引擎在翻譯腳本表達(dá)式時,會將程序數(shù)據(jù)轉(zhuǎn)成字符串,然后在相應(yīng)位置用out.print(…) 將數(shù)據(jù)輸給客戶端。
- JSP腳本表達(dá)式中的變量或表達(dá)式后面不能有分號(;)。
jsp腳本片斷
- JSP腳本片斷(scriptlet)用于在JSP頁面中編寫多行Java代碼。語法:
<%
多行java代碼
%> - 注意:JSP腳本片斷中只能出現(xiàn)java代碼,不能出現(xiàn)其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。
JSP腳本片斷中的Java代碼必須嚴(yán)格遵循Java語法,例如,每執(zhí)行語句后面必須用分號(;)結(jié)束。
在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標(biāo)記和其他JSP元素。
舉例:<%
int x = 10;
out.println(x);
%>
<p>這是JSP頁面文本
<%
int y = 20;
out.println(y);
%>多個腳本片斷中的代碼可以相互訪問,猶如將所有的代碼放在一對<%%>之中的情況。如:out.println(x);
單個腳本片斷中的Java語句可以是不完整的,但是,多個腳本片斷組合后的結(jié)果必須是完整的Java語句,例如:
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.it315.org
<%
}
%>
jsp聲明
- JSP頁面中編寫的所有代碼,默認(rèn)會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法:
<%!
java代碼
%> 所以,JSP聲明可用于定義JSP頁面轉(zhuǎn)換成的Servlet程序的靜態(tài)代碼塊、成員變量和方法 。
多個靜態(tài)代碼塊、變量和函數(shù)可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。
JSP隱式對象的作用范圍僅限于Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。
jsp注釋
JSP注釋的格式:
<%– 注釋信息 –%>JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被注釋的內(nèi)容。
jsp指令
JSP指令(directive)是為JSP引擎而設(shè)計的,它們并不直接產(chǎn)生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其余部分。在JSP 2.0規(guī)范中共定義了三個指令:
- page指令
- Include指令
- taglib指令
JSP指令簡介
1. JSP指令的基本語法格式:
<%@ 指令 屬性名=”值” %>
舉例:<%@ page contentType=”text/html;charset=gb2312”%>
2. 如果一個指令有多個屬性,這多個屬性可以寫在一個指令中,也可以分開寫。
例如:
<%@ page contentType=”text/html;charset=gb2312”%>
<%@ page import=”java.util.Date”%>
也可以寫作:
<%@ page contentType=”text/html;charset=gb2312” import=”java.util.Date”%>
Page指令
page指令用于定義JSP頁面的各種屬性,無論page指令出現(xiàn)在JSP頁面中的什么地方,它作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習(xí)慣,page指令最好是放在整個JSP頁面的起始位置。
使用page指令解決JSP中文亂碼
假如jsp頁面使用記事本寫的,其默認(rèn)是gb2312編碼存入本地硬盤(假設(shè):“中國” 98 、99),web服務(wù)器把jsp頁面翻譯成servlet,但是tomcat5.0服務(wù)器默認(rèn)是iso8859-1編碼,所以翻譯成servlet時候就亂碼了,解決方法:可以在jsp頁面 page指令pageEncoding=”gb2312”通知web服務(wù)器使用gb2312編碼。但是回顯給瀏覽器端同時也需要告知瀏覽器使用哪個編碼打開(做法:jsp頁面page指令,contentType=”text/html; charset=gb2312”)。
但是在eclipse開發(fā)工具中,這個問題就不用那么麻煩了,如果jsp頁面pageEncoding=“”指定了哪個編碼,其保存到硬盤也是哪個編碼,而且contentType也不需要指定編碼告知瀏覽器用哪個編碼打開(這里也已經(jīng)默認(rèn)是和pageEncoding指定的編碼相同)。
include指令
- include指令用于引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那么JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態(tài)引入。
- 語法:
<%@ include file=”relativeURL”%>
其中的file屬性用于指定被引入文件的路徑。路徑以“/”開頭,表示代表當(dāng)前web應(yīng)用。 - 細(xì)節(jié):
- 被引入的文件必須遵循JSP語法。
- 被引入的文件可以使用任意的擴(kuò)展名,即使其擴(kuò)展名是html,JSP引擎也會按照處理jsp頁面的方式處理它里面的內(nèi)容,為了見明知意,JSP規(guī)范建議使用.jspf(JSP fragments)作為靜態(tài)引入文件的擴(kuò)展名。
- 由于使用include指令將會涉及到2個JSP頁面,并會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能沖突(除了pageEncoding和導(dǎo)包除外)。
taglib指令
Taglib指令用于在JSP頁面中導(dǎo)入標(biāo)簽庫,講自定義標(biāo)簽技術(shù)時講。
jsp九大隱式對象
| Request | |
| Response | |
| Session | |
| Application | servletContext |
| Config | servletConfig |
| Page | this |
| Exception | |
| Out | jspWriter |
| pageContext |
out隱式對象
- 設(shè)置page指令的buffer屬性關(guān)閉了out對象的緩存功能
- out對象的緩沖區(qū)已滿
- 整個JSP頁面結(jié)束
out隱式對象的工作原理圖
注意:同時使用out和response.getwriter()輸出數(shù)據(jù)。
<body><%out.write("aaaa");response.getWriter().write("bbbb");%></body>瀏覽器結(jié)果:
這是因為:這個過程out.write使得jspWrite對象緩沖區(qū)有aaa,response.getWriter().writeres使得reponse對象緩沖區(qū)bbb,然后aaa進(jìn)入response緩沖對象,然后進(jìn)入jsp引擎處理。
pageContext對象
pageContext對象是JSP技術(shù)中最重要的一個對象,它代表JSP頁面的運行環(huán)境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域?qū)ο?#xff0c;可以用來保存數(shù)據(jù)。并且,這個對象還封裝了web開發(fā)中經(jīng)常涉及到的一些常用操作,例如引入和跳轉(zhuǎn)其它資源、檢索其它域?qū)ο笾械膶傩缘取?
getException方法返回exception隱式對象
getPage方法返回page隱式對象
getRequest方法返回request隱式對象
getResponse方法返回response隱式對象
getServletConfig方法返回config隱式對象
getServletContext方法返回application隱式對象
getSession方法返回session隱式對象
getOut方法返回out隱式對象
pageContext封裝其它8大內(nèi)置對象的意義,思考:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那么這個java對象將具有什么功能?
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方法 (*重點,查找各個域中的屬性) EL表達(dá)式
注:PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法。
方法接收的資源如果以“/”開頭, “/”代表當(dāng)前web應(yīng)用。
jsp標(biāo)簽
JSP標(biāo)簽也稱之為Jsp Action(JSP動作)元素,它用于在Jsp頁面中提供業(yè)務(wù)邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護(hù)。
常用標(biāo)簽:
<jsp:include>標(biāo)簽
<jsp:forward>標(biāo)簽
<jsp:param>標(biāo)簽
<jsp:include>標(biāo)簽
<jsp:include>標(biāo)簽用于把另外一個資源的輸出內(nèi)容插入進(jìn)當(dāng)前JSP頁面的輸出內(nèi)容之中,這種在JSP頁面執(zhí)行時的引入方式稱之為動態(tài)引入。
語法:
<jsp:include page=”relativeURL | <%=expression%>” flush=”true|false” />
- page屬性用于指定被引入資源的相對路徑,它也可以通過執(zhí)行一個表達(dá)式來獲得。
flush屬性指定在插入其他資源的輸出內(nèi)容時,是否先將當(dāng)前JSP頁面的已輸出的內(nèi)容刷新到客戶端。
<jsp:include>標(biāo)簽是動態(tài)引入, <jsp:include>標(biāo)簽涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內(nèi)容在執(zhí)行時進(jìn)行合并。
而include指令是靜態(tài)引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內(nèi)容是在源文件級別進(jìn)行合并。
不管是<jsp:include>標(biāo)簽,還是include指令,它們都會把兩個JSP頁面內(nèi)容合并輸出,所以這兩個頁面不要出現(xiàn)重復(fù)的HTML全局架構(gòu)標(biāo)簽,否則輸出給客戶端的內(nèi)容將會是一個格式混亂的HTML文檔。
<jsp:forward>標(biāo)簽
<jsp:forward>標(biāo)簽用于把請求轉(zhuǎn)發(fā)給另外一個資源。
語法:
<jsp:forward page=”relativeURL | <%=expression%>” />
page屬性用于指定請求轉(zhuǎn)發(fā)到的資源的相對路徑,它也可以通過執(zhí)行一個表達(dá)式來獲得。
<jsp:param>標(biāo)簽
當(dāng)使用<jsp:include>和<jsp:forward>標(biāo)簽引入或?qū)⒄埱筠D(zhuǎn)發(fā)給其它資源時,可以使用標(biāo)簽向這個資源傳遞參數(shù)。
語法1:
語法2:
<jsp:forward page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /></jsp:include><jsp:param>標(biāo)簽的name屬性用于指定參數(shù)名,value屬性用于指定參數(shù)值。在<jsp:include>和<jsp:forward>標(biāo)簽中可以使用多個<jsp:param>標(biāo)簽來傳遞多個參數(shù)。
映射jsp
<servlet><servlet-name>SimpleJspServlet</servlet-name><jsp-file>/jsp/simple.jsp</jsp-file><load-on-startup>1</load-on-startup > </servlet>…… <servlet-mapping><servlet-name>SimpleJspServlet</servlet-name><url-pattern>/xxx/yyy.html</url-pattern> </servlet-mapping>如何查找jsp頁面中的錯誤
JSP最佳實踐
- 不管是JSP還是Servlet,雖然都可以用于開發(fā)動態(tài)web資源。但由于這2門技術(shù)各自的特點,在長期的軟件實踐中,人們逐漸把servlet作為web應(yīng)用中的控制器組件來使用,而把JSP技術(shù)作為數(shù)據(jù)顯示模板來使用。
- 其原因為,程序的數(shù)據(jù)通常要美化后再輸出:
- 讓jsp既用java代碼產(chǎn)生動態(tài)數(shù)據(jù),又做美化會導(dǎo)致頁面難以維護(hù)。
- 讓servlet既產(chǎn)生數(shù)據(jù),又在里面嵌套html代碼美化數(shù)據(jù),同樣也會導(dǎo)致程序可讀性差,難以維護(hù)。
- 因此最好的辦法就是根據(jù)這兩門技術(shù)的特點,讓它們各自負(fù)責(zé)各的,servlet只負(fù)責(zé)響應(yīng)請求產(chǎn)生數(shù)據(jù),并把數(shù)據(jù)通過轉(zhuǎn)發(fā)技術(shù)帶給jsp,數(shù)據(jù)的顯示jsp來做。
重點
到此為止,web開發(fā)接觸到了4個域?qū)ο?這4個域?qū)ο笫菍W(xué)習(xí)web的重點,也是筆試經(jīng)常考察的知識點
pageContext(稱之為page域)
request(稱之為request域)
session(稱之為session域)
servletContext(稱之為application域)明確如下問題:
什么是域?
這4個對象的生命周期?
哪種情況下用哪種域?qū)ο蟆?/p>
總結(jié)
以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_JSP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web三个域对象的区别
- 下一篇: 方立勋_30天掌握JavaWeb_(JS