美文网首页程序员技术干货
『框架整合』SpringMVC+Spring+Hibernate

『框架整合』SpringMVC+Spring+Hibernate

作者: dejunz | 来源:发表于2016-11-30 17:37 被阅读931次

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

    1. classpath路径解析

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

    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().。
    配置如下:

    <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>       
        </filter>
    

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

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

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

    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文件中,要用&amp代替&,以免歧义解析错误。
    springContext.xml

    <bean
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:database.properties</value>
                </list>
            </property>
    </bean>
    <bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
    </bean>
    

    7. 绝对路径与相对路径

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

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

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

    8. 配置视图解析器

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

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

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

    9.访问项目静态资源

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

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-dispatcher.xml</param-value>
            </init-param>
        <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern> <!--注意这里-->
        </servlet-mapping>
    

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

    解决方法通常有两种:

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

    此声明可以使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中找到<Connector>标签,加上URIEncoding="UTF-8"即可。
    注意:可能你会发现这么修改还是不可以,这是因为eclipse会使用自己的server.xml配置文件,这个文件在eclipse项目导航,servers项目中,打开项目,找到配置文件,修改后应该就可以了。
    <br /><br />


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

    邮箱:CodingDjz@126.com

    相关文章

      网友评论

        本文标题:『框架整合』SpringMVC+Spring+Hibernate

        本文链接:https://www.haomeiwen.com/subject/fwgzpttx.html