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

首頁 > 編程 > JSP > 正文

Servlet和JSP邁上新臺階

2024-09-05 00:20:20
字體:
來源:轉載
供稿:網友

即將面世的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_urijavax.servlet.forward.context_pathjavax.servlet.forward.servlet_pathjavax.servlet.forward.path_infojavax.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/modernjavax.servlet.forward.context_path : /myappjavax.servlet.forward.servlet_path : /modernjavax.servlet.forward.path_info : nulljavax.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 voidsetcharacterencoding(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技術開始出現到現在,人們普遍誤解了這個接口?,F在大家都反對用它,因為它會造成混亂,并且在考慮線程安全時在安全性方面給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="http://java.sun.com/jsp/jstl/core" %><c:set var="x" value="3"/>after: ${x}<jsp:dobody/>

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

<%@ taglib prefix="c"          uri="http://java.sun.com/jsp/jstl/core" %><%@ 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
久久久久久久久久国产精品| 亚洲欧美一区二区三区四区| 亚洲天堂久久av| 成人性生交xxxxx网站| 亚洲国产精品人久久电影| 欧美国产乱视频| 国产精品入口福利| 亚洲乱码国产乱码精品精| 高清欧美电影在线| 国产成人拍精品视频午夜网站| 欧美日韩另类视频| 久久精品亚洲国产| 欧美黄色性视频| 国产欧洲精品视频| 欧美在线精品免播放器视频| 国产成人在线亚洲欧美| 日韩黄色高清视频| 中文字幕少妇一区二区三区| 亚洲电影免费观看高清完整版在线观看| 一区二区三区回区在观看免费视频| 日韩电影大片中文字幕| 欧美精品电影在线| 久久69精品久久久久久久电影好| 91热精品视频| 全色精品综合影院| 高跟丝袜欧美一区| 成人www视频在线观看| 精品少妇一区二区30p| 色播久久人人爽人人爽人人片视av| 久久亚洲成人精品| 成人免费网站在线观看| 欧美超级乱淫片喷水| 国内精品久久久久| 国产精品女主播| 欧美高清视频在线播放| 日本精品免费一区二区三区| 欧美乱大交做爰xxxⅹ性3| 91精品国产91久久| 欧美老女人www| 久久久这里只有精品视频| 国产精品高潮呻吟久久av无限| 96国产粉嫩美女| 亚洲女在线观看| 日韩精品视频免费在线观看| 久久久久久久久爱| 中文字幕亚洲一区二区三区五十路| 国语自产在线不卡| 欧美乱人伦中文字幕在线| 夜色77av精品影院| 日韩大陆欧美高清视频区| 国产欧美日韩视频| 亚洲视频在线观看视频| 91色视频在线观看| 久久伊人精品视频| 欧美日韩综合视频网址| 中文字幕日韩欧美精品在线观看| 揄拍成人国产精品视频| 欧美老妇交乱视频| 精品视频在线导航| 久久福利视频导航| 欧美刺激性大交免费视频| 亚洲综合视频1区| 国产日产亚洲精品| 97精品视频在线播放| 日韩中文字幕久久| www.欧美精品一二三区| 久久久久久久久久久久av| 久久综合免费视频| 国产日产久久高清欧美一区| 亚洲色图25p| 日韩视频精品在线| 国产中文欧美精品| 亚洲精品乱码久久久久久按摩观| 国产精品扒开腿爽爽爽视频| 久久韩国免费视频| 国产精品第二页| 97精品一区二区三区| 欧美激情啊啊啊| 久久久久久高潮国产精品视| 国产精品亚洲自拍| 美女国内精品自产拍在线播放| 日韩国产高清污视频在线观看| 亚洲综合最新在线| 亚洲精品videossex少妇| 亚洲福利在线看| 成人深夜直播免费观看| 成人国产精品久久久久久亚洲| 欧美成人午夜剧场免费观看| 精品久久中文字幕| 国产第一区电影| 77777少妇光屁股久久一区| 亚洲美女久久久| 久久综合久中文字幕青草| 精品视频—区二区三区免费| 一色桃子一区二区| 国产精品偷伦一区二区| 欧美精品videosex牲欧美| 欧美视频在线观看免费网址| 黑人巨大精品欧美一区二区| 最近2019年中文视频免费在线观看| 亚洲第一av在线| 亚洲福利在线播放| 亚洲人成网站免费播放| 日韩av电影在线免费播放| 午夜精品一区二区三区在线视频| 日韩精品在线免费观看视频| 国产精品中文字幕久久久| 亚洲国产精品久久久久秋霞不卡| 亚洲免费伊人电影在线观看av| 亚洲人高潮女人毛茸茸| 久久久精品国产一区二区| 97视频国产在线| 国产精品爽爽爽| 性欧美激情精品| 日韩在线免费av| 日韩电影免费观看在线| 久久精品国产亚洲精品2020| 国产一区二区三区视频在线观看| 亚洲黄页视频免费观看| 久久激情视频免费观看| 激情懂色av一区av二区av| 97人人爽人人喊人人模波多| 久久精品99国产精品酒店日本| 日韩精品视频免费专区在线播放| 亚洲福利视频二区| 国产精品自产拍高潮在线观看| 成人久久久久久久| 亚洲性生活视频在线观看| 中文字幕欧美日韩va免费视频| 另类视频在线观看| 亚洲精品97久久| 中日韩美女免费视频网址在线观看| 亚洲视频一区二区三区| 国产亚洲精品久久久久久| 国产精品久久久久久中文字| 国产精品极品美女在线观看免费| 久久99精品国产99久久6尤物| 日韩在线视频网| 成人写真视频福利网| 精品久久久一区二区| 午夜精品一区二区三区在线| 色青青草原桃花久久综合| 日韩av中文字幕在线播放| 亚洲国产精品久久久久| 色婷婷综合成人| 欧美视频二区36p| 亚洲欧美资源在线| 国产日韩专区在线| 亚洲一区二区在线播放| www.亚洲免费视频| 亚洲精品中文字| 亚洲第五色综合网| 91精品国产自产91精品| 国产成人精品在线观看| 亚洲毛茸茸少妇高潮呻吟| 国产一区在线播放| 成人黄色免费在线观看| 国产成人一区二区三区| 国产精品6699| 国产精品爱久久久久久久| 亚洲欧美中文在线视频| 国产精品福利片| 日韩中文字幕在线免费观看| 日韩av在线免费看|