两种方式
一、
创建一个类实现 这个类: WebApplicationInitializer
官方文档:https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/web.html#spring-web
官方示例代码:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
// Load Spring web application configuration
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
ac.refresh();
// Create and register the DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
自己实现的代码:
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletRegistration.Dynamic;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
//相当于web.xml
public class WebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
/**
* Load Spring web application configuration
*/
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(Config.class);//注册mvc的配置类
ctx.setServletContext(servletContext);
/**
* 注册DispatcherServlet(调度工作,控制流程)
*/
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));//配置DispatcherServlet
servlet.addMapping("/");//url-pattern路径
servlet.setLoadOnStartup(1);//启动顺序
/**
* 注册filter 这里是字符编码utf-8
*/
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);//强制
javax.servlet.FilterRegistration.Dynamic filter = servletContext.addFilter("encoding", characterEncodingFilter);
filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class),true,"*");
}
}
Config.class
import com.sunsharing.tools.testInterceptors;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Configuration//相当于配置文件
@ComponentScan("包名")//配置包扫描(Controller,Repository,service等)
@EnableWebMvc//启用mvc支持 annotation-driven
@MapperScan(value="mapper包名",sqlSessionFactoryRef = "sqlSessionFactory")//mapper扫描器
@EnableTransactionManagement//开启事务
public class Config extends WebMvcConfigurerAdapter {
/**
* jsp视图解析器的bean
*/
@Bean
public UrlBasedViewResolver setupViewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
/**
* 配置数据源
*/
@Bean(name = "dataSource")
public DriverManagerDataSource getDataSource() {
try {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//useAffectedRows 可以返回删除更新受影响行数 使用:在mapper里面返回值设置为int而不是void
dataSource.setUrl("jdbc:mysql://localhost:3306/movies?useAffectedRows=true");
dataSource.setUsername("root");
dataSource.setPassword("");
return dataSource;
} catch (Exception e) {
return null;
}
}
/**
* 创建事务管理 用来指定数据源
*/
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(getDataSource());
}
/**
* 配置SqlSessionFactory,给MapperScan调用
*/
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(getDataSource());
return sessionFactory.getObject();
}
/**
* mvc返回资源编码设置为utf-8
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//在StringHttpMessageConverter构造方法设置utf-8编码
StringHttpMessageConverter shmc = new StringHttpMessageConverter(Charset.forName("utf-8"));
converters.add(shmc);
converters.add(new MappingJackson2HttpMessageConverter());
}
/**
* mvc资源路径配置
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//后面根据路径自己配置
registry.addResourceHandler("/**").addResourceLocations("/");
}
/**
* mvc拦截器配置
*/
//@Override
//public void addInterceptors(InterceptorRegistry registry) {
//
// registry.addInterceptor(new testInterceptors()).addPathPatterns("/home");
// }
}
二、
继承 AbstractAnnotationConfigDispatcherServletInitializer
官方示例代码:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { App1Config.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/app1/*" };
}
}
自己实现:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { Config.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter("UTF-8") };
}
/**
* 跳转404视图需要设置ThrowExceptionIfNoHandlerFound为true(抛出异常)
*/
@Override
protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) {
DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext);
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
return dispatcherServlet;
}
}
Config.class在第一个方法里了。
404全局的控制器:
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;
/**
* 全局 配置错误页面跳转
*/
@ControllerAdvice
public class NoHandlerFoundControllerAdvice {
@ExceptionHandler(NoHandlerFoundException.class)
public String processMethodNotSupportedException(Exception exception) {
return "error";
}
@ExceptionHandler(Exception.class)
public String AllSupportedException(Exception exception) {
return "error";
}
}
会返回到error.jsp