下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

web开发学堂之解决JSP页面乱码

作者:课课家     来源: http://www.kokojia.com点击数:1209发布时间: 2019-03-14 18:59:55

标签: web开发JSP乱码解决

Web开发

  在进行Web开发的过程中相信大家都会遇到过JSP页码出现乱码的情况,面对这些乱码我们有没有快速简便的方法来处理它们呢?为此本次的讲解课课家笔者主要为大家讲解如何处理在进行web开发遇到乱码时处理的方法和步骤。

web开发学堂之解决JSP页面乱码_web开发_JSP_乱码解决_课课家

  根据以往的经验总结,笔者得出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开发能够起到一定的帮助作用!

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程