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對象,與JSP的PageContext內置對象相同。
·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指令,有pageEncoding、body-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配置Servlet、Filter、Listener的繁瑣步驟,允許開發人員使用Annotation修飾它們,從而進行部署。
3、Servlet 3.0 規範在javax.servlet.annotation包中提供瞭如下的Annotation:
@WebServlet:用於修飾一個Servlet 類, 用於部署Servlet 類。
@WebInitParam:用於與@WebServlet或@WebFilter一起使用,爲Servlet、Filter配置參數。
@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、Servlet的Web模塊支持爲模塊化開發、框架使用提供了巨大的方便,例如需要在Web應用中使用Web框架,這就只要將該框架的JAR包賦值到Web應用中即可。因爲這個JAR包的META-INF目錄下可以通過web-fragment文件來配置該框架所需的Servlet、Listener、Filter等,從而避免修改Web應用的web.xml文件。
11、Servlet 3.0 規範引入了異步處理,使得Servlet 可以重新發起一條新線程去調用耗時的業務方法,這樣就可以避免等待。
12、通過AsyncContext類來處理異步過程,Servlet可通過ServletRequest的如下兩個方法開啓異步調用、創建AsyncContext對象:
·AsyncContext startAsyncContext();
·AsyncContext startAsync(ServletRequest, ServletResponse);
重複調用上面的方法將得到同一個AsyncContext對象,該對象代表異步處理的上下文,它提供了一些工具方法,可以完成設置異步調用的超時時長,dispatch用於請求、啓動後臺過程獲取request、response對象等功能。
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、Filter和Servlet具有很大的相似性,因此,Servlet 3.0 規範完全支持Filter中使用異步調用,在Filter中進行異步調用與在Servlet中進行異步調用的效果完全相似。
18、Servlet 3.0 改進了部分API,這種改進很好地簡化了Java Web開發。其中兩個較大的改進是:
·HttpServletRequest增加了對文件上傳的支持
·ServletContext允許通過編程的方式註冊Servlet、Filter。
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);