【SpringMVC框架】参数绑定和返回值介绍

参数绑定和返回值介绍

以一个Controller请求为例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("userList")
    public ModelAndView userList() {
        //这个是需要Service获取数据结果
        List<User> list = userService.getAllUser();

        //返回ModelAndView结果
        ModelAndView modelAndView = new ModelAndView();
        //填充数据
        modelAndView.addObject("users", list);
        //指定视图
        modelAndView.setViewName("userList");
        return modelAndView;
    }
}
Controller请求介绍

在请求中@RequestMapping注解的作用有两点:

  • 窄化请求URL:

    • 在类上添加@RequestMapping注解,对URL进行分类管理,可以在这里定义根路径,最终的访问URL是跟路径+子路径。
  • 限制HTTP的请求方法:

    • @RequestMapping( value = "userList",method = RequestMethod.POST),如果限制请求为POST请求时,则前端的get请求会报错(405错误)。
Spring MVC的参数绑定

参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,当数据到达Controller层时,就是参数绑定的过程。

参数绑定过程

在Spring MVC中,提交请求的数据是通过方法形参接收,从客户端请求key-value数据,经过参数绑定,将key-value数据绑定到controller的形参上,然后通过controller就可以直接使用该参数了。

在这里插入图片描述

这里主要涉及的是参数绑定组件,需要先理解请求的数据转化为我们需要的数据称之为参数绑定组件,也就是参数绑定转换器, Spring MVC内置很多参数转换器,只有在极少数情况需要实现自定义的参数转换器。

默认支持的类型

Spring MVC支持的默认的参数类型主要有以下几种,这些类型直接在方法的形参上给出默认的类型的声明,就可以直接使用了。

  • HttpServletRequest对象,通过request对象来获取请求信息。
  • HttpServletResponse对象,通过response处理响应信息。
  • HttpSession对象,通过Session对象得到session信息(缓存信息的存储)。
  • Model/ModelMap对象,Model是接口,ModelMap是一个接口实现,将model数据填充到request中,即使使用Model,内部绑定的还是ModelMap的实现。
  • 例如:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {

    //默认的类型
    @RequestMapping("defaultParamType")
    public void defaultParamType(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) throws IOException {
        //获取前端请求的数据
        request.getParameter("userName");
        //设置数据
        request.setAttribute("repsonseParam","request");
        //响应结果
        response.getWriter().write("response");

        //设置session信息
        session.setAttribute("sessionParam","session");

        //Model参数设置
        model.addAttribute("modelParam","model");

    }
}
基本的数据类型

基本的数据类型包括:byte,short,int,long,float,double,char,boolean。

以int为类:

  • 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>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    </head>

    <body>
        <form action="${pageContext.request.contextPath}/user/basicDataType" method="get">
            <input name="number" value="20" type="text"/>
            <input type="submit" value="提交"/>
        </form>
    </body>
</html>
  • Controller层代码:
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    //基本的数据类型
    @RequestMapping("dataType")
    public String DataType() {
        return "dataType";
    }

    @RequestMapping("basicDataType")
    public void basicDataType(int number){
        System.out.println("number:" + number);
    }
}
  • 注意:表单中Input的name值和controller的参数变量名保持一致,可以完成数据绑定。
  • 如果不一致,则需要使用@RequestParam注解完成。例如:
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    //基本的数据类型
    @RequestMapping("dataType")
    public String DataType() {
        return "dataType";
    }

    @RequestMapping("basicDataType")
    public void basicDataType(@RequestParam("number") int num){
        System.out.println("number:" + num);
    }
}
自定义的类型

例如:

public class User {
    //用户ID
    private int id;
    private String userName;
    private String sex;
    private String address;

    //省略get/set方法
}
  • 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>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>详情</title>
</head>
<body>

<form action="${pageContext.request.contextPath }/user/editUserSubmit" method="get">
    <table width="60%" border="1"align="center">
        <h1 align="center">修改用户信息</h1>
        <tr>
            <td>用户ID</td>
            <td> <input type="text" name="id" value="${user.id }" readonly ></td> </td>
        </tr>
        <tr>
            <td>用户名</td>
            <td> <input id="username" type="text" name="userName" value="${user.userName }"></td> </td>
        </tr>
        <tr>
            <td>性别</td>
            <td> <input id="sex" type="text" name="sex" value="${user.sex }"></td> </td>
        </tr>
        <tr>
            <td>地址</td>
            <td> <input id="address" type="text" name="address" value="${user.address }"></td> </td>
        </tr>
        <tr ><td colspan="2" align="center"><input   type="submit" value="提交"/></td></tr>
    </table>
</form>
</body>
</html>
  • 注意:表达的name属性和pojo实体类的属性保持一致才能映射成功。

  • controller层代码:

/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    //自定义的数据类型
    @RequestMapping("{id}")
    public ModelAndView user(@PathVariable("id") int id){
        User user = new User();
        user.setId(1);
        user.setUserName("lisi");
        user.setSex("男");
        user.setAddress("西安");

        //返回ModelAndView结果
        ModelAndView modelAndView = new ModelAndView();
        //填充数据
        modelAndView.addObject("user", user);
        //指定视图
        modelAndView.setViewName("editUser");
        return modelAndView;
    }

    @RequestMapping("editUserSubmit")
    public String editUserSubmit(User user){
        System.out.println("用户信息:" + user);
        return "success";
    }
}
集合类型

集合类型:数组、List、Map等常用的数据传输的类型。

以List为例:

  • JSP页面:c:forEach
<%@ 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>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>用户列表</title>
</head>
<body>
<table width="80%" border="1" align="center">
    <h1 align="center">用户列表</h1>
    <tr>
        <td>用户ID</td>
        <td>用户名</td>
        <td>性别</td>
        <td>住址</td>
    </tr>

    <c:forEach items="${users }" var="user">
        <tr>
            <td>${user.id }</td>
            <td>${user.userName }</td>
            <td>${user.sex}" </td>
            <td>${user.address }</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>
  • controller层代码:
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    //集合类型
    @Autowired
    private UserService userService;

    @RequestMapping(value = "UserList", method = {RequestMethod.POST, RequestMethod.GET})
    public ModelAndView userList() {
        //这个是需要Service获取数据结果
        List<User> list = userService.getAllUser();

        //返回ModelAndView结果
        ModelAndView modelAndView = new ModelAndView();
        //填充数据
        modelAndView.addObject("users", list);
        //指定视图
        modelAndView.setViewName("userList");
        return modelAndView;
    }
}
Spring MVC的请求返回值
返回ModelAndView类型

返回结果定位为ModelAndView类型,将Model和view进行分别设置。

/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping(value = "UserList", method = {RequestMethod.POST, RequestMethod.GET})
    public ModelAndView userList() {
        //这个是需要Service获取数据结果
        List<User> list = userService.getAllUser();

        //返回ModelAndView结果
        ModelAndView modelAndView = new ModelAndView();
        //填充数据
        modelAndView.addObject("users", list);
        //指定视图
        modelAndView.setViewName("userList");
        return modelAndView;
    }
}
返回String类型

返回逻辑视图名

  • 真正路径=前缀+逻辑视图名+后缀。
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping("dataType")
    public String DataType() {
        //逻辑视图名 =》视图路径=前缀("WEB-INF/jsp/")+逻辑视图名("dataType")+后缀(".jsp")
        return "dataType";
    }
}

redirect:重定向

  • 重定向特点:浏览器的URL地址会发生改变,修改后的request的数据无法传递给重定向的页面,因此重定向后重新进行request(request是无法共享)。
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping("editUserSubmit")
    public String editUserSubmit(User9 user) {
        System.out.println("editUserSubmit:"+user);
        //通过重定向和页面转发来进行介绍 "user/userList"
        return "redirect:userList";
    }
}

在这里插入图片描述

forward:页面转发

  • 浏览器的URL地址不变,request共享。
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping("editUserSubmit")
    public String editUserSubmit(User9 user) {
        System.out.println("editUserSubmit:"+user);
        //通过重定向和页面转发来进行介绍 "userList"
        return "forward:userList";
    }
}

在这里插入图片描述

返回void类型

在controller方法的形参上可以定义HttpServletRquestHttpServletResponse类型的参数,使用request和response类响应结果。

使用request转向页面

/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping("defaultParamType")
    public void defaultParamType(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
      request.getRequestDispatcher("userList").forward(request,response);
    }
}

使用response页面重定向

/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping("defaultParamType")
    public void defaultParamType(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
       response.sendRedirect("userList");
    }
}

通过response指定响应结果

  • 例如通过JSON数据返回。
/*
 * 处理器
 * 基于注解实现的Handler
 */
@Controller
public class ControllerDemo {
    @RequestMapping("defaultParamType")
    public void defaultParamType(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write("hello word");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值