﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-飞鸟JAVA-文章分类-JSP</title><link>http://www.blogjava.net/yczz/category/11243.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:14:38 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:14:38 GMT</pubDate><ttl>60</ttl><item><title>JSP中文解决方法   </title><link>http://www.blogjava.net/yczz/articles/47178.html</link><dc:creator>飞鸟</dc:creator><author>飞鸟</author><pubDate>Sat, 20 May 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/yczz/articles/47178.html</guid><wfw:comment>http://www.blogjava.net/yczz/comments/47178.html</wfw:comment><comments>http://www.blogjava.net/yczz/articles/47178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yczz/comments/commentRss/47178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yczz/services/trackbacks/47178.html</trackback:ping><description><![CDATA[中文解决方法   <br />    <br />  一、Tomcat本身的Get与Post中文处理方法       <br />  1、从webapps\jsp-examples\WEB-INF\classes\下拷贝filters目录到YourAPP的classes目录下   <br />  2、设置Tomcat的Server.xml配置文件在&lt;Connector中增加URIEncoding="GBK"成如下   <br />          &lt;Connector   port="8080"   maxThreads="150"   minSpareThreads="25"   maxSpareThreads="75"   <br />                                enableLookups="false"   redirectPort="8443"   acceptCount="100"   <br />                                debug="0"   connectionTimeout="20000"     <br />                                disableUploadTimeout="true"   <br />                                URIEncoding="GBK"/&gt;   <br />  3、在应用程序的配置文件web.xml中&lt;web-app&gt;增加   <br />          &lt;filter&gt;   <br />                  &lt;filter-name&gt;Set   Character   Encoding&lt;/filter-name&gt;   <br />                  &lt;filter-class&gt;filters.SetCharacterEncodingFilter&lt;/filter-class&gt;   <br />                  &lt;init-param&gt;   <br />                          &lt;param-name&gt;encoding&lt;/param-name&gt;   <br />                          &lt;param-value&gt;GBK&lt;/param-value&gt;   <br />                  &lt;/init-param&gt;   <br />          &lt;/filter&gt;   <br />            <br />          &lt;filter-mapping&gt;   <br />                  &lt;filter-name&gt;Set   Character   Encoding&lt;/filter-name&gt;   <br />                  &lt;url-pattern&gt;/*&lt;/url-pattern&gt;   <br />          &lt;/filter-mapping&gt;   <br />    <br />  二、代码修改   <br />  1、JSP文件的修改   <br />  在首句加上：   <br />  &lt;%@   page   contentType="text/html;charset=GBK"%&gt;   <br />  以显示中文   <br />    <br />  2、new   String((request.getParameter("caseData")).getBytes("ISO-8859-1"),"GBK");   <br />    <br />  JDBC源：   <br />  jdbc:mysql://localhost/Test?autoReconnect=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=GB2312 <br /><img src ="http://www.blogjava.net/yczz/aggbug/47178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yczz/" target="_blank">飞鸟</a> 2006-05-20 15:52 <a href="http://www.blogjava.net/yczz/articles/47178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置Tomcat的连接池</title><link>http://www.blogjava.net/yczz/articles/46791.html</link><dc:creator>飞鸟</dc:creator><author>飞鸟</author><pubDate>Thu, 18 May 2006 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/yczz/articles/46791.html</guid><wfw:comment>http://www.blogjava.net/yczz/comments/46791.html</wfw:comment><comments>http://www.blogjava.net/yczz/articles/46791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yczz/comments/commentRss/46791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yczz/services/trackbacks/46791.html</trackback:ping><description><![CDATA[配置Tomcat 4.1.29的连接池<br />Tomcat 4.1.29是目前的最高稳定版本，下面介绍一下它的连接池配置方法。<br />1)    连接池配置(Database Connection Pool (DBCP) Configurations)<br />DBCP使用的是Jakarta-Commons Database Connection Pool 要使用连接池需要如下的组件即jar文件。<br />Jakarta-Commons DBCP 1.1 对应commons-dbcp-1.1.jar。<br />Jakarta-Commons Collections 2.0 对应commons-collections.jar。<br />Jakarta-Commons Pool 1.1 对应commons-pool-1.1.jar。<br />这三个jar文件要与你的JDBC驱动程序一起放到【TOMCAT_HOME】\common\lib目录下以便让tomcat和你的web应用都能够找到。<br />注：这三个jar文件是默认存在与【TOMCAT_HOME】\common\lib下的。<br />需要注意的地方：第三方的驱动程序或者其他类只能以*.jar的形式放到Tomcat的common\lib目录中,因为Tomcat只把*.jar文件加到CLASSPATH中。<br />不要把上诉三个文件放到WEB-INF/lib或者其他地方因为这样会引起混淆。<br /><br />2)    通过配置阻止连接池漏洞<br />数据库连接池创建和管理连接池中建立好的数据库连接，循环使用这些连接以得到更好的效率。这样比始终为一个用户保持一个连接和为用户的请求频繁的建立和销毁数据库连接要高效的多。<br />这样就有一个问题出现了，一个Web应用程序必须显示的释放ResultSet，Statement和Connection。如果在关闭这些资源的过程中失败将导致这些资源永远不在可用，这就是所谓的连接池漏洞。这个漏洞最终会导致连接池中所有的连接不可用。<br />通过配置Jakarta Common DBCP可以跟踪和恢复那些被遗弃的数据库连接。<br />以下是一系列相关配置：<br />    通过配置DBCP数据源中的参数removeAbandoned来保证删除被遗弃的连接使其可以被重新利用。<br />为ResourceParams(见下文的数据源配置)标签添加参数removeAbandoned<br />&lt;parameter&gt;<br />&lt;name&gt;removeAbandoned&lt;/name&gt;<br />&lt;value&gt;true&lt;/value&gt;<br />&lt;/parameter&gt;<br />通过这样配置的以后当连接池中的有效连接接近用完时DBCP将试图恢复和重用被遗弃的连接。这个参数的值默认是false。<br />    通过设置removeAbandonedTimeout来设置被遗弃的连接的超时的时间，即当一个连接连接被遗弃的时间超过设置的时间时那么它会自动转换成可利用的连接。<br />    &lt;parameter&gt;<br />     &lt;name&gt;removeAbandonedTimeout&lt;/name&gt;<br />     &lt;value&gt;60&lt;/value&gt;<br />     &lt;/parameter&gt;<br />    默认的超时时间是300秒。<br />    设置logAbandoned参数，这个参数的用处我没能够理解它的意义所以提供原文供大家参考。<br />The logAbandoned parameter can be set to true if you want DBCP to log a stack trace of the code which abandoned the dB connection resources。<br />&lt;parameter&gt;<br />&lt;name&gt;logAbandoned&lt;/name&gt;<br />&lt;value&gt;true&lt;/value&gt;<br />&lt;/parameter&gt;<br />这个参数默认为false。<br /><br />3)    下面以MySQL为例演示Tomcat数据库连接池的配置<br />    MySQL的版本以及对应的JDBC驱动程序<br />MySQL 3.23.47, MySQL 3.23.47 using InnoDB, MySQL 4.0.1alpha对应的驱动为mm.mysql 2.0.14 (JDBC Driver)。<br />    在MySQL中创建供测试的数据库，表结构以及数据<br /><pre>mysql&gt; create database javatest;<br />mysql&gt; use javatest;<br />mysql&gt; create table testdata (<br />    -&gt;   id int not null auto_increment primary key,<br />    -&gt;   foo varchar(25), <br />    -&gt;   bar int);<br />    mysql&gt; insert into testdata values(null, 'hello', 12345);<br />Query OK, 1 row affected (0.00 sec)<br /><br />mysql&gt; select * from testdata;<br />+----+-------+-------+<br />| ID | FOO   | BAR   |<br />+----+-------+-------+<br />|  1 | hello | 12345 |<br />+----+-------+-------+<br />1 row in set (0.00 sec)</pre><br /><br />    要注意的是登录的mysql用户要有创建数据库的权限还有注意要设置密码我用的是root^_^。<br />    配置Tomcat的server.xml文件<br />配置【TOMCAT_HOME】\common\lib下的server.xml文件，在&lt;/host&gt;标签之前加入以下内容以添加JNDI数据源：<br /><pre>&lt;Context path="/DBTest" docBase="DBTest"<br />        debug="5" reloadable="true" crossContext="true"&gt;<br />  &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />             prefix="localhost_DBTest_log." suffix=".txt"<br />             timestamp="true"/&gt;<br />  &lt;Resource name="jdbc/TestDB"<br />               auth="Container"<br />               type="javax.sql.DataSource"/&gt;<br />  &lt;ResourceParams name="jdbc/TestDB"&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;factory&lt;/name&gt;<br />    &lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Maximum number of dB connections in pool. Make sure you<br />         configure your mysqld max_connections large enough to handle<br />         all of your db connections. Set to 0 for no limit.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;maxActive&lt;/name&gt;<br />      &lt;value&gt;100&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Maximum number of idle dB connections to retain in pool.<br />         Set to 0 for no limit.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;maxIdle&lt;/name&gt;<br />      &lt;value&gt;30&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Maximum time to wait for a dB connection to become available<br />         in ms, in this example 10 seconds. An Exception is thrown if<br />         this timeout is exceeded.  Set to -1 to wait indefinitely.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;maxWait&lt;/name&gt;<br />      &lt;value&gt;10000&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- MySQL dB username and password for dB connections  --&gt;<br />    &lt;parameter&gt;<br />     &lt;name&gt;username&lt;/name&gt;<br />     &lt;value&gt;javauser&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;parameter&gt;<br />     &lt;name&gt;password&lt;/name&gt;<br />     &lt;value&gt;javadude&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- Class name for mm.mysql JDBC driver --&gt;<br />    &lt;parameter&gt;<br />       &lt;name&gt;driverClassName&lt;/name&gt;<br />       &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;<br />    &lt;/parameter&gt;<br />    &lt;!-- The JDBC connection url for connecting to your MySQL dB.<br />         The autoReconnect=true argument to the url makes sure that the<br />         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the<br />         connection.  mysqld by default closes idle connections after 8 hours.<br />         --&gt;<br />    &lt;parameter&gt;<br />      &lt;name&gt;url&lt;/name&gt; &lt;value&gt;jdbc:mysql://localhost:3306/javatest?autoReconnect=true&lt;/value&gt;<br />    &lt;/parameter&gt;<br />  &lt;/ResourceParams&gt;<br />&lt;/Context&gt;<br />    配置Web应用程序的web.xml文件<br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />    &lt;!DOCTYPE web-app PUBLIC<br />    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />    "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />&lt;web-app&gt;<br />  &lt;description&gt;MySQL Test App&lt;/description&gt;<br />  &lt;resource-ref&gt;<br />      &lt;description&gt;DB Connection&lt;/description&gt;<br />      &lt;res-ref-name&gt;jdbc/TestDB&lt;/res-ref-name&gt;<br />      &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />      &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />  &lt;/resource-ref&gt;<br />&lt;/web-app&gt;</pre><br />    测试代码<br />测试代码包括一个JSP文件和一个Java类。代码如下：<br /><div class="codeStyle"><ol><li>&lt;html&gt; 
</li><li>  &lt;head&gt; 
</li><li>    &lt;title&gt;DB Test&lt;/title&gt; 
</li><li>  &lt;/head&gt; 
</li><li>  &lt;body&gt; 
</li><li>  &lt;% 
</li><li>    foo.DBTest tst = <b><font color="#0000ff">new</font></b> foo.DBTest(); 
</li><li>    tst.init(); 
</li><li>  %&gt; 
</li><li>  &lt;h2&gt;Results&lt;/h2&gt; 
</li><li>    Foo &lt;%= tst.getFoo() %&gt;&lt;br&gt; 
</li><li>    Bar &lt;%= tst.getBar() %&gt; 
</li><li>  &lt;/body&gt; 
</li><li>&lt;/html&gt; 
</li><li><b><font color="#0000ff">package</font></b> foo; 
</li><li></li><li><b><font color="#0000ff">import</font></b> javax.naming.*; 
</li><li><b><font color="#0000ff">import</font></b> javax.sql.*; 
</li><li><b><font color="#0000ff">import</font></b> java.sql.*; 
</li><li></li><li><b><font color="#0000ff">public</font></b> <b><font color="#0000ff">class</font></b> DBTest { 
</li><li></li><li>  <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> foo = <font color="#ff33ff">"Not Connected"</font>; 
</li><li>  <b><font color="#0000ff">int</font></b> bar = -1; 
</li><li>     
</li><li>  <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">void</font></b> init() { 
</li><li>    <b><font color="#0000ff">try</font></b>{ 
</li><li>      <b><a href="http://www.javaresearch.org/source/jdk142/javax/naming/Context.java.html" target="_blank"><font class="classLink"><u>Context</u></font></a></b> ctx = <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/javax/naming/InitialContext.java.html" target="_blank"><font class="classLink"><u>InitialContext</u></font></a></b>(); 
</li><li>      <b><font color="#0000ff">if</font></b>(ctx == <b><font color="#0000ff">null</font></b> )  
</li><li>          <b><font color="#0000ff">throw</font></b> <b><font color="#0000ff">new</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b>(<font color="#ff33ff">"Boom - No Context"</font>); 
</li><li>      <b><a href="http://www.javaresearch.org/source/jdk142/javax/sql/DataSource.java.html" target="_blank"><font class="classLink"><u>DataSource</u></font></a></b> ds =  
</li><li>            (<b><a href="http://www.javaresearch.org/source/jdk142/javax/sql/DataSource.java.html" target="_blank"><font class="classLink"><u>DataSource</u></font></a></b>)ctx.lookup( 
</li><li>               <font color="#ff33ff">"java:comp/env/jdbc/TestDB"</font>); 
</li><li>      <b><font color="#0000ff">if</font></b> (ds != <b><font color="#0000ff">null</font></b>) { 
</li><li>        <b><a href="http://www.javaresearch.org/source/jdk142/java/sql/Connection.java.html" target="_blank"><font class="classLink"><u>Connection</u></font></a></b> conn = ds.getConnection();      
</li><li>        <b><font color="#0000ff">if</font></b>(conn != <b><font color="#0000ff">null</font></b>)  { 
</li><li>            foo = <font color="#ff33ff">"Got Connection "</font>+conn.toString(); 
</li><li>            <b><a href="http://www.javaresearch.org/source/jdk142/java/sql/Statement.java.html" target="_blank"><font class="classLink"><u>Statement</u></font></a></b> stmt = conn.createStatement(); 
</li><li>            <b><a href="http://www.javaresearch.org/source/jdk142/java/sql/ResultSet.java.html" target="_blank"><font class="classLink"><u>ResultSet</u></font></a></b> rst =  
</li><li>                stmt.executeQuery( 
</li><li>                  <font color="#ff33ff">"select id, foo, bar from testdata"</font>); 
</li><li>            <b><font color="#0000ff">if</font></b>(rst.next()) { 
</li><li>               foo=rst.getString(2); 
</li><li>               bar=rst.getInt(3); 
</li><li>            } 
</li><li>            conn.close(); 
</li><li>        } 
</li><li>      } 
</li><li>    }<b><font color="#0000ff">catch</font></b>(<b><a href="http://www.javaresearch.org/source/jdk142/java/lang/Exception.java.html" target="_blank"><font class="classLink"><u>Exception</u></font></a></b> e) { 
</li><li>      e.printStackTrace(); 
</li><li>    } 
</li><li> } 
</li><li> <b><font color="#0000ff">public</font></b> <b><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink"><u>String</u></font></a></b> getFoo() { <b><font color="#0000ff">return</font></b> foo; } 
</li><li> <b><font color="#0000ff">public</font></b> <b><font color="#0000ff">int</font></b> getBar() { <b><font color="#0000ff">return</font></b> bar;} 
</li><li>} </li></ol></div><br />最后在Tomcat的webapps目录下建立DBTest然后将应用程序文件拷贝到这个目录下即可。<br />    重新启动Tomcat在浏览器上http://localhost:8080/DBTest/test.jsp即可看到结果。<br />Results<br />Foo hello<br />Bar 12345<br /><br />4)    一些常见的问题<br />    由于垃圾收集器的运行而导致连接超时<br />Tomcat是运行在JVM中的，JVM要周期性的执行GC(垃圾收集器)来清除不再被引用的Java对象。在GC运行时Tomcat将会冻结，如果在设置连接池中的连接的最大等待时间(MaxWait)小于GC的运行时间的话那么你很可能在使用数据库连接时失败。推荐将连接的超时时间设置成10到15秒。<br />注意连接的超时时间与被遗弃的连接的超时时间的区别。<br />    重复关闭连接引发的异常<br />这种情况发生在当响应一个客户的请求时从数据库连接池里取得了连接但是关闭了两次。使用连接池中的连接与使用直接与数据库建立的连接是不一样的，连接池中的连接在释放时只是将连接返回到连接池而不是释放连接的资源。Tomcat使用多线程来处理并发的请求，以下实例演示了一个在Tomcat中可以导致出错的过程：<br />请求A在线程A中运行并从连接池中得到一个连接<br />请求A关闭了这个连接<br />JVM转到线程B<br />请求B在线程B中运行并取得一个连接(这个连接是请求A刚刚返回的那个)<br />JVM转到线程A<br />请求A在finally块中又一次关闭连接(因为第一次没有设置连接引用为null)<br />JVM转到线程B<br />请求B试图使用得到的连接但连接已经被请求A返回到了连接池中所以请求B的操作失败<br />以下是一段公认的恰当的代码可以避免以上的问题<br /><div class="codeStyle"><ol><li>  <font color="#ff0000">Connection</font> conn = <b><font color="#0000ff">null</font></b>; 
</li><li>  <font color="#ff0000">Statement</font> stmt = <b><font color="#0000ff">null</font></b>;  <i><font color="#339900">// Or PreparedStatement if needed</font></i></li><li>  <font color="#ff0000">ResultSet</font> rs = <b><font color="#0000ff">null</font></b>; 
</li><li>  <b><font color="#0000ff">try</font></b> { 
</li><li>    conn = ... get connection from connection pool ... 
</li><li>    stmt = conn.createStatement(<font color="#ff33ff">"select ..."</font>); 
</li><li>    rs = stmt.executeQuery(); 
</li><li>    ... iterate through the result set ... 
</li><li>    rs.close(); 
</li><li>    rs = <b><font color="#0000ff">null</font></b>; 
</li><li>    stmt.close(); 
</li><li>    stmt = <b><font color="#0000ff">null</font></b>; 
</li><li>    conn.close(); <i><font color="#339900">// Return to connection pool</font></i></li><li>    conn = <b><font color="#0000ff">null</font></b>;  <i><font color="#339900">// Make sure we don't close it twice</font></i></li><li>  } <b><font color="#0000ff">catch</font></b> (<font color="#ff0000">SQLException</font> e) { 
</li><li>    ... deal with errors ... 
</li><li>  } <b><font color="#0000ff">finally</font></b> { 
</li><li>    <i><font color="#339900">// Always make sure result sets and statements are closed,</font></i></li><li>    <i><font color="#339900">// and the connection is returned to the pool</font></i></li><li>    <b><font color="#0000ff">if</font></b> (rs != <b><font color="#0000ff">null</font></b>) { 
</li><li>      <b><font color="#0000ff">try</font></b> { rs.close(); } <b><font color="#0000ff">catch</font></b> (<font color="#ff0000">SQLException</font> e) { ; } 
</li><li>      rs = <b><font color="#0000ff">null</font></b>; 
</li><li>    } 
</li><li>    <b><font color="#0000ff">if</font></b> (stmt != <b><font color="#0000ff">null</font></b>) { 
</li><li>      <b><font color="#0000ff">try</font></b> { stmt.close(); } <b><font color="#0000ff">catch</font></b> (<font color="#ff0000">SQLException</font> e) { ; } 
</li><li>      stmt = <b><font color="#0000ff">null</font></b>; 
</li><li>    } 
</li><li>    <b><font color="#0000ff">if</font></b> (conn != <b><font color="#0000ff">null</font></b>) { 
</li><li>      <b><font color="#0000ff">try</font></b> { conn.close(); } <b><font color="#0000ff">catch</font></b> (<font color="#ff0000">SQLException</font> e) { ; } 
</li><li>      conn = <b><font color="#0000ff">null</font></b>; 
</li><li>    } 
</li><li>  } </li></ol></div><img src ="http://www.blogjava.net/yczz/aggbug/46791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yczz/" target="_blank">飞鸟</a> 2006-05-18 13:45 <a href="http://www.blogjava.net/yczz/articles/46791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>