最早使用spring是在2008年,但是只是测试性的使用了spring的DI功能,对于web方面,当时公司使用的是自己的框架,所以并未深入了解。最近的一个项目基于spring3,因此就专门研究了一下,做了一个简单的示例。网络上关于spring3-web的教程并不多见,可能由于众多的Java开发人员已经熟悉了spring之前的模式,所以学习起来比较平坦的缘故。但是对于一个新进入spring-web世界的开发人员来说,在没有context的情况下,并不那么容易,后来在网络上找到一篇很好的教程,我根据这个教程实践了一遍,然后在其基础上做了少量的改动。
环境方面:这个简单的示例中,使用了spring3-web,hibernate4,JPA,web容器采用jetty,构建工具采用gradle,没有什么特别的原因,这些工具都是项目中需要用到的。文中的示例来源于网络上的一篇优秀的教程,不过这篇教程使用的是maven,而且没有涉及到部署运行(可能对于大多数Java-web开发人员,这部分并不需要特别指出)。
运行结果如下:
基本上,这个应用就是一个最简单的MVC版本的web应用,有ORM层,有service层,有控制器,有视图,有spring的基本配置,以及其与hibernate的简单整合。虽然例子很小,但是足够说明很多问题。
下面是项目的布局:
这里主要介绍几个比较容易出现问题的地方,其他代码可以参考这篇优秀的教程。
1: <bean id="sessionFactory"
2: class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
3: <property name="dataSource" ref="dataSource" />
4: <property name="configLocation">
5: <value>classpath:hibernate.cfg.xml</value>
6: </property>
7: <property name="annotatedClasses">
8: <value>org.hibernate.cfg.AnnotationConfiguration</value>
9: </property>
10: <property name="hibernateProperties">
11: <props>
12: <prop key="hibernate.dialect">${jdbc.dialect}</prop>
13: <prop key="hibernate.show_sql">true</prop>
14: </props>
15: </property>
16: </bean>
在Spring3中,已经去掉了configClasses属性,而提供新的annotatedClasses,因此需要将名称为configClasses的属性修改为annotatedClasses。
另一个问题是SimpleBlogDAO.java中:
1:
2: public List<Blog> listBlogs() {
3: return sessionFactory.getCurrentSession().createQuery("from Blog").list();
4: }
createQuery中的表名应为大写开头的名称,我在这个地方浪费了大概1-2个小时,可能此处为一个惯例,但是我没有找到相关的文档。最后介绍一下构建脚本gradle, 我使用的是gradle来进行编译,运行等,gradle有jetty的插件,因此仅需要将项目layout为gradle推荐的形式即可,而无需进行复杂的配置:
1: apply plugin: 'war'
2: apply plugin: 'jetty'
3:
4: group = 'org.icodeit.miniblog'
5:
6: repositories {
7: mavenCentral()
8: }
9:
10: configurations {
11:
12: }
13:
14: dependencies {
15: compile "org.springframework:spring-web:3.1.1.RELEASE",
16: "org.springframework:spring-webmvc:3.1.1.RELEASE",
17: "org.springframework:spring-beans:3.1.1.RELEASE",
18: "org.springframework:spring-context:3.1.1.RELEASE",
19: "org.springframework:spring-orm:3.1.1.RELEASE"
20:
21: compile "aopalliance:aopalliance:1.0"
22:
23: compile "org.hibernate:hibernate-core:4.0.0.Final"
24:
25: runtime "commons-pool:commons-pool:1.3",
26: "commons-dbcp:commons-dbcp:1.2.2",
27: "commons-collections:commons-collections:3.2",
28: "org.slf4j:slf4j-log4j12:1.6.0",
29: "mysql:mysql-connector-java:5.1.5"
30:
31: }
32:
33: httpPort = 8080
34: stopPort = 9451
35: stopKey = 'foobar'
所有的依赖的jar都可以通过mavenCentral函数从maven的repository上下载,这一个功能非常好用。最后,使用gradle启动这个web项目即可: