• SpringMVC基础篇(三)


    1.SpringMVC映射请求数据

    1.获取请求头信息
    1.VoterHandler.java
    package com.sun.web.requetstparam;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    @RequestMapping("/request")
    @Controller
    public class VoterHandler {
        //获取请求头信息
        @RequestMapping("/getheader")
        public String getHeader(@RequestHeader("Accept-Encoding") String ae, @RequestHeader("Host") String host) {
            System.out.println("Accept-Encoding:" + ae);
            System.out.println("host:" + host);
            return "/success";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    2.request_parameter.jsp
    <%--
      Date: 2024/2/25
      Time: 21:04
      User: 孙显圣
      Version:1.0
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    

    点击获取请求头信息

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    3.结果展示

    image-20240225212032818

    image-20240225212042843

    image-20240225211928845

    2.自动封装javabean
    1.需求分析

    image-20240225212231900

    2.应用实例
    1.Master.java
    package com.sun.web.entity;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Master {
        private Integer id;
        private String name;
        private Pet pet; //属性中包含一个对象
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Pet getPet() {
            return pet;
        }
    
        public void setPet(Pet pet) {
            this.pet = pet;
        }
    
        @Override
        public String toString() {
            return "Master{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", pet=" + pet +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    2.Pet.java
    package com.sun.web.entity;
    
    import javafx.geometry.Orientation;
    
    /**
     * @author 孙显圣
     * @version 1.0
     */
    public class Pet {
        private Integer id;
        private String name;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "Pet{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    3.后端接口
        /**
         * 将请求信息自动封装到master中
         * 1.如果是普通属性,则名称必须与其对应
         * 2.如果是对象属性,则使用对象属性.属性的形式来封装
         * @param master
         * @return
         */
        @RequestMapping("/setmaster")
        public String setMaster(Master master) {
            System.out.println(master);
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    4.结果展示

    image-20240225221332181

    image-20240225221338611

    3.底层机制
    • Spring MVC直到要将参数封装到Master中,则反射创建Master对象
    • 基本属性封装
      • 读取请求信息,得到id和name两个属性的值
      • 调用Master对象的setter方法为其赋值
    • 嵌套属性封装
      • 读取请求信息,得到pet.id和pet.name这两个值
      • 首先检测刚才反射创建的Master实例中是否有Pet实例,如果没有,则反射创建一个Pet实例
      • 调用Pet的setter方法先封装id
      • 再次检测Master实例中是否有Pet实例,发现已经存在,则直接调用setName方法封装name
      • 最后掉用setPet的方法封装到Master实例中
    3.调用servlet-api
    1.基本说明

    image-20240225222616318

    2.代码实例
    1.接口
        @RequestMapping("/servlet")
        public String servlet(HttpServletRequest request, HttpServletResponse response) {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println("username:" + username + " password:" + password) ;
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    2.结果展示

    image-20240225223103534

    image-20240225223114538

    3.注意事项

    image-20240225223755990

    案例演示
        @RequestMapping("/session")
        public String session(HttpServletRequest request, HttpSession session) {
            //使用传入参数形式获取的session和使用request获取的session是同一个session
            System.out.println(session);
            HttpSession session1 = request.getSession();
            System.out.println(session1);
            return "success";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20240225223831005

    image-20240225223840086

    2.模型数据(放入request)

    1.需求分析

    image-20240226084147361

    2.模型数据—默认机制
    1.接口
        /**
         * 模型数据的默认机制:得到请求之后,自动将请求的内容封装到master中,名字是类型名首字母小写
         * 将”getmaster”封装到request请求中
         * 将”getmaster”请求转发给getmaster.jsp文件
         * @param master
         * @return
         */
        @RequestMapping("/m01")
        public String master01(Master master) {
            return "getmaster";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2.getmaster.jsp
    <%@ page import="org.springframework.web.context.request.RequestScope" %><%--
      Date: 2024/2/26
      Time: 11:56
      User: 孙显圣
      Version:1.0
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
        id:${requestScope.master.id}
    name:${requestScope.master.name}
    pet.id:${requestScope.master.pet.id}
    pet.name:${requestScope.master.pet.name}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    3.postman测试

    image-20240226120730320

    3.模型数据—HttpServletRequest API
    1.接口
        /**
         * 使用原生的servlet api来进行操作,将请求转发到getmaster页面
         *
         * @param master
         * @param request
         * @return
         */
        @RequestMapping("/m02")
        public String master02(Master master, HttpServletRequest request) {
            request.setAttribute("master", master);
            return "getmaster";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    2.postman测试

    image-20240226122202260

    4.模型数据—Map
    1.接口
        /**
         * 使用Map map来将信息放到request域中
         * 原理分析:在将信息封装到master之后,先将master放到request域中,然后扫描map,将这里面的信息也放到request域中
         * 请求转发
         * @param master
         * @param map
         * @return
         */
        @RequestMapping("/m03")
        public String master03(Master master, Map<String, Object> map) {
            map.put("address", "127.0.0.1"); //给map赋值
            return "getmaster";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2.getmaster.jsp
    <%@ page import="org.springframework.web.context.request.RequestScope" %><%--
      Date: 2024/2/26
      Time: 11:56
      User: 孙显圣
      Version:1.0
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    address:${requestScope.address}
    id:${requestScope.master.id}
    name:${requestScope.master.name}
    pet.id:${requestScope.master.pet.id}
    pet.name:${requestScope.master.pet.name}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    3.postman测试

    image-20240226123738297

    4.注意事项

    image-20240226124205667

    5.模型数据—ModelAndView
    1.接口
        /**
         * 使用ModelAndView来将信息封装到request域中,并且返回ModelAndView对象,到视图解析器
         * 原理分析:
         * 1.首先将请求的信息封装到master中
         * 2.然后将这个master放到request域中
         * 3.扫描modelandview,将信息也封装到request域中
         * 4.返回modelandview并请求转发给视图解析器
         * @param master
         * @return
         */
        @RequestMapping("/m04")
        public ModelAndView modelandview(Master master) {
            ModelAndView modelAndView = new ModelAndView();
            //添加对象
            modelAndView.addObject("address", "127.0.0.1");
            //设置视图名字
            modelAndView.setViewName("getmaster");
            return modelAndView;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    2.postman测试

    image-20240226130032732

    3.注意事项

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    6.模型数据(放入session)
    1.接口
        @RequestMapping("/m05")
        public String getsession(Master master, HttpSession session){
            session.setAttribute("address", "122222");
            session.setAttribute("name", "sun");
            return "getsession";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.getsession.jsp
    <%--
      Date: 2024/2/26
      Time: 13:38
      User: 孙显圣
      Version:1.0
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    name:${sessionScope.name}
    address:${sessionScope.address}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    3.postman测试

    image-20240226134314888

    7.@ModelAttribute注解配置所有方法前置通知
    1.代码
        //配置所有方法的前置通知
        @ModelAttribute
        public void prepareModel() {
            System.out.println("准备工作完毕");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    2.postman测试

    image-20240226135039409

    image-20240226135046832

  • 相关阅读:
    深入理解JavaScript——执行上下文与调用栈
    优测云测试平台 | 有效的单元测试
    量化交易是不是用机器预测股票涨跌?这靠谱吗?
    Java多态
    带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?
    LeetCode_优先级队列_692.前K个高频单词
    Smart UI Web 16.0.1 WebComponents htmlelements Crack
    优雅的MVC思想
    FreeRTOS 任务状态查询
    Sleuth+Zipkin链路追踪
  • 原文地址:https://blog.csdn.net/m0_64637029/article/details/138200803