SpringMVC-数据绑定和响应

数据绑定和响应

浏览器请求消息数据和处理器的形参建立连接的过程

浏览器发送的请求的参数封装到处理器形参的过程

1、数据绑定过程

SpringMVC是web层框架主要是用来浏览器交互的,浏览器发送请求的数据和响应给浏览器的数据
在这里插入图片描述

SpringMVC数据绑定中的信息处理过程
在这里插入图片描述

2、数据绑定类型

2.1、默认类型数据绑定

在这里插入图片描述

@Controller
public class 默认类型 {

    /**
     * 默认参数类型:
     * HttpServletRequest:请求
     * HttpServletResponse:响应
     * HttpSession:session对象
     * Modol:模型,用于存放页面需要的数据
     */
    @RequestMapping("/findById")
    public String getUserId(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) {

        model.addAttribute("msg","javaweb教务系统");

        String id = request.getParameter("userId");
        System.out.println("userId=" + id);
        return "pages/success";
    }
}

2.2、简单类型数据绑定

  • 客户端请求参数的名称和处理器的形参名称一致即可,请求参数会自动映射并匹配到处理器的形参完成数据绑定。
public String User(String name) {
    System.out.println("简单数据类型-----前端后端参数一致时-----name:" + name);
    return "pages/success";
}
  • 当客户端请求参数的名称和处理器的形参名称不一致时,需要用@RequestParam注解
/**
 * @RequestParam:解决客户端请求参数和处理器形参名称不一致时
 * 客户端请求参数name="username"
 * 少参数报错:required=true
 * 不传参数,默认为小焦同学:defaultValue="小焦同学"
 */
@RequestMapping("/easy2")
public String User1(@RequestParam(value = "username",defaultValue = "小焦同学") String name) {
    System.out.println("简单数据类型-----前端后端参数不一致时-----name:" + name);
    return "pages/success";
}
  • 使用RESTful风格
/**
 * 使用RESTful风格
 * http://localhost:8080/easy2/小焦同学
 */
@RequestMapping("/easy2/{username}")
public String User2(@PathVariable("username") String name) {
    System.out.println("使用RESTful风格方式:路径中的参数:" + name);
    return "pages/success";
}

2.3、引用类型数据绑定

  • 编写pojo类
@Data
public class User {
    private String username;
    private String password;
}
  • 编写jsp页面
<form action="${pageContext.request.contextPath}/register" method="get">
    姓名:<input type="text" name="username" value="张三" ><br>
    密码:<input type="password" name="password" value="123"><br>
    <input type="submit" value="提交">
</form>
  • 编写Controller类
/**
 * register.jsp中name名字要和pojo中的变量名一致,如果不一致,值为null
 * @param user
 * @return
 */
@RequestMapping("/register")
public String registerUser(User user){
    // 用户端传来的参数是中文的话,输出是乱码,则需要配置filter过滤器
    System.out.println("用户注册成功:"+user);
    return "pages/success";
}

2.4、数组类型数据绑定

多用于批量删除,批量删除会有多个参数值

Integer[] ids参数要和jsp中的name值相同

  • 编写jsp页面
<form action="${pageContext.request.contextPath}/array/deleteUsers" method="post">
    <table width="20%" border="1">
        <tr>
            <td>选择</td>
            <td>用户名</td>
        </tr>
        <tr>
            <td><input name="ids" value="1" type="checkbox"></td>
            <td>tom</td>
        </tr>
        <tr>
            <td><input name="ids" value="2" type="checkbox"></td>
            <td>jack</td>
        </tr>
        <tr>
            <td><input name="ids" value="3" type="checkbox"></td>
            <td>Lucy</td>
        </tr>
    </table>
    <input type="submit" value="删除">
</form>
  • 编写Controller类
// 接收批量删除的方法
@RequestMapping("/deleteUsers")
public String deleteUsers(Integer[] ids) {
    if (ids != null) {
        for (Integer id : ids) {
            System.out.println("成功删除了id为:" + id + "的用户");
        }
    } else {
        System.out.println("ids为空");
    }
    return "pages/success";
}

2.5、集合类型数据绑定

多用于批量修改,不同的数据类型、集合类型不能直接放到方法形参上,需要用包装类pojo

  1. 同一类型的参数,@RequestParam(“ids”) List ids
// 接收批量删除的方法
@RequestMapping("/deleteUsers")
public String deleteUsers(@RequestParam("ids") List<Integer> ids) {
    if (ids != null) {
        for (Integer id : ids) {
            System.out.println("成功删除了id为:" + id + "的用户");
        }
    } else {
        System.out.println("ids为空");
    }
    return "pages/success";
}
  1. 集合类型可能有不同的参数类型,集合类型不能直接放到方法形参上,需要用包装类pojo:UserVo
  • 编写pojo类:User
@Data
public class User {
    private Integer id;
    private String username;
}
  • 编写集合pojo类:UserVo
// 集合类型绑定
@Data
public class UserVo {
    private List<User> users;
}
  • 编写jsp页面
<form action="${pageContext.request.contextPath}/list/user_update" method="post">
    <table width="20%" border="1">
        <tr>
            <td>选择</td>
            <td>用户名</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="users[0].id" value="1"></td>
            <td><input type="text" name="users[0].username" value="tom"></td>
        </tr>
        <tr>
            <td><input type="checkbox" name="users[1].id" value="2"></td>
            <td><input type="text" name="users[1].username" value="jack"></td>
        </tr>
        <tr>
            <td><input type="checkbox" name="users[2].id" value="3"></td>
            <td><input type="text" name="users[2].username" value="lucy"></td>
        </tr>
    </table>
    <input type="submit" value="修改">
</form>

在这里插入图片描述

  • 编写Controller类
// UserVo userList:集合类型可能有不同的参数类型,集合类型不能直接放到方法形参上,需要用包装类Pojo:UserVo
@RequestMapping("/user_update")
public String userUpdate(UserVo userList) {
    List<User> users = userList.getUsers();
    for (User user : users) {
        if (user.getId() != null)
            System.out.println(user);
    }
    return "pages/success";
}

3、复杂pojo绑定

3.1、对象数据类型

pojo类中有引用数据类型

  • 编写pojo类
@Data
public class Depart {
    private String id;
    private String name;
}

@Data
public class Claz implements Serializable{
   private String id;
   private String name;
   private String grade;
   private Depart depart;
}
  • 编写jsp页面
<form action="${pageContext.request.contextPath }/claz/save" method="post">
    班级:<input name='id'><br>
    名称:<input name='name'><br>
    年级:<input name='grade'><br>
    系别:<input name="depart.id"/><br>
    <input type='submit'>
</form>
  • 编写Controller
/**
 * 绑定包装POJO类型(depart类类型)
 */
@RequestMapping("/save")
public String save(Claz claz) {
    System.out.println(claz.getDepart().getId());
    System.out.println(claz);
    return "redirect:list";
}

3.2、集合数据类型

  • 编写pojo类
@Data
public class Claz implements Serializable{
   private String id;
   private String name;
}

@Data
public class ClazList {
    private List<Claz> clazs;
    private List<String> address;
}
  • 编写jsp页面
<form method="post" action="${pageContext.request.contextPath}/clazList/save">
    <table width="20%" border="1">
        <tr>
            <td>班级id</td>
            <td>班级name</td>
            <td>班级地址</td>
        </tr>
        <tr>
            <td><input type="text" name="clazs[0].id" value="1"></td>
            <td><input type="text" name="clazs[0].name" value="计本1班"></td>
            <td><input type="text" name="address" value="师大1"></td>
        </tr>
        <tr>
            <td><input type="text" name="clazs[1].id" value="2"></td>
            <td><input type="text" name="clazs[1].name" value="计本2班"></td>
            <td><input type="text" name="address" value="师大2"></td>
        </tr>
        <tr>
            <td><input type="text" name="clazs[2].id" value="3"></td>
            <td><input type="text" name="clazs[2].name" value="计本3班"></td>
            <td><input type="text" name="address" value="师大3"></td>
        </tr>
    </table>
    <input type="submit" value="添加">
</form>
  • 编写Controller类
@RequestMapping("/save")
public String save(ClazList clazList, Model model){
    System.out.println(clazList.getClazs());
    System.out.println(clazList.getAddress());
    model.addAttribute("msg","List类型添加成功");
    return "clazList/list";
}

3.3、Map数据类型

  • 编写pojo类
@Data
public class Claz implements Serializable{
   private String id;
   private String name;
}

@Data
public class ClazMap {
    private String teacher_id;
    private HashMap<String,Claz> clazMaps;
}
  • 编写jsp页面
<form method="post" action="${pageContext.request.contextPath}/clazMap/save">
    <table width="20%" border="1">
        <tr>
            <td>老师id</td>
            <td>班级id</td>
            <td>班级name</td>
        </tr>
        <tr>
            <td><input type="text" name="teacher_id" value="1"></td>
            <td><input type="text" name="clazMaps['claz01'].id" value="1"></td>
            <td><input type="text" name="clazMaps['claz01'].name" value="计本1班"></td>
        </tr>
        <tr>
            <td><input type="text" name="teacher_id" value="2"></td>
            <td><input type="text" name="clazMaps['claz02'].id" value="2"></td>
            <td><input type="text" name="clazMaps['claz02'].name" value="计本2班"></td>
        </tr>
    </table>
    <input type="submit" value="添加">
</form>
  • 编写Controller类
@RequestMapping("/save")
public String save(ClazMap clazMap, Model model){
    String teacher_id = clazMap.getTeacher_id();
    System.out.println("老师id为:"+teacher_id);

    HashMap<String, Claz> clazMaps = clazMap.getClazMaps();
    Set<String> keys = clazMaps.keySet();
    for (String key : keys){
        Claz claz = clazMaps.get(key);
        System.out.println(key);
        System.out.println(claz);
    }
    model.addAttribute("msg","Map类型添加成功");
    return "clazMap/list";
}

/*输出结果 	key:value
老师id为:1,2
claz02:Claz [id=2, name=计本2班]
claz01:Claz [id=1, name=计本1班]
*/

4、返回类型响应

4.1、void类型

void类型:如果是void类型,默认跳转到 前缀+映射名字+后缀.jsp中,如果没有这个jsp,报404

注意:映射名字要和jsp名字一致
在这里插入图片描述

4.2、String类型

@Controller
public class StringControllerTest {
    @RequestMapping("/aString")
    public String aString(){
        System.out.println("配置视图解析器");
        return "pages/success";
    }

    @RequestMapping("/bString")
    public String bString(){
        System.out.println("没有配置视图解析器————forward跳转");
        return "forward:WEB-INF/pages/success.jsp";
    }

    @RequestMapping("/cString")
    public String cString(){
        System.out.println("没有配置视图解析器————redirect重定向");
        return "redirect:bString";
//        return "redirect:http://www.itheima.com";
    }
}
String类型--不带参数:
    配置视图解析器:
        直接return "success";         jsp要放到WEB-INF下
    不配置视图解析器:
        forward:跳转到jsp中     return "forward:success.jsp";       jsp要放到webapp下
        redirect:重定向         return "redirect:success"return "redirect:http://www.baidu.com";

String类型--带参数:
    HttpServletRequest:request.setAttribute("username","request");
    Model:model.addAttribute("username","model");

5、数据显示到前端

5.1、通过ModelAndView

@Controller
public class ModelAndViewController {

    @RequestMapping("/showModelAndView")
    public ModelAndView showModelAndView(){
        ModelAndView modelAndView = new ModelAndView();

        // 数据设置
        modelAndView.addObject("username","张三");
        User user = new User();
        user.setPassword("123");
        modelAndView.addObject("user",user);

        // 视图设置
        modelAndView.setViewName("user/modelAndView");
        return modelAndView;
    }
}

5.2、通过Model

// HttpServletRequest
@RequestMapping("/showPageByRequest")
public String showPageByRequest(HttpServletRequest request){
    request.setAttribute("username","request");
    return "user/model";
}

// Model
@RequestMapping("/showPageByModel")
public String showPageByModel(@RequestParam("username") String name,Model model){
    model.addAttribute("username","model");
    return "user/model";
}

5.3、通过ModelMap

@RequestMapping("/hello")
public String showPageByModelMap(@RequestParam("username") String name, ModelMap model){
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("username","model");
    return "user/model";
}

对比

  • Model只有寥寥几个方法,只适用于存储数据,简化了对于Model对象的操作和理解
  • ModelMap继承了LinkedMap,除了实现了自身的一些方法,同样继承了LinkedMap的方法和特性
  • ModelAndView可以在存储数据的同时,可以进行设置返回的逻辑视图,进行控制页面的跳转
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringMVC是一个用于构建Web应用程序的Java框架。在SpringMVC中,处理请求和响应是通过使用控制器方法来实现的。控制器方法使用@RequestMapping注解来映射请求的URL,并通过方法参数来获取请求参数和响应对象。 在处理请求时,可以使用@RequestParam注解来获取请求参数的值。例如,可以在方法参数上使用@RequestParam注解来获取请求中的特定参数值。另外,也可以使用@PathVariable注解来获取URL中的路径参数。 在处理响应时,可以使用@ResponseBody注解将方法的返回值直接写入HTTP响应体中,而不是进行视图跳转。这样可以直接返回字符串、JSON格式的数据或其他型的数据。 另外,在SpringMVC中,还有一些核心组件,如处理器映射器、处理器适配器和视图解析器。处理器映射器负责将请求映射到相应的控制器方法,处理器适配器负责将请求参数绑定到方法参数,并调用相应的控制器方法,视图解析器负责将方法的返回值解析为视图。 总结起来,SpringMVC通过控制器方法、注解和核心组件来处理请求和响应,使得开发者可以方便地构建Web应用程序。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [springMVC的请求和响应](https://blog.csdn.net/weixin_38088097/article/details/105840310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringMVC的请求和响应](https://blog.csdn.net/weixin_51146329/article/details/123166475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_koen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值