学习笔记——SpringMVC

学习笔记——SpringMVC,第1张

学习笔记——SpringMVC

文章目录
      • 什么是MVC
      • 什么是SpringMVC
      • 配置
      • RestMapping
          • 位置
          • value
          • method
          • method的注解
          • params
          • SpringMVC支持路径的占位符
      • SpringMVC获取请求参数
          • 通过servletAPI获取
            • HttpServletRequest
          • 通过参数名获取
            • 保证控制器参数名和请求参数名一致
            • 使用@RequestParam
          • 通过POJO(实体类)获取参数
            • 保证请求参数名和实体类属性名一致
            • @RequestBody
          • 请求参数乱码问题
      • SpringMVC流程
      • HandlerMapping
          • HandlerInterceptor:Handler执行前后拦截器
          • HandlerExecutionChain:
      • HandlerAdapter
      • Handler
      • 域对象共享数据

什么是MVC

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中填写请求地址的资源路径,可以填多个,满足一个即可。

method

method属性通过请求的请求方式(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)

params

params通过请求参数来匹配请求映射

@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

HandlerAdapter
public 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涉及业务需求,所以需要工程师针对用户需求进行开发,最终返回业务数据

域对象共享数据

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5687409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存