【Spring MVC】Spring MVC的参数绑定和返回值


一:参数绑定

参数绑定过程

在springMVC中,从前端(页面:jsp…)发送请求到后端(controller…),会包含一些数据,数据是如何到达Controller,这个过程就是参数绑定过程
在这里插入图片描述

1、默认支持的类型

SpringMVC有支持的默认的参数类型,在方法上给出默认的参数类型的声明就可以直接使用

  • HttpServletRequest request:通过request对象来获取请求的信息
  • HttpServletResponse response:通过response来处理响应信息
  • HttpSession session:通过session对象来存放缓存信息
  • Model model:Model是一个接口,modelMap是一个接口实现,将model信息填充到request中
    public String index(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) {
        //返回的modelAndView
        //指定返回的页面    

2、基本数据类型

基本的数据类型也支持绑定,基础的数据类型包括byte、short、int、long 、float、double、char、boolean

JSP页面:

<html>
<head>
    <title>测试基本数据类型</title>
</head>
<body>
<!-- 测试基本的数据类型绑定:form表单向后端提交数据 -->
<form action="/index/basedataType" method="post">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>
</body>
</html>

controller层:

   @RequestMapping("/basedataType")
public void baseDataType(int username) {
    System.out.println("基本数据类型:"+username);
}
  • 注意:表单上Input中的name值和controller的参数的变量名保持一致,则能完成数据绑定,如果不一致呢?

  • 需要@RequestParam注解来完成,JSP页面不用改变
    在这里插入图片描述
    使用@RequestParam注解就可以解决页面Input的name值和controller方法形参名不一致的问题

注意:基本的数据类型和包装类型(Integer,Long…)以及String类型参数绑定都是适用于以上基本类型参数绑定,基本类型和包装类型的区别:基本类型传递参数不能为null或者“”,否则会出现数据转化的异常,包装类型不会出现这种问题,建议使用时使用包装。

在这里插入图片描述

3、自定义类型

自定义类型的类(User)

public class User {
    private Long id;
    private String name;
    private String address;
}
//getter setter  toString

JSP页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>自定义类型数据提交</title>
    </head>
    <body>
    <form action="/user/adduser" method="post">
    用户id:<input type="text" name="id"><br/>
    用户名:<input type="text" name="name"><br/>
    地址:<input type="text" name="address"><br/>
    <input type="submit" value="提交">
    </form>
    </body>
    </html>

controller层

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/index")
    public String index() {
        return "user";
    }
    @RequestMapping("/adduser")
    //接收自定义类型的数据
    public String addUser(User user){
        System.out.println("用户信息:"+user);
        return "success";
    }
}

在这里插入图片描述
注意:页面输入框的name属性值和自定义的pojo实例的属性名保持一致即可映射成功
如果类型存在 不一致时需要自定义一个类型转化器,需要给定一个自定义的类,实现Converter接口,该接口需要执行转化的类型,例如将前端的String的数据转化为日期类型,即Converter<String,Date>

4、集合类型

集合类型:数组,List、Map等常用的集合类型都会支持
以List集合为例进行介绍

JSP页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>用户列表</title>
</head>
<body>
<table align="center" border="1">
    <thead>
    <tr>
        <td>用户id</td>
        <td>用户名</td>
        <td>地址</td>
    </tr>
    </thead>
    <tbody>
    <c:forEach items="${users}" var="user">
        <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.address}</td>
        </tr>
    </c:forEach>
    </tbody>
</table>
</body>
</html>

controller层

@RequestMapping("/userlist")
//集合类型数据的传递
public ModelAndView userList() {


    ModelAndView modelAndView = new ModelAndView();
    //指定逻辑视图名
    modelAndView.setViewName("userlist");

    //伪数据集合
    ArrayList<User> users = new ArrayList <>();
    User user1 = new User();
    user1.setId(1L);
    user1.setName("张三");
    user1.setAddress("陕西西安");
    users.add(user1);

    User user2 = new User();
    user2.setId(2L);
    user2.setName("李四");
    user2.setAddress("陕西西安");
    users.add(user2);

    User user3 = new User();
    user3.setId(3L);
    user3.setName("王五");
    user3.setAddress("陕西西安");
    users.add(user3);

    //填充数据
    modelAndView.addObject("users", users);

    return modelAndView;
}

在这里插入图片描述

二:返回值

1、返回ModelAndView类型

返回结构定位ModelAndView时,将model和View分别进行设置

    @RequestMapping("/userlist")
    //集合类型数据的传递
    public ModelAndView userList() {


        //伪数据集合
        ArrayList <User> users = new ArrayList <>();

        ModelAndView modelAndView = new ModelAndView();
        //指定逻辑视图名
        modelAndView.setViewName("userlist");
        //返回数据
        modelAndView.addObject("users", users);
        modelAndView.addObject("class", "超大充电宝");

        return modelAndView;
    }

在这里插入图片描述

在这里插入图片描述

2、返回String类型

(1)返回逻辑视图名

返回String,可以表示是逻辑视图名
在这里插入图片描述

  • 真正视图(jsp路径)=“前缀”+逻辑视图名+“后缀”
    前缀和后缀可以在spring-mvc中设置视图解析器组件时指定
    在这里插入图片描述

(2)redirect重定向

redirect特点:

  • 浏览器上地址URL会发生改变,
  • 修改后的request的数据无法传递到重定向的页面,即重定向时request数据无法共享
    在这里插入图片描述
    点击提交之后,页面跳转到redirect指定的页面,URL会发生改变
    在这里插入图片描述

(3)forward页面转发

forward特点:

  • 浏览器的地址URL不变的
  • request是可以共享的
    在这里插入图片描述
    点击提交之后,页面跳转到forward指定的页面,URL不会发生改变
    在这里插入图片描述

问题:forward和redirect的区别?

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

  • 直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
  • 间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

举个通俗的例子:

  • 直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”
  • 间接转发就相当于:“A找B借钱,B说没有,让A去找C借”

二者区别:
redirect 重定向:

  • 1、重定向会改变浏览器地址栏地址 。
  • 2、重定向不止可以访问服务器内的资源,还可以访问外部连接 。
  • 3、重定向因为是两次请求,所以重定向不能使用request来访问资源和共享数据,因为request的作用域是一次请求内。

forward 请求转发:

  • 1、不会改变浏览器地址栏信息 。
  • 2、只能访问服务器内部资源 。
  • 3、是一次请求.所以可以使用request共享数据。

2、返回void类型

    @RequestMapping("/void")
    //接收自定义类型的数据
    public void result(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //添加用户成功跳转到用户列表
        request.getRequestDispatcher("/user/userlist").forward(request,response);
        response.sendRedirect("/user/userlist");

        response.getWriter().write("hello...");
    }

(1)使用request页面转向

 request.getRequestDispatcher("/user/userlist").forward(request,response);

(2)通过response页面重定向

response.sendRedirect("/user/userlist");

(3)通过response指定响应结果

response.getWriter().write("hello...");
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值