JSP寶典,讓你一篇文章搞定JSP

編程語言 JSP HTML 腳本語言 Jame院長 2017-05-27

JSP寶典,讓你一篇文章搞定JSP

不培養代碼搬運工哦,想了解更多加:qq:116 159 0055

1、Tip:什麼是JSP?

a、JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用於開發動態web資源的技術。JSP/Servlet規範。JSP實際上就是Servlet。

b、JSP這門技術的最大的特點在於,寫jsp就像在寫html,但它相比html而言,html只能為用戶提供靜態數據,而Jsp技術允許在頁面中嵌套java代碼,為用戶提供動態數據。

2、Tip:JSP原理

3、JSP最佳實踐

不管是JSP還是Servlet,雖然都可以用於開發動態web資源。但由於這2門技術各自的特點,在長期的軟件實踐中,人們逐漸把servlet作為web應用中的控制器組件來使用,而把JSP技術作為數據顯示模板來使用。

其原因為,程序的數據通常要美化後再輸出:

讓JSP既用java代碼產生動態數據,又做美化會導致頁面難以維護。

讓servlet既產生數據,又在裡面嵌套html代碼美化數據,同樣也會導致程序可讀性差,難以維護。

因此最好的辦法就是根據這兩門技術的特點,讓它們各自負責各得,servlet只負責響應請求產生數據,並把數據通過轉發技術帶給jsp,數據的顯示jsp來做。

4、Tip:JSP語法

JSP模版元素

JSP表達式

JSP腳本片斷

JSP註釋

JSP指令

JSP標籤

JSP內置對象

如何查找JSP頁面中的錯誤

5、Tip: JSP模版元素

JSP頁面中的HTML內容稱之為JSP模版元素。

JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。

6、Tip: JSP腳本表達式

JSP腳本表達式(expression)用於將程序數據輸出到客戶端

語法:<%= 變量或表達式 %>

舉例:當前時間:<%= new java.util.Date() %>

JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,然後在相應位置用out.print(…) 將數據輸給客戶端。

JSP腳本表達式中的變量或表達式後面不能有分號(;)。

看一下源文件

7、Tip: JSP腳本片斷(1)

JSP腳本片斷(scriptlet)用於在JSP頁面中編寫多行Java代碼。語法:

<%

多行java代碼

%>

注意:JSP腳本片斷中只能出現java代碼,不能出現其它模板元素,JSP引擎在翻譯JSP頁面中,會將JSP腳本片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。

JSP腳本片斷中的Java代碼必須嚴格遵循Java語法,例如,每執行語句後面必須用分號(;)結束。

8、Tip: JSP腳本片斷(2)

在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標記和其他JSP元素。

舉例:

<%

int x = 10;

out.println(x);

%>

<p>這是JSP頁面文本</p>

<%

int y = 20;

out.println(y);

%>

多個腳本片斷中的代碼可以相互訪問,猶如將所有的代碼放在一對<%%>之中的情況。如:out.println(x);

正規開發中的JSP中不應出現java腳本:標籤封裝

9、Tip: JSP腳本片斷(3)

單個腳本片斷中的Java語句可以是不完整的,但是,多個腳本片斷組合後的結果必須是完整的Java語句,例如:

<%

for (int i=1; i<5; i++)

{

%>

<H1>www.it315.org</H1>

<%

}

%>

練習:一張表格,打印100行

10、Tip: JSP聲明

JSP頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法:

<%!

java代碼

%>

所以,JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法 。

多個靜態代碼塊、變量和函數可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。

JSP隱式對象的作用範圍僅限於Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。

11、Tip: JSP聲明?案例

<%!

static

{

System.out.println("loading Servlet!");

}

private int globalVar = 0;

public void jspInit()

{

System.out.println("initializing jsp!");

}

%>

<%!

public void jspDestroy()

{

System.out.println("destroying jsp!");

}

%>

12、Tip: JSP註釋

JSP註釋的格式:

<%-- 註釋信息 --%>

JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被註釋的內容。HTML中的註釋有什麼不同,查看源文件解決。

13、Tip: JSP指令

JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其餘部分。在JSP 2.0規範中共定義了三個指令:

page指令

Include指令

taglib指令

14、Tip: JSP指令簡介

JSP指令的基本語法格式:

<%@ 指令 屬性名="值" %>

舉例:<%@ page contentType="text/html;charset=utf-8"%>

如果一個指令有多個屬性,這多個屬性可以寫在一個指令中,也可以分開寫。

例如:

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.util.Date"%>

也可以寫作:

<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

15、Tip: Page指令

page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。

JSP 2.0規範中定義的page指令的完整語法:

<%@ page

[ language="java" ]

[ extends="package.class" ]

[ import="{package.class | package.*}, ..." ]

[ session=“true | false” ]//true創建session對象

[ buffer="none | 8kb | sizekb" ]

[ autoFlush="true | false" ]

[ isThreadSafe=“true | false” ] false才繼承SingleThreadModel接口

[ info="text" ]

[ errorPage="relative_url" ]

[ isErrorPage="true | false" ]

[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]

[ pageEncoding="characterSet | ISO-8859-1" ]

[ isELIgnored="true | false" ]

errorPage屬性的設置值為一路徑(相對或絕對),如果以“/”開頭,表示相對於當前WEB應用程序的根目錄(注意不是站點根目錄),否則,表示相對於當前頁面。

可以在web.xml文件中使用<error-page>元素為整個WEB應用程序設置錯誤處理頁面,其中的<exception-type>子元素指定異常類的完全限定名,<location>元素指定以“/”開頭的錯誤處理頁面的路徑。

如果設置了某個JSP頁面的errorPage屬性,那麼在web.xml文件中設置的錯誤處理將不對該頁面起作用。

16、Tip:使用page指令解決JSP中文亂碼

JSP程序存在有與Servlet程序完全相同的中文亂碼問題

輸出響應正文時出現的中文亂碼問題

讀取瀏覽器傳遞的參數信息時出現的中文亂碼問題

JSP引擎將JSP頁面翻譯成Servlet源文件時也可能導致中文亂碼問題

JSP引擎將JSP源文件翻譯成的Servlet源文件默認採用ISO8859-1編碼,而JSP開發人員可以採用各種字符集編碼來編寫JSP源文件,因此,JSP引擎將JSP源文件翻譯成Servlet源文件時,需要進行字符編碼轉換。

如果JSP文件中沒有說明它採用的字符集編碼,JSP引擎將把它當作默認的ISO8859-1字符集編碼處理。

如何解決JSP引擎翻譯JSP頁面時的中文亂碼問題

通過page指令的contentType屬性說明JSP源文件的字符集編碼

page指令的pageEncoding屬性說明JSP源文件的字符集編碼

17、Tip: include指令

include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。

語法:

<%@ include file=“被包含組件的絕對URL或相對URL"%>

其中的file屬性用於指定被引入文件的路徑。路徑以“/”開頭,表示代表當前web應用。

細節:

被引入的文件必須遵循JSP語法。

被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裡面的內容,為了見明知意,JSP規範建議使用.jspf(JSP fragments)作為靜態引入文件的擴展名。

由於使用include指令將會涉及到2個JSP頁面,並會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能衝突(除了pageEncoding和導包除外)。

18、Tip: taglib指令

Taglib指令用於在JSP頁面中導入標籤庫,講自定義標籤技術時講。

19、Tip:JSP運行原理和九大隱式對象

每個JSP 頁面在第一次被訪問時,WEB容器都會把請求交給JSP引擎(即一個Java程序)去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) ,然後按照servlet的調用方式進行調用。

由於JSP第一次訪問時會翻譯成servlet,所以第一次訪問通常會比較慢,但第二次訪問,JSP引擎如果發現JSP沒有變化,就不再翻譯,而是直接調用,所以程序的執行效率不會受到影響。

JSP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet使用。JSP技術的設計者為便於開發人員在編寫JSP頁面時獲得這些web對象的引用,特意定義了9個相應的變量,開發人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用。

這9個對象分別是哪些,以及作用也是筆試經常考察的知識點。

20、Tip:JSP九大隱式對象

request

response

config

application

exception

Session

page

out

pageContext

21、Tip: out隱式對象

out隱式對象用於向客戶端發送文本數據。

out對象是通過調用pageContext對象的getOut方法返回的,其作用和用法與ServletResponse.getWriter方法返回的PrintWriter對象非常相似。

JSP頁面中的out隱式對象的類型為JspWriter,JspWriter相當於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性可以調整它的緩存大小,甚至關閉它的緩存。

只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象才去調用ServletResponse.getWriter方法,並通過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:

設置page指令的buffer屬性關閉了out對象的緩存功能

out對象的緩衝區已滿; 整個JSP頁面結束

22、Tip: out隱式對象的工作原理圖

<% out.println("aaa"); response.getWriter().write("bbb") %>

23、Tip: out隱式對象的注意事項

同時使用out和response.getwriter()輸出數據。

用JSP實現文件下載。

24、Tip: pageContext對象

pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象,可以用來保存數據。並且,這個對象還封裝了web開發中經常涉及到的一些常用操作,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。

25、Tip:通過pageContext獲得其他對象

getException方法返回exception隱式對象

getPage方法返回page隱式對象

getRequest方法返回request隱式對象

getResponse方法返回response隱式對象

getServletConfig方法返回config隱式對象

getServletContext方法返回application隱式對象

getSession方法返回session隱式對象

getOut方法返回out隱式對象

pageContext封裝其它8大內置對象的意義,思考:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將具有什麼功能?

25、Tip:pageContext作為域對象

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表達式

26、Tip:引入和跳轉到其他資源

PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法。

方法接收的資源如果以“/”開頭, “/”代表當前web應用。

27、Tip: JSP標籤

JSP標籤也稱之為Jsp Action(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。

28、Tip: JSP常用標籤

<jsp:include>標籤

<jsp:forward>標籤

<jsp:param>標籤

28、Tip: <jsp:include>標籤

<jsp:include>標籤用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。

語法:

<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />

page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。

flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。

29、Tip: <jsp:include>與include指令的比較

<jsp:include>標籤是動態引入, <jsp:include>標籤涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合併。

而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合併。

不管是<jsp:include>標籤,還是include指令,它們都會把兩個JSP頁面內容合併輸出,所以這兩個頁面不要出現重複的HTML全局架構標籤,

否則輸出給客戶端的內容將會是一個格式混亂的HTML文檔。

30、Tip: <jsp:forward>標籤

<jsp:forward>標籤用於把請求轉發給另外一個資源。

語法:

<jsp:forward page="relativeURL | <%=expression%>" />

page屬性用於指定請求轉發到的資源的相對路徑,它也可以通過執行一個表達式來獲得。

31、Tip: <jsp:param>標籤

當使用<jsp:include>和<jsp:forward>標籤引入或將請求轉發給其它資源時,可以使用<jsp:param>標籤向這個資源傳遞參數。

語法1:

<jsp:include page="relativeURL | <%=expression%>">

<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />

</jsp:include>

語法2:

<jsp:forward page="relativeURL | <%=expression%>">

<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />

</jsp:include>

<jsp:param>標籤的name屬性用於指定參數名,value屬性用於指定參數值。在<jsp:include>和<jsp:forward>標籤中可以使用多個<jsp:param>標籤來傳遞多個參數。

32、Tip:映射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>

33、Tip:如何查找JSP頁面中的錯誤

JSP頁面中的JSP語法格式有問題,導致其不能被翻譯成Servlet源文件,JSP引擎將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息。

JSP頁面中的JSP語法格式沒有問題,但被翻譯成的Servlet源文件中出現了Java語法問題,導致JSP頁面翻譯成的Servlet源文件不能通過編譯,

JSP引擎也將提示這類錯誤發生在JSP頁面中的位置(行和列)以及相關信息。

JSP頁面翻譯成的Servlet程序在運行時出現異常,這與普通Java程序的運行時錯誤完全一樣,Java虛擬機將提示錯誤發生在Servlet源文件中的位置(行和列)以及相關信息。

34、Tip:重點

到此為止,web開發接觸到了4個域對象,這4個域對象是學習web的重點,也是筆試經常考察的知識點

pageContext(稱之為page域)

request(稱之為request域)

session(稱之為session域)

servletContext(稱之為application域)

明確如下問題:

什麼是域?

這4個對象的生命週期?

哪種情況下用哪種域對象。

1、request:如果客戶向服務器發請求,產生的數據,用戶看完就沒用了,像這樣的數據就存在request域,像新聞數據,屬於用戶看完就沒用的

2、session:如果客戶向服務器發請求,產生的數據,用戶用完了等一會兒還有用,像這樣的數據就存在session域中,像購物數據,用戶需要看到自己購物信息,並且等一會兒,還要用這個購物數據結帳

3、servletContext:如果客戶向服務器發請求,產生的數據,用戶用完了,還要給其它用戶用,像這樣的數據就存在servletContext域中,像聊天數據。

相關推薦

推薦中...