# SpringMVC_Study
**Repository Path**: thread-git/SpringMVC_Study
## Basic Information
- **Project Name**: SpringMVC_Study
- **Description**: Spring-MVC学习笔记,主要用于记录
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-06-02
- **Last Updated**: 2022-06-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringMVC
MVC:模型(dao,service) 视图 (jsp) 控制器(servlet)
## 1、常规依赖
```xml
junit
junit
4.12
org.springframework
spring-webmvc
5.2.0.RELEASE
javax.servlet
servlet-api
2.5
javax.servlet.jsp
jsp-api
2.2
javax.servlet
jstl
1.2
```
## 2、文件导出格式异常的一般处理方式
```xml
src/main/resources
**/*.properties
**/*.xml
src/main/java
**/*.properties
**/*.xml
```
## SpringMVC执行原理
## **3、简要分析执行流程**
1、DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
如上url拆分成三部分:
http://localhost:8080服务器域名
SpringMVC部署在服务器上的web站点
hello表示控制器
通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
2、HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
3、HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
4、HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
5、HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
6、Handler让具体的Controller执行。
7、Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
8、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
9、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
10、视图解析器将解析的逻辑视图名传给DispatcherServlet。
11、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
12、最终视图呈现给用户。
每次以Maven方式创建SpringMVC项目时都需要注意修改Artifacts里的lib,新建lib包 点+号导入

## 4、复用配置代码
#### web.xml
```xml
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
springmvc
/
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encoding
/*
```
#### 注解开发时的springmvc-servlet.xml
```xml
```
#### HelloController.java
测试代码
```java
@RestController //这样写会使得返回的hello变为字符串
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "Hello SpringMVC Annotation");
// 返回的结果和配置文件里拼接而成 hello.jsp
return "hello";
}
}
```
Restful风格一般写法记录
```java
// 普通方式 :http://localhost:8080/springmvc_04_controler_war_exploded/add?a=1&b=2
// Restful :http://localhost:8080/springmvc_04_controler_war_exploded/add/a/b
// @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
@GetMapping("/add/{a}/{b}")
public String test(@PathVariable int a,@PathVariable int b,Model model){
int res=a+b;
model.addAttribute("msg",res);
return"test";
}
```
关于地址栏传参
```java
@RequestMapping("/user/t1")
public String test1(@RequestParam("username") String name,Model model){
System.out.println("前端参数:"+name);
model.addAttribute("msg",name);
return"test";
}
// Restful
@RequestMapping("/user/t2/{name}")
public String test2(@PathVariable String name,Model model){
System.out.println("前端参数:"+name);
model.addAttribute("msg",name);
return"test";
}
/*
接收前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接试用
假设传递的是一个对象,匹配对象中的字段名,名字一致则ok 不一致则为null
*/
@GetMapping("/user/t3")
public String test3(User user){
System.out.println("前端参数:"+user);
return"test";
}
```