欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-30 19:34:15
参数绑定和返回值介绍以一个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.ModelAndVie...

参数绑定和返回值介绍

以一个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就可以直接使用该参数了。

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

这里主要涉及的是参数绑定组件,需要先理解请求的数据转化为我们需要的数据称之为参数绑定组件,也就是参数绑定转换器, 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";
    }
}

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

forward:页面转发

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

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

返回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");
    }
}

本文地址:https://blog.csdn.net/Sampson_S/article/details/107382867

相关标签: # SpringMVC框架