论坛首页 Java企业应用论坛

自定义Struts的JSP模板和Hibernate的DAO模板

浏览 4029 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-19  
         这一阵子在MyEclipse里做项目,用到了Struts和hibernate功能,起初,对自动生成赞不绝口,但后来,发现自动生成的代码也有不方便的地方,比如:

一、Struts

          当new一个JSP,使用Standard JSP using Struts 1.2时,生成的页面代码中只包含了Struts标签。但很多时候,我们需要在页面中使用到JSTL标签,我们应该把常用的几个JSTL标签加到JSP页 面中,就像这样:

  1. <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>  
  2. <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>  
  3. <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>  
  4. <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>  
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>  
  6. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>  
  7. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>  
      
          其次,Struts1.2的
  1. <html:base />  
<html:base> <html:base> 似乎有些问题,它表示的地址是当前页面的地址,而不是应用程序的根目录,因此,这个base我们还是得用内嵌的Java代码得到,就像这样:

</html:base> </html:base>
  1. <%  
  2. String path = request.getContextPath();  
  3. String basePath = request.getScheme()+"://"+request.getServerName()+":"
  4.            +request.getServerPort()+path+"/";  
  5. %>  

          然后在之间加入base标签:

  1. "<%=basePath%>">  

          这样,用起来才比较方便一点。但每次都改页面,显然做了很多重复的劳动,我想MyEclipse在生成这样的页面时,肯定用到了模板。那么到底是那个模板呢?我们来搜搜看。

          首先说明一下,我用的不是MyEclipse的All-In-One安装,所以有两个目录,一个是Eclipse的解压目录,另一个才是 MyEclipse的安装目录:MyEclipse 5.5.1 GA。如果用的All-In-One安装,可能只有一个目录,就是MyEclipse 5.5.1 GA。这里,我就把这个目录称为安装目录了。

          在安装目录下搜索:Struts-1_2.vtl,可以得到这个文件,打开看看,其头部结构与生成的页面很相似,因此,我们只需要在适当的地方添上自己的代码即可。修改前还是要注意备份。

二、hibernate

          使用Hibernate Reverse Engineering最大的好处就是它可以自动生成PO和DAO的源码,以及映射配置文件。但是看看DAO的代码,才发现里面的数据库操作方法都是实例 方法,用起来还必须先new一个DAO,个人觉得没有这个必要,使用静态方法就可以了,但我不可能给每个DAO的每个方法都加一个static吧。于是, 跟上面一样,改模板。

          首先得分析一下,生成的DAO是继承的BaseHibernateDAO,而BaseHibernateDAO是扩展的 IBaseHibernateDAO接口,在这个接口中,定义了getSession方法。要把数据库操作方法改成static,这个 getSession方法也必须是static,但是在接口中不能定义是static的方法,那么唯一的办法就是不管IBaseHibernateDAO 接口,在BaseHibernateDAO类中自己实现一个静态的getSession方法。

          BaseHibernateDAO有模板文件,但是没有必要改它,因为一个工程只用得到一个BaseHibernateDAO。我们要改的模板文件是用于 生成具体DAO类的。然而在安装目录下用hibernate关键字搜一搜,并没有发现哪个文件与我们的DAO有关,难道MyEclipse把生成规则写死 在代码里了吗?

          我不相信MyEclipse的开发人员那么糊涂,于是用templates关键字搜索了一下,发现了这个: myeclipse_templates_5.5GA.zip,打开一点,发现里面全部是有关hibernate的模板文件,另外有一个readme的说 明,关键部分如下:

  1. 2) Edit the velocity templates you wish to customize.  
  2.      
  3. Note: POJO templates are present in the pojo folder  
  4.       DAO template in the dao folder  
  5.       HBM templates in the hbm folder  
  6.      
  7. 3) Optional: Though not necessary, it is recommended that you delete the  
  8.    velocity templates you do not plan to customize. This will prevent future  
  9.    confusion over which templates are being processed by MyEclipse.  
  10.   
  11. 4) Invoke the JPA/EJB3/Hibernate Reverse-Engineering wizard and select   
  12.    "Use custom templates". Manually enter or click the browse button to select the   
  13.    myeclipse_templates_5.5GA folder.  

          上面的意思是:把解压之后的文件夹放在一个方便的地方(不需要放在原目录下,那样找起来很不方便),修改它,然后删掉其他你没有修改的文件,以免发生可能的冲突,最后,在Hibernate Reverse-Engineering的对话框中,钩选Use custom templates,输入你解压后的文件夹(myeclipse_templates_5.5GA)路径,就可以使用到自定义的模板了。

          照这个意思,我修改了DAO文件夹下的daohome.vm和facadeif.vm,在其中所有的public标识后加上了static(我也不知道哪 些是hibernatet真正用到的,反正我不用EJB和JPA)。然后照它的意思试 了一把,果然,DAO方法全变成了static。


          目前,我还没有充分的证据证明DAO中使用静态方法比实例方法要好,只是觉得使用静态方法方便一些,运用到工程中也没有出错。我想,MyEclipse自 动生成的DAO,使用实例方法,可能有他们的考虑,这就有可能是我没有考虑到的。所以,各位高手如果有充分的经验证明静态方法比实例方法好,那么请给小弟 一个sp,也好让我信心十足地写程序;如果有充分的道理证明实例方法比静态方法好,也请毫不吝惜地拍砖。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics