JavaEE複習筆記(4)——JSP2和Servlet3.0的新特性

JSP2 特性

1、JSP 2 主要增加了如下的新特性:

·直接配置JSP屬性。

·表達式語言

·簡化自定義標籤API

·Tag文件語法。

2、如需使用JSP2語法,其web.xml文件必須使用Servlet2.4以上版本的配置文件。Servlet2.4以上版本的配置文件的根元素寫法如下:

<?xml version=1.0, encoding=GBK?>

<!-- 不再使用DTD,而是使用schema描述,版本也升級爲2.4 -->

<web-app xmlns=http://java.sun.com/xml/ns/j2ee

xmlhs:xsi=http://www.w3.org/2001/XMLSchema-instance

xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd

version=2.4>

...

</web-app>

3、使用<jsp-property-group/>子元素配置JSP屬性,主要包括如下4個方面:

·是否使用表達式語言:使用<el-ignored/>元素指定,默認值爲false,即允許使用表達式語言。

·是否允許使用JSP腳本: 使用<scriping-invalid>子元素確定,默認值爲false,即允許使用JSP腳本。

·聲明JSP頁面的編碼:使用<page-encoding/>元素指定,配置該元素後,可以替代每個頁面裏的page指令contentType屬性的charset部分。

·使用隱式包含:使用<include-prelude/><include-coda/>元素確定,可以替代每個頁面裏使用include編譯命令來包含頁面。

4、配置樣例:

<?xml version="1.0" encoding="GBK"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">

<!-- 關於JSP的配置信息 -->

<jsp-config>

<jsp-property-group>

<!-- 對哪些文件應用配置 -->

<url-pattern>/noscript/*</url-pattern>

<!-- 忽略表達式語言 -->

<el-ignored>true</el-ignored>

<!-- 頁面編碼的字符集 -->

<page-encoding>GBK</page-encoding>

<!-- 不允許使用Java腳本 -->

<scripting-invalid>true</scripting-invalid>

<!-- 隱式導入頁面頭  -->

<include-prelude>/inc/top.jspf</include-prelude>

<!-- 隱式導入頁面尾 -->

<include-coda>/inc/bottom.jspf</include-coda>

</jsp-property-group>

<jsp-property-group>

<!-- 對哪些文件應用配置 -->

<url-pattern>*.jsp</url-pattern>

<el-ignored>false</el-ignored>

<!-- 頁面編碼字符集 -->

<page-encoding>GBK</page-encoding>

<!-- 允許使用Java腳本 -->

<scripting-invalid>false</scripting-invalid>

</jsp-property-group>

<jsp-property-group>

<!-- 對哪些文件應用配置 -->

<url-pattern>/inc/*</url-pattern>

<el-ignored>false</el-ignored>

<!-- 頁面編碼字符集 -->

<page-encoding>GBK</page-encoding>

<!-- 不允許使用Java腳本 -->

<scripting-invalid>true</scripting-invalid>

</jsp-property-group>

</jsp-config>

<context-param>

<param-name>author</param-name>

<param-value>yeeku</param-value>

</context-param>

</web-app>


5、表達式語言(Expression Language)是一種簡化的數據訪問方式。使用表達式語言可以方便地訪問JSP的隱含對象和JavaBeans組件,在JSP2規範中,建議儘量使用表達式語言使JSP文件的格式一致,避免使用Java腳本。

6、表達式語言語法格式:

${expression}

7、表達式語言支持算術運算符:

表達式語言

計算結果

${1}

1

${1.2 + 2.3}

3.5

${1.2E4 + 1.4}

12001.4

${-4-2}

-6

${21 * 2}

42

${3/4}

0.75

${3 div 4}

0.75

${3/0}

Infinity

${10%4}

2

${10 mod 4}

2

${(1 == 2) ? 3 : 4}

4

表達式語言會將所有數值視作浮點數處理。

 

8、表達式語言支持邏輯運算符:

 

表達式語言

計算結果

數字之間的比較

${1 < 2}

true

${1 lt 2}

true

${1 > (4/2)}

false

${1 gt (4/2)}

false

${4.0 >= 3}

true

${4.0 ge 3}

true

${4 <= 3}

false

${4 le 3}

false

${100.0 == 100}

true

${100.0 eq 100}

true

${(10*10) != 100}

false

${(10*10) ne 100}

false

字符之間的比較

${a < b}

true

${hip > hit

false

${4 > 3}

true

表達式語言中,字符串的比較是根據UNICODE值來比較大小的。

 

9、表達式語言包含的11個內置對象:

·pageContext:代表頁面的pageContext對象,與JSPPageContext內置對象相同。

·pageScope:用於獲取page範圍內的屬性值。

·requestScope:用於獲取request範圍內的屬性值。

·sessionScope:用於獲取session範圍內的屬性值。

·applicationScope:用於獲取application範圍內的屬性值。

·param:用於獲取請求的參數值。

·paramValues:用於獲取請求的參數值,與param的區別在於,該對象用於獲取屬性值爲數組的屬性值。

·header:用於獲取請求頭的屬性值。

·headerValues:用於獲取請求頭的屬性值,與header的區別在於,該對象用於獲取屬性值爲數組的屬性值。

·initParam:用於獲取請求web應用的初始化參數。

·cookie:用於獲取指定的cookie值。

10、表達式語言除了可以使用基本運算符外,還可以使用自定義函數。通過自定義函數,能夠大大加強表達式語言的功能。自頂一個函數的開發步驟非常類似於標籤的開發步驟,定義方式也幾乎一樣。區別在於自定義標籤直接在頁面上生成輸出,而自定義函數則在表達式語言中使用。

11、函數功能大大擴充了EL的功能,EL本身只是一種數據訪問語言,因此它不支持調用方法。如果需要在EL中進行更復雜的處理,就可以通過函數來完成。函數的本質是:提供一種語法允許在EL中調用某個類的靜態方法。

12、開發自定義函數步驟:

① 開發函數處理類:函數處理類就是普通類,這個普通類中包含若干個靜態方法,每個靜態方法都可以定義成一個函數。實際上這個步驟也是可省略的——完全可以直接使用JDK或其他項目提供的類,只要這個類包含靜態方法即可。

② 使用標籤庫定義函數:定義函數的方法與定義標籤的方法大致類似。在<taglib../>子元素下增加<tag..>元素用於定義自定義標籤;增加<functions.../>元素則用於定義自定義函數。每個<function...>元素只要三個子元素即可:

·name:指定自定義函數的函數名。

·function-class:指定自定義函數的處理類。

·function-signature:指定自定義函數對應的方法。

樣例如下:

<taglib>

...

<function>

<name> reverse </name>

<function-class>

lee.Functions

</function-class>

<function-signature>

java.lang.String

reverse(java.lang.String)

</function-signature>

</function>

...

</taglib>

③ 在JSP頁面的EL中使用函數:一樣需要先導入標籤庫,然後在使用函數:

<%@ taglib prefix=crazyit 

uri=http://www.crazyit.org/tags %>

${crazyit: reverse(param[name]}

13、Tag File 是自定義標籤的簡化用法,使用Tag File可以無需定義標籤處理類和標籤庫文件,但任然可以在JSP頁面中使用自定義標籤。

14、利用Tag File開發自定義標籤的步驟:

① 建立Tag 文件。在JSP所支持Tag File的規範下,Tag File 代理了標籤處理類,它的格式類似於JSP文件。可以這樣理解:如果JSP可以代替Servlet的表現層一樣,Tag File則可以代替標籤處理類。

Tag File 具有以下5個編譯命令。

·taglib:作用與JSP文件中的taglib指令效果相同,用於導入其他標籤庫。

·include:作用與JSP文件中的include指令效果相同,用於導入其他JSP或靜態頁面。

·tag:作用類似於JSP文件中的page指令,有pageEncodingbody-content等屬性,用於設置頁面編碼等屬性。

·attribute:用於設置自定義標籤的屬性,類似於自定義標籤處理器類中的標籤屬性。

·variable:用於設置自定義標籤的變量,這些變量傳給JSP頁面使用。

樣例:

<%@ tag pageEncoding="GBK" import="java.util.List"%>

<!-- 定義了四個標籤屬性 -->

<%@ attribute name="bgColor" %>

<%@ attribute name="cellColor" %>

<%@ attribute name="title" %>

<%@ attribute name="bean" %>

<table border="1" bgcolor="${bgColor}">

<tr>

<td><b>${title}</b></td>

</tr>

<%List<String> list = (List<String>)

request.getAttribute("a");

//遍歷輸出list集合的元素

for (Object ele : list){%>

<tr>

<td bgcolor="${cellColor}">

<%=ele%>

</td>

</tr>

<%}%>

</table>


tag File的命名規則是:tagName.tag,即文件名就是標籤名,文件名的後綴必須是tag。該文件放置在web應用的某個路徑下,這個路徑相當於標籤庫的URI名。

② 在頁面中使用自定義標籤時,需要先導入標籤庫,再使用標籤。使用Tag File標籤與普通自定義標籤的用法完全相同,只是在導入標籤庫時存在一些差異。格式如下:

<%@ taglib prefix=tags tagdir=/WEB-INF/tags %>

<tags:iterator bgColor=#99dd99 cellColor=#9999cc

title=Iterator Tag bean=a />

15、Tag File 支持的內置對象:

·request:與JSP腳本中的request對象對應。

·response:與JSP腳本中的response對象對應。

·session:與JSP腳本中的session對象對應。

·application:與JSP腳本中的config對象對應。

·config:與JSP腳本中的config對象對應。

·out:與JSP腳本的out對象對應。

Servlet 3.0 新特性

1、伴隨着Java EE 6一起發佈的Servlet 3.0 規範是Servlet規範歷史上最重要的變革之一,它的許多特性都極大地簡化了Java Web 的開發。

2、Servlet 3.0 的一個顯著改變是“順應”了潮流,拋棄採用web.xml配置ServletFilterListener的繁瑣步驟,允許開發人員使用Annotation修飾它們,從而進行部署。

3、Servlet 3.0 規範在javax.servlet.annotation包中提供瞭如下的Annotation

@WebServlet:用於修飾一個Servlet 類, 用於部署Servlet 類。

@WebInitParam:用於與@WebServlet@WebFilter一起使用,爲ServletFilter配置參數。

@WebListener:用於修飾Listener類,用於部署Listener類。

@WebFilter:用於修飾Filter類,用於部署Filter類。

@MultipartConfig:用於修飾Servlet,指定該Servlet將會負責處理multipart/form-data類型的請求(主要用於文件上傳)

@ServletSecurity:這是一個與JAAS有關的Annotation,修飾Servlet指定該Servlet的安全與授權控制。

@HttpConstraint:用於與@ServletSecurity一起使用,用於指定該servlet的安全與授權控制。

@HttpMethodConstraint:用於與@ServletSecuity一起使用,用於指定該Servlet的安全與授權控制。

4、Servlet 3.0 爲模塊化開發提供了良好的支持,Servlet 3.0 規範不再要求所有的Web組件都部署在web.xml文件中,而是允許採用Web 模塊”來部署、管理他們。

5、一個Web模塊通常對應與一個JAR包,這個JAR包有如下的文件結構:

<webModule>.jar

|----META-INF

|       |----web-fragment.xml

|----Web模塊所用的類文件、資源文件等。

Web模塊文件與普通的JAR的最大區別在於需要在META-INF目錄下添加一個web-fragment.xml文件,這個文件也被稱爲Web模塊部署描述符。

6、web-fragment.xml文件與web.xml文件的作用、文檔結構都基本相似。但web-fragment.xml文件可以多指定如下兩個元素:

·<name.../>:用於指定該Web模塊名稱。

·<ordering.../>:用於指定加載該Web模塊的相對順序。

7、樣例:

<?xml version="1.0" encoding="GBK"?>

<web-fragment xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  

http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" version="3.0">

<!-- 指定該Web模塊的唯一標識 -->

<name>crazyit</name>

<listener>

<listener-class>lee.CrazyitListener</listener-class>

</listener>

<ordering>

<!-- 用配置該Web模塊必須位於哪些模塊之前加載 -->

<before>

<!-- 用於指定位於其他所有模塊之前加載 -->

<others/>

</before>

</ordering>

</web-fragment>


 

8、Web模塊打包成JAR包後,放置在任意一個Web應用中的WEB-INF/lib目錄下,啓動Web應用,Web模塊就會被加載。

9、Web應用除了可以按照web-fragment.xml文件指定的順序來加載Web模塊之外,還可以通過web.xml文件指定加載的絕對順序,這將覆蓋web模塊中web-fragment.xml文件指定的順序。如下:

<absolute-ordering>

<!-- 指定Web模塊按照如下順序加載 -->

<name> leegang </name>

<name> crazyit</name>

</absolute-ordering>

10、ServletWeb模塊支持爲模塊化開發、框架使用提供了巨大的方便,例如需要在Web應用中使用Web框架,這就只要將該框架的JAR包賦值到Web應用中即可。因爲這個JAR包的META-INF目錄下可以通過web-fragment文件來配置該框架所需的ServletListenerFilter等,從而避免修改Web應用的web.xml文件。

11、Servlet 3.0 規範引入了異步處理,使得Servlet 可以重新發起一條新線程去調用耗時的業務方法,這樣就可以避免等待。

12、通過AsyncContext類來處理異步過程,Servlet可通過ServletRequest的如下兩個方法開啓異步調用、創建AsyncContext對象:

·AsyncContext startAsyncContext();

·AsyncContext startAsync(ServletRequest, ServletResponse);

重複調用上面的方法將得到同一個AsyncContext對象,該對象代表異步處理的上下文,它提供了一些工具方法,可以完成設置異步調用的超時時長,dispatch用於請求、啓動後臺過程獲取requestresponse對象等功能。

13、對於需要啓用異步調用的Servlet而言,開發者必須顯式指定開啓異步調用,有兩種方式:

·爲@WebServlet指定asyncSupported = true.

·在web.xml文件的<servlet.../>元素增加<async-supported.../>子元素

14、Servlet啓用異步調用的線程之後,該線程的執行過程對開發者是透明的。但在有些情況下,開發者需要了該異步線程的執行細節,並針對特定的執行結果進行針對性處理,這可藉助於Servlet 3.0 提供的異步監聽器來實現。

15、異步監聽器需要實現AsyncListener接口,實現該接口的監聽器類需要實現如下4個方法。

·onStratAsync(AsyncEvent event):當異步調用開始時觸發該方法。

·onComplete(AsyncEvent event):當異步調用完成時觸發該方法。

·onError(AsyncEvent event):當異步調用出錯時,觸發該方法。

·onTimeout(AsyncEvent event):當異步調用超時時,觸發該方法。

16、提供異步監聽器之後,還需要通過AsyncContext來註冊監聽器,調用該對象的addListener()方法即可註冊監聽器:

actx.addListener(new MyAsyncListener());

17、FilterServlet具有很大的相似性,因此,Servlet 3.0 規範完全支持Filter中使用異步調用,在Filter中進行異步調用與在Servlet中進行異步調用的效果完全相似。

18、Servlet 3.0 改進了部分API,這種改進很好地簡化了Java Web開發。其中兩個較大的改進是:

·HttpServletRequest增加了對文件上傳的支持

·ServletContext允許通過編程的方式註冊ServletFilter

19、HttpServlet提供瞭如下兩個方法來處理文件上傳

·Part getPart(String name):根據名稱來獲取文件上傳域。

·Collection<Part> getParts():獲取所有的文件上傳域。

每個Part對象對應與一個文件上傳域,該對象提供了大量方法來訪問上傳文件的文件類型、大小、輸入流等,並提供一個write(String file)方法將上傳文件寫入服務器磁盤。

20、爲了向服務器上傳文件,需要在表單裏使用<input type=file.../>的文件域,這個文件域會在HTML頁面上產生一個單行文本框和一個“瀏覽”按鈕,瀏覽者可通過該按鈕選擇需要上傳的文件。除此之外,上傳文件一定要爲表單域設置enctype屬性。

21、表單的enctype屬性指定的是表單數據的編碼方式,該屬性有如下三個值:

·application/x-www-form-urlencoded:這是默認的編碼方式,它只處理表單域裏的value屬性值,採用這種編碼方式的表單會將表單域的值處理成URL編碼方式。

·multipart/form-data:這種編碼方式會以二進制流的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數裏。

·text/plain:這種編碼方式當表單的action屬性爲mailto:url的形式比較方便,這種方式主要適用於這屆通過表單發送郵件的方式。

如果將enctype屬性設定爲:application/x-www-form-unrencoded,或不設置enctype屬性,提交表單時只會發送文件域的文本框裏的字符串,也就是瀏覽者所選擇文件的絕對路徑,對服務器獲取該文件在客戶端上的絕對路徑沒有任何作用,因爲服務器不可能訪問客戶機的文件系統:

<form method=post action=upload  enctype=multipart/form-data>

文件名: <input type=text id=name name=name /> <br/>

選擇文件:<input type=file id=file name=file/><br/>

<input type=submit value=上傳 /> <br/>

</form>

22、上傳文件Servlet端代碼:

String fileName = request.getParameter(name);

Part part = request.getPart(file);

part.write(getServletContext().getRealPath(/uploadFiles)

/ + fileName);

Servlet類需要使用@MultipartConfig來修飾。或者在web.xml中添加<multi part-config.../>子元素進行配置。

23、ServletContext提供瞭如下方法來動態地註冊Servlet

·多個重載的addServlet:動態地註冊Servlet

·多個重載的addFilter:動態地註冊Filter

·多個重載的addListener:動態地註冊Listener

·setInitParameter(String name, String value);


發佈了75 篇原創文章 · 獲贊 80 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章