您的位置:首页 > 编程语言 > Java开发

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

2015-04-12 16:17 176 查看
好长时间都没更新博客了,主要是因为比较忙,先是写毕业论文,写了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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: