2015第23周四HTML特殊字符显示问题
1.项目中常采用EL表达式来输出后台内容,但测试发现它并不能完美处理要输出内容包含有<>或&等HTML特殊字符问题。先直接给出此问题JSTL的解决方案:
这样取值:<input id="name" value="${fn:escapeXml(name)}" type="text"/> 其中name为后台要输出值,如果直接用${name}且name值为 时文本框中就是空格而不是
2、用JSTL标签显示不转义的字符:<c:out value="<%=name%>" escapeXml="false"/>
不如直接用structs标签处理:<s:property value="name" >
另外注意该标签其它两个属性:
default属性
用于设置默认的值,在无法找到value表示的属性时,其值便直接取default值。比如
- <s:property value="name" default="anonymity"/>
表示的是,如果值栈中能取到name,那么就显示取到的值;如果取不到,那么就用"anonymity".
escape属性
1)默认是true,表示将value内的内容强制转换成字符串显示
2)设置成false,表示将value值当做html代码去解析。此时如name值为 前台就显示为空白,跟EL表达式的默认情况一样。
不知为何EL表达式不像s:property一样把value内容强制转换为字符串显示处理,这样默认应该更合理。
EL 全名为Expression Language,它原本是JSTL 1.0为方便存取数据所自定义的语言。当时EL只能在JSTL 标签中使用,不能直接在JSP 网页中使用。到了JSP 2.0 之后,只要是支持Servlet 2.4 / JSP2.0 的Container,就都可以在JSP 网页中直接使用EL 了,需要引入页签:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
最后转一篇其它特殊字符处理的文章: <HTML、JS、JSON特殊字符 - JS到HTML特殊字符转换 - kobejayandy的专栏 - 博客频道 - CSDN.NET>
这几天做项目,发现从服务器端以JSON格式将数据传递到客户端后,通过JS显示在HTML页面时,有一些特殊字符不能直接显示,如后台传递过来的是 '<b>msg</b> #' 通过JS显示在HTML页面中时,显示成了msg # ,并不是<b>msg</b> #,这是由于<与>之间的内容看作是HTML标签了,而以&开头的 与#为HTML实体,所以显示不正常。
解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:

- <html>
- <body>
- <divid="div1"></div>
- <divid="div2"></div>
- <script>
- var str = '<b>msg</b> #';
- document.all.div1.innerHTML='<pre>'+str+'</pre>';
- //js中的字符串正常显示在HTML页面中
- String.prototype.displayHtml= function(){
- //将字符串转换成数组
- var strArr = this.split('');
- //HTML页面特殊字符显示,空格本质不是,但多个空格时浏览器默认只显示一个,所以替换
- var htmlChar="&<>";
- for(var i = 0; i<str.length;i++){
- //查找是否含有特殊的HTML字符
- if(htmlChar.indexOf(str.charAt(i)) !=-1){
- //如果存在,则将它们转换成对应的HTML实体
- switch (str.charAt(i)) {
- case '<':
- strArr.splice(i,1,'<');
- break;
- case '>':
- strArr.splice(i,1,'>');
- break;
- case '&':
- strArr.splice(i,1,'&');
- }
- }
- }
- return strArr.join('');
- }
- alert(str.displayHtml());
- document.all.div2.innerHTML=str.displayHtml();
- </script>
- </body>
- </html>
上面在赋给div之前没有转换,所以显示不正常,第二个div显示正常,显示结果如下:

JSP到HTML特殊字符转换

- <inputtype='txt'value='<%=msg %>'>

。这是由于HTML标签属性值可以使用双引号也可使用单引号,如果HTML使用的是单引号,而值中也包含单引号时,就会出现问题,双引号同样也有这样的问题,由于大都数情况下,页面中属性使用双引号还是单引号没有规范下来,所以服务器端传递来的单引号与双引号都需要转换。另外像<、>就不用说了,也是需要转换的,所以此种情况下应该至少<>"'& 这5个需要特殊转换。

- // HTML字符转换表
- publicfinalstatic Map<String, String> HTML_CHAR = new HashMap<String, String>();
- static {
- HTML_CHAR.put("&", "&");
- HTML_CHAR.put("\"", """);
- HTML_CHAR.put("<", "<");
- HTML_CHAR.put(">", ">");
- HTML_CHAR.put("'", "'");
- }
- publicstaticfinal StringBuilder toHTMLChar(String str) {
- if (str == null) {
- returnnew StringBuilder();
- }
- StringBuilder sb = new StringBuilder(str);
- char tempChar;
- String tempStr;
- for (int i = 0; i < sb.length(); i++) {
- tempChar = sb.charAt(i);
- if (HTML_CHAR.containsKey(Character.toString(tempChar))) {
- tempStr = (String) HTML_CHAR.get(Character
- .toString(tempChar));
- sb.replace(i, i + 1, tempStr);
- i += tempStr.length() - 1;
- }
- }
- return sb;
- }
在输出到HTML之前使用上面的toHTMLChar(msg).toString()转换一下即可:
Java到JSON特殊字符转换
由于从服务器后端生成JSON格式的字符串,最后传递到客户端由 eval() 函数动态的生成Javascript,如果JSON字符串格式错误,则eval解析会出错,经常也是最常出错的是" ' \r\n 这三个字符,如 {name:'I'am'}解析时会出错,同样,由于JavaScript中的字符串可由单引号也可由双引号引起来,所以双引号一样也有这样问题。另外,字符串是不能跨行写的,即你不能写成这样:{name:"I'
am"}
所以这3个需要转换,另外换行可能依赖于平台,所以 \n 也需要转换,比如我们需要将后台抛出的异常栈信息以JSON的格式传回到浏览器上显示时,就需要将回车换行转换。代码如下:

- response.setContentType("application/json");
- Writer wr = response.getWriter();
- if(exceptionTrace.indexOf("'")!=-1){
- //将单引号转义一下,因为JSON串中的字符串类型可以单引号引起来的
- exceptionTrace = exceptionTrace.replaceAll("'", "\\'");
- }
- if(exceptionTrace.indexOf("\"")!=-1){
- //将双引号转义一下,因为JSON串中的字符串类型可以单引号引起来的
- exceptionTrace = exceptionTrace.replaceAll("\"", "\\\"");
- }
- if(exceptionTrace.indexOf("\r\n")!=-1){
- //将回车换行转换一下,因为JSON串中字符串不能出现显式的回车换行
- exceptionTrace = exceptionTrace.replaceAll("\r\n", "\\u000d\\u000a");
- }
- if(exceptionTrace.indexOf("\n")!=-1){
- //将换行转换一下,因为JSON串中字符串不能出现显式的换行
- exceptionTrace = exceptionTrace.replaceAll("\n", "\\u000a");
- }
- wr.write("{success:false,exception:true,msg:'" +exceptionTrace + "'}");
- wr.flush();
- wr.close();
最常用的字符实体(Character Entities)
| 显示结果 | 说明 | Entity Name | Entity Number |
| 显示一个空格 | | ||
| < | 小于 | < | < |
| > | 大于 | > | > |
| & | &符号 | & | & |
| " | 双引号 | " | " |
其他常用的字符实体(Character Entities)
| 显示结果 | 说明 | Entity Name | Entity Number |
| © | 版权 | © | © |
| ® | 注册商标 | ® | ® |
| × | 乘号 | × | × |
| ÷ | 除号 | ÷ | ÷ |
2015第23周四HTML特殊字符显示问题的更多相关文章
- [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23)
本文出处 [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23) 这是我的文章备份 http://www.dotblogs.co ...
- 2015第30周四Java日志组件
Java 日志 API 从功能上来说,日志 API 本身所需求的功能非常简单,只需要能够记录一段文本即可.API 的使用者在需要进行记录时,根据当前的上下文信息构造出相应的文本信息,调用 API 完成 ...
- 2015.4.23 贪吃蛇、canvas动画,各种上传工具,url信息匹配以及最全前端面试题等
1.面向对象贪吃蛇 2.css中:hover 改变图片 页面加载完 第一次鼠标移入会闪一下 这是为啥? 解决方法:你把两张图合成一张图或者是先把图片加载到页面上,然后再hover出来. 解析:图片 ...
- 2015第24周四Spring事务4
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. Da ...
- 2015第23周一SVN插件安装
之前想把eclipse(3.7)的SVN插件版本从1.8.x降到1.6.x,上午折腾了好久没弄好,先是尝试在线安装,按网上说的1.6.x的url安装不成功(可能是网络问题,下载不到资源),然后尝试下载 ...
- 2015第19周四jquery版本
今天用到一个jquery插件,发现最新版需要jquery2.0以上版本才行,而目前项目在用的版本是1.8.3,自然无法使用,刚看了jquery的主要版本和差异,直接百度搜索无满意结果,最后在百科中给出 ...
- 2015第10周四-CSS小结
这两天做前台页面发现个人在CSS前端方法很多基础知识都忘了,晚上又搜索学习了下,把相关内容摘录总结. CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector {declara ...
- Daily Scrum (2015/10/23)
这天晚上PM和我一起细算下来这周的确做了不少事儿.由于这天是周五,有的组员今晚有外出活动,有的组员忙了一周想休息一下.所以PM与我讨论提出今晚就布置些阅读的任务,给组员们一些自由分配的时间: 成员 今 ...
- Daily Scrumming 2015.10.23(Day 4)
今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 继续学习rails ActiveRecord 数据库迁移 域名备案申请 学习rails router配置与 ...
随机推荐
- HDU-3787(字符串模拟)
Problem Description 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开.现在请计算A+B的结果,并以正常形式输出. Input 输入包含 ...
- Nginx缓存解决方案:SRCache
前些天帮别人优化PHP程序,搞得灰头土脸,最后黔驴技穷开启了FastCGI Cache,算是勉强应付过去了吧.不过FastCGI Cache不支持分布式缓存,当服务器很多的时候,冗余的浪费将非常严重, ...
- vb安装过程中 ntvdm.exe[9696]中发生未处理的win32异常
最近电脑总是出问题导致我的学习效率很低,前几天在用VB6.0的时候有个知识点不太熟悉,于是按F1发现不会出来帮助文档.突然想到重新装系统之后忘记了安装MSDN帮助插件,就在我安装这个软件的时候发现电脑 ...
- Python爬虫实战(二)
本来晚上是准备写贴吧爬虫的,但是在分析页面时就遇到了大麻烦!选取了某个帖子,在爬取的时候,发现正则匹配不全..很尴尬!!先来看看吧, #!/usr/bin/env python # -*- codin ...
- (转)iOS5:[UIDevice uniqueIdentifier]的替代方案
背景: 大多数应用都会用到苹果设备的UDID号,UDID通常有以下两种用途: 1)用于一些统计与分析目的:[第三方统计工具如友盟,广告商如ADMOB等] 2)将UDID作为用户ID来唯一识别用户,省去 ...
- SurfaceView类透明背景设置
将SurfaceView背景设置为透明,主要添加以下几句话就可以了: 在SurfaceView创建后设置一下下面的参数: setZOrderOnTop(true); getHolder().setFo ...
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...
- 【GitHub-SwipeMenuListView】针对ListView item的側滑菜单
项目地址:https://github.com/baoyongzhang/SwipeMenuListView Usage Step 1:import swipemenulistview.jar Ste ...
- ViewDragHelper详解
2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...
- dsadm-dsconf数据导入导出
cd instance-path/ds6/bin #注意黄色参数修改为跟实际环境一致 -c,--accept-cert Does not ask for confirmation before a ...