读书人

自定义Struts的JSP模板跟Hibernate的D

发布时间: 2012-11-04 10:42:41 作者: rapoo

自定义Struts的JSP模板和Hibernate的DAO模板
??? ???? 这一阵子在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,也好让我信心十足地写程序;如果有充分的道理证明实例方法比静态方法好,也请毫不吝惜地拍砖。

读书人网 >JavaScript

热点推荐