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参数绑定和返回值内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解利用SpringMVC拦截器控制Controller返回值

    背景:需求是在Controller中方法没有实现时,返回模拟结果.主要用于项目初期前台跟后台的交互,Web项目就是在前台发出请求然后后台响应并返回结果.本示例利用拦截器和注解实现跳过执行方法直接返回定义结构的功能. 通过定义一个StringResult注解,在访问方法的时候返回StringResult中的内容.通过Debug注解来定义方法是否要返回StringResult中的内容. Debug默认为TRUE package com.tiamaes.dep.annotation; import j

  • 一篇文章弄懂Spring MVC的参数绑定

    前言 参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢? 下面我们来详细的讲解. SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行参数绑定: 1. @PathVariable注解 @PathVariabl

  • [Spring MVC]-详解SpringMVC的各种参数绑定方式

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post"> <input name="count" value="10" t

  • 详解springmvc之json数据交互controller方法返回值为简单类型

    当controller方法的返回值为简单类型比如String时,该如何与json交互呢? 使用@RequestBody 比如代码如下: @RequestMapping(value="/ceshijson",produces="application/json;charset=UTF-8") @ResponseBody public String ceshijson(@RequestBody String channelId) throws IOException{

  • SpringMVC Controller 返回值的可选类型详解

    spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void. ModelAndView @RequestMapping("/hello") public ModelAndView helloWorld() { String message = "Hello World, Spring 3.x!"; return new ModelAndView("hello"

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

    一:参数绑定 参数绑定过程 在springMVC中,从前端(页面:jsp-)发送请求到后端(controller-),会包含一些数据,数据是如何到达Controller,这个过程就是参数绑定过程 1.默认支持的类型 SpringMVC有支持的默认的参数类型,在方法上给出默认的参数类型的声明就可以直接使用 HttpServletRequest request:通过request对象来获取请求的信息 HttpServletResponse response:通过response来处理响应信息 Htt

  • 关于Spring MVC同名参数绑定问题的解决方法

    前言 最近在使用Spring MVC接收参数的时候,碰到个同名参数绑定的问题,参考了好几篇文章才解决问题,所以自己在这里总结一下,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 比如,我的表单是这样的: <form action="/test.action" method="post"> <input name="user.name"> <input name="acc.name"&g

  • Spring MVC请求参数的深入解析

    请求参数解析 客户端请求在handlerMapping中找到对应handler后,将会继续执行DispatchServlet的doPatch()方法. 首先是找到handler对应的适配器. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 进入到getHandlerAdapter(mappedHandler.getHandler())方法中 protected HandlerAdapter getHandler

  • Spring MVC请求参数接收的全面总结教程

    前提 在日常使用SpringMVC进行开发的时候,有可能遇到前端各种类型的请求参数,这里做一次相对全面的总结.SpringMVC中处理控制器参数的接口是HandlerMethodArgumentResolver,此接口有众多子类,分别处理不同(注解类型)的参数,下面只列举几个子类: RequestParamMethodArgumentResolver:解析处理使用了@RequestParam注解的参数.MultipartFile类型参数和Simple类型(如long.int)参数. Reques

  • Spring Boot 捕捉全局异常 统一返回值的问题

    在前后端分离的情况下,我们经常会定义一个统一的反回数据格式,通常都会包含状态码,返回信息,返回的数据,是否成功等参数. 1.ResultCode 单独定义了一个ReturnCode枚举类用于存储代码和返回的Message public enum ResultCode { //成功 SUCCESS(200), // 失败 FAIL(400), // 未认证(签名错误) UNAUTHORIZED(401), // 接口不存在 NOT_FOUND(404), // 服务器内部错误 INTERNAL_S

  • Spring MVC处理参数中的枚举类型通用实现方法

    前言 在开发的过程中,会涉及到大量的枚举类型数据,我们都知道,Springmvc本身能自动转换很多的数据类型,也支持你自定义转换类型,非常灵活. 本文主要介绍的是关于Spring MVC处理参数的枚举类型通用实现的相关内容,下面话不多说了,来一起看看详细的介绍吧 业务场景: 前端提交了枚举的一个属性value,想由spring来完成参数类型自动转换成对应的枚举. 比方有一个枚举 @AllArgsConstructor(access = AccessLevel.PRIVATE) @Getter @

  • python3 http提交json参数并获取返回值的方法

    如下所示: import json import http.client connection = http.client.HTTPSConnection('spd.aiopos.cn') headers = {'Content-type': 'application/json'} values = { 'acct_pan':'6226011****83678', 'acct_name':'张三', 'cert_type':'01', 'cert_id':'37293019****95', 'p

  • spring mvc 实现获取后端传递的值操作示例

    本文实例讲述了spring mvc 实现获取后端传递的值.分享给大家供大家参考,具体如下: jsp页面怎么获取从后端传递过来的值? JSTL 方法获取后端传递的值 @RequestMapping("index1") public ModelAndView index1() { ModelAndView model = new ModelAndView("/Index/index"); model.addObject("msg","my

  • Java 带参数与带返回值的方法的定义和调用

    目录 带参数方法的定义和调用 形参和实参 带参数方法练习 带返回值的方法的定义和调用 带返回值的方法定义 带返回值的方法调用 带参数方法的定义和调用 形参和实参 形参:方法定义中的参数 相当于变量定义格式,例int number 实参:方法调用中参数 等同于变量或常量,例如10   , number 带参数方法练习 需求: 设计一个方法用于打印两个数中最大数,数据来自于方法参数 思路: 1.定义一个方法,用于打印两个书中的最大数,例如getMax() public static void get

随机推荐