百度空间 | 百度首页 
 
查看文章
 
HTML标签使用中文做name要谨慎
2009-05-16 13:08

基于Struts的开发中,有时可能会需要使用中文做为html标签的name,这时一定要谨慎。

例如这样一个场景,有一个名单列表,这个列表除了人的姓名以外没有唯一键

这个列表后面有一对单选按钮可以操作,这时为了将每一行的单选按钮划到一组中去,我们会为他们赋一个name,最简单的办法就是直接用他们的姓名。如下:

本来这也没什么,但是如果你的页面端使用GBK编码,在不对这些radio进行特殊处理的情况下,那么页面在提交的时候,Struts会侦测到这个属性然后调用BeanUtils进行Form的populate,而这时问题就来了。上图中的那个问题派的“李芠奇”中间的那个“芠”字在解码时会变成一串乱码,光是乱码也没什么,也不是很关心它,偏偏乱码中间有个“[”,这恰恰是BeanUtils进行数组判断的标记,于是在找不到“]”的时候发生了异常。

这个Bug的综合因素很多,但是不幸我中奖了。最初还找错了方向,以为是我提交的JSON串出了问题。

解决办法:

1. 使用列表的index做name,这样做系统最省事。推荐使用。

2. 页面使用UTF-8编码,使用Filter或是其他的什么方法进行编码转换。

3. 不使用中文做为HTML标签的name值,可以使用这个中文的hashCode,我在此案例中是这么解决的,但没办法,有很多因素限制。

4. 在提交前处理掉radio,比如disable它,但是觉得有点无聊,呵呵


类别:我是一个程序员 | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2009-05-18 13:37 | 回复
中文做name, 危险的事情......
 
2
2009-05-18 13:48 | 回复
列表除了人的姓名以外没有唯一键 ?

select rowid, * from ttt;
 
3
2009-05-18 16:58 | 回复
关键不是从表里出来的,是从excel导入的,其实也可以放个index做唯一键,但当时没想那么多,结果搞出这么个bug来
 
4
2009-05-18 17:59 | 回复
其实你这个需求很简单地,生成这个列表必然是用的循环,在循环中用index前缀或者后缀作为name值就可以了。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu