I code it

Code and Life

Spring的web应用示例

最早使用spring是在2008年,但是只是测试性的使用了spring的DI功能,对于web方面,当时公司使用的是自己的框架,所以并未深入了解。最近的一个项目基于spring3,因此就专门研究了一下,做了一个简单的示例。网络上关于spring3-web的教程并不多见,可能由于众多的Java开发人员已经熟悉了spring之前的模式,所以学习起来比较平坦的缘故。但是对于一个新进入spring-web世界的开发人员来说,在没有context的情况下,并不那么容易,后来在网络上找到一篇很好的教程,我根据这个教程实践了一遍,然后在其基础上做了少量的改动。

环境方面:这个简单的示例中,使用了spring3-web,hibernate4,JPA,web容器采用jetty,构建工具采用gradle,没有什么特别的原因,这些工具都是项目中需要用到的。文中的示例来源于网络上的一篇优秀的教程,不过这篇教程使用的是maven,而且没有涉及到部署运行(可能对于大多数Java-web开发人员,这部分并不需要特别指出)。

运行结果如下:

miniblog-spring-jetty

基本上,这个应用就是一个最简单的MVC版本的web应用,有ORM层,有service层,有控制器,有视图,有spring的基本配置,以及其与hibernate的简单整合。虽然例子很小,但是足够说明很多问题。

下面是项目的布局:

spring-miniblog-structure

这里主要介绍几个比较容易出现问题的地方,其他代码可以参考这篇优秀的教程

   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项目即可:

gradle-jetty-run

Comments