- 什么是MVC
- 什么是SpringMVC
- 配置
- RestMapping
- 位置
- value
- method
- method的注解
- params
- SpringMVC支持路径的占位符
- SpringMVC获取请求参数
- 通过servletAPI获取
- HttpServletRequest
- 通过参数名获取
- 保证控制器参数名和请求参数名一致
- 使用@RequestParam
- 通过POJO(实体类)获取参数
- 保证请求参数名和实体类属性名一致
- @RequestBody
- 请求参数乱码问题
- SpringMVC流程
- HandlerMapping
- HandlerInterceptor:Handler执行前后拦截器
- HandlerExecutionChain:
- HandlerAdapter
- Handler
- 域对象共享数据
M:模型层,处理数据——业务层和数据处理层(service,dao)
V:视图层,前端
C:控制层,指Servlet,作用是接收请求和响应浏览器——(controller)
什么是SpringMVC基于Servlet的处于控制层的框架
整合在spring中
优点:spring原生家族,代码简洁,性能卓越,通过前端控制器DispatcherServlet对请求和响应进行统一处理(不用自己写Servlet了)。
配置加以下依赖
org.springframework spring-webmvc 5.1.9.RELEASE javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2 javax.servlet jstl 1.2 org.thymeleaf thymeleaf-spring5 3.0.12.RELEASE
web.xml
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:bean.xml springmvc /
classpath:bean.xml
MVC配置文件的路径,这里和扫描bean注解放在一起了
防止报错信息出现,加个log4j.properties
log4j.rootLogger=info,CONSOLE,A
log4j.addivity.org.apache=false
log4j.appender.ConSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout.ConversionPattern=%c %d{yyyy-MM-dd HH:mm:ss} -%-4r [%t] %-5p %x - %m%n
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=gbk
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.A=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A.File=${catalina.home}/logs/jeef_log/PurePro_
log4j.appender.A.DatePattern=yyyy-MM-dd'.log'
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L : %m%n
为了可视化便于·测试,在bean.xml文件加Thymeleaf视图解析器(Thymeleaf依赖之前加了)
动态页面文件的路径,WEB-INF/templates
RestMapping将请求和处理请求的控制器关联起来。
位置在类上面
@RequestMapping("api/v1/pri/user")
public class UserController
在方法上面
@RequestMapping("save")
//下单方法,两个参数,一个是下单的数据,一个是请求携带的数据,比如用户数据
public JsonData saveOrder(@RequestBody OrderRequest videoOrderRequest, HttpServletRequest request){
Integer userId = (Integer) request.getAttribute("user_id");
int rows = videoOrderService.save(userId,videoOrderRequest.getVideoId(),videoOrderRequest.getDishId());
return rows ==0 ? JsonData.buildError("下单失败") : JsonData.buildSuccess();
}
value
value中填写请求地址的资源路径,可以填多个,满足一个即可。
methodmethod属性通过请求的请求方式(get,post等)匹配请求映射
目前浏览器只支持get,post
默认是匹配任何请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
RequestMethod.GET
RequestMethod.POST
RequestMethod.PUT
RequestMethod.DELETE
method的注解@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping =@RequestMapping(method =RequestMethod.GET)
paramsparams通过请求参数来匹配请求映射
@RequestMapping(
value = "/hello",
method = {RequestMethod.POST},
params={"username","password"}
)
params={“username”}——需要有username这一参数
params={"!username"}——不能有username这一参数
params={"username=”admin“}——需要有username这一参数,且等于admin
params={"username!=”admin“}——需要有username这一参数,且不等于admin
SpringMVC支持路径的占位符原始方式 /deleteUser?id=1
rest方式 /deleteUser/1
通常用于restful风格中,当请求路径将某些数据传入服务器中。就可以在@RequestMapping中value中通过占位符表示属性。
@RequestMapping("/test/{id}/{username}")
test(@PathVariable("id")String id,@PathVariable("username")String username)
{
}
SpringMVC获取请求参数
通过servletAPI获取
HttpServletRequest
通过HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型是封装了请求报文的对象。
@RequestMapping("list")
public JsonData listOrder(HttpServletRequest request){
Integer userId = (Integer) request.getAttribute("user_id");
List videoOrderList=videoOrderService.listOrder(userId);
return JsonData.buildSuccess(videoOrderList);
}
通过参数名获取
保证控制器参数名和请求参数名一致
@RequestMapping("register")
public JsonData register(String username,String password)
使用@RequestParam
注解有两个属性: value、required,defaultValue; value用来指定要传入值的id名称(即请求参数的key对应,也是表单属性的name的值对应),required用来指示参数是否必须绑定,默认为true即请求参数必须携带该参数,不携带将报错;required为false,那么defaultValue是参数的默认值。
将请求变量名与方法参数名绑定
实例:
@PostMapping("/method12")
public ApiResponse method12(@RequestParam(value = "id",required = true) int videoId, @RequestParam(value = "name",required = false)String username){
String s = videoId + "" + username;
System.out.println(s);
return ApiResponse.ok().data(s);
}
通过POJO(实体类)获取参数
保证请求参数名和实体类属性名一致
public JsonData login( LoginRequest loginRequest)
通过名字把类属性名和参数名映射上,所以就能将一组参数数据封装在对象中
@RequestBody@RequestBody的作用其实是将json格式的数据转为java对象或者map。
public JsonData login(@RequestBody LoginRequest loginRequest){
String token=userService.findByPhoneAndPwd(loginRequest.getPhone(),loginRequest.getPwd());
return token == null?JsonData.buildError("登录失败,账号密码错误"):JsonData.buildSuccess(token);
}
将json数据自动匹配到类的对象中
注意:请求方式必须post 一个控制器@RequestBody 只能有一个
请求参数乱码问题在web.xml注册编码过滤器characterEncodingFilter
SpringMVC流程1.用户发起请求到前端控制器
2.前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handler)。通过url得到对应的handle实例(controller对象和method对象——含在HandlerMethod)
public HandlerMethod(Object bean, Method method) {
this.bean = bean;//类对象
this.beanFactory = null;
this.method = method;//方法
this.bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
this.parameters = initMethodParameters();
}
3.找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)。handler+拦截器=HandlerExecutionChain
4.前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
5.HandlerAdapter去执行处理器Handler
6.执行完成返回ModelAndView
HandlerMapping作用:根据请求的URL,找到对应的Handler,帮助DispatcherServlet找到对应的Controller
HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了多种不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
该接口只有一个方法getHandler,它的入参是HttpServletRequest,输出是HandlerExecutionChain。很明显,它通过当前请求的request对象,来获取到一个包含实际请求处理器的HandlerExecutionChain对象
public interface HandlerMapping {
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
HandlerInterceptor:Handler执行前后拦截器
HandlerInterceptor是个接口,里面包含三个方法:preHandle、postHandle、afterCompletion
分别在Handler执行前、执行中、执行完成后执行的三个方法
HandlerExecutionChain:HandlerMapping返回给DispatcherServlet的执行链
handler+拦截器=HandlerExecutionChain
HandlerAdapterpublic interface HandlerAdapter {
// 判断是否支持传入的handler
boolean supports(Object handler);
// 使用handler处理请求
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
// 获取资源的LastModified值
long getLastModified(HttpServletRequest request, Object handler);
}
有三种实现类
其中RequestMappingHandlerAdapter-支持携带方法参数和返回类型签名的HandlerMethod
Handler
处理器(需要工程师开发)
注意:编写Handler时需要HandlerAdapter的要求去做,这样HandlerAdapter才可以正确执行Handler
Handler是继DispatcherServlet前端控制器的后台控制器,在DispatcherServlet控制下对用户请求进行处理,Handler涉及业务需求,所以需要工程师针对用户需求进行开发,最终返回业务数据
域对象共享数据


