react 前端框架如何驱动企业数字化转型与创新发展
753
2023-02-13
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页面:
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" %>
用户id:
用户名:
地址:
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
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="cQGuulZAk" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
用户id 用户名 地址
controller层
@RequestMapping("/userlist")
//集合类型数据的传递
public ModelAndView userList() {
ModelAndView modelAndView = new ModelAndView();
//指定逻辑视图名
modelAndView.setViewName("userlist");
//伪数据集合
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
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...");
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~