SpringMVC+Hibernate的一些配置

3月 15th, 2011 6,211 留下评论 阅读评论

近期项目又用到了Spring MVC+Hibernate的框架结构和全Annotation(注解)的配置,自然是再熟悉不过的了,从Trilogy的达西那儿实习开始,到学院的J2EE、软件工程的大程,一路相同的架构配置,轻车熟路,不过这次可谓变化不小,配置项因此有不小的改变,也学到一些东西。

Spring MVC的XML

Spring MVC的<servlet-name>-servlet.xml(以下用spring-servlet.xml表示)和普通Spring结构的applicationContext.xml,两者有比较微妙的关系。

Spring MVC项目中,web.xml的servle项按如下配置好,Spring会自动加载applicationContext.xml之后再加载spring-servlet.xml(推测原因,因为后者能引用前者的bean,反之则不行),其中关于Controller的项必须放在spring-servlet.xml中,而其他比如datasource、dao、service等bean则建议放在applicationContext.xml中。

<servlet>  
	<servlet-name>spring</servlet-name>  
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
	<load-on-startup>1</load-on-startup>
	<!-- 
	这里如果填了下面的项,会导致仅加载applicationContext.xml而不加载spring-servlet.xml
	这样就只能在applicationContext.xml里手动去加载其他xml,<import resource="spring-servlet.xml"/>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</init-param>
	-->
</servlet>

Spring MVC的模板层配置

先说Spring MVC的模板层,一直以来习惯使用Freemarker,这就需要配置Freemarker的bean和Spring连接Freemarker的ViewResolver,FreeMarkerViewResolver。一般方法就是在spring-servlet.xml中,将这几个bean的信息注入。如下所示:

<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
<bean id="freemarkerConfig" 
	class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
	<property name="templateLoaderPath" value="/WEB-INF/views/" />
	<property name="freemarkerSettings">
		<props>
			<prop key="defaultEncoding">UTF-8</prop>
			<prop key="datetime_format">yyyy-MM-dd</prop>
			<prop key="number_format">0.######</prop>
		</props>
		</property>
	<property name="freemarkerVariables">
		<map><entry key="xml_escape" value-ref="fmXmlEscape" /></map>
	</property>
	<property name="defaultEncoding" value="UTF-8" />
</bean>
 
<bean id="viewResolver" 
	class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
	<property name="prefix" value="" />
	<property name="suffix" value=".ftl" />
	<property name="exposeSpringMacroHelpers" value="true" />
	<property name="contentType" value="text/html;charset=UTF-8" />
</bean>

这次项目比较正规,我负责后端Java开发,前端页面另有人负责,而且前端程序员希望用JSP页面来完成,于是正好换一个新的模板引擎试试。其实自己一直很想用JSP的,这样又可以省去Freemarker这一第三方类库,少一点总是好的。换成JSP,当然就要换成JSP的ViewResolver,叫InternalResourceViewResolver,而JSP因为是J2EE集成的模板,所以不需要像Freemarker还要配置,的确是方便了!bean如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/views/" />
	<property name="suffix" value=".jsp" />
</bean>

Hibernate Annotation的外键配置

前几个项目中虽然一直都有用@ManyToOne、@OneToOne和@JoinColumn这种Annotation来配置对应关系,但一直都是代码逻辑来控制的,并没有将外键实施于数据库中。说了这次项目比较正规嘛,要求数据库中也是有外键约束的,于是又要重新动动脑筋。说来也奇怪的,搞了好久的Annotation,也百度了好久才找到:MySQL中MyISAM类型的数据表是不支持外键的,InnoDB类型才支持!说来关于MySQL的数据表类型是MyISAM还是InnoDB曾经也遇到过类似问题,不过是不是外键就不记得了。

找到了问题所在,剩下的就是如何将Hibernate的自动建表机制(hibernate.hbm2ddl.auto)将数据表建为InnoDB了。居然没想到百度还搜不到,最后在Google的英文页面中找到了配置方法:

hibernate.dialect = org.hibernate.dialect.MySQLDialect	=>	MyISAM表
hibernate.dialect = org.hibernate.dialect.MySQLInnoDBDialect	=>	InnoDB表

深爱的Spring

说起著名的SSH框架,Spring是我第二个学的,初学的时候感觉非常难,《Pro Spring》中的反转控制和依赖注入实在是太抽象的概念。幸运的是,通过实习项目中的coding,立马就深深地理解了Spring的各种编程理念和思维方式。从而也接触了Spring MVC,接触了全Annotation的配置,立马就让我放弃了Structs。至于Hibernate,其实也不是很喜欢,又复杂又臃肿,不如JDBC来的简洁方便!所以,当“SSH你最喜欢哪个框架”这种问题摆在我面前,毫无疑问的!难道不觉得Spring的名字也是最美的么? :mrgreen:

Categories: Java 标签:, ,
  1. libitum | #沙发
    3月 19th, 2011 20:38

    不知为何我对这些xml的配置及其反感…老是会忘了该怎么配~ssh里的spring和hibernate都不怎么熟,实在是太土了…不过struts也不怎么喜欢,myBatis轻量一些还是没那种很顺手的感觉…

    • XML的确很繁琐啊,所以我喜欢Annocation。我从来不记的,每次都抄以前写过的…

  2. 3月 17th, 2011 10:12

    最近学的是PHP,感觉好熟悉

    • 学PHP没有前途啊,自己玩玩挺好的,公司里不实用

  3. 3月 17th, 2011 10:09

    好复杂啊,最近看到这些代码就眼花啊啊。。。