1.项目中常采用EL表达式来输出后台内容,但测试发现它并不能完美处理要输出内容包含有<>或&等HTML特殊字符问题。先直接给出此问题JSTL的解决方案:

1、引入标签:<%@ taglib uri ="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

这样取值:<input  id="name" value="${fn:escapeXml(name)}" type="text"/> 其中name为后台要输出值,如果直接用${name}且name值为&nbsp;时文本框中就是空格而不是&nbsp;

2、用JSTL标签显示不转义的字符:<c:out value="<%=name%>" escapeXml="false"/>

不如直接用structs标签处理:<s:property value="name" >

另外注意该标签其它两个属性:

default属性

用于设置默认的值,在无法找到value表示的属性时,其值便直接取default值。比如

  1. <s:property value="name" default="anonymity"/>

表示的是,如果值栈中能取到name,那么就显示取到的值;如果取不到,那么就用"anonymity".

escape属性

1)默认是true,表示将value内的内容强制转换成字符串显示
2)设置成false,表示将value值当做html代码去解析。此时如name值为&nbsp;前台就显示为空白,跟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>&nbsp;#' 通过JS显示在HTML页面中时,显示成了msg # ,并不是<b>msg</b>&nbsp;#,这是由于<与>之间的内容看作是HTML标签了,而以&开头的&nbsp;#为HTML实体,所以显示不正常。

解决办法很简单,在JS将其渲染到HTML页面前转换一下即可:

Html代码
  1. <html>
  2. <body>
  3. <divid="div1"></div>
  4. <divid="div2"></div>
  5. <script>
  6. var str = '<b>msg</b>&nbsp;#';
  7. document.all.div1.innerHTML='<pre>'+str+'</pre>';
  8. //js中的字符串正常显示在HTML页面中
  9. String.prototype.displayHtml= function(){
  10. //将字符串转换成数组
  11. var strArr = this.split('');
  12. //HTML页面特殊字符显示,空格本质不是,但多个空格时浏览器默认只显示一个,所以替换
  13. var htmlChar="&<>";
  14. for(var i = 0; i<str.length;i++){
  15. //查找是否含有特殊的HTML字符
  16. if(htmlChar.indexOf(str.charAt(i)) !=-1){
  17. //如果存在,则将它们转换成对应的HTML实体
  18. switch (str.charAt(i)) {
  19. case '<':
  20. strArr.splice(i,1,'<');
  21. break;
  22. case '>':
  23. strArr.splice(i,1,'>');
  24. break;
  25. case '&':
  26. strArr.splice(i,1,'&');
  27. }
  28. }
  29. }
  30. return strArr.join('');
  31. }
  32. alert(str.displayHtml());
  33. document.all.div2.innerHTML=str.displayHtml();
  34. </script>
  35. </body>
  36. </html>

上面在赋给div之前没有转换,所以显示不正常,第二个div显示正常,显示结果如下:

JSP到HTML特殊字符转换

以上是通过JS将后台传递过来的数据显示在页面之前的转换,有时是通过JSP生成HTML页面内容,此时的特殊字符会比上面多,另外此时的转换需要通过服务器端转换后再输出到HTML页面。如 jsp页面在生成HTML时如下:
Html代码
  1. <inputtype='txt'value='<%=msg %>'>
如果 msg 为 I'am> 时,第一页面会乱,第二文本框中显示的值不正确

。这是由于HTML标签属性值可以使用双引号也可使用单引号,如果HTML使用的是单引号,而值中也包含单引号时,就会出现问题,双引号同样也有这样的问题,由于大都数情况下,页面中属性使用双引号还是单引号没有规范下来,所以服务器端传递来的单引号与双引号都需要转换。另外像<、>就不用说了,也是需要转换的,所以此种情况下应该至少<>"'& 这5个需要特殊转换。
Java代码
  1. // HTML字符转换表
  2. publicfinalstatic Map<String, String> HTML_CHAR = new HashMap<String, String>();
  3. static {
  4. HTML_CHAR.put("&", "&");
  5. HTML_CHAR.put("\"", """);
  6. HTML_CHAR.put("<", "<");
  7. HTML_CHAR.put(">", ">");
  8. HTML_CHAR.put("'", "'");
  9. }
  10. publicstaticfinal StringBuilder toHTMLChar(String str) {
  11. if (str == null) {
  12. returnnew StringBuilder();
  13. }
  14. StringBuilder sb = new StringBuilder(str);
  15. char tempChar;
  16. String tempStr;
  17. for (int i = 0; i < sb.length(); i++) {
  18. tempChar = sb.charAt(i);
  19. if (HTML_CHAR.containsKey(Character.toString(tempChar))) {
  20. tempStr = (String) HTML_CHAR.get(Character
  21. .toString(tempChar));
  22. sb.replace(i, i + 1, tempStr);
  23. i += tempStr.length() - 1;
  24. }
  25. }
  26. return sb;
  27. }

在输出到HTML之前使用上面的toHTMLChar(msg).toString()转换一下即可:

Java到JSON特殊字符转换

由于从服务器后端生成JSON格式的字符串,最后传递到客户端由 eval() 函数动态的生成Javascript,如果JSON字符串格式错误,则eval解析会出错,经常也是最常出错的是" ' \r\n 这三个字符,如 {name:'I'am'}解析时会出错,同样,由于JavaScript中的字符串可由单引号也可由双引号引起来,所以双引号一样也有这样问题。另外,字符串是不能跨行写的,即你不能写成这样:{name:"I'

am"}

所以这3个需要转换,另外换行可能依赖于平台,所以 \n 也需要转换,比如我们需要将后台抛出的异常栈信息以JSON的格式传回到浏览器上显示时,就需要将回车换行转换。代码如下:

Java代码
  1. response.setContentType("application/json");
  2. Writer wr = response.getWriter();
  3. if(exceptionTrace.indexOf("'")!=-1){
  4. //将单引号转义一下,因为JSON串中的字符串类型可以单引号引起来的
  5. exceptionTrace = exceptionTrace.replaceAll("'", "\\'");
  6. }
  7. if(exceptionTrace.indexOf("\"")!=-1){
  8. //将双引号转义一下,因为JSON串中的字符串类型可以单引号引起来的
  9. exceptionTrace = exceptionTrace.replaceAll("\"", "\\\"");
  10. }
  11. if(exceptionTrace.indexOf("\r\n")!=-1){
  12. //将回车换行转换一下,因为JSON串中字符串不能出现显式的回车换行
  13. exceptionTrace = exceptionTrace.replaceAll("\r\n", "\\u000d\\u000a");
  14. }
  15. if(exceptionTrace.indexOf("\n")!=-1){
  16. //将换行转换一下,因为JSON串中字符串不能出现显式的换行
  17. exceptionTrace = exceptionTrace.replaceAll("\n", "\\u000a");
  18. }
  19. wr.write("{success:false,exception:true,msg:'" +exceptionTrace + "'}");
  20. wr.flush();
  21. wr.close();

最常用的字符实体(Character Entities)

显示结果 说明 Entity Name Entity Number
  显示一个空格 &nbsp;  
< 小于 &lt; <
> 大于 &gt; >
& &符号 &amp; &
" 双引号 &quot; "

其他常用的字符实体(Character Entities)

显示结果 说明 Entity Name Entity Number
© 版权 &copy; ©
® 注册商标 &reg; ®
× 乘号 &times; ×
÷ 除号 &divide; ÷

2015第23周四HTML特殊字符显示问题的更多相关文章

  1. [中文翻译] 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 ...

  2. 2015第30周四Java日志组件

    Java 日志 API 从功能上来说,日志 API 本身所需求的功能非常简单,只需要能够记录一段文本即可.API 的使用者在需要进行记录时,根据当前的上下文信息构造出相应的文本信息,调用 API 完成 ...

  3. 2015.4.23 贪吃蛇、canvas动画,各种上传工具,url信息匹配以及最全前端面试题等

    1.面向对象贪吃蛇   2.css中:hover 改变图片 页面加载完 第一次鼠标移入会闪一下 这是为啥? 解决方法:你把两张图合成一张图或者是先把图片加载到页面上,然后再hover出来. 解析:图片 ...

  4. 2015第24周四Spring事务4

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分.     Da ...

  5. 2015第23周一SVN插件安装

    之前想把eclipse(3.7)的SVN插件版本从1.8.x降到1.6.x,上午折腾了好久没弄好,先是尝试在线安装,按网上说的1.6.x的url安装不成功(可能是网络问题,下载不到资源),然后尝试下载 ...

  6. 2015第19周四jquery版本

    今天用到一个jquery插件,发现最新版需要jquery2.0以上版本才行,而目前项目在用的版本是1.8.3,自然无法使用,刚看了jquery的主要版本和差异,直接百度搜索无满意结果,最后在百科中给出 ...

  7. 2015第10周四-CSS小结

    这两天做前台页面发现个人在CSS前端方法很多基础知识都忘了,晚上又搜索学习了下,把相关内容摘录总结. CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector {declara ...

  8. Daily Scrum (2015/10/23)

    这天晚上PM和我一起细算下来这周的确做了不少事儿.由于这天是周五,有的组员今晚有外出活动,有的组员忙了一周想休息一下.所以PM与我讨论提出今晚就布置些阅读的任务,给组员们一些自由分配的时间: 成员 今 ...

  9. Daily Scrumming 2015.10.23(Day 4)

    今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 继续学习rails ActiveRecord 数据库迁移 域名备案申请 学习rails router配置与 ...

随机推荐

  1. 个性化品牌开始繁荣?为设计师和代工厂牵线的平台Maker's Row获得100万美元融资 | 36氪

    个性化品牌开始繁荣?为设计师和代工厂牵线的平台Maker's Row获得100万美元融资 | 36氪 个性化品牌开始繁荣?为设计师和代工厂牵线的平台Maker's Row获得100万美元融资

  2. Struts 2零配置

    从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该 ...

  3. 计算机网络VLAN学习

    首先要搞明白VLAN的由来,为什么会产生这样一种技术.这得从计算机网络的数据交换说起,最开始,我们的网络处于蛮荒时代,数据是怎么交换的,就是简单的介质共享,大家都接到一条线路上,然后互相发数据,这个必 ...

  4. Redis起步

    Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介  Redis是一个key-value存储系统.和Memcached类似,但是解决 ...

  5. poj 2454 Jersey Politics dfs

    这个题目第一步还是比较明显的,先把最小的n个值去掉,剩下的问题就是能不能把数据分成两半,使得每一半和都大于n*500,这个刚开始考虑了下dp的做法,但是复杂度不满足要求. 那么能想到的就是搜索了,实际 ...

  6. C#调用R语言输出图片

    参考:http://rdotnet.codeplex.com/documentation   REngine.SetEnvironmentVariables(); REngine engine = R ...

  7. Qt使用AES加密算法对字符串进行加密

          因工作需要,需要对字符串进行加密处理,在网上找了很长时间,终于找到了一个可以使用的aes加密算法.其源代码采用c++编写而成,但其头文件引用windows.h,经过修改部分代码,将#inc ...

  8. Vim的设置和使用——编程者

    一.第一个插件:Ctags 当我们看到一个陌生的变量或者函数,我们总想知道它的含义,因此,快速找到它的定义很重要.Ctags插件中的"Ctrl+]"快捷键就可以做到. 二.教你高效 ...

  9. JavaScript的68个技巧一

    1. 严格模式 在自己的项目中 你可以坚持只使用" 严格模式 " 或只使用" 非严格模式 "的策略.但如果你要编写健壮的代码应对各种各样的代码连接 你有两个可选 ...

  10. USB通讯协议 && 数据传输

    USB2.0通讯协议(spalish)   1.包(packet) 包是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的.USB包由五部分组成,同步字段(sync).包标识符(PI ...