Spring & Spring MVC & Hibernate 整合备忘

以下为此三种框架整合配置的详细备注,以及部分问题备忘
项目结构和配置文件可访问 Github 查看

1. pom.xml

尽量使用 Maven 管理项目依赖以减少包引入时的麻烦,以及避免跨开发工具问题


    4.0.0
    com.ecollaboration
    ecollaboration_v1
    war
    1.0-SNAPSHOT
    ecollaboration_v1 Maven Webapp
    http://maven.apache.org
    
        
        1.8
        1.8

        4.12
        4.3.3.RELEASE
        4.3.11.Final
        2.8.6
        1.3.2
        3.1.0
        5.1.21
        1.8.9
    
    
    
        
        
            junit
            junit
            ${junit.version}
        

        
        
            org.springframework
            spring-orm
            ${spring.version}
        

        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        

        
        
            mysql
            mysql-connector-java
            ${mysql.jdbc.version}
        

        
        
            org.hibernate
            hibernate-core
            ${hibernate.version}
        

        
        
            com.fasterxml.jackson.core
            jackson-databind
            ${jackson.version}
        

        
        
            commons-fileupload
            commons-fileupload
            ${commons-fileupload.version}
        

        
        
            javax.servlet
            javax.servlet-api
            ${servlet.version}
        

        
        
            org.aspectj
            aspectjweaver
            ${aspectj.version}
        

    
    
        ecollaboration_v1
    

2. web.xml




    Archetype Created Web Application

    
    
        contextConfigLocation
        
        classpath:application-context.xml
    

    
    
        characterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceEncoding
            true
        
    
    
        characterEncodingFilter
        /
    

    
    
        org.springframework.web.context.ContextLoaderListener
    

    
    
        spring-mvc-servlet
        org.springframework.web.servlet.DispatcherServlet
        
        
        
            contextConfigLocation
            classpath:spring-mvc.xml
        
        1
    
    
        spring-mvc-servlet
        /
    

3. application-context.xml

文件名与 web.xml 第 12 行匹配




    
    

    
    

    
    
        
    

    
    
        
        
        
        
    
    
    
    
        
        
        
            
                
                true
                
                true
                
                org.hibernate.dialect.MySQL5Dialect
                
                update
                
                thread
                
                
                    org.springframework.orm.hibernate4.SpringSessionContext
                
            
        

        
        
            
                
                hibernates/UserEntity.hbm.xml
            
        

        
        
    
    
    
    
        
    

    
    
        
        
            
            
            
            
        
    

    
    
        
    

4. jdbc.properties

文件名与 application-context.xml 第 17 行匹配

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/ecollaboration?characterEncoding=UTF-8
jdbc.username=dbusername
jdbc.password=dbpassword

5. spring-mvc.xml

文件名与 web.xml 第 46 行匹配




    
    
        
    

    
    
        
        
    

    
    

    
    

        

        
            
                
            
        

        
            
                
                
                
                
                    
                        json=application/json
                        xml=application/xml
                        html=text/html
                    
                
                
            
        

    

    
    
        
        
    

    
    

    
    
        
        

        
        
            
            
            
        

    

6. 问题备忘

6.1 JSP 中无法使用 EL 表达式

web.xml 中,如果配置信息为:


  
  
 

则表示其采用 JSP 1.2,EL 表达式默认关闭,此时需要在 .jsp 中添加 <% @page isELIgnored="false" %>
或采用 JSP 2.0,即将配置信息改为:

 
  

  

6.2 /*/** 的区别

/* 中的通配符 * 会止于分隔符 /,而 /** 则不会。如 /resources/* 无法匹配 /resources/images/xxx.jpg,而只能匹配 /resources/xxx.jpg
换做 /resources/** 可以解决这一问题。

6.3 路径问题

在 Java 项目中,/path/to/xxx 表示以 webapp 为起点的路径;path/to/xxx 表示以项目根目录为起点的路径;classpath:path/to/xxx 标识以 classpath 为起点的路径;
注:也可以使用 this.getClass().getClassLoader().getResource("") 得到类对于系统的绝对路径进而得到所需资源的路径。

6.4 classpath:classpath*: 区别

classpath*: 可以从多个 jar 文件中加载相同的文件,而 classpath: 只会加载找到的第一个文件。如引入的两个 jar 包都存在 com.a 下的 xx.xml 文件,使用 classpath: 只会加载找到的第一个文件,而 classpath*: 则会加载全部。

6.5 class path resource [beans.xml] cannot be opened because it does not exist 报错解决方法

application-context.xml 配置中,关于 sessionFactory 的配置中,其属性 mappingResource 不能加入 classpath:( 默认即为 classpath 下的文件 ),也不能使用通配符。


    
        
        hibernates/UserEntity.hbm.xml
        
        
        
        
        
    

6.6 Could not obtain transaction-synchronized Session for current thread 报错解决方法

image_1b87ggv4h1mvbfdg1nh0129513rf9.png-28.4kB

如果不使用 Spring 的事务管理机制,且使用 session.getCurrentSession() 时,会出现如上图所示错误,此时需要对 application-context (Spring 配置文件)进行更改( 参见 application-context 第 50 行 ):


        
        

    
        
            
                
            thread
            
                org.springframework.orm.hibernate4.SpringSessionContext
            

            
        
    

    

并添加配置将事务管理交给 Spring( 参见 application-context 第 90 行 ):


    



    
        
    



    
    

注:需要注意 aop:advisorpointcut 属性所覆盖的类与方法,如果操作 session 的方法不在此包含内,则仍会报错。
注:当然也可以使用 session.openSession() 并通过 Hibernate 的事务管理方式组织代码。

6.7 Spring MVC 路由失效问题

有时可能出现:在配置了 @Controller 后,访问该控制器对应的 URL 时,返回 404 错误。此时需要检查 web.xml 中是否添加了 welcome-file-list,如下:

  
    index.html
    index.jsp 
 

此时,对某一 url 的访问会等同于访问该路径所对应文件夹下的 index.htmlindex.jsp 文件,如访问 localhost/foo 等同于访问 localhost/foo/index.htmllocalhost/foo/index.jsp( 依次检测这两个文件是否存在 )。因而需要在 spring-mvc.xml ( Spring mvc 配置文件 )中添加如下配置:

6.8 context:property-placeholder 导入多个 .properties 配置文件

由于 Spring 容器允许最多定义一个 placeholder,加入多个文件会忽略。而由于 IDE 不会进行这一判断,因而会出现 IDE 中没有警告提示,但运行时却报错的情况。

这时我们可以使用通配符解决引入多个配置文件的需求:

 

6.9 运行出现警告 WARNING: Exception encountered during context initialization - cancelling refresh attempt

发生这一问题可能是由于在进行代码迁移时,tomcat 和编译器的 jdk 指定版本不同,导致前者无法识别后者编译的的字节码文件。只需将二者保持一致即可,详情可参考 Stackoverflow。

7. 扩展 - 添加 Thymeleaf 模板引擎支持

若要在项目中使用 Thymeleaf 模板引擎,需要对之前进行的配置进行以下修改

7.1 修改 pom.xml 以增加 Thymeleaf 支持



    org.thymeleaf
    thymeleaf-spring4
    3.0.3.RELEASE




    nz.net.ultraq.thymeleaf
    thymeleaf-layout-dialect
    2.1.2

7.2 修改 spring-mvc.xml 以改变 View Resolver

这里需要将 spring-mvc.xml 第 16 - 19 行注释,并添加 ThymeleafViewResolver 的相应配置:




    
    





    
    
    
    
    
    
    






    
    
    
        
            
                
                
            
        
    



    
    

7.3 添加 Thymeleaf namespace 支持

由于 Thymeleaf 使用如

的方式解析视图,若要开发工具能够支持 th:xxx 的代码提示,需要在 html 标签中加入声明:,( 如需使用 layout 布局,还需加入 xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" ),此时 html 文件框架为:




    
    




7.4 在 IDEA 中添加含有 th 命名空间声明的 .html 文件框架

由于开发工具 与 emmet 插件等自动生成的 .html 文件框架中不含上述声明,每次都要写入声明也比较麻烦,可以在开发工具中添加一个文件模板以避免重复工作,这里以 IDEA 为例:
File > Other Settings > Default Settings > Editor > File and Code Templates 中新建一个文件模板,如下图:

Spring & Spring MVC & Hibernate 整合备忘_第1张图片

7.5 Thymeleaf 资料参考

  1. thymeleaf使用详解 - 知乎专栏

  2. Thymeleaf 模板的使用 - 博客园

  3. ${}, *{}, #{}, @{}, ~{} 的区别 - stackoverflow

  4. 新一代Java模板引擎Thymeleaf - 天马营

  5. Thymeleaf Layout Dialect


参考

  1. Spring 各 jar 包的作用及依赖关系 - 博客园

  2. hibernate.hbm2ddl.auto配置详解 - 博客园

  3. Spring-mvc 解决EL表达式不能使用问题 - CSDN

  4. Spring: Difference of /* and / with regards to paths - stackoverflow

  5. Spring 中 property-placeholder 的使用与解析 - 博客园

  6. IDEA 新建 Spring 配置文件的方法 - CSDN

  7. SPRING4配置文件模板 - 博客园

  8. JAVA获取CLASSPATH路径

  9. Spring 加载 resource 时 classpath*: 与 classpath: 的区别 - CSDN

  10. SSM_config 配置 springmvc.xml 模板 - CSDN

  11. 使用说明 - CSDN

  12. java.io.FileNotFoundException: class path resource beans.xml cannot be opened because it does not exist 解决方法 - CSDN

  13. Spring 注解 @Component、@Repository、@Service、@Controller 区别 - CSND

  14. The content of element type "web-app" must match 问题之解决办法 - CSDN

  15. spring mvc 和 spring 各自扫描自己的注解不要相互混淆 - 博客园

  16. context:component-scan 扫描使用上的容易忽略的 use-default-filters - iteye

  17. current_session_context_class - CSDN

  18. aop:aspectj-autoproxy 作用 - 360DOC

  19. 在使用 spring mvc 时,我使用了 @Service 这样的注解, 发现使用注解 @Transactional 声明的事务不起作用 - CSDN

  20. context:exclude-filter 与 context:include-filter - CSDN

  21. SpringMVC + Spring + Hibernate 整合 - 慕课网

  22. Spring 事务管理 - 慕课网

  23. @resource和@autowired的区别是什么 - CSDN

  24. SpringMVC4+thymeleaf3的一个简单实例(篇二:springMVC与thymeleaf的整合) - 博客园

  25. IntelliJ IDEA 2016.3 Help

  26. thymeleaf code completion not working intellij 14 - stackoverflow

  27. Intellij Idea: Thymeleaf namespace unknown

  28. SpringMVC4+thymeleaf3的一个简单实例(篇二:springMVC与thymeleaf的整合) - 博客园

  29. Spring MVC中使用Thymeleaf模板引擎 - 知乎专栏

  30. Spring 注解:@Repository、@Service、@Controller、@Autowired - CSDN

  31. Spring mvc 访问静态资源的三种方式 - CSDN

  32. thymeleaf 中文乱码问题 - CSDN

  33. Thymeleaf Layout Dialect - Gitbook

  34. spring中 context:property-placeholder 导入多个独立的配置文件

  35. WARNING: Exception encountered during context initialization - cancelling refresh attempt - Stackoverflow

你可能感兴趣的:(spring,spring-mvc,hibernate,thymeleaf,intellij-idea)