专栏首页三言两语J2EE前后台传值带中文时乱码

J2EE前后台传值带中文时乱码

(本文年代久远,请谨慎阅读)传值乱码问题在Web开发中涉及许多方面:登陆注册时,是否正确得到正确的中文用户名;修改信息时,是否可以显示提交的中文信息;

以上是具体使用,当然包括所有后台想得到值的 文本框 的传值!! 可以看到输入中文是我们在做一个网站时必须要考虑的,纯英文的外国网站你输入中文也不会乱码。 其实,解决乱码我们只需要注意几个问题,再加之少许操作即可获得想要的中文

写在前面

  • 一个Web工程项目中代码涉及编码的地方有几处: 你的struts.xml配置文件中开头会有一句:<?xml version=”1.0” encoding=”GBK” ?>
  • 文本框所在的jsp页面的开头也会有一句:<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> 好像这就是所涉及到编码的所有部分了,如果我们只是改变一下”GBK”,”UTF-8”等等字眼,估计随便怎么换也是乱码
  • 我们需要进一步的进行“再编码”!!

下面的解决方式面对两种问题,至今我只遇到了这两种,即两种后台得到值的方式“ 标准的form表单提交,后台用get和set得到文本框的值; 大量重复操作的跳转(比如页面中一个表格里每一行后面有一个删除按钮),直接href=action后挂相应的值进行传递

标准form表单提交

1.把显示的jsp页面的第一句话写为:pageEncoding=”UTF-8”,GBK是不行的,对于struts可以忽视

2.在后台Java代码中的业务处理部分,

如果你的get和set没有在.java中,你总要通过getParameter(“xxx”);来获取值即:

如果get与set在其中,则可以直接用,不用getParameter

要做的操作:String xxx = request.getParameter(“xxx”);之后加一句 xxx = URLDecoder.decode(username , “utf-8”); //关键代码,所需包会自动添加

get与set同你的处理代码在一起的,就在excute()里第一次出现xxx的前面添加:xxx = URLDecoder.decode(username , “utf-8”);

用href=action传值

首先,要改写,不要用href,改为点击触发一个js的function(),比如:

<input name="in" value="<%p++(构造了一个id值)%>"....href="xx.action?id=p ">
单传非中文是没有问题的,但是中文就要改一下,先要执行一个js:
<input name="in" value="<%p++(构造了一个id值)%>"....onclick=”look('p')“>
添加完onclick属性后,再添加代码:
function look( str ){ 
//在js中首先进行两侧编码,注意是两次,查阅所有网上资料都可以发现,至于为什么,功力未到还不能搞懂
    var faultAddr = encodeURI(encodeURI(str));  //需要通过两次编码    
    window.location.href="xxx.action?id="+str; 
}

这相当于在页面传值的时候进行了编码,在后java中得到的是编码两次的变量,所以要进行一次解码,添加:

xxx = URLDecoder.decode(xxx, "utf-8");  //关键代码,添加位置同First所述
Second-End

具体实例

在“input.jsp”页面中,需要通过js将值传递到后台,后台根据传递的值进行数据查询时,

通过test.jsp的js进行编码(粉色为编码),后台java解码(绿色为解码部分),可以解决

<script type="text/javascript" charset="UTF-8">
   function test(){
        var faultAddr = encodeURI(document.getElementById("faultAddr").value);
        faultAddr = encodeURI(faultAddr);  //需要通过两次编码
        window.frames["listframe"].location.href ="queryorderList.action?faultAddr=" + faultAddr ;
   }
</script>
<tr>      
    <td height="5%" width="50">输入内容</td>
    <td><input id="faultAddr" maxlength="300" size="10" name="faultAddr" type="text" value=""/></td>
</tr>
import java.net.URLDecoder;
String faultAddr =request.getParameter("faultAddr");
try{
    faultAddr = URLDecoder.decode(faultAddr , "utf-8");
}catch(Exception e){
    e.printStackTrace();
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 新机常用软件及环境配置清单

    ZONGLYN
  • hive与hbase的联系与区别

    ZONGLYN
  • Python的项目代码结构

    ZONGLYN
  • 三种人工智能开源框架

    TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流...

    机器人网
  • 基于性能测试工具kylinTOP构建虚拟用户自身请求的并发模型

    在对于WEB系统进行性能测试时,第一时间想到的是测试出WEB系统能够承受的最大并发虚拟用户(VU)用户数,因为系统的最大VU并发数可以直接反应系统的承载能力。但...

    小老鼠
  • 互联网安全知多少

    设计安全方案的基本原则,中文翻译“默认安全”不太好理解,其实就包含两层含义:白名单/黑名单思想,和最小权限原则。

    曲水流觞
  • Python之守护线程与锁

      # 守护线程随着子线程结束而结束,与守护进程不一样--守护进程随着主进程代码执行完毕而结束

    py3study
  • 数据科学家需要了解的 5 种采样方法

    采样问题是数据科学中的常见问题,对此,WalmartLabs 的数据科学家 Rahul Agarwal 分享了数据科学家需要了解的 5 种采样方法,AI 开发者...

    AI研习社
  • 深入 AI 之前,你需要学习的服务与框架

    用户1737318
  • 火绒安全警报:疑似方正集团子公司签名泄露 遭黑客利用盗取Steam账号

    日前,火绒安全团队发出警报,火绒工程师截获下载器病毒Apametheus,该病毒入侵电脑后会下载多个病毒模块,病毒模块运行后,将盗取Steam账号,同时劫持用户...

    用户6477171

扫码关注云+社区

领取腾讯云代金券