下面是我的一份jsp代码的片段(黑色下划线代表空格,后面提到):
<s:iterator value="categorys" var="category">
_____<s:iterator value="links" var="link">
_________<s:if test="#category.id==#link.category_id">
<li class="link">
<s:a value="%{#link.url}"><s:property value="#link.name"/></s:a>
</li>
</s:if>
_____</s:iterator>
</s:iterator>
以上代码要完成的什么样的功能并不重要,重点是它的结构:循环内有判断,并且为了代码的可读性,每行代码前面有缩进。
这样的代码有个特点是:并不是每一次循环,内层的<s:if></s:if>代码都能的到执行(里面的输出内容不会在生成的页面上出现)。其实这也不是问题。真正的问题是,那些在<s:if></s:if>外部,但是在<s:iterator></s:iterator>内部的空格(代码中以黑色下划线表示),却在每次循环都打印了到页面上,最后页面上会有很多空格,像下面这样:
<li class="link">
<a href="http://www.codeforge.com/article/54868" target="view_window">编译原理资料</a>
</li>
<li class="link">
<a href="http://best-java-source.whyandhow.org/" target="view_window">Java开源项目</a>
</li>
我在浏览器上将一个jsp生成的静态页面下载到磁盘上,它占用的空间是12KB。当我用dreamweaver把页面中那些无意义的空格全部删除后,页面文件变得只有4KB。修改前后的体积比是3:1。其实可以想象,这个比值在一些时候还可以更大,甚至大的离谱。我想页面有这么大的代码冗余是很浪费流量的一件事。
我现在找到的解决办法并不完美。应为我把代码改成下面这个样子了:
<s:iterator value="categorys" var="category">
<s:iterator value="links" var="link">
<s:if test="#category.id==#link.category_id">
<li class="link">
<span>
<s:a value="%{#link.url}" target="view_window"><s:property value="#link.name"/></s:a>
</span>
</li>
</s:if>
</s:iterator>
这样改了之后,生成的静态页面的体积终于正常了。但是代码变得很难读。所以我要准备两套代码:一套用来编辑,一套是用来部署到服务器的的。
我现在再想别的办法:用别的结构的代码实现我上面那些代码的等效功能。