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 ;
    }
相关推荐
泡海椒1 分钟前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf
OxYGC21 分钟前
[AI工程] Spring AI 第十四篇:Agent 五种模式在 2.0 里怎么写
java·spring·ai·ai编程
code2cat22 分钟前
【随笔】从聊天到调用工具:理解MCP在AI应用中的位置
java·人工智能
2501_9339232530 分钟前
Spring Bean作用域揭秘:单例、原型、请求与会话的区别
java·后端·spring·java-ee
学编程就要猛1 小时前
基于Spring AI 的智能聊天机器人
java·spring ai·chat robot
修炼室1 小时前
Java开发工程师笔试经验贴【高频知识】
java
木井巳1 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
杨杨杨大侠1 小时前
知识库已经有了,Java 程序员还要做什么?Spring AI RAG 实战
java·openai·ai编程
伊信1 小时前
Spring AI 基础学习与应用
java·后端
夜郎king1 小时前
基于 Java + Playwright 实现网站自动访问与数据采集(以腾讯云开发者社区为例)
java·playwright·网页数据获取