亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

Servlet和JSP邁上新臺階

2019-11-18 19:15:28
字體:
來源:轉載
供稿:網友

即將面世的J2EE 1.4提供用java開發Web應用程序的新的Servlet 2.4和JavaServer Pages (jsp) 2.0技術。本文展示了這兩種技術的新特性,并在適當的地方提供每個特性的示例代碼。本文假設讀者熟悉以前的 Servlet 2.3和JSP 1.2版本。給出的例子已用Tomcat 5(包含在Java Web Services Developer Pack 1.2中)進行了測試。

Servlet和JSP毫無疑問是兩種應用最廣的J2EE技術。Servlet技術是用Java進行Web應用編程的基礎,也是JSP的基礎。但是,servlet編程可能會非常麻煩。特別是當你不得不發送一個沒多少代碼的長HTML頁面時更是如此。每個HTML標記必須嵌入到字符串中,用PRintWriter對象的顯示方式發送。是一種工作單調乏味而煩人的工作。使用servlet的另一個缺點是每一處改變都需要servlet程序員介入。

Sun公司了解到這一問題之后便開發了JSP作為解決方案。在JSP中,程序員和頁面設計員的分工變得容易多了,并且當JSP頁面更改時會自動進行編譯。不過請注意,JSP是servlet技術的一個擴展,而不是廢棄servlet。在實際應用當中,servlet和JSP頁面一起使用。

Servlet 2.4的新特性

Servlet 2.4提供了幾個新類,且不支持javax.servlet.SingleThreadModel接口。這一版本只支持HTTP 1.1,所以Servlet 2.4應用程序不適用于HTTP 1.0客戶程序。2.4版增加了請求監聽器和請求屬性監聽器,并能在一個應用程序中將servlet用作歡迎頁面。另外,Servlet 2.4還提供了更好的ServletRequest和RequestDispatcher對象,并更好地支持國際化。此外,現在是根據模式而不是文檔類型定義(document-type definition,DTD)文件來驗證部署描述符是否有效。這就意味著支持部署描述符的可擴展性。

下面具體說明Servlet 2.4的新特性。請求監聽器和請求屬性監聽器。Servlet 2.3增加了servlet上下文相關監聽器和會話相關監聽器。Servlet 2.4增加了新的javax.servlet.ServletRequestListener和javax.servlet.ServletRequestAttributeListener兩種接口,它們會通知你與Request對象有關的事件。如果你對每個Request對象的初始化和撤消感興趣,你可以實施ServletRequestListener接口。這個接口有兩個方法:requestInitialized()和requestDestroyed()。當需要一個Request對象時,servlet容器便調用requestInitialized方法。當不再需要Request對象時,servlet容器便調用requestDestroyed方法。

這兩個方法都從servlet容器接收一個javax.servlet.ServletRequestEvent對象??梢詮腟ervletRequestEvent實例獲得servlet上下文和servlet請求。

第二個監聽器接口ServletRequestAttributeListener處理Request對象屬性的添加、更改和刪除。該接口有以下方法:


attributeAdded。向Request對象添加新屬性時由servlet容器調用。


attributeRemoved。從Request對象中刪除屬性時由servlet容器調用。


attributeReplaced。Request對象中現有屬性值被替換時由servlet容器調用。

這三個方法從servlet容器獲得javax.servlet.ServletRequestAttributeEvent類的一個實例。ServletRequestAttributeEvent類擴展了ServletRequestEvent類,并添加了兩個新方法:getName和getValue。getName方法返回觸發事件的屬性的名稱,getValue返回屬性的值。

代碼清單1 給出這兩個新的監聽器的示例類。當servlet容器調用方法時二者都顯示方法名。監聽器經過編譯后,它們的類文件必須被部署到WEB-INF/classes目錄下。ServletRequest中的新方法。在Servlet 2.4中,javax.servlet.ServletRequest接口增加了4個新方法:


getRemotePort。返回發送請求的客戶機或最后一個代理服務器的Internet Protocol(ip)源端口。


getLocalName。返回從中接收請求的IP接口的主機名。


getLocalAddr。返回從中接收請求的接口的IP地址。


getLocalPort。返回從中接收請求的接口的IP端口號。

請注意,在Servlet 2.3中,getServerName和getServerPort方法返回的值就是現在getLocalName和getLocalPort返回的值。在2.4版中,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 : 3303
Local Name : localhost
Local Addr : 127.0.0.1
Local Port : 8080


請求調度程序的新特性。使用請求調度程序可將當前請求傳遞給一個新的資源,或從當前頁面引入另一個資源。Servlet 2.4增加了一些屬性,它們將被添加到傳遞給另一個資源的一個Request對象上:


javax.servlet.forward.request_uri
javax.servlet.forward.context_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中,顯示代碼清單2中的代碼。

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
javax.servlet.forward.context_path : /myApp
javax.servlet.forward.servlet_path : /Modern
javax.servlet.forward.path_info : null
javax.servlet.forward.query_string : null


將過濾器用于請求調度程序。Servlet 2.4在部署描述符中添加了一個新的元素,以便servlet程序員決定是否將過濾器(filters)應用于請求調度程序。元素的值可以是REQUEST(默認值)、FORWARD、INCLUDE和ERROR:


REQUEST。如果請求直接來自客戶機則使用過濾器。


FORWARD。如果請求正由請求調度程序進行處理,表示與或相匹配的Web組件使用傳遞調用,則使用過濾器。


INCLUDE。只有在請求正由請求調度程序進行處理,表示與或相匹配的Web組件使用包含(include)調用時,才使用過濾器。


ERROR。只有在請求正由錯誤頁面機制處理為一個與元素相匹配的錯誤資源時才使用過濾器。

Servlet 2.4只支持HTTP 1.1客戶機。Servlet 2.3既支持HTTP 1.0,又支持HTTP 1.1,而Servlet 2.4與Servlet 2.3不同,它只支持HTTP 1.1客戶機。作為過渡,HTTP/1.0狀態碼302(暫時建議)仍然存在,而且仍然由javax.servlet.http.HttpServletResponse接口中的SC_MOVED_TEMPORARILY表示。HTTP 1.1具有Found的狀態碼302,它由HttpServletResponse接口中的靜態SC_FOUND表示。

Servlet用作歡迎頁面。在Servlet 2.3中,你可以在部署描述符中使用元素列出歡迎文件--當收到一個不完整的URL時將顯示的文件。但是,在Servlet 2.3中,在元素中只能使用HTML文件或JSP文件。在Servlet 2.4中,如今可以將一個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>

此時,若用戶鍵入諸如http://domain/context/(不帶資源文件)的URL時,就會調用ModernServlet。

對國際化的新支持。在Servlet 2.3中,沒有辦法直接告訴客戶瀏覽器應當使用什么字符編碼。要實現這一目的,你必須把一個java.util.Locale對象傳遞給javax.servlet.ServletResponse接口的setLocale方法,如下所示:


response.setLocale(locale);

這意味著你必須首先創建一個Locale對象。

另外一種辦法是,在Servlet 2.3中,你可以使用setContentType方法來傳遞內容類型和字符集,如:


setContentType('text/html;
               charset=UTF-8');

在Servlet 2.4中,javax.servlet.ServletResponse接口中有兩個支持國際化的新方法。第一個方法是setCharacterEncoding,它的用法如下:


public void
setCharacterEncoding(String charset)

使用setCharacterEncoding,你可以只將字符編碼指定為一個字符串,而不必先創建Locale對象。不過,請注意,要讓這種方法起作用,必須在調用getWriter方法之前以及響應提交之前調用它。

第二個新方法是getContextType,作為在ServletResponse對象中調用setContentType、setLocale或setCharacterEncoding方法的結果,它返回在ServletResponse對象中使用的內容類型。

除了javax.servlet.ServletResponse中的這兩個方法之外,你還可以利用Servlet 2.4在部署描述符中定義一個新元素:它使servlet程序員不必在他/她的servlet中指定locale-to-charset映射。如何使用這一新元素的例子如下:


<locale-encoding-mapping-list>
  <locale-encoding-mapping>
    <locale>ja</locale>
    <encoding>ISO-2022-JP</encoding>

  </locale-encoding-mapping>
</locale-encoding-mapping-list>


部署描述符的可擴展性。在Servlet 2.3應用程序中,根據DTD文件對部署描述符進行驗證?,F在Servlet 2.4支持根據模式對部署描述符進行驗證。使用模式比使用DTD有以下幾點好處:


通過模式可以繼承另一個模式(可擴展的)的語法。


模式比DTD更精確。


通過模式可以指定每個元素的內容的實際數據類型。


模式可以用于多個名字空間。


通過模式可以指定一個元素出現的最多和最少次數。
但是,為了向后兼容,要求Servlet 2.4容器支持Servlet 2.3和Servlet 2.2 DTD。

不支持javax.servlet.SingleThreadModel接口。SingleThreadModel接口沒有方法,它用于向servlet容器指明,它必須保證不會有兩個線程同時執行實施該接口的servlet的服務方法。從servlet技術開始出現到現在,人們普遍誤解了這個接口。現在大家都反對用它,因為它會造成混亂,并且在考慮線程安全時在安全性方面給servlet程序員一個錯覺。在任何新的開發工作中決不應再使用這個接口。

JSP 2.0中的新特性

JSP 2.0(最初稱為JSP 1.3)比JSP 1.2有了重要改進。當然,增加的最重要內容是JSP 2.0容器中加入了對表達式語言(EL)的支持。

EL最初是由JSP標準標記庫(JSTL)1.0規范定義的,它可協助從JSP頁面中刪除Java代碼。javax.servlet.jsp.el包中所描述的API揭示EL的語義。EL表達式的語義與Java表達式的語義類似;表達式的值計算出來后被插入到當前的輸出中。EL可用于標準的或定制的操作的屬性值以及模板文本中。下面是EL表達式的結構(其中expr為表達式):


${expr}


對于包含字符序列"${"的文字值,JSP 2.0提供了一種方法,通過使用序列"${'${'"進行換碼。例如,下面的字符序列被轉換為文字值${expr}:


${'${'}expr}


此外,由于JSP 2.0以前的版本不支持EL,所以JSP應用程序將忽略任何Web應用程序中的EL,這些應用程序的web.xml根據Servlet 2.2或Servlet 2.3 DTD進行驗證。為了測試此處講到的JSP頁面中的表達式,你只需從應用程序中刪除web.xml文件。

實際上,EL是一種簡單的語言,它幫助頁面創作者訪問JSP隱含對象,進行反復操作以及不包含Java代碼的條件操作--這些在JSP 1.2中是無法實現的。

為了訪問隱含對象,JSP容器支持下面的名稱-對象映射:


pageContext。PageContext對象


pageScope。將頁面范圍的屬性名映射到它們的值


requestScope。將請求范圍的屬性名映射到它們的值


sessionScope。將會話范圍的屬性名映射到它們的值


applicationScope。將應用程序范圍的屬性名映射到它們的值


param。將參數名映射到一個單一串參數值


paramValues。將參數名映射到該參數所有值的一個字符串數組


header。將標頭名映射到一個單一串標頭值


headerValues。將標頭名映射到該標頭所有值的一個字符串數組


cookie。將cookie名映射到一個單一cookie對象


initParam。將上下文初始化參數名映射到其字符串參數值

例如,下面的表達式表示參數userName的值:


${param.userName}


下面的表達式返回Session對象的productId屬性的值:


${sessionScope.productId}


更簡單的SimpleTag接口操作過程。JSP 2.0提供了一個新的接口javax.servlet.jsp.tagext.SimpleTag,它是編寫標記處理器(tag handler)的一種更簡單的方法。在JSP 1.2中,標記處理器必須直接或間接地實施avax.servlet.jsp.tagext包中的下列接口之一:Tag、IterationTag或BodyTag。對于實施Tag接口的標記處理器來說,最基本的情況是,JSP容器每次遇到JSP頁面中的一個標記時就調用doStartTag和doEndTag兩個方法。利用JSP 2.0,JSP程序員可以通過實施新的SimpleTag接口來選擇實施過程更簡單的標記處理器。JSP容器并不調用實施Tag接口的標記處理器的兩個方法,而只需要調用SimpleTag接口中的一個方法:doTag。所有標記邏輯、反復操作和主體評估等都用這一個方法來執行。所以,SimpleTag與javax.servlet.jsp.tagext.BodyTag功能一樣強大,但操作過程更簡單。

為了支持需要實施SimpleTag接口的標記處理器的編寫,javax.servlet.jsp.tagext包提供了一個名為SimpleTagSupport的支持類。如果你要擴展這個類,則你只需提供一個執行方法:doTag。

代碼清單3給出了一個擴展SimpleTagSupport的標記處理器的例子。

使用標記文件更輕松地開發標記庫。眾所周知,JSP 1.2中的自定義標記庫需要花很多時間來開發。開發工作涉及標記處理器和標記庫描述符(TLD)文件的開發,以及標記庫在web.xml文件中的注冊。JSP 2.0通過提供一種新的編寫自定義標記庫的方法解決了這個問題。使用標記文件,標記擴展可類似于JSP文件。無需編譯,無需編輯web.xml文件,而且不再需要TLD。要做的是你必須把標記文件復制到WEB-INF/ tags目錄中,而這一點很容易做到。剩下的事都交給JSP容器去做,它會把WEB-INF/tags目錄中找到的每個標記文件轉換為標記處理器。程序員完全擺脫了構建標記處理器的復雜工作。

下面舉個例子。這是標記庫最簡單的形式,其中標記文件只是簡單地把一個字符串寫到隱含對象中。


<%— example1.tag file, must reside in
      WEB-INF/tags —%>

<%
  out.println("Hello from tag file.");
%>


使用JSP頁面中的標記庫再簡單不過了。和平常一樣,你只需taglib指令,通過前綴屬性在整個頁面中識別標記庫?,F在你有一個tagdir屬性,而不是uri屬性。tagdir屬性引用WEB-INF/tags目錄或WEB-INF/tags下的任何子目錄。


下面是一個使用example1.tag文件的JSP頁面的例子。


<%@ taglib prefix="easyTag"

          tagdir="/WEB-INF/tags" %>
<easyTag:example1>
</easyTag:example1>


調用該JSP頁面瀏覽器上就會顯示下面的字符串:


Hello from tag file.


結合上面講到的表達式語言,你就可以真正快速構建無腳本的JSP頁面。再舉一個例子,下面的標記文件(叫做example2.tag)通過調用JSP頁面接收一個屬性,并將它轉換為大寫字母。


<%— example2.tag file, must reside
    in WEB-INF/tags —%>
<%@ attribute name="x" %>
<%
  x = x.toUpperCase();
  out.println(x);
%>

下面是使用該標記文件的JSP頁面:


<%@ taglib prefix="easyTag"

          tagdir="/WEB-INF/tags" %>
<easyTag:example2 x="hello">
</easyTag:example2>


下面是另一個例子,其中沒有Java代碼:

 

<%— example3.tag file, must
    reside in WEB-INF/tags —%>
<%@ variable name-given="x"
            scope="AT_BEGIN" %>
<%@ taglib prefix="c"           
          uri="<c:set var="x" value="3"/>
After: ${x}
<jsp:doBody/>

該標記文件用于下面的JSP頁面:


<%@ taglib prefix="c"
          uri="
<%@ taglib prefix="easyTag"
          tagdir="/WEB-INF/tags" %>
<c:set var="x" value="1"/>

Before: ${x}<br>
<easyTag:example3/>

請注意,要運行本示例,在WEB-INF/lib目錄下要有JSTL庫。
最后一個標記文件示例還表明,不熟悉Java編程語言的頁面創作者仍能利用標記擴展的強大功能。即便是Java程序員,使用標記文件也比編寫實施javax.servlet.jsp.tagext包中的某個接口的Java類要方便。

結論

本文簡要闡述了Servlet 2.4和JSP 2.0規范中的新特性,它們將包含在即將面世的J2EE 1.4中。Servlet 2.4和JSP 2.0無疑將會加快Web應用程序的開發。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女又黄又爽在线观看| 欧美日韩成人网| 日韩精品中文字幕有码专区| 亚洲开心激情网| 国产狼人综合免费视频| 97成人精品视频在线观看| 欧美极品美女电影一区| 午夜精品一区二区三区在线播放| 在线日韩欧美视频| 亚洲精品欧美极品| 91色琪琪电影亚洲精品久久| 奇门遁甲1982国语版免费观看高清| 欧美午夜无遮挡| 国产精品入口免费视频一| 亚洲精品国产品国语在线| 三级精品视频久久久久| 国外成人在线直播| 在线视频日韩精品| 亚洲精品成人久久| 欧美激情在线观看视频| xx视频.9999.com| 98精品在线视频| 中文字幕国产日韩| 久久久天堂国产精品女人| 亚洲成av人影院在线观看| 亚洲午夜未删减在线观看| 中文字幕九色91在线| 亚洲美女动态图120秒| 亚洲国产精品成人va在线观看| 日韩在线观看高清| 亚洲电影免费观看高清完整版在线| 亚洲色图13p| 亚洲精品丝袜日韩| 亚洲电影免费观看高清完整版在线| 中文字幕国产日韩| 久久精品成人欧美大片| 亚洲www在线观看| 欧美区二区三区| 欧美极品少妇xxxxⅹ免费视频| 亚洲国产欧美久久| 欧美综合在线第二页| 欧美裸体xxxx极品少妇软件| 中文字幕国产亚洲2019| 在线观看视频99| 成人亚洲欧美一区二区三区| 伊人伊成久久人综合网小说| 国产精品91久久久久久| 亚洲国产小视频| 欧美日韩精品在线观看| 欧美精品18videos性欧| 亚洲男人天堂网站| 久久影视免费观看| 亚洲综合中文字幕在线| 亚洲另类激情图| 中文字幕少妇一区二区三区| 亚洲一区二区国产| 色综合老司机第九色激情| 九色精品免费永久在线| 国产成人亚洲综合青青| 插插插亚洲综合网| 午夜精品美女自拍福到在线| 日韩欧美在线一区| 欧美福利在线观看| 久久精品中文字幕一区| 国产91热爆ts人妖在线| 疯狂欧美牲乱大交777| 国产一区二区免费| 国产一区二区精品丝袜| 成人午夜小视频| 亚洲男人天堂古典| 亲子乱一区二区三区电影| 国产欧美日韩丝袜精品一区| 精品国产一区二区三区四区在线观看| 国产91亚洲精品| 中文字幕国内精品| 久久久久久久激情视频| 26uuu另类亚洲欧美日本老年| 91九色视频在线| 久久视频在线看| 欧美日韩一区二区三区| 成人网中文字幕| 日av在线播放中文不卡| 亚洲人成电影网站色| 亚洲精品国产免费| 国产成人在线精品| 国产精品免费一区| 亚洲人成电影网站色xx| 国产精品一香蕉国产线看观看| 亚洲一区二区三区在线视频| 久久久视频免费观看| 黑丝美女久久久| 欧美激情在线一区| 久热精品在线视频| 亚洲国产精品久久久久久| 国产欧美一区二区三区久久人妖| 亚洲аv电影天堂网| 亚洲国产精品成人精品| 亚洲最大av网站| 亚洲国产成人在线视频| 亚洲www在线观看| 亚洲精品98久久久久久中文字幕| 国产精品入口免费视频一| 亚洲视频免费一区| 久久国产精品久久久久| 亚洲欧美制服中文字幕| 亚洲一级一级97网| 亚洲人成网站免费播放| 欧美理论电影在线观看| 欧美三级免费观看| 亚洲午夜色婷婷在线| 欧美日韩国产成人在线观看| 中国日韩欧美久久久久久久久| 2018日韩中文字幕| 国产精品久久久久9999| 国产91精品最新在线播放| 欧美福利视频在线| 成人精品aaaa网站| 色综合亚洲精品激情狠狠| 日韩麻豆第一页| 日韩精品视频在线观看网址| 国产福利精品av综合导导航| 亚洲自拍另类欧美丝袜| 97国产精品人人爽人人做| 韩剧1988在线观看免费完整版| 成人福利网站在线观看| 国产日韩精品入口| 日本欧美国产在线| 亚洲精品福利视频| 国产亚洲福利一区| 国产乱人伦真实精品视频| 中文字幕亚洲欧美| 欧美精品一区二区三区国产精品| 91精品国产成人www| 97超级碰碰碰| 国产精品久久久av久久久| 亚洲第一男人av| 欧美日韩国产第一页| 亚洲国产婷婷香蕉久久久久久| 国产suv精品一区二区| 欧美亚洲日本网站| 国产一区二区三区在线| 日韩欧美中文第一页| 日韩视频亚洲视频| 在线亚洲欧美视频| 欧美一乱一性一交一视频| 青青草原一区二区| 成人国产亚洲精品a区天堂华泰| 性视频1819p久久| 亚洲精品资源美女情侣酒店| 国产一区二区三区直播精品电影| 一本久久综合亚洲鲁鲁| 国产亚洲精品成人av久久ww| 欧美大片在线影院| 亚洲精品之草原avav久久| 欧美二区乱c黑人| 亚洲欧美中文在线视频| 欧美一性一乱一交一视频| 久久777国产线看观看精品| 欧美电影免费播放| 4438全国成人免费| 日韩在线观看免费全集电视剧网站| 久久视频这里只有精品| 精品一区二区三区电影| 亚洲午夜av久久乱码|