jsp

位置:IT落伍者 >> jsp >> 浏览文章

JSP中使用request乱码问题的解决


发布日期:2018年11月08日
 
JSP中使用request乱码问题的解决

JSP显示中文有乱码怎么办用request得到的用户输入的中文怎么是乱码把汉字写到数据库怎么是乱码等等一些关于汉字乱码的问题其实这个问题很简单管它汉字不汉字还是日文还是其他的什么双字节的语言我们一律把它当作UTF看待

(一)request中的双字节文字

我们来实现在整个应用程序中使用UTF编码工作之所以选择UTF不仅仅之于上述原因我们知道java的就是基于在UTF之上的所以我们选择UTF应该没错
首先把我们的java jsp文件都用UTF编码来保存如果以前的没有用UTF保存也无所谓但是建议以后写的都用UTF来保存

并在jsp里面写:

以下是引用片段
<%@pagecontentType=text/html;charset=UTF%>而不是%@pagecontentType=text/html;charset=UTF%
然后在webxml添加下面一段

以下是引用片段
<webapp>

<filter>
<filtername>SetCharacterEncoding</filtername>
<filterclass>comredvprojectseduadminutilfiltersSetCharacterEncodingFilter</filterclass>
<initparam>
<paramname>encoding</paramname>
<paramvalue>UTF</paramvalue>
</initparam>
</filter>
<filtermapping>
<filtername>SetCharacterEncoding</filtername>
<urlpattern>/*</urlpattern>
</filtermapping>

</webapp>
其中comredvprojectseduadminutilfiltersSetCharacterEncodingFilter的代码如下 packagecomredvprojectseduadminutilfilters;
importjavaioIOException;
importjavaxservletFilter;
importjavaxservletFilterChain;
importjavaxservletFilterConfig;
importjavaxservletServletException;
importjavaxservletServletRequest;
importjavaxservletServletResponse;
importjavaxservletUnavailableException;
importjavaxservlet
importjavaxservlet

publicclassSetCharacterEncodingFilter
implementsFilter{

protectedStringencoding=null;
protectedFilterConfigfilterConfig=null;
protectedbooleanignore=true;
publicvoiddestroy(){
thisencoding=null;
thisfilterConfig=null;
}
publicvoiddoFilter(ServletRequestrequestServletResponseresponse
FilterChainchain)throwsIOExceptionServletException{
//Conditionallyselectandsetthecharacterencodingtobeused
if(ignore||(requestgetCharacterEncoding()==null)){
Stringencoding=selectEncoding(request);
if(encoding!=null){
requestsetCharacterEncoding(encoding);//
OverridesthenameofthecharacterencodingusedinthebodyofthisrequestThismethodmustbecalledpriortoreadingrequestparametersorreadinginputusinggetReader()
}
}
//Passcontrolontothenextfilter
chaindoFilter(requestresponse);
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
thisfilterConfig=filterConfig;
thisencoding=filterConfiggetInitParameter(encoding);
Stringvalue=filterConfiggetInitParameter(ignore);
if(value==null){
thisignore=true;
}
elseif(valueequalsIgnoreCase(true)){
thisignore=true;
}
elseif(valueequalsIgnoreCase(yes)){
thisignore=true;
}
else{
thisignore=false;
}
}
protectedStringselectEncoding(ServletRequestrequest){
return(thisencoding);
}
}

这样我们的request请求就是以UTT编码的在JSP程序中就可以使用requestgetParameter(myKey)来直接得到UTF编码的字符串了而不需要像这样new String(requestgetParameter(myKey)getBytes(ISO) GBK)来解决那些乱码了

(二)数据库处理的双字节文字

另外一个就是写入数据库的问题我们知道我们在使用mysql的时候可以改用这样的url来处理汉字编码问题jdbc:mysql://localhost:/upas?useUnicode=true& characterEncoding=gb那么对于那些我们无法像mysql这样解决的怎么办呢?难道我们每次都这样写吗(wwwliancom)

importjavasql*;
ClassforName(orggjtmmmysqlDriver);
Connectioncon=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
con=DriverManagergetConnection(jdbc:mysql://localhost:/testroot);
pstmt=conprepareStatement(SELECTffFROMtblWHEREf=?ANDf=?);
pstmtsetString(newString(fgetBytes(GBK)ISO);
pstmtsetString(newString(fgetBytes(GBK)ISO);
rs=pstmtexecuteQuery();
Stringff;
while(rsnext()){
f=newString(rsgetString()getBytes(ISO)GBK);
f=newString(rsgetString()getBytes(ISO)GBK);
}
}
finally{
//closeresouces

}

其实我们完全可以这样写

importjavasql*;
importcomredvsqlencoding*;
ClassforName(orggjtmmmysqlDriver);
Connectioncon=null;
PreparedStatementpstmt=null;
ResultSetrs=null;
try{
con=DriverManagergetConnection(jdbc:mysql://localhost:/testroot);
//接管数据库连接实例
booleancoding=true;
EncodingConnectioncodingConnection=newEncodingConnection(concodingISOGBK);
//获得接管后的数据库连接实例以后直接使用con已经是经过EncodingConnection重新包装过的实例
con=codingConnectiongetConnection();
pstmt=conprepareStatement(SELECTffFROMtblWHEREf=?ANDf=?);
pstmtsetString(f);
pstmtsetString(f);
rs=pstmtexecuteQuery();
Stringff;
while(rsnext()){
f=rsgetString();
f=rsgetString();
}
}
finally{
//closeresouces

}

看看怎么样我们只需要在获取数据库连接的地方稍微修改一下甚至我们可以把它当作参数保存在 properties里面改变coding的布尔值来设定是否使用自动编码转换常常我们可以使用一个Database类来封装获取数据库连接的那段 getConnection以便于我们可以从 javaxsqlDataSource中获取到数据库连接这个时候我们仅仅需要修改我们的Database类即可而不用去搜索所有使用了 rssetString() rsgetString()的地方去加入我们的编码转换代码了

上一篇:JSP如何连接MYSQL数据库代码示例

下一篇:JSP指令元素(page指令/include指令/taglib指令)复习整理