热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【SpringMVC框架】参数绑定和返回值介绍

参数绑定和返回值介绍以一个Controller请求为例:importorg.springframework.beans.factory.annotation.Autowired;i


参数绑定和返回值介绍

以一个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"%>

<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"%>

<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">


<h1 align="center">修改用户信息h1>
<tr>
<td>用户IDtd>
<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" %>

<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>用户IDtd>
<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方法的形参上可以定义HttpServletRquestHttpServletResponse类型的参数,使用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



推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • ECharts 官方提供了丰富的图表示例,但实际项目中往往需要从后端动态获取数据。本文将详细介绍如何从后端获取数据并将其转换为 ECharts 所需的 JSON 格式,以实现动态饼图的展示。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 本文深入解析了Django框架中的MVT(Model-View-Template)设计模式,详细阐述了其工作原理和应用流程。通过分析URL模式、视图、模型和模板等关键组件,读者将全面理解Django应用程序的架构体系,掌握如何高效地构建和管理Web应用。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
author-avatar
jx轩宝妈咪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有