在 servlet 3.0 开始web项目可以完全不需要web.xml配置文件了,所以本文的配置只在支持servlet 3.0及以上的web容器中有效
使用的是spring mvc (4.3.2.release) + thymeleaf(3.0.2.release), 持久层使用的 spring的 jdbctemplate, ps:推荐一个很好用的对jdbctemplate封装的框架:https://github.com/selfly/dexcoder-assistant 。 下面开始具体的配置:
配置spring mvc dispatcherservlet
dispatcherservlet 是spring mvc的核心, spring 提供了一个快速配置dispatcherservlet的类 abstractannotationconfigdispatcherservletinitializer,具体代码如下:
其中 onstartup() 是 webapplicationinitializer 接口中的方法,用户配置其他的 filter 和 listener
getrootconfigclasses() 获取配置类,我理解的相当于 applicationcontext.xml 创建的上下文
getservletconfigclasses()获取配置类,相当于 mvc-servlet.xml 创建的上下文
此类上不需要任何注解,
package com.liulu.bank.config;
import org.springframework.web.webapplicationinitializer;
import org.springframework.web.filter.characterencodingfilter;
import org.springframework.web.servlet.support.abstractannotationconfigdispatcherservletinitializer;
import javax.servlet.filterregistration;
import javax.servlet.servletcontext;
import javax.servlet.servletexception;
import java.nio.charset.standardcharsets;
/**
* user : liulu
* date : 2016-10-7 15:12
*/
public class webappinitializer extends abstractannotationconfigdispatcherservletinitializer implements webapplicationinitializer {
@override
protected class[] getrootconfigclasses() {
return new class[]{rootconfig.class};
}
@override
protected class[] getservletconfigclasses() {
return new class[]{webconfig.class};
}
/**
* 配置dispatcherservlet 匹配的路径
* @return
*/
@override
protected string[] getservletmappings() {
return new string[]{/};
}
/**
* 配置其他的 servlet 和 filter
*
* @param servletcontext
* @throws servletexception
*/
@override
public void onstartup(servletcontext servletcontext) throws servletexception {
filterregistration.dynamic encodingfilter = servletcontext.addfilter(encodingfilter, characterencodingfilter.class);
encodingfilter.setinitparameter(encoding, string.valueof(standardcharsets.utf_8));
encodingfilter.setinitparameter(forceencoding, true);
encodingfilter.addmappingforurlpatterns(null, false, /*);
}
}
配置 applicationcontext.xml,由rootconfig类实现
package com.liulu.bank.config;
import com.mchange.v2.c3p0.combopooleddatasource;
import org.springframework.context.annotation.*;
import org.springframework.core.env.environment;
import org.springframework.jdbc.core.jdbctemplate;
import org.springframework.jdbc.datasource.datasourcetransactionmanager;
import org.springframework.stereotype.controller;
import org.springframework.transaction.platformtransactionmanager;
import org.springframework.transaction.annotation.enabletransactionmanagement;
import javax.annotation.resource;
import javax.sql.datasource;
import java.beans.propertyvetoexception;
/**
* user : liulu
* date : 2016-10-7 15:36
*/
@configuration
@propertysource(classpath:config.properties) // 导入属性文件
@enableaspectjautoproxy // 相当于 xml 中的
@enabletransactionmanagement // 开启注解事务
@componentscan(basepackages = {com.liulu.lit, com.liulu.bank}, excludefilters = @componentscan.filter(classes = controller.class ))
public class rootconfig {
// 上面导入的属性文件中的属性会 注入到 environment 中
@resource
private environment env;
/**
* 配置数据库连接池 c3p0,
* @return
* @throws propertyvetoexception
*/
@bean
public datasource datasource() throws propertyvetoexception {
combopooleddatasource datasource = new combopooleddatasource();
datasource.setjdbcurl(env.getproperty(db.url));
datasource.setdriverclass(env.getproperty(db.driver));
datasource.setuser(env.getproperty(db.user));
datasource.setpassword(env.getproperty(db.password));
datasource.setminpoolsize(integer.valueof(env.getproperty(pool.minpoolsize)));
datasource.setmaxpoolsize(integer.valueof(env.getproperty(pool.maxpoolsize)));
datasource.setautocommitonclose(false);
datasource.setcheckouttimeout(integer.valueof(env.getproperty(pool.checkouttimeout)));
datasource.setacquireretryattempts(2);
return datasource;
}
/**
* 配置事物管理器
* @param datasource
* @return
*/
@bean
public platformtransactionmanager transactionmanager(datasource datasource) {
return new datasourcetransactionmanager(datasource);
}
@bean
public jdbctemplate jdbctemplate (datasource datasource) {
return new jdbctemplate(datasource);
}
}
config.properties 文件在 resources 目
#数据库配置
db.url=jdbc:mysql://192.168.182.135:3306/bank
db.driver=com.mysql.jdbc.driver
db.user=root
db.password=123456
#数据库连接池配置
#连接池中保留的最小连接数
pool.minpoolsize=5
#连接池中保留的最大连接数
pool.maxpoolsize=30
#获取连接超时时间
pool.checkouttimeout=1000
配置 servlet.xml, 由webconfig类实现
thymeleaf 模板配置也在下面
package com.liulu.bank.config;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.componentscan;
import org.springframework.context.annotation.configuration;
import org.springframework.stereotype.controller;
import org.springframework.web.servlet.viewresolver;
import org.springframework.web.servlet.config.annotation.defaultservlethandlerconfigurer;
import org.springframework.web.servlet.config.annotation.enablewebmvc;
import org.springframework.web.servlet.config.annotation.webmvcconfigureradapter;
import org.thymeleaf.templateengine;
import org.thymeleaf.spring4.springtemplateengine;
import org.thymeleaf.spring4.templateresolver.springresourcetemplateresolver;
import org.thymeleaf.spring4.view.thymeleafviewresolver;
import org.thymeleaf.templatemode.templatemode;
import java.nio.charset.standardcharsets;
/**
* user : liulu
* date : 2016-10-7 15:16
*/
@configuration
@enablewebmvc // 启用 springmvc ,相当于 xml中的
@componentscan(basepackages = {com.liulu.bank.controller, com.liulu.lit},
includefilters = @componentscan.filter(classes = controller.class),
usedefaultfilters = false)
public class webconfig extends webmvcconfigureradapter {
/**
* 设置由 web容器处理静态资源 ,相当于 xml中的
*/
@override
public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer) {
configurer.enable();
}
/**
* 下面三个bean 配置 thymeleaf 模板
* @return
*/
@bean
public springresourcetemplateresolver templateresolver() {
springresourcetemplateresolver templateresolver = new springresourcetemplateresolver();
templateresolver.setprefix(/web-inf/templates/);
templateresolver.setsuffix(.html);
templateresolver.settemplatemode(templatemode.html);
templateresolver.setcharacterencoding(string.valueof(standardcharsets.utf_8));
return templateresolver;
}
@bean
public templateengine templateengine(springresourcetemplateresolver templateresolver) {
springtemplateengine templateengine = new springtemplateengine();
templateengine.settemplateresolver(templateresolver);
return templateengine;
}
@bean
public viewresolver viewresolver(templateengine templateengine) {
thymeleafviewresolver viewresolver = new thymeleafviewresolver();
viewresolver.settemplateengine(templateengine);
viewresolver.setcharacterencoding(string.valueof(standardcharsets.utf_8));
return viewresolver;
}
}
