Spring MVC

Spring MVC:以前在编写网页时,会将网页的编写分为三个部分,MVC其分别表示三个不同的部分模型(Mode),视图(View),控制器(Controller),来进行分布实现,同时展开。

现在,由于前端和后端的界线开始划清,工作中的分工开始明显,所以后端现在基本上只负责后端的处理,也就没有了View层了,现在View表示的是视图所需要的数据。

Spring MVC分为三大部分,建立连接,请求,响应。

1.建立连接

RequestMapping路由映射,可以通过url来进行连接的建立,并且其修饰方法,也修饰类。

访问地址:类的路径+方法路径

RequestMapping支持get和post

POSt(????)

传递请求数据

请求最关键的就是使用如何传递不同的参数,传递一个参数,多个参数,对象,数组/集合

1.传递单个参数

复制代码
  @RequestMapping("/t3")
    public String t3(String name){
        return "name:" + name;
    }

当请求传递name时,接收到了name,并返回

2.传递多个参数

复制代码
 @RequestMapping("/t4")
    public String t4(String name,int age){
        return "name:" + name +"age:"+age;
    }

和传递单个参数一样,传递name和age,接收然后并返回,并且这两个参数的位置不是必需与代码中的参数位置一一对应。

并且使用基本数据类型必需进行有效传值,0或者NULL这种一样会报错。

但是使用包装类型可以不用传值,其返回的是NULL

复制代码
 @RequestMapping("/t5")
    public String t5(String name,Integer age){
        return "name:" + name +"age:"+age;
    }

3.传递对象

复制代码
@RequestMapping("/t6")
    public String t5(Student student){
        return "Student" + student.toString();
    }

4.后端参数重命名

使用@RequestParam重命名时,

1)传递的参数必须和@RequestParam声明的参数名称一样,这个参数为必传

复制代码
  @RequestMapping("/t7")
    public String t7(@RequestParam("name")String student_name){
        return "Student_name" + student_name ;
    }
  • 后面定义的为重命名的,随着程序的运行数据增多可能分不清这个是什么具体的数据,态笼统,不能细分,这样就可以细分。如最开始设计的时候只有姓名,随着功能开始拓展就可能会出现各种名字的 划分如学生名,老师名等,不想大变的情况下这样较好,最主要不会改变原有的逻辑。

2)使用required=faslse设置为不是必需要传递

复制代码
@RequestMapping("/t8")
    public String t8(@RequestParam(value = "name",required = false)String student_name,int age){
        return "Student_name" + student_name +age;
    }

5.传递数组

当请求中,同一个参数有多个时,浏览器会将其封装成一个数组

复制代码
 @RequestMapping("/t9")
    public String t9(String[] array){
        return "接收到的数组"+ Arrays.toString(array)+array.length;
    }

6.传递集合

复制代码
  @RequestMapping("/t1")
    public  String t1(@RequestParam List<String> array){
        return "长度"+ array.size();
    }

如果不在参数列表中写@RequestParam就会报错并且一般情况下

5开头的通常旨服务端发生错误

4开头的通常旨客户端发生错误

复制代码

上面那些响应码是叫HTTP响应码,不是后端自定义的
2XX:成功3XX:重定向4XX:客户端错误5XX:服务端错误

后端自定义的叫做业务状态码

比如用户登录:
1.密码正确:恭喜登录成功

2.密码错误:密码错误

这样根据自己写的业务逻辑返回的。

这里也可以将参数设置为不是必需要传递

Kotlin 复制代码
    @RequestMapping("/t1")
    public  String t1(@RequestParam(required = false) List<String> array){
        return "长度"+ array.size();
    }

7.传递json数据

传递JSON数据使用需要使用@RequestBody

Kotlin 复制代码
  @RequestMapping("/t2")
    public  String t2(@RequestBody Student student ){
        student.getAge();
        student.getAge();
        return student.toString() +" ";
    }

8.获取URL中的参数

注意里面的注解变化为了@PathVariable,以及请求URL格式必须和后端定义的URL格式必需匹配
,切记不要错误,并且也可以一次获取多个,并进行重命名。

获取一个:

Kotlin 复制代码
@RequestMapping("/t3/{studentid}")
    public  String t3(@PathVariable Integer studentid ){

        return "studentid"+studentid;
    }

获取多个:

获取多个URL时,注意/一定要将其分隔开

Kotlin 复制代码
//获取多个并进行重命名
@RequestMapping("/t3/{studentid}/{studentage}")
    public  String t3(@PathVariable Integer studentid ,@PathVariable("studentage") Integer age){

        return "studentid"+studentid + "age"+age;
    }

9.上传图片

注意注解名称和文件类型

Kotlin 复制代码
 @RequestMapping("/t4")
    public  String t4(@RequestPart MultipartFile file) {
        System.out.println(file.getOriginalFilename());
        return "success";
    }

10.获取cook,session,Header

Cookie是客户端机制用来保存记录的,Session是服务端机制用来保存记录的二者的联系在于会与Sessionid联系起来,通过Sessionid来确保这份记录在Cookie和Session都有。

cookie

其下面获cookie代码中如果不加判断为空会出现空指针异常。切记当页面中出现500错误时,一定要返回编辑器的控制台看报错信息

第一种获取cookie//想错了(????)

复制代码
  @RequestMapping("/getCookie")
    public  String getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
      Cookie[] cookies = request.getCookies();
      if(cookies != null) {
          for (Cookie cookie : cookies) {
              System.out.println(cookie.getName() + ":" + cookie.getValue());
                return  "cookie的值"+cookie;
          }
          Arrays.stream(cookies).forEach(cookie -> {
              System.out.println(cookie.getName() +":" +cookie.getValue());
          });
      }

        return "success";
    }

注解获取cookie

复制代码
  @RequestMapping("/getCookie2")
    public  String getCookie2 (@CookieValue String test) {


        return "cookie存取的值"+test;
    }

测试能不能取到cookie 在浏览器中按F12或者在网页中右键有个检查按钮点进去其中应用里面就可以设置cookie值

并且其最后输出时

第一种方式会直接获取到所有cookie的值????

第二种方式只能获取到指定cook的值,但是可以一定获取多个,由自己定义的参数决定

session

因为要从请求中来获取session,我们要先设置一个session。在设置session时,我们可以从抓到的包中看到请求发出之后,响应那边会出现Set-Cookie,并且其在其后面的JSESSIONID就是设置的session的id,右侧就是其值,相互对应,返回到客户端中存储起来。

Set-Cookie: JSESSIONID=B4409B5559B2E5966289A99290C51E6B;

复制代码
@RequestMapping("/setSession")
    public  String setSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        session.setAttribute("name","张三");
        return "success";
    }

在获取session时,因为会将想要读取的seesionid也进行enconde解码变成一串字母只有相同的才会变成相同的字母,如果在客户端字母相同的话,就会返回其存储的值。

复制代码
@RequestMapping("/getSession")
    public  String getSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession(false);
        if(session !=null){
            String username = (String) session.getAttribute("name");
            return "用户名"+username;
        }
        return "没有记录";
    }

注解获取session

复制代码
 @RequestMapping("/getSession2")
    public  String getSession2(@SessionAttribute String name){

        return "session" + name ;
    }

在参数列表中直接创建session对象

复制代码
 @RequestMapping("/getSession3")
    public  String getSession3(HttpSession session){

        String name = (String) session.getAttribute("name");
        return "session" + name ;
    }

获取Header

两中方式创建没有太大区别

复制代码
 @RequestMapping("/getHeader")
    public  String getHeader(HttpServletRequest request){

        String userAgent = request.getHeader("user-Agent");

        return "userAgent" +userAgent ;
    }
    @RequestMapping("/getHeader2")
    public  String getHeader2(@RequestHeader("user-Agent") String userAgent){


        return "userAgent" +userAgent ;
    }
相关推荐
腥臭腐朽的日子熠熠生辉27 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian29 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之34 分钟前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
程序猿chen1 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
松韬2 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存
绝顶少年2 小时前
Spring Boot 注解:深度解析与应用场景
java·spring boot·后端