熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Servlet和JSP邁上新台階

2022-06-13   來源: Oracle 

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