Java Tools

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            83 隨筆 :: 0 文章 :: 16 評論 :: 0 Trackbacks

          #

          看到很多文章在問和答關(guān)于java網(wǎng)頁漢字亂碼的情況,有些甚至認為這是servlet包容器實現(xiàn)上的錯誤。
          可是如果讀過servlet規(guī)格說明書,關(guān)于java網(wǎng)頁編碼的問題就應該迎刃而解了。

          編寫java網(wǎng)頁(servlet\jsp),需要關(guān)心response(反饋給客戶端的頁面)和request(來自客戶端的數(shù)據(jù))的編碼問題。

          response的編碼可以直接用代碼實現(xiàn)。而request的編碼怎么辦呢?
          以下是servlet規(guī)范書上的文字(我粗略翻譯一下吧,不怕見笑):

          -- 整理自<Java Servlet Specification Version 2.3> SRV.4.9 --

          當前,很多瀏覽器并不發(fā)送帶有“Content-Type”頭信息的字符編碼限定符,而由讀取HTTP請求的代碼來決定字符的編碼方式。如果客戶端請求未定義編碼限定符,則包容器(如tomcat)用于創(chuàng)建request reader和分析POST數(shù)據(jù)的request的缺省編碼方式必須是“ISO-8859-1”。然而,為了向開發(fā)者指明客戶端沒有發(fā)送字符編碼信息的情況,包容器對getCharacterEncoding方法返回null。

          如果客戶端不設(shè)置字符編碼方式,并且request不是按照以上缺省編碼方式(iso-8859-1)來編碼,則會發(fā)生問題。為了解決這個問題,在接口ServletRequest中加入了一個新的方法setCharacterEncoding(String enc)。開發(fā)者可以調(diào)用這個方法來替換包容器提供的缺省字符編碼方式。但是,必須在從request中分析任何POST數(shù)據(jù)或者讀取任何輸入之前,調(diào)用這個方法。一旦數(shù)據(jù)已被讀取,則調(diào)用這個方法將不會影響編碼方式。
          posted @ 2007-07-02 12:19 和田雨 閱讀(981) | 評論 (1)編輯 收藏

          一、Servlet過濾器的概念:
          ***************************************************************************************
          Servlet過濾器是在Java Servlet規(guī)范2.3中定義的,它能夠?qū)ervlet容器的請求和響應對象進行檢查和修改。   

          Servlet過濾器本身并不產(chǎn)生請求和響應對象,它只能提供過濾作用。Servlet過期能夠在Servlet被調(diào)用之前檢查Request對象,修改Request Header和Request內(nèi)容;在Servlet被調(diào)用之后檢查Response對象,修改Response Header和Response內(nèi)容。

          Servlet過期負責過濾的Web組件可以是Servlet、JSP或者HTML文件。 
          ***************************************************************************************


          二、Servlet過濾器的特點:
          ***************************************************************************************
          A.Servlet過濾器可以檢查和修改ServletRequest和ServletResponse對象
          B.Servlet過濾器可以被指定和特定的URL關(guān)聯(lián),只有當客戶請求訪問該URL時,才會觸發(fā)過濾器
          C.Servlet過濾器可以被串聯(lián)在一起,形成管道效應,協(xié)同修改請求和響應對象
          ***************************************************************************************


          三、Servlet過濾器的作用:
          ***************************************************************************************
          A.查詢請求并作出相應的行動。
          B.阻塞請求-響應對,使其不能進一步傳遞。
          C.修改請求的頭部和數(shù)據(jù)。用戶可以提供自定義的請求。
          D.修改響應的頭部和數(shù)據(jù)。用戶可以通過提供定制的響應版本實現(xiàn)。
          E.與外部資源進行交互。
          ***************************************************************************************


          四、Servlet過濾器的適用場合:
          ***************************************************************************************
          A.認證過濾
          B.登錄和審核過濾
          C.圖像轉(zhuǎn)換過濾 
          D.數(shù)據(jù)壓縮過濾 
          E.加密過濾 
          F.令牌過濾 
          G.資源訪問觸發(fā)事件過濾 
          H.XSL/T過濾 
          I.Mime-type過濾
          ***************************************************************************************


          五、Servlet過濾器接口的構(gòu)成:
          ***************************************************************************************
          所有的Servlet過濾器類都必須實現(xiàn)javax.servlet.Filter接口。這個接口含有3個過濾器類必須實現(xiàn)的方法:

          A.init(FilterConfig):
          這是Servlet過濾器的初始化方法,Servlet容器創(chuàng)建Servlet過濾器實例后將調(diào)用這個方法。在這個方法中可以讀取web.xml文件中Servlet過濾器的初始化參數(shù)

          B.doFilter(ServletRequest,ServletResponse,FilterChain):
          這個方法完成實際的過濾操作,當客戶請求訪問于過濾器關(guān)聯(lián)的URL時,Servlet容器將先調(diào)用過濾器的doFilter方法。FilterChain參數(shù)用于訪問后續(xù)過濾器

          B.destroy():
          Servlet容器在銷毀過濾器實例前調(diào)用該方法,這個方法中可以釋放Servlet過濾器占用的資源
          ***************************************************************************************


          六、Servlet過濾器的創(chuàng)建步驟:
          ***************************************************************************************
          A.實現(xiàn)javax.servlet.Filter接口
          B.實現(xiàn)init方法,讀取過濾器的初始化函數(shù)
          C.實現(xiàn)doFilter方法,完成對請求或過濾的響應
          D.調(diào)用FilterChain接口對象的doFilter方法,向后續(xù)的過濾器傳遞請求或響應
          E.銷毀過濾器
          ***************************************************************************************


          七、Servlet過濾器對請求的過濾:
          ***************************************************************************************
          A.Servlet容器創(chuàng)建一個過濾器實例
          B.過濾器實例調(diào)用init方法,讀取過濾器的初始化參數(shù)
          C.過濾器實例調(diào)用doFilter方法,根據(jù)初始化參數(shù)的值判斷該請求是否合法
          D.如果該請求不合法則阻塞該請求
          E.如果該請求合法則調(diào)用chain.doFilter方法將該請求向后續(xù)傳遞
          ***************************************************************************************


          八、Servlet過濾器對響應的過濾:
          ***************************************************************************************
          A.過濾器截獲客戶端的請求
          B.重新封裝ServletResponse,在封裝后的ServletResponse中提供用戶自定義的輸出流
          C.將請求向后續(xù)傳遞
          D.Web組件產(chǎn)生響應
          E.從封裝后的ServletResponse中獲取用戶自定義的輸出流
          F.將響應內(nèi)容通過用戶自定義的輸出流寫入到緩沖流中
          G.在緩沖流中修改響應的內(nèi)容后清空緩沖流,輸出響應內(nèi)容
          ***************************************************************************************

          九、Servlet過濾器的發(fā)布:
          ***************************************************************************************
          A.發(fā)布Servlet過濾器時,必須在web.xml文件中加入<filter>元素和<filter-mapping>元素。

          B.<filter>元素用來定義一個過濾器:
          屬性                   含義
          filter-name    指定過濾器的名字
          filter-class    指定過濾器的類名
          init-param    為過濾器實例提供初始化參數(shù),可以有多個

          C.<filter-mapping>元素用于將過濾器和URL關(guān)聯(lián):
          屬性                     含義
          filter-name    指定過濾器的名字
          url-pattern    指定和過濾器關(guān)聯(lián)的URL,為”/*”表示所有URL
          ***************************************************************************************


          十一、Servlet過濾器使用的注意事項
          ***************************************************************************************
          A.由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的請求、響應對象ServletRequest、ServletResponse在使用前都必須先轉(zhuǎn)換成HttpServletRequest、HttpServletResponse再進行下一步操作。

          B.在web.xml中配置Servlet和Servlet過濾器,應該先聲明過濾器元素,再聲明Servlet元素


          C.如果要在Servlet中觀察過濾器生成的日志,應該確保在server.xml的localhost對應的<host>元素中配置如下<logger>元素:
          <Logger className = “org.apache.catalina.logger.FileLogger”
          directory = “logs”prefix = “localhost_log.”suffix=”.txt”
          timestamp = “true”/>
          ***************************************************************************************
          posted @ 2007-07-02 12:13 和田雨 閱讀(279) | 評論 (0)編輯 收藏

             各種數(shù)據(jù)庫的JDBC驅(qū)動下載及連接字符串URL寫法

          sun官方網(wǎng)站上的JDBC驅(qū)動列表:http://java.sun.com/products/jdbc/reference/industrysupport/index.html

          數(shù) 據(jù) 庫  說      明 
          MySQL  http://www.mysql.com/products/connector/j/ Shipped. But need to download the latest for MySQL 4.1 or higher. 
          Oracle  http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html Included. 
          SQL Server by jTDS  http://sourceforge.net/project/showfiles.php?group_id=33291 Included. Support Microsoft SQL Server (6.5, 7, 2000 and 2005) 
          Postgres  http://jdbc.postgresql.org/download.html Included 7.3 JDBC 3 
          SAP DB  http://www.sapdb.org/sap_db_jdbc.htm Included. 
          SyBase by jTDS  http://jtds.sourceforge.net/ Included. Support Sybase (10, 11, 12) 


          以下內(nèi)容來自互聯(lián)網(wǎng)

          1. MySQL(http://www.mysql.com) mysql-connector-java-2.0.14-bin.jar ;
            Class.forName( "org.gjt.mm.mysql.Driver" );
            cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd ); 
          2. PostgreSQL(http://www.de.postgresql.org) pgjdbc2.jar ;
            Class.forName( "org.postgresql.Driver" ); 
            cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd ); 
          3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/) classes12.zip ;
            Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
            cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); 
          4. Sybase(http://jtds.sourceforge.net) jconn2.jar ;
            Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" ); 
            cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd ); 
            //(Default-Username/Password: "dba"/"sql") 
          5. Microsoft SQLServer(http://jtds.sourceforge.net) ;
            Class.forName( "net.sourceforge.jtds.jdbc.Driver" ); 
            cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd ); 
          6. Microsoft SQLServer(http://www.microsoft.com) ;
            Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" ); 
            cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd ); 
          7. ODBC 
            Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); 
            Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd ); 
          8.DB2 Class.forName("com.ibm.db2.jdbc.net.DB2Driver"); 
            String url="jdbc:db2://192.9.200.108:6789/SAMPLE" 
            cn = DriverManager.getConnection( url, sUsr, sPwd ); 
          9.access由于access并不是作為一項服務運行,所以url的方法對他不適用。access可以通過odbc,也可以通過服務器映射路徑的形式找到.mdb文件,參見http://rmijdbc.objectweb.org/Access/access.html
          JDBC API的使用方法
          (1)登記并加載JDBC驅(qū)動程序;
          兩種方法:
          Class.forName(String drivername);
          DriverManager.registerDriver(Driver driver)
          (2)建立與SQL數(shù)據(jù)庫的連接;
          DriverManager的getConnection()方法:
          Connection getConnection(String url):url表示數(shù)據(jù)庫地址字符串;
          Connection getConnection(String url,String user,String pwd)
          Connection getConnection(String url,Properties info)
          (3)傳送一個SQL查詢;
          Connection的createStatement()方法:
          Statement createStatement();
          Statement可以執(zhí)行SQL語句,得到SQL查詢結(jié)果。
          (4)獲得結(jié)果集。
          Statement的執(zhí)行SQL語句方法:
          ResultSet executeQuery(String sql):執(zhí)行select語句
          int executeUpdate(String sql):執(zhí)行更新語句,如insert,delete,update.
          (5)檢索查詢結(jié)果。
          ResultSet的方法:
          boolean next():沒有行時返回false;
          String getString(String columnName):返回列名對應的值。
          posted @ 2007-07-01 16:09 和田雨 閱讀(7757) | 評論 (3)編輯 收藏

          僅列出標題
          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 
          主站蜘蛛池模板: 天津市| 松原市| 桦川县| 会东县| 阳春市| 黄山市| 鸡西市| 万州区| 罗源县| 阿勒泰市| 邢台市| 麦盖提县| 延长县| 买车| 常熟市| 滁州市| 邓州市| 石景山区| 冕宁县| 南郑县| 若尔盖县| 剑川县| 晋宁县| 长乐市| 鸡泽县| 太康县| 银川市| 临沧市| 肥城市| 缙云县| 图木舒克市| 治多县| 宝丰县| 芒康县| 康保县| 常州市| 渑池县| 旺苍县| 会泽县| 定日县| 蒙自县|