请求处理、响应处理(请求映射,基本注解响应JSON、内容协商的一点笔记)

spring boot笔记

https://www.yuque.com/atguigu/springboot/vgzmgh#SN5lp

在这个网页,老师笔记做的很完美真的很棒!!!

除了没分析源码外,其他的我自己跟着手敲了一遍理解了一下评论区的同学们标注的知识点,然后没学过的或者没学好的知识都去搜了学,狂补内容。

springmvc之HiddenHttpMethodFilter配置使用POST、GET、DELETE、PUT请求

在springmvc中的目标方法中如何得到发过去的参数,比如id呢?

使用@PathVariable注解。 看请求标头和响应标头等信息

请求处理、响应处理(请求映射、基本注解、响应JSON、内容协商)

多看这几篇文章如下链接,看文章比看视频快多了,我springmvc没好好跟着视频学也学不懂多少。

【Springboot】请求处理、响应处理(请求映射、基本注解、响应JSON、内容协商)

SpringMVC的HiddenHttpMethodFilter详解

SpringMVC之控制器的数据响应和页面跳转使用

Node基础:url查询参数解析之querystring

其中涉及到node.js的知识 搜了一下简单的说 Node.js 就是运行在服务端的 JavaScript,啊。。。。我还没学这个,vue也没学,前端我好像只学了html css,看来得先去学一下 JavaScript了。

矩阵变量:

注意一定就是,矩阵变量可以出现在任何路径片段中,每一个矩阵变量都用分号(;)隔开。比如 “/color=red;year=2012”。多个值可以用逗号隔开,比如 “color=red,green,blue”,或者分开写 “color=red;color=green;color=blue”。

页面开发,如果把cookie 禁用掉,session 里面的内容怎么找到

cookie 和 session 的机制就是,session里面保存一个k-v的值,然后每个人都有一个jsessionid,这个jsessionid 会被保存在cookie里面,每次用户发送请求cookie 都会携带jsessionid ,如果把cookie 禁用掉,我们要获取session 的k获取v ,肯定要通过jsessionid来拿到这个session对象,但是jsession有保存在cookie 所以无法从session对象的v

这里我们可以使用 矩阵变量来获取 session 如 /user;jessionid=xxx 用过url 重写,把cookie的值使用矩阵变量的方式进行传递

参考文章:SpringBoot @MatrixVariable注解 矩阵变量

打开项目111111

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input name=" method" type="hidden" value="PUT"/>
<input value="REST-PUT 提交"type="submit"/>
</form>
<hr/>

<ul>
    <!-- 路径链接 -->
    <a href="/car/{id}/owner/{username}">car/{id}/owner/{username} </a>
    <li>@PathVariable(路径变量)</li>
    <li>@RequestHeader(获取请求头)</li>
    <li>@RequestParam(获取请求参数)</li>
    <li>@cookieValue(获取cookie值)</li>
    <li>@RequestAttribute(获取request域属性)</li>
    <li>@RequestBody(获取请求体)</li>
    <li>@MatrixVariable(矩阵变量)</li>
    </u1>
    
<!-- 矩阵变量的用法-->
<!--    /cars/{path}?xxx=xxx&aaa=ccc 这种方式称作queryString 查询字符串。获取这些值使用@RequestParam: -->
<!--    /cars/sell;low=34;brand=byd,audi,yd 以分号:结尾的请求就是矩阵变量-->
<!--    页面开发,cookie禁用了,session里面的内容怎么使用;-->
<!--    session.set(k,v)-&ndash;&gt;jsessionid -&ndash;&gt;cookie &#45;&#45;&ndash;&gt;每次发请求携带,-->
<!--    url重写:/abc;jsesssionid=xxxx 把cookie的值使用矩阵变量的方式进行传递-->
<!--    /boss/1/2-->
<!--    分号前边是访问路径 分号后边是矩阵变量-->
<!--    /boss/1;age=20/2;age=20.-->   
    <a href="/cars/sell;low=34;brand=byd,audi,yd">@MatrixVariable(矩阵变量)</a>
    <a href="/cars/sell;low=34;brand=byd;brand=audi;brand=yd">@MatrixVariable(矩阵变量)</a>
    <a href="/boss/1;age=20/2;age=10">@MatrixVariable(矩阵变量)/boss/{bossId}/{empId}</a>
    <br/>
    <form action="/save" method="post">
        测试@RequestBody获取数据<br/>
        用户名:<input name="userName"/><br>
        邮箱:<input name="email"/>
        <input type="submit" value="提交"/>
    </form>
    <ol>
        <li>矩阵变量需要在springBoot中手动开启</li>
        <li>根据RFC3986的规范,矩阵变量应当绑定在路径变量中!</li>
        <li>若是有多个矩阵变量,应当使用英文符号;进行分隔。</li>
        <li>若是一个矩阵变量有多个值,应当使用英文符号,进行分隔,或之命名多个重复的key即可。</li>
    </ol>
</ul>
</body>
</html>
/*
 请求域属性 @RequestAttribute
通过/goto发送请求,并进行setAttribute,然后将请求转发给/success;在success中获得转发前的请求。
 */
@Controller//只是一个控制器
public class RequestController{
    //SpringMVC之控制器的数据响应和页面跳转使用
    /*
    SpringMVC的控制器方法提供了有三种返回值类型
    String :该返回值可以借助配置的视图解析器完成成页面跳转,数据响应需要借助形参的model或者request完成
    void:没有返回值,所以需要程序员自己使用servletAPI完成数据响应和页面跳转
    ModelAndVIew:该返回值可以完成数据响应和页面跳转。
     */
    @GetMapping("/goto")//在去goToPage()页面前先发送一个请求 去 /goto这个路径
    public String goToPage(HttpServletRequest request){
        request.setAttribute("jhj","gfyhu");//可以给里面放一些属性
        request.setAttribute("jhg","ujtg");
        //forward来转发到 /success
        return "forward:/success";//success就是一个请求
    }

    @ResponseBody//其实是将java对象转为json格式的数据。
    /*
    作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】
    注意:在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。
     */
    @GetMapping("/success")//转发之后 它来 处理这个请求
    public Map success(@RequestAttribute("jhj") String jhj,
                       @RequestAttribute("jhj") Integer jhg,
                       HttpServletRequest request){//为了方便取出jhj 有两种方法
        Object jhj1 = request.getAttribute("jhj");//为打印方便 使用Map
        HashMap<Object, Object> map = new HashMap<>();

        map.put("reqMethod_jhj",jhj);//使用 方法取
        map.put("annotation_jhj",jhj);//使用注解取
        //把取出的数据返回 写给浏览器就行了
        return null;
    }
    /*
    宪先发/goto这个请求 然后跳到/success
    /success准备取出请求域中的数据 想要给请求域中放一个数据
     */
}
/*@CrossOrigin//跨域
@RestController
@RequestMapping("/p")*/
public class ParameterTestController {
    //控制器:
    //HandlerMapping意思是处理器映射,把一个URL指定到一个Controller上
    @GetMapping("car/3/owner/lisi?age=18&inters=basketball&inters=game")//路径变量
    //@PathVariable(明确的告诉他要获取路径变量中谁的值把他单独提取出来
    //还能把所有的k v提取出来
//@RequestHeader用于获取http请求的header部分信息
    //Map都是请求全部
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("username") String name,
                                      @PathVariable Map<String, String> pv,
                                      @RequestHeader("User-Agent") String userAgent,
                                      @RequestHeader Map<String, String> header,
                                      @RequestParam("age") Integer age, List<String> inters,
                                      Map<String, String> params,
                                      @CookieValue("_ga") String _ga,
                                      @CookieValue("_ga") Cookie cookie) {

        Map<String, Object> map = new HashMap<>();

//        map.put("id",id);
//        map.put("name",name);
//        map.put("pv",pv);
//        map.put("userAgent",userAgent);
//        map.put("headers",header);
        map.put("age", age);
        map.put("inters", inters);
        map.put("params", params);
        map.put("_ga", _ga);
        System.out.println(cookie.getName() + "===>" + cookie.getValue());
        return map;
    }

    @PostMapping("/save")
    //把请求体的数据拿过来
    // 请求体 @RequestBody
    public Map postMethod(@RequestBody String content) {
        Map<String, Object> map = new HashMap<>();

        map.put("content", content);
        return null;
    }

    //2、SpringBoot默认是禁用了矩阵变量的功能
    //      手动开启:原理。对于路径的处理。UrlPathHelper进行解析。
    //              removeSemicolonContent(移除分号内容)支持矩阵变量的
    //3、矩阵变量必须有url路径变量才能被解析
    ///cars/sell;low=34;brand=byd,audi,yd
    @GetMapping("/cars/{path}")
    public Map carsSell(@MatrixVariable("low") Integer low,
                        @MatrixVariable("brand") List<String> brand,
                        @PathVariable("path") String path) {//这俩都是矩阵变量 取出他们的值

        HashMap<Object, Object> map = new HashMap<>();
        map.put("low", low);
        map.put("brand", brand);
        map.put("path", path);
        return map;
    }
    ///boss/1;age=20/2;age=10
    @GetMapping("/boss/{bossId}/{empId}")
    public Map boss(@MatrixVariable(value = "age", pathVar
            = "bossId") Integer bossAge,
                    @MatrixVariable(value = "age", pathVar = "empId") Integer empAge) {
        Map<String, Object> map = new HashMap<>();
        map.put("bossAge", bossAge);
        map.put("empAge", empAge);
        return map;
    }
}
//矩阵变量 @MatrixVariable
@Configuration(proxyBeanMethods = false)
public class WebConfig{
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void configurePathMatch(PathMatchConfigurer configurer) {
                UrlPathHelper urlPathHelper = new UrlPathHelper();
                // 不处理";"后面的内容,矩阵变量功能就可以实现了。
                urlPathHelper.setRemoveSemicolonContent(false);
                configurer.setUrlPathHelper(urlPathHelper);
            }
        }
    }
}
public class webaa {
    
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        hiddenHttpMethodFilter.setMethodParam("_m");
        return hiddenHttpMethodFilter;
    }    
}
public class HiddenHttpMethod {
/*
请求过来被HiddenHttpMethodFilter拦截,如果请求正常并且为POST,
获取到_method的值(兼容PUT.DELETE.PATCH请求,大小写均可)。原生模式的request(post),
包装模式requestWrapper重写了getMethod方法,返回的是传入的值。过滤器链放行的时候用wrapper。
以后的方法调用getMethod是调用requesWrapper的。
如果是Android直接发送,或者使用Postman客户端直接发送这些PUT.DELETE.PATCH请求,不会经过filter,
所以页面表单的Rest功能可以选择性开启。
 */
    @RequestMapping(value = "/user",method = RequestMethod.GET)
    public String getUser(){
        return "GET-张三";
    }

    @RequestMapping(value = "/user",method = RequestMethod.POST)
    public String saveUser(){
        return "POST-张三";
    }


    @RequestMapping(value = "/user",method = RequestMethod.PUT)
    public String putUser(){
        return "PUT-张三";
    }

    @RequestMapping(value = "/user",method = RequestMethod.DELETE)
    public String deleteUser(){
        return "DELETE-张三";
    }

//    @Bean
//    @ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
//    @ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
//    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
//        return new OrderedHiddenHttpMethodFilter();
//    }
//
//    //自定义filter
//    @Bean
//    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
//        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
//        methodFilter.setMethodParam("_m");
//        return methodFilter;
//    }
}

没成功,缺着点比较重要的,反正就是不知道哪缺了,除了能访问个网页其他都没访问成功,先这样吧等有更多的时间了又回来再刷一遍,源码部分直接跳过了,实在是太多了看不下去一点,之前学javase的时候明明很有耐心的,现在就这样吧。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值