ytech

          學習JAVA, Hello World!

          導航

          <2005年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          留言簿(1)

          隨筆分類

          隨筆檔案

          閱讀排行榜

          評論排行榜

          常用鏈接

          統計

          最新評論

          轉發: J2EE1.4新特性之Servlet2.4新特性

          http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=125&threadID=13086 

          在J2EE1.4最新的Servlet 2.4版中,加入了一些新的功能,下面我們介紹其中主要的常用功能。

          1、XML Schema定義Web查詢部署描述文件

          Servlet 2.3之前的版本使用DTD作為部署描述文件的定義,其web.xml的格式為如下所示:

          <?xml version="1.0" encoding="IS0-8859-1"?>
          <!DOCTYPE web-app
              PUBLIC "-//sunMicrosystems,Inc.//DTD WebApplication 2.3f//EN"
              "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">
              <web-app>
               .......
              </web-app>



          Servlet 2.4版首次使用XML Schema定義作為部署描述文件,這樣Web容器更容易校驗web.xml語法。同時XML Schema提供了更好的擴充性,其web.xml中的格式如下所示:

          <?xml version="1.0" encoding="UTF-8"?>
              <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
                    xmlns:workflow="http://www.workflow.com"
                    xmins: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">
              .........
              </web-app>



          雖然上面顯示兩個版本的開頭幾行有差別,Servlet 2.4版程序web.xml中Web構件的設置方法和Servlet 2.3版大致相同。

          2、Servlet Request監聽器

          Servlet 2.4版在事件監聽器中加入了ServletRequest監聽器,包括:ServletRequestListener,ServletRequestAttributeListener和其他相關類。這些類可以用來管理和控制與ServletRequest動作有關的事件。下面的程序顯示了一個典型的ServletRequest監聽器的結構。

          import javax.setvlet.ServletContext;
              import javax.servlet.ServletRequestListener;
              import javax.servlet.ServletRequestAttributeListener;
              import javax.servlet.http.HttpServletRequest;
              import iava.io.*;
              import java.util.Locale;
              public final class RequestListener  implements   SerVletRequestListener,
              ServletRequestAttributeListener,ServletContextListener{
                  ........
          public void requestlnitialized(javax.servlet.ServletRequestEvent event){
                  ........
                  }
          public void attributeAdded(javax.servlet.ServletRequestAttributeEvent event){
                  ........
                  }
          public void attributeRemoved(javax.servlet.ServletRequestAttributeEvent event){
                  ........
                  }
          public void attributeReplaced(javax.servlet.ServletRequestAttributeEvent event){
                  ........
                  }
          public void attributeDestroyed(javax.servlet.ServletRequestAttributeEvent event){
                 ........
                 }
              }



          3、 Request Dispatcher變化

          Servlet 2.4版的Web程序增強了filter和request dispatcher的配合功能,這樣過濾器可以根據請求分發器(request dispatcher)所使用的方法有條件地對Web請求進行過濾。編程者可以通過在web.xml中使用元素設定過濾器作用的條件(下圖1):




          圖1 設定元素的過濾器


          ·只有當request直接來自客戶,過濾器才生效,對應為REQUEST條件。

          ·只有當request被一個請求分發器使用forward()方法轉到一個Web構件時(采用或定義),對應稱為FORWARD條件。

          ·類似地,只有當request被一個請求分發器使用include()方法轉到一個Web構件時(采用或定義),對應稱為INCLUDE條件。

          ·只有當request被一個請求分發器使用“錯誤信息頁”機制方法轉到一個Web構件時,對應稱為ERROR條件。

          ·第五種過濾器作用的條件可以是上面四種條件的組合。

          下面的程序中的定義了當客戶請求/icsamples/* 樣式的URL時,Security Filter會被用來過濾請求。但是如果到達URL為/icsamples/* 的Web構件的請求是從一個request dispatcher轉發過來的,這個過濾器不工作。

          <filter-mapping>
              <filter-name>Security Filter</filter-name>
              <url-pattern>/icsamples/*</url-pattern>
              </filter-mapping>



          如果使用下面的程序設置,在中加入INCLUDE,Security Filter只有在被一個request dispatcher使用include()方法包括RequestRecorderServlet時才會工作。在其他情況(如請求直接從客戶發來,或request dispatcher使用forward方法)下,Security Filter都不會工作。

          <filter-mapping>
              <fliter-name>Security Filter</filter-name>
              <servlet-name>RequestRecorderServlet</servlet-name>
              <dispatcher>INCLUDE</dispatcher>
              </filter-mapping>



          下面的程序設置定義了Security Filter當request由客戶直接發出或request

          dispatcher使用forward方法時能工作。

          <filter-mapping>
              <filter-name>Security Filter</filter-name>
              <url-pattern>/icsamples/*</uri-pattern>
              <dispatcher>FORWARD</dispatcher>
              <dispatcher>REQUEST</dispatcher>
              </filter-mapping>



          程序例6顯示了一個在中使用的例子。程序7定義的ReqDispatcherServlet根據用戶請求的參數"type",決定如何處理請求。在其中使用了兩個RequestDispatcher(rd,和rd2),它們可以向URL為/admin或/control的servlet轉發請求。當請求被轉發后,適當的過濾器會起作用。過濾器和Web資源的關系可以在web.xml中定義。如果用戶輸入的Web請求參數為“INCLUDE”,ReqDispatcherServlet的RequestDispatcher會調用include 方法,這樣DispatcherFilterIcd會被使用,因為在定義了INCLUDE;如果用戶輸入的 Web請求參數為“ERROR”ReqDispatcherServlet會調用resp.sendError()方法,這樣DispatcherFilterErr會被使用,因為在定義了ERROR。

          例6:

          <filter-mapping>
              <filter-name>DispatcherFilterIcd</filter-name>
              <url-pattern>/admin</url-pattern>
              <dispatcher>INCLUDE</dispatcher>
              </filter-mapping>
              <filter-mapping>
              <filter-name>DispatcherFilterErr</filter-name>
              <url-pattern>/errorpage</url-pattern>
              <dispatcher>ERROR</dispatcher>
              </filter-mapping>



          例7:

          import javax.servlet.*;
              import javax.servlet.http.*;
              import java.io.*;
              import java.util.*;

              public class ReqDispatcherServlet extends HttpServlet
              {
              String dispatchtype;
              public void init(ServletConfig config) throws ServletException
              {
              super.init(config);
              }
              public void service(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,IOException
              {
              PrintWriter out=resp.getWriter();
              String type="NONE";
              if((req.getParameter("type"))!=null)
              {
              type = req.getParameter("type");
              }
                  resp.setContentType("text/html");
                  out.println("<HTML>");
                  out.println("<BODY>");
          out.println("<HR>");
          out.println("<p>");
              out.println("ReqDispacherServelt");
              out.println("</P><p>");
              out.println("ServerName:"+req.getServerName()+"ServerPort:"+
          req.getServerPort());   
              out.println("</p>");
              RequestDispatcher rd=req.getRequestDispatcher("/admin");
              RequestDispatcher rd2=req.getRequestDispatcher("/control");
              if(type.equals("REQUEST"))
              {
              }
              if(type.equals("FORWARD"))
               {   
              rd.forward(reg,resp);
               }
              if(type.equals("INCLUDE"))
              {
              rd.include(req,resp);
                }
              if(type.equals("ERROR"))
               {
              resp.sendError(404,"Error from ReqDispacherServlet");
               }
              if(type.equals("CONTROL"))
               {
              rd2.forward(req,resp);
               }
              out.flush();
              }
              public voiddestroy()
              {
              System.out.println("ReqDispacherServlet:destroy()");
               }
              }



          4、 增強的國際化功能

          Servlet 2.4增加了Web程序國際化功能,在web.xml中可以定義網站的字符編碼方式。

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



          當客戶請求了特定語言的Web資源時,servlet程序通過ServletResponse接口的setLocale方法設置一個Web響應的語言屬性。

          5、 Login/Logout功能

          在Servlet 2.4中增加了logout和login方法方便安全管理。大家可以參考Servlet 2.4的API查看其用法。

          posted on 2005-11-24 04:08 Java 的學習之路 閱讀(470) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 微山县| 岚皋县| 马公市| 惠来县| 南涧| 汕头市| 宜良县| 巴彦县| 玛沁县| 林州市| 册亨县| 扶风县| 堆龙德庆县| 太仆寺旗| 利川市| 白河县| 棋牌| 肃宁县| 太白县| 阳江市| 桂林市| 浦北县| 天台县| 兴和县| 威宁| 武穴市| 晋州市| 罗平县| 尚志市| 隆化县| 台山市| 辉南县| 丹巴县| 瑞安市| 中卫市| 平遥县| 淅川县| 民乐县| 搜索| 壶关县| 莆田市|