使用Spring MVC3和Hibernate4做网站的一些记录

1 篇文章 0 订阅

好长时间都没更新博客了,主要是因为比较忙,先是写毕业论文,写了28K个字,纯手打,花了好长时间,回报就是论文的重复率为0%。论文写完后就着手做东西了,这次做的也是一个openflow相关的程序,和以往不同的是,原来做的程序都是达到功能就行,参数配置一个各种操作基本上都是通过手动改配置文件,甚至是改代码完成的。这次想做的人性化点,于是决定做一个网站,通过web界面配置控制器程序。闲话说完了,下边开始进入正题。

现在一提做网站,就是MVC、三层架构等一大堆乱七八糟的东西,网上一搜一大堆,而且关于Spring MVC3和Hibernate4整合的配置文件网上也多的是。我在这里就不做多余的介绍了,只是记录一下在做网站过程中遇到的一些问题,如果你也恰巧碰到了这些问题,只希望可以提供些许的帮助。

从开始就没准备自己为网站写界面,一方面是因为没人美工,自己做出的页面太难看,另一方面,虽然我会写CSS,可是我实在是太懒了,不想写。因此选择了使用ExtJS,它有各种内置的UI组件,因为ExtJS在前端提供了各种各样的功能,所以服务器只需要返回json数据就行,也就是说在这个网站中Spring MVC所有控制的方法均使用了@ResponseBody注解,没有使用任何JSP文件。

一、首先是web.xml,这个文件中主要有两项配置。 

1、配置servlet,让Spring MVC接管用户请求:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
    <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

2、配置一个过滤器,该过滤器的作用是解决使用POST提交中文时的乱码问题。

<filter>  
    <filter-name>CharacterEncodingFilter</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>  
</filter>  
<filter-mapping>  
    <filter-name>CharacterEncodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>
二、然后是spring-servlet.xml文件,这个文件的配置比较多。 

1、告诉Spring,这个项目是基于注解配置的,以及需要扫描的java包

<context:annotation-config />
<context:component-scan base-package="com.lamoop.sdnweb" />

2、引入一个properties文件,该文件中存有数据库的配置信息

<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
3、配置dataSource
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
4、配置sessionFactory
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
 
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>
5、配置事务管理
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
6、配置一个拦截器,该拦截器的作用是检查用户的登录权限
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="loginInterceptor" />
        </list>
    </property>
</bean>
<bean id="loginInterceptor" class="com.lamoop.sdnweb.interceptor.LoginInterceptor">
    <property name="matchURL" value=".*/sdn/.*\.do" />
</bean>
7、配置转换器,该配置有两个作用,把控制器返回的内容使用Jackson转化为json数据,且使用UTF-8编码
<bean  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
    <property name="messageConverters">
         <list>
             <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
                <property name = "supportedMediaTypes">
                     <list>
                         <value>text/plain;charset=UTF-8</value>
                         <value>application/json;charset=UTF-8</value>
                     </list>
                </property>
             </bean>
             <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> 
         </list>
    </property>
</bean>

三、hibernate.cfg.xml文件和jdbc.properties文件
<hibernate-configuration>
    <session-factory>
        <mapping class="com.lamoop.sdnweb.domain.Server" />
        <mapping class="com.lamoop.sdnweb.domain.Client" />
    </session-factory>
</hibernate-configuration>

jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.dialect=org.hibernate.dialect.MySQL5Dialect
jdbc.databaseurl=jdbc:mysql://localhost:3306/sdnweb?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456


新手做网站都是先上网上搜配置文件,然后直接拿来用,然后发现不能用,就上网搜解决方案,一个一个的解决。我也是这样,上面那些配置也是从网上下的,经过多次修改才能正常工作。下面说一下我都遇到了哪些问题。 

1、使用@ResponseBody注解直接输出的json数据会转义 比如说你想输出{name:"zhangsan"},你在控制器中直接返回这个字符串,那么客户端接收到的数据就成了"{name:"zhangsan"}",使用ExtJS也可以处理这些数据,但是会多个步骤,解决方案就是添加在配置文件中,然后返回一个Map,在map中添加一条key为name、value为zhangsan的条目。 Google一般会说在配置文件中加入,如果你照做了就会出现java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException异常,因为这个是针对jackson1.x的。


2、No Session found for current thread和createQuery is not valid without active transaction 刚开始没遇到这个问题,domain、dao、service里都只有一个类,一切工作正常,然后又添加了一个doamin,以及相应的dao、service,就出现No Session found for current thread异常了,Google给出的答案是在hibernate的配置文件中加入thread,照着做了以后就出现createQuery is not valid without active transaction异常了。这个问题最终使用了妥协的方案:使用openSession()而不是getCurrentSession()获取Session对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值