- 什么是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-webmvc5.1.9.RELEASE javax.servlet servlet-api2.5 javax.servlet.jsp jsp-api2.2 javax.servlet jstl1.2 org.thymeleaf thymeleaf-spring53.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-支持携带方法参数和返回类型签名的HandlerMethodHandler
处理器(需要工程师开发)
注意:编写Handler时需要HandlerAdapter的要求去做,这样HandlerAdapter才可以正确执行Handler
Handler是继DispatcherServlet前端控制器的后台控制器,在DispatcherServlet控制下对用户请求进行处理,Handler涉及业务需求,所以需要工程师针对用户需求进行开发,最终返回业务数据
域对象共享数据欢迎分享,转载请注明来源:内存溢出
评论列表(0条)