『框架整合』SpringMVC+Spring+Hibernate+Maven整合常见问题

整理下自己在搭建SpringMVC+Spring+Hibernate+Maven框架时遇到的问题。

1. classpath路径解析

  • 在搭建框架时,我们经常要用到classpath这个单词,比如设置spring配置文件
my app
    
        contextConfigLocation
        classpath:spirng-hbm.xml,classpath:spring-dispatcher.xml
    

classpath路径,指的就是classes目录,当web项目发布后,java编译后的class文件以及用到的配置文件都会被保存到这个目录,此目录在WEB-INF文件夹下,可以从Tomcat的wtpwebapps目录下观察到。

  • 在开发过程中,可以理解这个路径为项目源文件路径
    不使用maven管理项目的话,就是src目录下,如果使用maven,就是src/main/resourcesrc/main/java目录。
  • classpath*相比classpath多了个*号,它是指除了直接查找指定目录,还要查找lib目录下jar包内的配置文件。

2. JSP文件charset和pageEncoding区别

下面是每个JSP文件头都会标注的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

那么charsetpageEncoding区别是什么?
我们知道JSP其实就是一个Servlet,也就是说它是可以被编译的。

  • pageEncoding是指当前这个.jsp文件的编码格式,是通过什么编码来进行保存的。
    当这个JSP被解析编译成.java文件时,就是通过此属性来读取JSP文件,这一步如果设置错误,就会在后台出现乱码。
  • charset是后台操作完成,发送给浏览器(前端)所使用编码,浏览器通过此编码解析响应信息,这个属性等同于response.setCharacterEncoding()
  • 如果没有指定pageEncoding那么将以charset设定值保存JSP页面。

3. 在web.xml通过过滤器配置编码

我们可以在web.xml文件中进行编码配置,这样就可以不用重复的写request/response.setCharacterEncoding().。
配置如下:


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

其中encoding参数作用是设置ServletRequest.setCharacterEncoding().
forceEncoding则是使ServletResponse的编码设置和ServletRequest一致。

4. EL表达式被当做字符串处理

  • 有时我们会发现在JSP中使用EL表达式时,会原封不动的输出${xxxx.xxx},而不是运算后的结果。
    这是因为servlet除了2.4以外版本,都默认忽视EL表达式,将其当做字符串处理。
    在JSP文件中加入<%@ page isELIgnored="false" %>就可以激活EL表达式。
  • 上面的做法要在每个JSP文件都进行配置,会很麻烦,也可以直接更改web.xml中的版本号,进行全局设置:


5. HQL语句操作的是实体类

当我们使用HQL语句时,比如:session.createQuery("from Article").list();,查询的对象Article是项目中的实体类,而不是数据库中article这个表名。

6. Hibernate连接数据库的信息最好单独使用文件

在spring中配置连接数据库所需要的user.name``user.password,url等信息时,最好将其写成一个.properties 文件,这样我们在修改时就不用动配置文件了。
database.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=

如果url写入xml文件中,要用&代替&,以免歧义解析错误。
springContext.xml


        
            
                classpath:database.properties
            
        


        
        
        
        

7. 绝对路径与相对路径

在项目中我们经常要引用url地址,比如/app/welcome.png或者./app/welcome.png。那么/前面那个.有或者没有是什么区别?
我们假设有个appweb项目

  • 如果前面有.,那么这个是当前位置的相对路径,从当前文件作为基准,开始计算路径。
  • 如果前面没有.,那么这个路径是根目录的路径,这里有个坑,这个根目录不一定是项目根目录,也有可能是站点的根目录

这是很容易犯的错误,找不到正确路径,自然就会造成404。
所以建议大家在写路径相关代码时,使用绝对路径!

8. 配置视图解析器

在使用SpringMVC时,我们经常会在其配置文件中做如下配置:


    
    

其中InternalResourceViewResolver是一个视图解析器,通过配置它的属性"prefix"和"suffix"来为Java代码Controller中返回的ModelAndView加上前缀后缀,这样就会去指定的路径下(prefix)自动解析视图,不用我们每次在ModelAndView中添加前缀后缀了,只需要写视图名称(jsp文件名称)。

9.访问项目静态资源

我在写项目试,无论怎样也无法访问到图片。
代码片段:![](./image/welcomebgp.png),返回404错误。
经过排查,原因是我在web.xml配置SpringMVC的Dispatcher是采用的下面代码:


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

其中/是指定Dispatcher的作用范围,/代表接受所有的url请求。
因此./image/welcomebgp.png会被分发到Controller中,自然没有对应RequestMapping对应,返回404错误。

解决方法通常有两种:

  • /改成*.do这样Dispatcher就只会拦截.do结尾的url请求,正常的资源请求会直接到项目中寻找。
    这样修改的话,我们的url都要以.do结尾,才能进到Controller中。
  • 在dispatcher的配置文件中,加入声明。



此声明可以使url能够访问项目下的静态资源,而不被dispatcher影响。
其中location="/image/"指定了资源所在位置,在image文件夹下。mapping="/image/**"指明了映射路径,我们访问资源时,就要使用mapping路径。
比如我要访问项目根目录image/welcome.png资源,那么url我就要写url:./image/welcome.png

10.GET请求传入后台乱码问题

在项目中,我发现即使在web.xml中配置了编码过滤器,在使用GET方式向后台传值时,还是会出现中文乱码。
这是因为,编码过滤器是针对POST请求起作用的,而tomcat是对GETPOST请求处理方式是不同的。其对GET默认解码方式是iso-8859-1,因此使用其他编码,自然会出现乱码问题。

解决方法:更改tomcatGET默认解码方式。
tomcat/conf/server.xml中找到标签,加上URIEncoding="UTF-8"即可。
注意:可能你会发现这么修改还是不可以,这是因为eclipse会使用自己的server.xml配置文件,这个文件在eclipse项目导航,servers项目中,打开项目,找到配置文件,修改后应该就可以了。



文章内容为个人理解,如有错误欢迎指出。

邮箱:[email protected]

你可能感兴趣的:(『框架整合』SpringMVC+Spring+Hibernate+Maven整合常见问题)