基于OpenLayers的WebGIS程序二次开发实例教程
35225 人在学
在进行Web开发的过程中相信大家都会遇到过JSP页码出现乱码的情况,面对这些乱码我们有没有快速简便的方法来处理它们呢?为此本次的讲解课课家笔者主要为大家讲解如何处理在进行web开发遇到乱码时处理的方法和步骤。
根据以往的经验总结,笔者得出JSP编程中网页显示出现乱码的情况基本上可以归为以下五种:
①JSP页面显示乱码。
②Servlet接收Form/Request传递的参数时显示为乱码
③JSP接收Form/Request传递的参数时显示为乱码
④用<jsp:forwardpage="catalog2.html"></jsp:forward>时页面显示乱码
⑤数据库存取的时候产生乱码。
下面笔者就逐个为大家给出相对应的解决方法:
◎JSP页面显示乱码
对于JSP页面显示乱码,下面笔者给出两种解决办法:
①在页面的开头加上:<%@pagelanguage="java"contentType="text/html;charset=GBK"pageEncoding="GBK"%>
PS:有时候若是我们不在页面开头加上这句,则页面中无法保存中文字符并提示:中文字符在不能被iso-8859-1字符集mapped。之所以出现这种情况主要由于默认情况下JSP是用iso-8859-1来编码的,解决办法是我们可以在Window->Preferences->General->ContentType选项下,在右边的窗口选择Text->Jsp,然后在下面的DefaultEncoding由默认的iso-8859-1改为GBK,点击update就可以解决了。但是这种方式会带来一个问题:由于这一句在其他文件include该文件的时候不能被继承,所以include它的文件也需要在文件开头加上这句话,此时如果用的是pageEncoding="gbk"则会出现问题,类似于org.apache.jasper.JasperException:/top.jsp(1,1)Pagedirective:illegaltohavemultipleoccurrencesofcontentTypewithdifferentvalues(old:text/html;charset=GBK,new:text/html;charset=gbk).。另外如果两个文件一个用的是gbk,一个用的是gb2312也会出现问题。
②在项目的web.XML中添加以下片段:
<jsp-config>
<jsp-property-group>
<description>
SpecialpropertygroupforJSPConfigurationJSPexample.
</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>GBK</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>
</jsp-property-group>
<jsp-property-group>
<description>
SpecialpropertygroupforJSPConfigurationJSPexample.
</description>
<display-name>JSPConfiguration</display-name>
<url-pattern>*.html</url-pattern>
<el-ignored>true</el-ignored>
<page-encoding>GBK</page-encoding>
<scripting-invalid>false</scripting-invalid>
<include-prelude></include-prelude>
<include-coda></include-coda>
</jsp-property-group>
</jsp-config>
◎Servlet接收Form/Request传递的参数时显示为乱码
同样面对Servlet接收Form/Request传递的参数时显示为乱码的情况,笔者也给大家提供两种解决办法。
①在用到request方法的前面加上这条语句:request.setCharacterEncoding("GBK");
同样这也会由于页面设置中GbK或gB2312大小写不同或者采用不同的汉语字符集而发生错误。
②添加一个名为SetCharacterEncodingFilter的filter。filter的源文件为(参见apach安装目录下\\webapps\\jsp-examples\\WEB-INF\\classes\\filters中的SetCharacterEncodingFilter.java文件):
packagecom.filters;importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.UnavailableException;
publicclassSetCharacterEncodingFilterimplementsFilter{
protectedStringencoding=null;
protectedFilterConfigfilterConfig=null;
protectedbooleanignore=true;
publicvoiddestroy(){
this.encoding=null;
this.filterConfig=null;
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)
throwsIOException,ServletException{
//Conditionallyselectandsetthecharacterencodingtobeused
if(ignore||(request.getCharacterEncoding()==null)){
Stringencoding=selectEncoding(request);
if(encoding!=null)
request.setCharacterEncoding(encoding);
}
//Passcontrolontothenextfilter
chain.doFilter(request,response);
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
Stringvalue=filterConfig.getInitParameter("ignore");
if(value==null)
this.ignore=true;
elseif(value.equalsIgnoreCase("true"))
this.ignore=true;
elseif(value.equalsIgnoreCase("yes"))
this.ignore=true;
else
this.ignore=false;
}
protectedStringselectEncoding(ServletRequestrequest){
return(this.encoding);
}
}
同时我们在web.xml中添加一下片段:
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>com.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
◎JSP接收Form/Request传递的参数时显示为乱码
若是我们按照第二种乱码的解决方式修改了web.xml并添加了filter之后,有时候我们会发现Sevlet接收Form/Request传递的参数可以正常显示了,但是jsp页面接受Form/Request传递的参数却仍然显示为乱码。举个例子,笔者在用Form发送信息的页面采用了这样的html:
<formaction="getParam.jsp">
姓名<inputtype="text"name="UserName"><br>
选出你喜欢吃的水果:
<inputtype="checkbox"name="checkbox1"value="苹果">苹果
<inputtype="checkbox"name="checkbox1"value="西瓜">西瓜
<inputtype="checkbox"name="checkbox1"value="桃子">桃子
<inputtype="checkbox"name="checkbox1"value="葡萄">葡萄
<inputtype="submit"value="提交">
</form>
通过观察我们可得知原因在于没有指定form的method属性,Form的默认mothod属性为get,而get是通过在发送请求的url后面加“?”,然后再加参数和值来传递数据的(编码格式为ASCII)。这就要求我们在传递的数据中有非ASCII字符或是超过了100个字符且使用到method="post",否则就会出现乱码。所以具体的解决方式为:第二种乱码的解决方式+在发送页面的Form中指定method为post。
◎用<jsp:forwardpage="catalog2.html"></jsp:forward>时页面显示乱码
这个乱码产生的原因和其他几个乱码的产生原因不同,它的原因在于我们用eclipse编辑要forward的html或者jsp文件时,采用的编码是可以产生中文乱码的编码而不是GBK或者GB2312,所以解决方式就是把eclipse编辑器的编码方式改为GBK或者GB2312就可以了。
◎数据库存取的时候产生乱码的解决方式
我们知道在写数据库时要保正数据库的编码与其它一致:在系统盘Windows目录下的my.ini文件,在文件中插入一行default-character-set=GBK。另外关于如何创建一个基于中文编码的数据库,下面笔者给大家介绍一下在DOS下创建中文编码数据库的方法:在进入数据库的时候用MySQL--default-character-set=gbk-uroot-p这句话进入mysql,然后就可以创建基于中文编码的数据库了,比如:createdatabaseadmin;。
需要大家注意的一点是,用连接数据库的时候读出的数据也可能是乱码,其解决方法为在我们建立数据库连接的时候把URL设置成下面这个样子就可以了:URL=jdbc:mysql://localhost:3306/my_database?useUnicode=true&characterEncoding=GBK。最后我们把各种地方的编码统一起来,所在的乱码问题就都解决了。
本次的web开发学堂之解决JSP页面乱码的讲解到此就暂告一段落了,如果以后有什么相关的内容进行补充或者修改的话,笔者会继续在此进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习web开发能够起到一定的帮助作用!