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 ;
    }
相关推荐
majingming1237 小时前
FUNCTION
java·前端·javascript
zopple7 小时前
常见的 Spring 项目目录结构
java·后端·spring
xuxie999 小时前
N11 ARM-irq
java·开发语言
cjy0001119 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20179 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin012210 小时前
Spring Boot实现定时任务
java
小江的记录本10 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji341610 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
寂静or沉默10 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
卓怡学长10 小时前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate