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 ;
    }
相关推荐
2401_8574396910 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66612 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索14 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨19 分钟前
Filter和Listener
java·filter
qq_49244844623 分钟前
Java实现App自动化(Appium Demo)
java
洛卡卡了29 分钟前
从单层到 MVC,再到 DDD:架构演进的思考与实践
架构·mvc
阿华的代码王国32 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
找了一圈尾巴1 小时前
前后端交互通用排序策略
java·交互
哎呦没3 小时前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
m0_571957585 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解