即將面世的J
EE
提供用Java開發Web應用程序的新的Servlet
和JavaServer Pages (JSP)
技術
本文展示了這兩種技術的新特性
並在適當的地方提供每個特性的示例代碼
本文假設讀者熟悉以前的 Servlet
和JSP
版本
給出的例子已用Tomcat
(包含在Java Web Services Developer Pack
中)進行了測試
Servlet和JSP毫無疑問是兩種應用最廣的J
EE技術
Servlet技術是用Java進行Web應用編程的基礎
也是JSP的基礎
但是
servlet編程可能會非常麻煩
特別是當你不得不發送一個沒多少代碼的長HTML頁面時更是如此
每個HTML標記必須嵌入到字符串中
用PrintWriter對象的顯示方式發送
是一種工作單調乏味而煩人的工作
使用servlet的另一個缺點是每一處改變都需要servlet程序員介入
Sun公司了解到這一問題之後便開發了JSP作為解決方案
在JSP中
程序員和頁面設計員的分工變得容易多了
並且當JSP頁面更改時會自動進行編譯
不過請注意
JSP是servlet技術的一個擴展
而不是廢棄servlet
在實際應用當中
servlet和JSP頁面一起使用
Servlet 的新特性 Servlet
提供了幾個新類
且不支持javax
servlet
SingleThreadModel接口
這一版本只支持HTTP
所以Servlet
應用程序不適用於HTTP
客戶程序
版增加了請求監聽器和請求屬性監聽器
並能在一個應用程序中將servlet用作歡迎頁面
另外
Servlet
還提供了更好的ServletRequest和RequestDispatcher對象
並更好地支持國際化
此外
現在是根據模式而不是文檔類型定義(document
type definition
DTD)文件來驗證部署描述符是否有效
這就意味著支持部署描述符的可擴展性
下面具體說明Servlet
的新特性
請求監聽器和請求屬性監聽器
Servlet
增加了servlet上下文相關監聽器和會話相關監聽器
Servlet
增加了新的javax
servlet
ServletRequestListener和javax
servlet
ServletRequestAttributeListener兩種接口
它們會通知你與Request對象有關的事件
如果你對每個Request對象的初始化和撤消感興趣
你可以實施ServletRequestListener接口
這個接口有兩個方法
requestInitialized()和requestDestroyed()
當需要一個Request對象時
servlet容器便調用requestInitialized方法
當不再需要Request對象時
servlet容器便調用requestDestroyed方法
這兩個方法都從servlet容器接收一個javax
servlet
ServletRequestEvent對象
可以從ServletRequestEvent實例獲得servlet上下文和servlet請求
第二個監聽器接口ServletRequestAttributeListener處理Request對象屬性的添加
更改和刪除
該接口有以下方法
attributeAdded
向Request對象添加新屬性時由servlet容器調用
attributeRemoved
從Request對象中刪除屬性時由servlet容器調用
attributeReplaced
Request對象中現有屬性值被替換時由servlet容器調用
這三個方法從servlet容器獲得javax
servlet
ServletRequestAttributeEvent類的一個實例
ServletRequestAttributeEvent類擴展了ServletRequestEvent類
並添加了兩個新方法
getName和getValue
getName方法返回觸發事件的屬性的名稱
getValue返回屬性的值
代碼清單
給出這兩個新的監聽器的示例類
當servlet容器調用方法時二者都顯示方法名
監聽器經過編譯後
它們的類文件必須被部署到WEB
INF/classes目錄下
ServletRequest中的新方法
在Servlet
中
javax
servlet
ServletRequest接口增加了
個新方法
getRemotePort
返回發送請求的客戶機或最後一個代理服務器的Internet Protocol(IP)源端口
getLocalName
返回從中接收請求的IP接口的主機名
getLocalAddr
返回從中接收請求的接口的IP地址
getLocalPort
返回從中接收請求的接口的IP端口號
請注意
在Servlet
中
getServerName和getServerPort方法返回的值就是現在getLocalName和getLocalPort返回的值
在
版中
getServerName和getServerPort已重新定義
欲了解更多的信息
請查看API文檔
將一個JSP頁面中的代碼示例如下
out
println(
<br>Remote Port :
+
request
getRemotePort());
out
println(
<br>Local Name :
+
request
getLocalName());
out
println(
<br>Local Addr :
+
request
getLocalAddr());
out
println(
<br>Local Port :
+
request
getLocalPort());
該代碼生成這樣的內容
Remote Port :
Local Name : localhost
Local Addr :
Local Port :
請求調度程序的新特性
使用請求調度程序可將當前請求傳遞給一個新的資源
或從當前頁面引入另一個資源
Servlet
增加了一些屬性
它們將被添加到傳遞給另一個資源的一個Request對象上
javax
servlet
forward
request_uri
javaxntext_path
javax
servlet
forward
servlet_path
javax
servlet
forward
path_info
javax
servlet
forward
query_string
如果一個Request對象未被傳遞
則這些屬性的值為null
另一方面
在所傳遞來對象的資源中這些屬性將具有非null值
當某一個資源必須只能通過另一個資源調用而不能直接調用時
這些屬性值很有用
舉個例子
在一個叫做myApp的Context(上下文)中有一個名為ModernServlet的servlet
ModernServlet被傳遞給TargetServlet
在TargetServlet中
顯示代碼清單
中的代碼
myApp的部署描述符包含以下和元素
<servlet>
<servlet
name>Modern</servlet
name>
<servlet
class>ModernServlet
</servlet
class>
</servlet>
<servlet
mapping>
<servlet
name>Modern</servlet
name>
<url
pattern>/Modern</url
pattern>
</servlet
mapping>
<servlet>
<servlet
name>Target</servlet
name>
<servlet
class>TargetServlet
</servlet
class>
</servlet>
<servlet
mapping>
<servlet
name>Target</servlet
name>
<url
pattern>/Target</url
pattern>
</servlet
mapping>
下面是調用ModernServlet時控制台顯示的結果
javax
servlet
forward
request_uri : /myApp/Modern
javaxntext_path : /myApp
javax
servlet
forward
servlet_path : /Modern
javax
servlet
forward
path_info : null
javax
servlet
forward
query_string : null
將過濾器用於請求調度程序
Servlet
在部署描述符中添加了一個新的元素
以便servlet程序員決定是否將過濾器(filters)應用於請求調度程序
元素的值可以是REQUEST(默認值)
FORWARD
INCLUDE和ERROR
REQUEST
如果請求直接來自客戶機則使用過濾器
FORWARD
如果請求正由請求調度程序進行處理
表示與或相匹配的Web組件使用傳遞調用
則使用過濾器
INCLUDE
只有在請求正由請求調度程序進行處理
表示與或相匹配的Web組件使用包含(include)調用時
才使用過濾器
ERROR
只有在請求正由錯誤頁面機制處理為一個與元素相匹配的錯誤資源時才使用過濾器
Servlet
只支持HTTP
客戶機
Servlet
既支持HTTP
又支持HTTP
而Servlet
與Servlet
不同
它只支持HTTP
客戶機
作為過渡
HTTP/
狀態碼
(暫時建議)仍然存在
而且仍然由javax
servlet
http
HttpServletResponse接口中的SC_MOVED_TEMPORARILY表示
HTTP
具有Found的狀態碼
它由HttpServletResponse接口中的靜態SC_FOUND表示
Servlet用作歡迎頁面
在Servlet
中
你可以在部署描述符中使用元素列出歡迎文件
當收到一個不完整的URL時將顯示的文件
但是
在Servlet
中
在元素中只能使用HTML文件或JSP文件
在Servlet
中
如今可以將一個servlet用作歡迎頁面
下例為一個叫做Modern的servlet
它的類為ModernServlet
class
並已被映射到path /Modern
<servlet>
<servlet
name>Modern</servlet
name>
<servlet
class>ModernServlet
</servlet
class>
</servlet>
<servlet
mapping>
<servlet
name>Modern</servlet
name>
<url
pattern>/Modern</url
pattern>
</servlet
mapping>
<welcome
file
list>
<welcome
file>Modern</welcome
file>
</welcome
file
list>
此時
若用戶鍵入諸//domain/context/(不帶資源文件)的URL時
就會調用ModernServlet
對國際化的新支持
在Servlet
中
沒有辦法直接告訴客戶浏覽器應當使用什麼字符編碼
要實現這一目的
你必須把一個java
util
Locale對象傳遞給javax
servlet
ServletResponse接口的setLocale方法
如下所示
response
setLocale(locale);
這意味著你必須首先創建一個Locale對象
另外一種辦法是
在Servlet
From:http://tw.wingwit.com/Article/program/Oracle/201311/18031.html