Java Tools

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

          #

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

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

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

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

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

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

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

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

          Servlet過(guò)期負(fù)責(zé)過(guò)濾的Web組件可以是Servlet、JSP或者HTML文件。 
          ***************************************************************************************


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


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


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


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

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

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

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


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


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


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

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

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

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


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

          B.在web.xml中配置Servlet和Servlet過(guò)濾器,應(yīng)該先聲明過(guò)濾器元素,再聲明Servlet元素


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

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

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

          數(shù) 據(jù) 庫(kù)  說(shuō)      明 
          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)容來(lá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并不是作為一項(xiàng)服務(wù)運(yùn)行,所以u(píng)rl的方法對(duì)他不適用。access可以通過(guò)odbc,也可以通過(guò)服務(wù)器映射路徑的形式找到.mdb文件,參見(jiàn)http://rmijdbc.objectweb.org/Access/access.html
          JDBC API的使用方法
          (1)登記并加載JDBC驅(qū)動(dòng)程序;
          兩種方法:
          Class.forName(String drivername);
          DriverManager.registerDriver(Driver driver)
          (2)建立與SQL數(shù)據(jù)庫(kù)的連接;
          DriverManager的getConnection()方法:
          Connection getConnection(String url):url表示數(shù)據(jù)庫(kù)地址字符串;
          Connection getConnection(String url,String user,String pwd)
          Connection getConnection(String url,Properties info)
          (3)傳送一個(gè)SQL查詢;
          Connection的createStatement()方法:
          Statement createStatement();
          Statement可以執(zhí)行SQL語(yǔ)句,得到SQL查詢結(jié)果。
          (4)獲得結(jié)果集。
          Statement的執(zhí)行SQL語(yǔ)句方法:
          ResultSet executeQuery(String sql):執(zhí)行select語(yǔ)句
          int executeUpdate(String sql):執(zhí)行更新語(yǔ)句,如insert,delete,update.
          (5)檢索查詢結(jié)果。
          ResultSet的方法:
          boolean next():沒(méi)有行時(shí)返回false;
          String getString(String columnName):返回列名對(duì)應(yīng)的值。
          posted @ 2007-07-01 16:09 和田雨 閱讀(7765) | 評(píng)論 (3)編輯 收藏

          僅列出標(biāo)題
          共9頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 8 9 
          主站蜘蛛池模板: 贵溪市| 上饶县| 东平县| 文水县| 华池县| 天气| 恩平市| 临海市| 卫辉市| 绵阳市| 清徐县| 南靖县| 图们市| 莱西市| 永泰县| 五原县| 班玛县| 江达县| 昆明市| 南投市| 措勤县| 长岛县| 新绛县| 岗巴县| 淄博市| 革吉县| 乌拉特中旗| 太白县| 庆安县| 尼勒克县| 崇左市| 玛纳斯县| 宜兴市| 田东县| 万全县| 海淀区| 松原市| 新沂市| 双鸭山市| 乌拉特中旗| 怀集县|