Spring MVC的参数绑定和返回值问题

网友投稿 256 2022-11-03


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 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 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...");


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux知识01:VM和Linux系统(CentOS)安装
下一篇:Android WebView的缓存
相关文章

 发表评论

暂时没有评论,来抢沙发吧~