M : 模型层,指的是JavaBean,比如实体类和业务处理bean:service,Dao对象等,用于处理业务逻辑和数据访问
V : 视图层,html或jsp页面,作用是与用户进行交互,展示数据
C : Controller,控制层,指的是servlet,用于接收请求和响应
MVC的工作流程:用户通过view发送请求,请求被Controller接收,Controller调用Model层处理请求并返回给Controller,Controller再根据结果找到View并渲染数据,响应给浏览器
RequestMapping注解
-
@RequestMapping
: 设置访问路径,写在方法上可以直接通过这个路径访问该方法
@RequestMapping
标识一个类:设置请求路径的初始信息,@RequestMapping
标识一个方法:设置请求路径的具体信息.比如写在类上是@RequestMapping("/test)
,同时在方法上是@RequestMapping("/hello")
,那么访问路径是test/hello
-
@RequestMapping
的value属性是请求(方法)的地址,可以写多个.value属性必须写 -
@RequestMapping
的method属性 根据请求方式(get,post)来访问方法,也可以写多种请求方式. 不设置的话可以匹配任何的请求方式. 注意:get请求方式比post快,post比get安全,post对参数个数没有限制 -
param属性:根据参数匹配请求,必须同时满足所有参数
-
派生注解:
GETMapping
,POSTMapping
等 -
ant风格的路径:
?:表示任意的单个字符
表示任意的0个或多个字符
**
: 表示任意层目录
注意:在使用**
时,只能使用/**/xxx
的方式 -
@RequestBody
: 设置返回值类型,将方法返回值作为响应内容 -
@Controller
: 声明控制器的注解,作用是将一个类定义为bean
@RequestMapping("/testPath/{id}")
public String testPath(@PathVariable("id")Integer id){
System.out.println("id:"+id);
return "success";
}
@PathVariable
: 将占位符(id)代表的值赋值给控制器方法的形参
获取请求参数
在控制器方法的形参位置设置和请求参数同名的形参,当发送请求时就会将请求参数赋值给相应的形参
<a th:href="@{/testParam(username='admin',password=123456)}">测试获取请求参数-->/testParam</a><br>
@RequestMapping("/testParam")
public String testParam(String username, String password){
System.out.println("username:"+username+",password:"+password);
return "success";
}
- 如果有多个同名的请求参数,可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数
- 若使用字符串数组类型的形参,此参数的数组中包含了每一个数据
- 若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果
如果请求参数和形参不一样,这时需要用到@RequestParam
注解,它可以绑定请求参数和形参的关系
@RequestParam
的三个属性:
value
:为形参赋值的请求参数的名字(请求参数写里面)
required
:设置是否必须传输此请求参数,默认值为true
设置为true时,表示必须传输value
所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue
属性,则页面报错400:Required String parameter ‘xxx’ is not present;若设置为false,则可以不传,若没有传输,则这个值为null
defaultValue
:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值
@RequestHeader
: 将请求头信息和控制器方法的形参绑定映射关系
@CookieValue
: 将cookie数据和控制器方法的形参绑定映射关系
绑定实体类(POJO
): 将控制器方法的形参设置为一个实体类类型,如果这时请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值.
域对象
使用ModelAndView: 向request域共享数据, 设置视图名称:在页面上显示信息
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
/**
* ModelAndView有Model和View的功能
* Model主要用于向请求域共享数据
* View主要用于设置视图,实现页面跳转
*/
ModelAndView mav = new ModelAndView();
//向请求域共享数据
mav.addObject("testScope", "hello,ModelAndView");
//设置视图,实现页面跳转
mav.setViewName("success");
return mav;
}
使用Model:
@RequestMapping("/testModel")
public String testModel(Model model){
model.addAttribute("testScope", "hello,Model");
return "success";
}
使用Map:
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("testScope", "hello,Map");
return "success";
}
使用ModelMap:
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("testScope", "hello,ModelMap");
return "success";
}
Map,Model,ModelMap关系:
public interface Model{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}
springmvc的视图
ThymeleafView:
当视图名称没有任何前缀时(比如 return "hello"
),Spring 会使用配置的视图解析器(如 InternalResourceViewResolver
或 ThymeleafViewResolver
)来解析视图名称,并将其映射到一个实际的视图文件(如 hello.html
、hello.jsp
等),这是通过 转发的方式实现跳转.
@RequestMapping("/testHello")
public String testHello(){
return "hello";
}
转发视图
当视图名称以 forward:
前缀开头时,Spring 会创建一个 InternalResourceView
,然后将前缀 forward:
去掉,剩余部分作为目标视图路径,并跳转到目标视图。请求路径不会改变,用户在浏览器中看到的 URL 地址不会改变,跳转过程发生在服务器内部
例如"forward:/",“forward:/employee”
@RequestMapping("/testForward")
public String testForward(){
return "forward:/testHello";
}
重定向视图
当视图名称以 redirect:
前缀开头时,Spring 会创建一个 RedirectView
,然后将前缀 redirect:
去掉,剩余部分作为目标 URL。服务器会返回一个重定向响应给客户端(HTTP 302),使得客户端重新发送请求到指定的 URL,浏览器会改变 URL 地址并重新加载页面。
例如"redirect:/",“redirect:/employee”
@RequestMapping("/testRedirect")
public String testRedirect(){
return "redirect:/testHello";
}
Restful:
- 资源导向: RESTful 以资源为中心,资源指代服务器上可以访问的实体(如用户、商品、订单等)。例如:
/users
表示用户的集合。/users/{id}
表示特定 ID 的用户。
标准 HTTP 方法:
- GET:获取资源。
- POST:创建资源。
- PUT:更新资源。
- DELETE:删除资源。
请求报文转换器
HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文.HttpMessageConverter提供了两个注解:@RequestBody
,@ResponseBody
@RequestBody
: @RequestBody
可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody
进行标识,当前请求的请求体就会为注解标识的形参赋值
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String requestBody){
System.out.println("requestBody:"+requestBody);
return "success";
}
@ResponseBody
: 用于标识控制器方法,将该方法的返回值直接作为响应报文的响应体响应到浏览器
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){
return "success";
}// 结果:浏览器页面显示success
- 加了
@ResponseBody
注解:方法返回的String
类型数据"success"
将直接作为 HTTP 响应体的内容返回给客户端。也就是说响应体的内容是"success"
,而不是跳转到某个视图页面。 - 没有加
@ResponseBody
注解:Spring MVC 会根据返回的字符串"success"
查找对应的视图名称(例如success.jsp
或success.html
),然后将该视图渲染到客户端。
@RestController
@RestController
注解一个复合注解,标识在控制器的类上,相当于为类添加了@Controller
注解,并且为其中的每个方法添加了@ResponseBody
注解
- 拦截器: 用于拦截控制器方法的执行
三个方法:
preHandle()
:控制器方法执行之前执行,返回值为boolean,true表示放行,即调用控制器方法;false表示拦截,即不调用控制器方法.
postHandle()
:控制器方法执行之后执行.
afterComplation()
:处理完视图和模型数据,渲染视图完毕之后执行.
多个拦截器的执行:
-
若每个拦截器的
preHandle()
都返回true , 此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:preHandle()
会按照配置的顺序执行,而postHandle()
和afterComplation()
会按照配置的反序执行 -
若某个拦截器的
preHandle()
返回了false ,preHandle()
返回 false 和它之前的拦截器的preHandle()
都会执行,postHandle()
都不执行,返回false的拦截器之前的拦截器的afterComplation()
会执行
以下是 Spring MVC 常用组件的表格:
组件/注解 | 功能 | 作用 |
---|---|---|
**DispatcherServlet | 前端控制器,负责接收并分发所有 HTTP 请求。 | 作为应用的入口,处理请求并将其转发给适当的控制器方法。 |
Controller | 处理业务逻辑的组件,通过注解标记,如 @Controller 或 @RestController 。 | 处理客户端请求,执行相应的业务逻辑,并返回视图或数据。 |
ModelAndView | 携带模型数据和视图信息的对象。 | 将处理结果与数据传递给视图层进行渲染,最终生成响应返回客户端。 |
ViewResolver | 视图解析器,负责根据逻辑视图名称解析到实际的视图实现。 | 根据逻辑视图名称找到相应的视图模板并渲染响应内容。 |
HandlerMapping | 请求映射器,负责将 HTTP 请求映射到相应的处理方法(控制器方法)。 | 根据请求的 URL 和方法,确定请求的处理器。 |
HandlerInterceptor | 请求拦截器,类似于过滤器,在请求处理前后进行操作。 | 用于日志记录、权限检查、请求修改等操作。 |
@RequestMapping | 映射 HTTP 请求到处理方法上。 | 定义哪些方法处理哪些类型的 HTTP 请求。 |
@PathVariable | 从 URL 路径中提取参数。 | 提取 URL 中的参数,通常用于 RESTful 风格的请求。 |
@RequestParam | 从请求参数中提取参数。 | 提取查询参数并将其绑定到方法参数上。 |
@ModelAttribute | 将请求中的参数绑定到方法参数(模型对象)。 | 自动将请求参数映射到 Java 对象,简化数据绑定和验证。 |
BindingResult | 用于存储数据绑定和验证的结果。 | 捕获绑定或验证过程中的错误。 |
@ResponseBody | 将方法返回值直接写入 HTTP 响应体中。 | 返回 JSON 或 XML 数据,常用于 RESTful API。 |
@RequestBody | 将请求体的内容绑定到 Java 对象。 | 将请求体中的数据(如 JSON)转换为 Java 对象。 |
Model | 用于传递数据到视图层的接口。 | 在控制器方法中添加属性,用于将数据传递给视图。 |
@SessionAttributes | 用于将控制器属性保存到 HTTP 会话中。 | 在多个请求之间共享数据,通常用于存储用户会话数据或购物车等信息。 |
@ExceptionHandler | 用于捕获控制器方法抛出的异常并处理。 | 集中处理特定异常,通常用于全局异常处理。 |
@ResponseStatus | 设置 HTTP 响应状态码和说明信息。 | 用于自定义异常类的响应状态(如 404、500 等)。 |