知识大全 Struts从零开始二、解决中文乱码的问题实例

Posted 中文

篇首语:缥帙各舒散,前后互相逾。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Struts从零开始二、解决中文乱码的问题实例相关的知识,希望对你有一定的参考价值。

Struts从零开始二、解决中文乱码的问题实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在进行web应用程序开发的过程中 中文问题经常困扰著很多程序员 因此 在接下来的两个课程的学习中 我将根据实践经验来谈一下web应用中的中文问题的解决方法 让大家不再为此而头痛

  我们就前那个登录验证的例子 进行进阶 处理中文乱码问题 前面例子中 只要用户名和密码都是 才返回成功的页面 为了处理中文 我们判断只有用户名是张三才登陆成功

  一 程序进阶

  既然是中文乱码处理 页面的用户输入就是中文了 相应的action的if处理也要变成: if (username equals( 张三 ) &&userpass equals( ))

  效果图

  

  我们以结果为导向 首先大家先看看要完成的效果图 对接下来要做的事情有个清晰的认识

   如图键入 中文

  显示结果如下图

  

  为什么会到错误页面呢?我们明明都写正确了呀 是的 没有错误 这是什么原因呢?

  请看下图

  

  我们打印才发现原来username的值传到action中 成了乱码 这主要由于客户端和服务器端采用了不同的字符集 中文乱码我们没有处理

  二 解决办法

  A 直接转编码

  我们新建一个包 命名为util 在包下新建一个类文件 命名为EncodingUtil 类的功能就是提供一个字符集转换的一个方法 具体代码如下所示

  package util;

  public class Encoding

  public static String isToGB(String src)

  String strRet = null;

  try

  strRet = new String(src getBytes( ISO_ _ ) GBK );

   catch (Exception e)

  e printStackTrace();

  

  return strRet;

  

  

  小结 这办法虽然能解决中文乱码 但是每次还得调用 是不是很不方便呢?如果忘记了调用这个方法 那程序又乱码了 维护起来很困难 下面我们看另一种解决方案

  B 继承RequestProcessor类

  RequestProcessor类处理ActionServlet接收到的所有请求 根据它的处理方式 可将每个请求分解为多个小任务 分别由不同的方法执行 这就允许针对请求的各个单独部分自定义处理

  RequestProcessor类的部分方法如下

  processPath() 获取客户端请求的路径URI

  processMapping() 根据请求URI获取所需的映射信息

  processRoles() 检查用户的角色是否允许他访问请求的资源

  processActionForm() 新建一个Form Bean或从请求会话中检索Form Bean

  processForward() 处理元素forward以匹配当前的请求路径

  processValidate() 调用Form Bean的validate()方法

  processPreprocess() 告诉请求处理器调用此方法后 是否应继续处理请求

  processLocale() 为请求选择一个语言环境

  processActionCreate() 实例化当前ActionMapping指定的类的实例

  processActionPerform() 将调用action的perform()或execute()方法

  呵呵 发没发现RequestProcess类的所有方法都有一个前缀proess 接着往下看吧

  RequestProcessor在action之前 所以我们应着手RequestProcessor 要开发自己的RequestProcessor类 步骤如下

  ( ) 创建一个继承 apache struts action RequestProcessor的类 在改类中显示定义一个无参 方法体为空的构造器

  ( ) 重写所需的方法 加入我们的功能

  具体代码如下所示

  package servlets;

  import java io UnsupportedEncodingException;

  import javax servlet HttpServletRequest;

  import javax servlet HttpServletResponse;

  import apache struts action RequestProcessor;

  public class EncodingHandler extends RequestProcessor

  public boolean processPreprocess(HttpServletRequest servletRequest

  HttpServletResponse serveltResponse)

  try

  servletRequest setCharacterEncoding( GBK );

  System out println( 请求被处理 );

   catch (UnsupportedEncodingException ex)

  ex printStackTrace();

  

  return true;

  

  

  ( ) 修改配置文件sturts config xml 在其中加入一个名为的元素 用以指定我们定制的RequestProcessor类

  <?xml version= encoding= UTF ?>

  <!DOCTYPE struts config PUBLIC //Apache Sofare Foundation//DTD Struts Configuration //EN config_ _ dtd >

  <struts config>

  <form beans>

  <form bean name= loginActionForm type= formbeans LoginActionForm />

  </form beans>

  <action mappings>

  <action

  path= /login

  name= loginActionForm

  scope= request

  type= actions LoginAction >

  <forward name= success path= /success jsp />

  <forward name= error path= /wrong jsp />

  </action>

  </action mappings>

  <controller processorClass= servlets EncodingHandler />

  </struts config>

  上面就是我们自己的定义的RequestProcessor类 使用标签类定义

  如图

  小结 这样做呢?问题是解决了 每一个请求先经过这个方法 并转换了字符集再交给action做处理 这样我们不用在操心中文乱码 但RequestProcessor是与struts耦合在一块儿 如果不用struts框架 我们又该如何处理中文问题呢?是否又更好的办法呢?那就接着跟我往下看吧

  C Filter来解决中文问题

  Filter 是不是你脑子里闪现了这个词呢?下面就来看看如何用它来改写我们上一章节的例子吧!

  ( ) 首先在工程中新建一包 命名为filter 在下面新建一类文件 命名为EncodingServlet 并继承HttpServlet 实现Filter接口 注意并实现接口的方法

  在Servlet中filter起著过滤器的作用 当一个请求发送到服务器的时候 需要把请求首先交给filter来处理 然后交给action做处理 EncodingServlet负责处理请求的字符集 在此就起这么个功能 具体代码请依照如下所示

  package servlets;

  import javax servlet Filter;

  import javax servlet FilterChain;

  import javax servlet FilterConfig;

  import javax servlet ServletException;

  import javax servlet ServletRequest;

  import javax servlet ServletResponse;

  import javax servlet HttpServlet;

  public class EncodingServlet extends HttpServlet implements Filter

  private static final long serialVersionUID = L;

  public void doFilter(ServletRequest servletRequest

  ServletResponse serveltResponse FilterChain filterChain)

  try

  servletRequest setCharacterEncoding( GBK );

  filterChain doFilter(servletRequest serveltResponse);

   catch (Exception ex)

  

  

  public void init(FilterConfig arg ) throws ServletException

  

  

  ( ) 修改web xml 加入我们的filter

  EncodingServlet

  servlets EncodingServlet

  EncodingServlet

  /*

  小结 这个中文乱码处理用了fileter 而且适用与任何场合 比较实用

cha138/Article/program/Java/ky/201311/28691

相关参考

知识大全 Struts从零开始二、解决中文乱码的问题实例[2]

Struts从零开始二、解决中文乱码的问题实例[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Struts从零开始二、解决中文乱码的问题实例[4]

Struts从零开始二、解决中文乱码的问题实例[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Struts从零开始二、解决中文乱码的问题实例[5]

Struts从零开始二、解决中文乱码的问题实例[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Struts从零开始二、解决中文乱码的问题实例[1]

Struts从零开始二、解决中文乱码的问题实例[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Struts从零开始六、Struts的模块使用实例

Struts从零开始六、Struts的模块使用实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Struts从零开始六、Struts的模块使用实例[1]

Struts从零开始六、Struts的模块使用实例[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Struts从零开始六、Struts的模块使用实例[3]

Struts从零开始六、Struts的模块使用实例[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Struts从零开始六、Struts的模块使用实例[2]

Struts从零开始六、Struts的模块使用实例[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Struts从零开始五、Struts中验证数据实例[8]

Struts从零开始五、Struts中验证数据实例[8]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 Struts从零开始五、Struts中验证数据实例[7]

Struts从零开始五、Struts中验证数据实例[7]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下