??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
一、初U解x?/STRONG>
通过一番检索后Q许多h采用了如下办法,首先对取得字W串按照 iso8859-1 q行解码转换Q然后再按照 gb2312 q行~码Q最后得到正的内容。示例代码如下:
String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");
具体的原因是因ؓ国人在?tomcat 旉认?iso8859-1 q行~码造成的?BR>
然而,在我们的 servlet ?jsp 面中有大量的参数需要进行传递,q样转换的话会带来大量的转换代码Q非怸ѝ?BR>
二、入门解决Ҏ
后来Q大家开始写一个过滤器Q在取得客户端传q来的参C前,通过qo器首先将取得的参数编码设定ؓ gb2312 Q然后就可以直接使用 getParameter 取得正确的参C。这个过滤器?tomcat 的示例代?
jsp-examples 中有详细的用示? 其中qo器在 web.xml 中的讑֮如下Q示例中使用的是日文的编码,我们只要修改?gb2312 卛_
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>EUC_JP</param-value>
</init-param>
</filter>
qo器的代码如下Q?BR>public class SetCharacterEncodingFilter implements Filter {
// ~码的字W串
protected String encoding = null;
// qo器的配置
protected FilterConfig filterConfig = null;
// 是否忽略客户端的~码
protected boolean ignore = true;
// 销毁过滤器
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
// qoҎ
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// 如果使用qo器,忽略客户端的~码Q那么用通过qo器设定编?BR> if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
// 传送给下一个过滤器
chain.doFilter(request, response);
}
// 初始化过滤器
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
// q回qo器设定的~码
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
然而在 tomcat5 中,即使用qo器,仍然可能取得qQ原因何在呢Q?BR>
三、高U解x?/STRONG>
q是因ؓQ?FONT face="Courier New">?tomcat4 ?tomcat5 中对参数的处理是不一LQ在 tomcat4 ?get ?post 的编码是一LQ所以只要在qo器中通过 request.setCharacterEncoding 讑֮一ơ就可以解决 get ?post 的问题。然而,?tomcat5 中,get ?post 的处理是分开q行?/FONT>
?tomcat 5 中,Z解决~码问题Qtomcat 的作者作了很多努力,具体表现为在 tomcat 的配|文?server.xml 中对 Connector 元素增加了如下的配置参数Q专门用来对~码q行直接的配|?BR>
URIEncoding 用来讑֮通过 URI 传递的内容使用的编码,tomcat 用这里指定的~码对客L传送的内容q行~码?BR>
什么是 URI 呢?
java doc 的说明中如下说明QURI 是统一资源标识W?/I>Q?URL 是统一资源定位W?/I>。因此,W统地说Q每?URL 都是 URIQ但不一定每?URI 都是 URL。这是因?URI q包括一个子c,即统一资源名称 (URN)Q它命名资源但不指定如何定位资源?BR>
也就是说Q?FONT style="BACKGROUND-COLOR: #ffff00">我们通过 get Ҏ提交的参数实际上都是通过 uri 提交的,都由q个参数理Q如果没有设定这个参敎ͼ?tomcat 用默认的 iso8859-1 对客L的内容进行编码?BR>
useBodyEncodingForURI 使用?Body 一L~码来处?URI, q个讑֮是ؓ了与 tomcat4保持兼容Q原来在 tomcat4 ?tomcat5 中队参数的处理是不一LQ在 tomcat4 ?get ?post 的编码是一LQ所以只要在qo器中通过 request.setCharacterEncoding 讑֮一ơ就可以解决 get ?post 的问题。然而,?tomcat5 中,get ?post 的处理是分开q行的,?get 的处理通过 前面?URIEncoding q行处理Q对 post 的内容依焉过 request.setCharacterEncoding 处理Qؓ了保持兼容,有了这个设定?BR>
?useBodyEncodingForURI 讑֮为真后,可以通过 request.setCharacterEncoding 直接解决 get ?post 中的q问题?BR>
q样Q我们可以通过?server.xml 中设?URIEncoding 来解?get Ҏ中的参数问题Q用过滤器来解?post Ҏ中的问题?BR>
或者也可以通过?server.xml 中设?useBodyEncodingForURI ?true Q配合过滤器来解决编码的问题?BR>
在这里,我强烈徏议在|站的创作过E中Q全E?utf-8 ~码来彻底解决ؕ码问题?BR>
具体操作如下Q?BR>1、页面内容?utf-8 格式保存Q在面中加?<mete http-equiv="contentType" content="text/html;charst=utf-8">
2、服务器端的 server.xml 中设?useBodyEncodingForURI = true
3、用过滤器Q过滤器讑֮~码?utf-8
ResultSet
Ҏ | 描述 |
registerDriver(Driver driver) | ?/span> DriverManager 中注?/span> JDBC 驱动E序 |
getConnection(String url,String user,String pwd) | 建立和数据库的连接,q回 Connection 对象 |
setLoginTimeOut(int seconds) | 讑֮{待数据库连接的最长时?/span> |
setLogWriter(PrintWriter out) | 讑֮输入数据库日至的 PrintWriter 对象 |
Ҏ | 描述 |
getMetaData() | q回数据库的 MetaData 数据?/span> MetaData 数据包含了数据库的相关信息,例如当前数据库连接的用户名、用的 JDBC 驱动E序、数据库允许的最大连接数、数据库的版本等{?/span> |
createStatement() | 创徏q返?/span> Statement 对象 |
PrepareStatement(String sql) | 创徏q返?/span> prepareStatement 对象 |
Ҏ | 描述 |
setAutoCommit(boolen autoCommit) | 讄是否自动提交事务Q默认ؓ自动提交 ?/span> |
commit() | 提交事务 |
rollback() | 撤销事务 |
try{
conn.SetautoCommit(false);
stmt = conn.createstatement();
stmt.executeUpdate(“delete form table1 where col1=1?; stmt.eecuteUpdate(“delete from table2 where col2=1?;
conn.comm.it();
}catch(Exception e){
e.printStackTrace;
try{
conn.rollback();
} catch(Exception e1){
e1.printStackTrace;
}
}
|
<%@ page import=”java.util.*?gt;
<%@ page import=”java.sql.*?gt;
<%
try{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//
加蝲
oracle
驱动E序
Class.forName(“oracle.jdbc.driver.OracleDriver.?;
//
注册
oracle
驱动E序
DriverManager.regidterDriver(new oracle.jdbc.driver.OracleDriver());
//
建立数据库连?/span>
conn=DriverManager.getConnection(“jdbc:oracle:thin:@your db ip:your db port:sid?dbuser,dbpassword);
stmt = conn.createStatement();
rs = stmt.executeQuery(“select * from tablename?;
while(rs.next){
out.print(rs.getstring(“colname?);
}
}catch(Exception e){
}
finally{
rs.close();
stmt.close();
conn.close();
}
%>
|
<Resource name="jdbc/ JNDI
名字
"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/JNDI
名字
">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>
用户?/span>
</value>
</parameter>
<parameter>
<name>password</name>
<value>
密码
</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@ip:
端口
:sid </value>
</parameter>
</ResourceParams>
|
属?/span> | 描述 |
name | 指定 Resource ?/span> JNDI 的名?/span> |
auth | 指定理 Resource ?/span> Manager Q由两个可选| Container ?/span> Application ?/span> Container 表示由容器来创徏和管?/span> Resource Q?/span> Application 表示?/span> WEB 应用来创建和理 Resource 。如果在 web application deployment descriptor 中?/span> <resource-ref> Q这个属性是必需的,如果使用 <resource-env-ref> Q这个属性是可选的?/span> |
type | 指定 Resource 所属的 java cd |
属?/span> | 描述 |
name | 指定 ResourceParams ?/span> JNDI 的名字,必须?/span> Resource ?/span> name 保持一?/span> |
factory | 指定生成 DataSource 对象?/span> factory 的类?/span> |
maxActive | 指定数据库连接池中处于活动状态的数据库连接最大数目, 0 表示不受限制 |
maxIdle | 指定数据库连接池?/span> 处于 I闲状态的数据库连接的最大数目, 0 表示不受限制 |
maxWait | 指定数据库连接池中的数据库连接处于空闲状态的最长时_单位为毫U)Q超q这一事gQ将会抛出异常?/span> -1 表示可以无限期等待?/span> |
username | 指定q接数据库的用户?/span> |
password | 指定q接数据库的密码 |
driverClassName | 指定q接数据库的 JDBC 驱动E序 |
url | 指定q接数据库的 URL |
<resource-ref>
<descryiption>DB Connection</descryiption>
<res-ref-name>jdbc/JNDI
名字
</ res-ref-name>
<res-type>javax.sql.DataSource </ res- type>
<res-auth>Container </ res- auth>
</resource-ref>
|
属?/span> | 描述 |
description | Ҏ引用的资源的说明 |
res-ref-name | 指定所引用资源?/span> JNDI 名字Q与 <Resource> 元素中的 name 属性保持一?/span> |
res-type | 指定所引用资源的类名字Q与 <Resource> 元素中的 type 属性保持一?/span> |
res-auth | 指定所引用资源?/span> Manager Q与 <Resource> 元素中的 auth 属性保持一?/span> |
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource db = (DataSource)envContext.lookup("jdbc/javablogorl");
// javablogorl
?/span>
<Resource>
元素?/span>
name
属性的?/span>
Connection conn = db.getConnection( );
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM blog_systemadmin");
while(rs.next()){
out.print(rs.getString("admin_name")+" ");
out.print(rs.getString("admin_password")+"<br>");
}
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
|
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=674822