用了一个星期时间终于将Spring+Hibernate+FreeMarker系统搭建完成了,现在将搭建的过程发布出来方便以后有和我一样的初学者
第一步
先新建一个WEB工程;导入相当的JAR包(我这里用的是Spring3.0,Hibernate-3.3,FreeMarker-2.3),这个就不用我多说了吧,相信大家都知道。
第二步
配置数据库连接及连接池相关的信息。任何程序都离不开数据。这个相信大家都明白。
我这里的数据库配置文件为
/WEB-INF/config/jdbc.properties
配置内容如下
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.141.23:3306/exam?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=password
cpool.checkoutTimeout=5000
cpool.minPoolSize=1
cpool.maxPoolSize=50
cpool.maxIdleTime=7200
cpool.maxIdleTimeExcessConnections=1800
cpool.acquireIncrement=10
第三步
增加Spring配置文件并配置Hibernate相关的信息。
我这里的Spring配置文件为
/WEB-INF/config/application-context.xml
此文件的配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="true">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/config/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 这一块配置是将数据数据库配置文件导入,形成对象方便下面的Bean进行调用 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="autoCommitOnClose" value="true"/>
<property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/>
<property name="initialPoolSize" value="${cpool.minPoolSize}"/>
<property name="minPoolSize" value="${cpool.minPoolSize}"/>
<property name="maxPoolSize" value="${cpool.maxPoolSize}"/>
<property name="maxIdleTime" value="${cpool.maxIdleTime}"/>
<property name="acquireIncrement" value="${cpool.acquireIncrement}"/>
<property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/>
</bean>
<!--生成数据源 -->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true"/>
<!-- 生成Spring对LOB数据的处理类; 对大对象数据的支持 -->
<bean id="onlineExamInterceptor" class="com.onlineexam.exam.core.common.interceptor.OnlineExamInterceptor" />
<!--
信息和会话回调应用程序拦截器;
引对象继承自
org.hibernate.EmptyInterceptor
--><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--Hibernate对事务处理的支持;此配置要来下面的 tx:annotation-driven 进行配套使用-->
<!--
这个配置信息比较多
这里主要有五部分功能;
dataSource用于将数据源注入到sessionFactory
hibernateProperties用于设置Hibernate基本信息;如方言,是否显示语句,是否使用缓存等;
lobHandler用于将前面对大对象的支持信息注入到Hibernate中
entityInterceptor用于将前面的回话回调拦截器加到Hibernate中
mappingLocations用于配置Bean之前的关系
-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingLocations">
<list>
<value>classpath*:/com/onlineexam/exam/core/entity/hbm/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.show_sql=false
hibernate.format_sql=false
hibernate.query.substitutions=true 1, false 0
hibernate.jdbc.batch_size=20
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.cache.use_query_cache=false
</value>
</property>
<property name="lobHandler">
<ref bean="lobHandler" />
</property>
<property name="entityInterceptor">
<ref local="onlineExamInterceptor"/>
</property>
</bean>
<!-- 增加对注解的支持信息-->
<context:annotation-config/>
<!-- 对应上面的事物处理-->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
上面是我对这个文件的配置信息做的一个具体的说明(只是我个人的理解,如果哪位高手感觉有什么不对的地方欢迎发贴讨论。)
这个信息配置完成后,我们需要让系统知道这个配置文件信息。因此需要将这个配置文件的信息加到WEB.XML里面;下面的我们说第四步,增加系统对Spring+Hibernate的支持信息
第四步
配置WEB.XML,
下面的是我的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>onlineexam</display-name>
<!--init config-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/application-context.xml
</param-value>
</context-param>
<!-- 将Spring +Hibernate 配置信息加入到系统中 -->
<filter>
<filter-name>encoding</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>
<filter-name>osivFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<!-- OpenSessionInViewFilter解决Hibernate的Session的关闭与开启问题 -->
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.jspx</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.jhtml</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>osivFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
Spring监听配置
auto config spring file infomation -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- session delay -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
</web-app>
到了这里Spring+Hibernate相关配置已经完成,下面我们进行第五步将FreeMarker加到Spring中。
第五步
配置FreeMarker信息,我们需要先做一些前期的准备。
首先增加数据国际化配置文件;我这里用的是message_zh_CN.properties, message_en_US.properties。我们在这两个文件中加入系统中要用到的相关文本信息。
我的文件目录及内容分别为
/WEB-INF/language/core/message_zh_CN.properties
exam.core.system.title=onlineexamsystem
/WEB-INF/language/core/message_en_US.properties
exam.core.system.title=在线考试系统
增加语系文件处理类;读取配置信息中当前的语系,设置本地化语言
package com.onlineexam.exam.core.common.interceptor;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.propertyeditors.LocaleEditor;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.support.RequestContextUtils;
public class LocaleLanguage extends HandlerInterceptorAdapter {
private static Logger logger = LoggerFactory.getLogger(LocaleLanguage.class);
/**
* 本地化字符串在ModelMap中的名称
*/
public static final String LOCALE = "locale";
private String language;
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
LocaleResolver localeResolver = RequestContextUtils
.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException(
"No LocaleResolver found: not in a DispatcherServlet request?");
}
logger.debug("当前语系为:{}",this.language);
String newLocale = this.language;
LocaleEditor localeEditor = new LocaleEditor();
localeEditor.setAsText(newLocale);
localeResolver.setLocale(request, response, (Locale) localeEditor
.getValue());
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
LocaleResolver localeResolver = RequestContextUtils
.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException(
"No LocaleResolver found: not in a DispatcherServlet request?");
}
if (modelAndView != null) {
modelAndView.getModelMap().addAttribute(LOCALE,
localeResolver.resolveLocale(request).toString());
}
}
}
增加登录认证和权限认证拦截器类
com.onlineexam.exam.core.common.interceptor.AdminContextInterceptor
此类也必须继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter类。
然后在此类中记录自己的登录信息和权限信息。
第六步
前面的准备工作已经完成了,我们需要配置我们的FreeMarker了。
在Spring中增加FreeMarker信息
新建Spring配置文件,我这里的配置文件名为
/WEB-INF/config/online-exam-manager.xml
这个文件的具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="true">
<!-- 配置语系文件所在路径,实现国际化-->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="cacheSeconds" value="-1"/>
<property name="basenames">
<list>
<value>/WEB-INF/language/core/message</value>
</list>
</property>
</bean>
<!--全局拦截器 进行本地化语系参数设置和用户登录及权限过滤
DefaultAnnotationHandlerMapping类是Spring3.1之前的
Spring3.1及3.1之后的版本建议使用
RequestMappingHandlerMapping
这个注解式处理器映射会扫描spring容器中的bean,发现bean实现类上拥有
@Controller或@RequestMapping注解的bean,并将它们作为处理器。
-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<ref bean="adminContextInterceptor"/>
<ref bean="adminLocaleIntercept"/>
</list>
</property>
</bean>
<!--实现用户的登录认识和权限权证等信息 -->
<bean id="adminContextInterceptor" class="com.onlineexam.exam.core.common.interceptor.AdminContextInterceptor">
<property name="loginUrl" value="/login.do"/>
<property name="returnUrl" value="/index.do"/>
<property name="excludeUrls">
<list>
<value>/login.do</value>
<value>/logout.do</value>
</list>
</property>
</bean>
<!-- 实现语系文件的本地化 -->
<bean id="adminLocaleIntercept" class="com.onlineexam.exam.core.common.interceptor.LocaleLanguage">
<property name="language" value="zh_CN" />
</bean>
<!-- 语系文件本地化 可修改配置;如果不加这个参数,进行本地化修改时会报错 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<property name="cookieMaxAge" value="-1"/>
</bean>
<!-- FREEMARKER 视图解析
-->
<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="prefix" value="/exam/"/>
<property name="suffix" value=".html"/>
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="exposeRequestAttributes" value="false"/>
<property name="exposeSessionAttributes" value="false"/>
<property name="exposeSpringMacroHelpers" value="true"/>
</bean>
<!-- FreeMarker配置信息
用于配置FreeMarker路径 信息
系统会通过这个路径然后加视图解析的前缀和后缀组成一个完成的页面访问路径。访问tpl模版
另外此配置中的auto_import用于配置已经创建好的自定义FreeMarker模版文件。并给这个模版文件起一个别名
-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF"/>
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.######</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="auto_import">/tpl/spring.ftl as s</prop>
</props>
</property>
</bean>
<context:annotation-config/>
<!-- 将其他Bean信息引入-->
<import resource="online-exam-manager-action.xml" />
</beans>
第七步
将FreeMarker配置信息加入到 系统中
在第六步时,我们已经将FreeMarker信息进行配置了,那怎么应该怎么在系统中使用他当然是在Web.xml中进行配置了。
前面我们已经将Hibernate的配置信息加入到了Web.xml中。
这里我们需要配置一个Servlet,根据规则将相关的请求交给Spring处理。
如下:
<servlet>
<servlet-name>OnlineExamManager</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/online-exam-manager.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>OnlineExamManager</servlet-name>
<url-pattern>/exam/manager/*</url-pattern>
</servlet-mapping>
在这个配置中我们将所有/exam/manager/目录下面的所有请求都交给Spring处理。并在系统启动时加载/WEB-INF/config/online-exam-manager.xml配置文件;
到了这里我们所有的Spring+Hibernate+FreeMarker就已经配置完成了。剩下的就是需要我们建立一个FreeMarker模版进行访问测试了。
因此我配置的FreeMarker路径是在/WEB-INF目录下,而前缀又是exam。所以FreeMarker的模版路径就是在/WEB-INF/exam/ 目录下面,而且后缀必须为.html的文件。
所有我建立了一个 /WEB-INF/exam/index.html的模版文件。
内容如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${title!""}</title>
</head>
<body>
${title}
<table>
</body>
</html>
然后增加一个Spring的控制器,内容如下:
@RequestMapping(value="index.do")
public String test(HttpServletRequest request,ModelMap map){
map.put("title","系统");
return "index";
}
将此控制类加到online-exam-manager-action.xml配置文件中进行注入。
然后访问index.do即可
以上纯属个人在安装学习过程中积累。在我这里是可以正常运行的。如果大家有什么意见或不认为不对的地方欢迎指正!