一、替代web.xml文件
Servlet3.0新特性
web.xml文件可以不用再写了,它提供了一个接口:ServletContainerInitializer

服务器在启动的时候会自动从容器中找ServletContainerInitializer接口实现类,自动调用onStartup()来完成Servlet的上下文初始化。
Spring3.1提供了实现类
实现类为:SpringServletContainerInitializer


从上面可以看到在服务器启动的时候,它会去加载所有实现WebApplicationInitializer接口的类

在这个接口下有一个子类:AbstractAnnotationConfigDispatcherServletInitializer

一旦我们自己提供类继承这个类之后,web服务器在启动时就会根据它来初始化Servlet上下文

自定义类替代web.xml
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* Spring的配置
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
/**
* SpringMVC的配置
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
/**
* DispatcherServlet的映射路径
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* 配置过滤器
* @return
*/
@Override
protected Filter[] getServletFilters() {
// 字符编码过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceRequestEncoding(true);
characterEncodingFilter.setForceResponseEncoding(true);
// 隐藏域请求方法过滤器
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
}
Spring配置类
/**
* Spring的配置类
*/
@Configuration
public class SpringConfig {
}
SpringMVC配置类
/**
* SpringMVC配置类
*/
@Configuration
@ComponentScan("com.xiaoxie") // 指定组件扫描包
@EnableWebMvc // 开启注解驱动
public class SpringMVCConfig {
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML");
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false); // 关闭缓存,开发时可以关闭,这样改动即会生效
return resolver;
}
}
SpringMVC的其它配置
SpringMVC配置类实现接口:WebMvcConfigurer
重写法方configureDefaultServletHandling可以开启默认Servlet处理静态资源
/**
* 开启静态资源访问(默认Servlet处理)
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
注意:一般来说是指定静态资源的访问规则,而不是直接启用DefaultServlet
所以上面的开启静态资源访问一般是不开启的,而是重写下面的方法来指定静态资源的访问规则
/**
* 指定静态资源位置
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
重写方法可以添加视图映射
/**
* 视图映射
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/test").setViewName("test");
}
二、异常处理器
新增一个类做全局异常处理
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler
public String tip(Exception e, Model model) {
// 把数据存储到request域中
model.addAttribute("ex",e);
return "tip"; // 返回逻辑视图
}
}
三、拦截器
新增一个拦截器
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor - preHandle");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor - postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor - afterCompletion");
}
}
四、模板文件及静态资源
模板文件
在前面的SpringMVC的配置类中可以看到模板文件需要放到WEB-INF/templates下
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>index</h1>
</body>
</html>
test.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>test</h1>
</body>
</html>
tip.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>出现异常了,请联系管理员!!</h1>
<div th:text="${ex}"></div>
</body>
</html>
静态资源
根据SpringMVC配置类可以看到模板文件需要放到/static下,并且访问的路径是以/static开始的
经过上述的配置我们就替换掉了web.xml文件,开发的基它部分还是按照原来的来即可。
SpringMVC全注解开发:替代web.xml等配置
363

被折叠的 条评论
为什么被折叠?



