【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方法的形参上可以定义HttpServletRquest
和HttpServletResponse
类型的参数,使用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
上一篇: 低价也能买高配 千元价位高关注度手机推荐
下一篇: 不见你穿裤叉