随着互联网应用的兴起,对基于布局技术的应用越来越多,许多情况下,都是采用copy+paste的开发模式来进行每一张jsp的开发。当然,再先进一点的,则是使用include的方式来包装每一张界面。
对于每一张界面,都有相同的东西。比如,经常使用的header,footer,以及一个body界面最基本的布局元素。在开发前期,这些信息基本由web开发师来确定,然后每一张界面进行copy,并填充不同的东西,然后由程序开发人员来根据效果图或基本的html界面写动态数据,并最终形成产品项目。
然而,这种解决方式还是不算简洁,对于已经存在的html。开发人员不再需要在界面上增加信息,而如果要新加一个功能,那么开发人员就需要首先从已经存在的界面上copy一份,然后修改其中需要变动的地方。
到后来,如果出于某种变动(如设计上的调整),则需要在涉及到的相关界面都需要增加或修改一部分代码,这种情况下,以前copy+paste的代码就很麻烦了。开发人员必须找到每一张需要调整的界面,并在其中修改代码。
我们说,重复的代码不写第二遍,那么在jsp上这么多的重复代码,应该怎么作呢。答案就是使用布局技术,首先有一个基本的布局界面,每张功能界面都引用这个布局界面,而只需要写当前功能界面所关注的功能,最后所生成的界面就是布局界面+功能界面的综合体了。
使用过wordpress博客的人都了解,每个界面实际上都差不多,而负责前端所有展现的界面也就只有那么几个,这就是布局界面的应用。
首先,作为开发人员,符合条件的布局技术必须满足两个条件,一个是掌握难度低,使用难度低,二是要简洁,不要大而全,解决最基本的功能即可。那么,就按照这两个需要来寻找吧。
在google上搜索一番,涉及到最常用的布局技术有两个:sitemesh和struts tiles。其中,struts tiles从struts1时代起就存在了,就是为了解决界面布局的问题。然后由于它基于配置,且过于灵活,导致使用难度过大且不太不容易被掌握;所以逐渐转移到sitemesh上来。
sitemesh当前最新的版本为2.4.2(官网上的版本为2.4.1)。网上有很多介绍它的应用,这里就不再介绍了,想使用的人可以google。它的主页为:http://www.opensymphony.com/sitemesh/。然而,最后的一次更新也在2009年3月,且最新的版本2.4.2也并没有在官网的下载中出现。寻找了半天,才发现sitemesh的代码库也不换地址了,最新的地址为https://github.com/sitemesh。而且,仔细看了下,好像基本处于停止的状态,且sitemesh也开始往sitemesh 3迁移了。代码基本上重新构建。对于使用和学习也不太方便。
从笔者的角度上,主要关注于使用和技术应用,简单地查看了相应的源代码,实现功能确实过于复杂了一些,基本上是基于界面流过滤器的思想来进行文本的解析和替换。并且,相当的功能对于笔者所在的应用来说,基本上用不着。并且,还考虑到一个灵活应用的考虑,最主要的应用还是一个减少代码量,统一布局的目的。如果某一个功能jsp和模板界面相差太多,就直接使用原始的jsp,而不再使用sitemesh,在这一点上sitemesh就需要去修改配置文件,对于在开发上容易健忘的我们这一点实在要求太高。
因此,最终笔者想要的就是一种可以类似界面替换的功能,以避免使用include指令时,大量的copy+paste操作。而不是想要增强jsp的应用。如果,某些界面又不使用这种功能时,又可以即时切换到原始的jsp上来。直接无迁移成本。而最后发现提供这种功能的东西就是:jsp extends。
来源于rapid framework,http://code.google.com/p/rapid-framework/wiki/rapid_jsp_extends,有兴趣的人可以看看。在仔细看了一下应用,以及相应实现源代码之后,我就确定,就是它了。只需要将使用的布局界面include过来,并使用替换脚本,替换掉相应的界面即可。当然,这里可以稍微增强一点,比如提供默认内容等。
对于使用此项技术的唯一限制是被include的界面,必须声明在最后(其实是在替换标签之后)。这一点没有任何问题,我们的ide(如intellij idea),已经能够完美支持被引用界面的解析,完全不用担心了。
有了这个东西,我们就可以根据项目功能,制作一个或多个布局界面,比如前端一个,后台一个。在前端使用一种布局展现方式,而后端使用另一种布局。或者只是引用不同的资源如js,css等,也可以使用这东西,更节省代码,不是吗?
转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/use-jsp-extends-not-sitemesh-divide-jsp-reduce-same-code.html