使用jsp extends而不是sitemesh分离jsp减少相同代码

    随着互联网应用的兴起,对基于布局技术的应用越来越多,许多情况下,都是采用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。

继续阅读“使用jsp extends而不是sitemesh分离jsp减少相同代码”

解决oracle中使用hibernate在某些条件下不能正确创建hibernate_sequence的问题

    项目中使用了ssh作为开发底层框架,由于在开发前期并没有限制项目运行在哪一个数据库之上,因此在hibernate的配置上使用Generated的id生成方式,使得能够在不修改源代码的情况下,无缝的在不同的数据库上跑,只需要修改配置文件中的dialect即可。
    在这种情况下,在oracle中,hibernate就会使用一个叫做hibernate_sequence的全局sequence来作为所有主键的生成sequence,在新增一条记录之上,均需要从此sequence中取一个数值,并作为其他记录的主键插入到数据库当中。

    然后,这个hibernate_sequence并不是在项目启动之前手动地创建的,而是使用了hiberante的create-update方式,即创建-修改的方式进行创建。既然是这样,那么hibernate在启动之前即需要去检测所要创建的sequence是否存在,如果存在,则不再创建此sequence。然而,在某些情况下,hibernate能够探测到其它用户所创建的sequence,而被认为不再需要创建sequence,这时候就会在项目运行中出错了。出错的原因,即找不到相应的sequence。
    这个错误和hibernate不会主动创建某些表一致,不一样的是hibernate用的是另一个判断语句来判断相应的sequence是否存在。
    相关链接:解决在oracle数据库中使用hibernate生成表不能正确创建表的问题.

继续阅读“解决oracle中使用hibernate在某些条件下不能正确创建hibernate_sequence的问题”