# springMVC-注解配置
**Repository Path**: liubin2000/springMVC-firstDemo
## Basic Information
- **Project Name**: springMVC-注解配置
- **Description**: 完全使用配置类和注解来代替web.xml和spring MVC.xml进行配置的入门项目
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-10-16
- **Last Updated**: 2021-10-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Spring-MVC-完全注解式配置
## 前言:本文是springMVC的入门级案例,采用完全注解式开发
> versions:
>
> java - 1.8
>
> tomcat - 8.5
>
> spring - 5.3.1
>
> gitee地址:
## 一、项目依赖
+ pom.xml
```xml
1.8
1.8
1.8
war
org.springframework
spring-webmvc
5.3.1
ch.qos.logback
logback-classic
1.2.3
javax.servlet
javax.servlet-api
3.1.0
provided
org.thymeleaf
thymeleaf-spring5
3.0.12.RELEASE
com.fasterxml.jackson.core
jackson-databind
2.12.4
commons-fileupload
commons-fileupload
1.3.1
```
## 二、使用Java配置类代替web.xml 和 springMVC.xml
### 1. src文件目录
```
|-- src
|-- main
| |-- java
| | |-- com
| | |-- lb
| | |-- mvc
| | |-- config
| | | |-- SpringConfig.java
| | | |-- WebConfig.java
| | | |-- WebInit.java
| | |-- controller
| | | |-- ExceptionController.java
| | | |-- TestController.java
| | |-- interceptors
| | |-- MyInterceptor.java
| |-- resources
| |-- webapp
| |-- WEB-INF
| |-- templates
| |-- error.html
| |-- index.html
| |-- success.html
|-- test
|-- java
```
### 2.**WebInit类**
> 因其继承于**AbstractAnnotationConfigDispatcherServletInitializer**类,因此Tomcat将会自动加载这个类
``` java
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 指定spring的配置类
*
* @return
*/
@Override
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
/**
* 指定SpringMVC的配置类
*
* @return
*/
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
/**
* 指定DispatcherServlet的映射规则,
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* 注册过滤器
*
* @return
*/
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter("UTF-8", true);
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
}
```
### 3. SpringConfig类
> 最基础的mvc项目不用配置该类,仅做个标识
``` java
@Configuration
public class SpringConfig {
}
```
### 4. WebConfig类
> ```
> /**
> * 该类用于代替SpringMVC的配置文件,可以实现如下功能的配置
> * 1. 注解扫描 2. 视图解析器 3. view-controller 4. default-servlet-handler
> * 5. mvc注解驱动 6. 文件上传解析器 7. 异常处理 8.拦截器
> */
> ```
``` java
@Configuration
@ComponentScan(basePackages = {"com.lb.mvc"}) // 1. 注解扫描
@EnableWebMvc // 5. mvc注解驱动
public class WebConfig implements WebMvcConfigurer {
//4. default-servlet-handler
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 8.拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**"); // 拦截所有路径
}
// 3. view-controller
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
// 6. 文件上传解析器
@Bean
public CommonsMultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
//7. 异常处理 , 也可以另外写类加上@ControllerAdvice
/*@Override
public void configureHandlerExceptionResolvers(List resolvers) {
SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
properties.setProperty("ArithmeticException", "error");
exceptionResolver.setExceptionMappings(properties);
exceptionResolver.setExceptionAttribute("exception");
resolvers.add(exceptionResolver);
}*/
/**
* 配置模板解析器
*
* @return
*/
@Bean
public ITemplateResolver templateResolver() {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
//ServletContextTemplateResolver 需要一个 ServletContext 作为构造参数,可以通过 WebApplicationContext 获得
ServletContextTemplateResolver templateResolver =
new ServletContextTemplateResolver(webApplicationContext.getServletContext());
templateResolver.setPrefix("/WEB-INF/templates/"); // 视图前缀
templateResolver.setSuffix(".html"); // 视图后缀
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
/**
* 配置模板引擎
*
* @param templateResolver 模板解析器
* @return
*/
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
/**
* 配置视图解析器, thymeleaf
*
* @param templateEngine 模板引擎
* @return
*/
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setOrder(1);
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
}
```
### 5. MyInterceptor类
``` java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器配置成功");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
```
### 6. ExceptionController类
> 异常处理类
``` java
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {ArithmeticException.class, NullPointerException.class})
public String test(Exception e, Model model) {
model.addAttribute("exception", e); // 将异常类共享到request域中
return "error"; // 转发到error视图
}
}
```
### 7. TestController类
``` java
@Controller
public class TestController {
@RequestMapping("/testArithmeticException")
public String testArithmeticException() {
int i = 10 / 0;
return "success";
}
@RequestMapping("/testNullPointerException")
public String testNullPointerException() {
Object o = null;
System.out.println(o.hashCode());
return "success";
}
}
```
### 8. index、success、error页面
``` html
index
首页
```
``` html
success
success
```
``` html
error
```
别气馁,马上就要成功了,还差最后一步!
## 三、Idea集成Tomcat
完整过程: https://www.jianshu.com/p/7e026b76424e