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...");
到此这篇关于Spring MVC的参数绑定和返回值的文章就介绍到这了,更多相关Spring MVC参数绑定和返回值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!