一、新建一個(gè)MyWebAppInitializer類(lèi)譬嚣,并繼承AbstractAnnotationConfigDispatcherServletInitializer類(lèi)
package com.czy.springmvc.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 前端控制器的配置礁芦,對(duì)應(yīng)web.xml
* @author czy
*
*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/*返回配置IoC容器的類(lèi)的類(lèi)對(duì)象,對(duì)應(yīng)appConfig.xml*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {AppConfig.class};
}
/*返回配置Spring MVC 的類(lèi)的類(lèi)對(duì)象,對(duì)應(yīng)視圖解析器配置*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] {WebConfig.class};
}
/*指定如何映射前端控制器*/
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
/*配置過(guò)濾器堂氯,在進(jìn)入前端控制器之前要執(zhí)行的過(guò)濾器*/
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
//編碼過(guò)濾器
new CharacterEncodingFilter("utf-8", true),
// 瀏覽器form表單只支持GET與POST請(qǐng)求
//而DELETE、PUT等method并不支持
//spring3.0添加了一個(gè)過(guò)濾器左电,可以將這些
//請(qǐng)求轉(zhuǎn)換為標(biāo)準(zhǔn)的http方法廉侧,使得支持GET段誊、
//POST栈拖、PUT與DELETE請(qǐng)求涩哟,該過(guò)濾器為
//HiddenHttpMethodFilter。
new HiddenHttpMethodFilter(),
//會(huì)話延遲過(guò)濾器潜腻,提醒:配置會(huì)話延遲時(shí)需要
//用到hibernate的SessionFactory器仗,所以在IoC容器中要記得配置SessionFactory的Bean
new OpenSessionInViewFilter()
};
}
}
這里的MyWebAppInitializer相當(dāng)于web.xml中的spring 前端控制器的配置。繼承了AbstractAnnotationConfigDispatcherServletInitializer類(lèi)后應(yīng)該重寫(xiě)其中的getRootConfigClasses()妓盲、getServletConfigClasses()和getServletMappings()方法。
其中g(shù)etRootConfigClasses()返回一個(gè)配置IoC容器的類(lèi)的類(lèi)對(duì)象的數(shù)組 -- Class<?>[]檀夹。getServletConfigClasses()返回一個(gè)配置Spring MVC 的類(lèi)的類(lèi)對(duì)象的數(shù)組策橘。getServletMappings()則是配置前端的請(qǐng)求過(guò)濾器路徑。
二蚌堵、新建AppConfig.class吼畏,并創(chuàng)建基本的Bean
package com.czy.springmvc.config;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
/**
* SpringIoC 容器的配置
* @author czy
*
*/
@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement
@ComponentScan(basePackages = "com.czy.springmvc")
//指定哪里掃描映射器
@MapperScan("com.czy.mapper")
public class AppConfig {
/**
* 將dbcp2的連接池交由SpringIoC容器進(jìn)行管理
* @return DataSource連接池
*/
@Bean
public DataSource dataSourece() {
BasicDataSource dataSourece = new BasicDataSource();
/*Driver driver = new com.mysql.jdbc.Driver();
dataSourece.setDriver(driver);*/
/*Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
dataSourece.setDriver(driver);*/
dataSourece.setDriverClassName("com.mysql.jdbc.Driver");
dataSourece.setUrl("jdbc:mysql://localhost:3306/dang?useUnicode=true&characterEncoding=utf8");
dataSourece.setUsername("root");
dataSourece.setPassword("123456");
dataSourece.setInitialSize(10);
dataSourece.setMaxTotal(50);
dataSourece.setMaxWaitMillis(10000);
return dataSourece;
}
/**
* 將Hibernate的SessionFactory交由SpringIoC容器進(jìn)行管理
* @param dataSource 為Hibernate的SessionFactory注入DataSource連接池
* @return Hibernate的SessionFactory
*/
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
LocalSessionFactoryBean bean =
new LocalSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setPackagesToScan("com.czy.springmvc.entity");
Properties props = new Properties();
props.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
props.setProperty("hibernate.show_sql", "true");
props.setProperty("hibernate.format_sql", "true");
bean.setHibernateProperties(props);
return bean;
}
/*Mybatis的SessionFactory配置*/
@Bean
public SqlSessionFactory mybatisSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean f = new SqlSessionFactoryBean();
f.setDataSource(dataSource);
return f.getObject();
}
/**
* 事務(wù)管理器
* @param sessionFactory 為事務(wù)管理器注入Hibernate SessionFactory
* @return 事務(wù)管理器
*/
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager tm =
new HibernateTransactionManager();
tm.setSessionFactory(sessionFactory);
return tm;
}
/**
* 配置springmvc提供的驗(yàn)證器工廠丑婿,負(fù)責(zé)創(chuàng)建驗(yàn)證器,
* 底層需要hibernate提供實(shí)現(xiàn)
* @return
*/
@Bean
public Validator globalValidator () {
LocalValidatorFactoryBean bean =
new LocalValidatorFactoryBean();
return bean;
}
}
三秒旋、新建WebConfig
package com.czy.springmvc.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
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.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
/**
* 視圖解析器的配置
* @author czy
*
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.czy.springmvc.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
/*
* 過(guò)濾路徑為"/"時(shí)迁筛,需要繼承 WebMvcConfigurerAdapter
* 重寫(xiě)configureDefaultServletHandling來(lái)告訴它靜態(tài)資源
* 還是交由原來(lái)默認(rèn)的servlet來(lái)處理
* 配置視圖解析器
*/
@Bean
public ViewResolver internalResourceViewResolver() {
InternalResourceViewResolver resolver =
new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/jsp/");
resolver.setSuffix(".jsp");
//設(shè)置優(yōu)先級(jí)瑰煎,在程序中也許會(huì)用到其它頁(yè)面生成模板酒甸,所以可以選擇將
//jsp的優(yōu)先級(jí)設(shè)大一下插勤,優(yōu)先級(jí)越大农尖,選用的順序越靠后
resolver.setOrder(10);
return resolver;
}
/*
* configurer.enable() 指定由默認(rèn)的servlet來(lái)處理靜態(tài)資源
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
到此就完成了基本的SpringMVC的框架搭建。需要的jar包可以自行百度一下助隧。利用maven管理還是很方便的并村。
四滓技、Validator的配置和使用
在AppConfig中令漂,已經(jīng)配置了springmvc提供驗(yàn)證器工廠。
/*
* 配置springmvc提供的驗(yàn)證器工廠荚孵,負(fù)責(zé)創(chuàng)建驗(yàn)證器处窥,
* 底層需要hibernate提供實(shí)現(xiàn)
* @return
*/
@Bean
public Validator globalValidator () {
LocalValidatorFactoryBean bean =
new LocalValidatorFactoryBean();
return bean;
}
在接下來(lái)的使用中就很簡(jiǎn)單了滔驾。比如驗(yàn)證用戶(hù)名長(zhǎng)度俄讹,首先創(chuàng)建User類(lèi),在User類(lèi)中的name上摊阀,用@Pattern注解中的regexp和屬性指明驗(yàn)證規(guī)則胞此。這里用的是正則表達(dá)式跃捣。
對(duì)于驗(yàn)證的其它規(guī)則酣胀,大家可以自行去了解。
然后在控制器中只需要用@Valid聲明User是需要進(jìn)行驗(yàn)證的甚脉,并且在user參數(shù)后緊跟一個(gè)Errors 參數(shù)铆农,這里Errors 必須在需要被驗(yàn)證的參數(shù)的后面一個(gè)墩剖。Errors 里面保存著驗(yàn)證后的信息等。通過(guò)errors.hasErrors()可以知道姓名的長(zhǎng)度驗(yàn)證是否符合驗(yàn)證條件。如果滿(mǎn)足則返回false蒲障,不滿(mǎn)足返回true瘫证。
利用jsp來(lái)簡(jiǎn)單驗(yàn)證一下
在參數(shù)請(qǐng)求中毙籽,name的長(zhǎng)度先指定為兩位數(shù)毡庆。不符合驗(yàn)證條件么抗,則顯示今天星期六
然后就在請(qǐng)求參數(shù)中蝇刀,填寫(xiě)符合驗(yàn)證條件的name,則顯示你好 + user.getName()捆探。