SpringMVC基础篇(三)

发布于:2024-04-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

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";
    }
}

2.request_parameter.jsp
<%--
  Date: 2024/2/25
  Time: 21:04
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3><a href="request/getheader">点击获取请求头信息</a></h3>

</body>
</html>

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 +
                '}';
    }
}

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 + '\'' +
                '}';
    }
}

3.后端接口
    /**
     * 将请求信息自动封装到master中
     * 1.如果是普通属性,则名称必须与其对应
     * 2.如果是对象属性,则使用对象属性.属性的形式来封装
     * @param master
     * @return
     */
    @RequestMapping("/setmaster")
    public String setMaster(Master master) {
        System.out.println(master);
        return "success";
    }
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";
    }
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";
    }

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";
    }
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" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    id:${requestScope.master.id}<br>
    name:${requestScope.master.name}<br>
    pet.id:${requestScope.master.pet.id}<br>
    pet.name:${requestScope.master.pet.name}
</body>
</html>

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";
    }
2.postman测试

image-20240226122202260

4.模型数据—Map<String, Object>
1.接口
    /**
     * 使用Map<String, Object> 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";
    }
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" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
address:${requestScope.address}
id:${requestScope.master.id}<br>
name:${requestScope.master.name}<br>
pet.id:${requestScope.master.pet.id}<br>
pet.name:${requestScope.master.pet.name}
</body>
</html>

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;
    }
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";
    }
2.getsession.jsp
<%--
  Date: 2024/2/26
  Time: 13:38
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
name:${sessionScope.name}<br>
address:${sessionScope.address}

</body>
</html>

3.postman测试

image-20240226134314888

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

image-20240226135039409

image-20240226135046832