本系列博客将为大家介绍JSP开发中一些不为人所知的一些细节方面的问题,有些问题可能会比较简单,您可能已经知道了答案,但是未必了解背后的一些原理。我们将从发现问题、分析问题、解决问题的思路来深入的阐述这些不为人知的细节。
问题描述
我们要实现的功能很简单,在页面上显示一个简单的表达式的值,如下所示:
在正式阅读之前,请大家思考实现这样的功能,利用JSP技术有哪些途径呢?
1)最简单的方式莫过于直接写上一行静态网页代码如下:
一个p标签加上一行表达式文字,简单粗暴的完成任务。
2)上面的实现方式过于简单,我们使用稍微高级的一点做法吧。
利用JSP的内置隐含对象out的write方法,向页面输出一个p标签。
3)在上面的基础上,我们稍微改进一下,表达式的值通过Java来计算。
4)还是利用out对象,把p标签写在外面吧,利用Java的表达式进行计算,然后将结果输出到页面。
这种做法比上一种做法确实改进了不少,但是当我们运行的时候,发现页面并没有输出8,而是出现了下面的结果:
p标签中写上了表达式文字,然后利用Java语言来计算表达式的值,得到结果为8,最后通过表达式的值向页面输出8啊,最后得到的HTML代码应该是'<p>5+3=8</p>'这个啊,但是为什么结果会出错呢?
问题分析
看似简单的问题,但是你是否能够很清晰的告诉别人这是为什么呢?还是你只是简单的知道这个问题的答案而并不明白是什么原因导致的呢。
最好的解决方法就是直接看源码,这是最权威的地方。将鼠标放在write,按ctrl+B键进入源码。
5+3进行计算得到结果为8,因此调用的是write(int)方法。通过上图红框标记的结果可以看到,这个整数8会被强制类型转为char类型,即8所对应的ascii码。
而8对应的ascii码为『退格』,这是一个不可显示字符,故在我们的页面上无法看到退格键的显示。
为了验证确实是这个原因,我们计算另外一个表达式「30+12=42」,而42所对应的ascii码为「*」。
编写如下代码:
最终我们看到的结果为:
上述实验证明了我们的想法是正确的。
综上所述,我们得出问题的原因在于write(int)该方法会将整数强制转化为ascii码,然后向页面输出。
解决方案
上面的分析得出不能使用write(int)这个方法,而使用另外一个方法。
上图为write的所有方法列表。
通过分析得出write(String)这个方法比较适合。
在知晓问题产生的原因之后,我们就能很快的知道如何解决问题。直接将5+3的结果整数转化为String类型即可。
总结
本文从一个简单的表达式问题入手,逐步深入的分析问题产生的原因,在了解原因后,非常快速的给出了问题的解决方案。
还有其他哪些做法?欢迎下方留言。