1.SpringMVC 绑定请求参数

(1)支持的数据类型

基本类型参数
  包括基本类型和 String 类型
POJO 类型参数
  包括实体类,以及关联的实体类
数组和集合类型参数
  包括 List 结构和 Map 结构的集合(包括数组)

(2)使用要求

SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
<1>如果是基本类型或者 String 类型:
  要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
<2>如果是 POJO 类型,或者它的关联对象:

  要求form表单中参数名称和实体类javabean的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
  SpringMVC 会将请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。

<3>如果是集合类型,有两种方式:
  第一种:
    要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
    给 List 集合中的元素赋值,使用下标。
    给 Map 集合中的元素赋值,使用键值对。
  第二种:
    接收的请求参数是 json 格式数据。需要借助一个注解实现。

2.绑定请求参数代码测试

注意:以下代码的运行环境是day18_spring_test01_quickstart这个web工程

(1)请求参数为基本的数据类型

ParamsController.java这个控制器类

package lucky.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; /**
* 请求参数绑定
*/
@Controller
@RequestMapping(path = "/params")
public class ParamsController {
/**
* 请求参数绑定入门
* @return
*/
@RequestMapping(path = "/testParam")
public String testParam(String username,String password){
System.out.println("testParam方法执行了");
System.out.println("用户名:"+username+",密码:"+password);
return "success";
}
}

jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>params_bind</title>
</head>
<body>
<%--请求参数的绑定--%>
<a href="/day18_spring_test01_quickstart/params/testParam?username=lucky&password=plj666">请求参数绑定</a>
</body>
</html>

控制台输出:

(2)将请求参数封装到javabean中

Account.java

package lucky.domain;

import java.io.Serializable;

public class Account implements Serializable {
private String username;
private String password;
private Double money;
private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Double getMoney() {
return money;
} public void setMoney(Double money) {
this.money = money;
} @Override
public String toString() {
return "Account{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
", user=" + user +
'}';
}
}

User.java

package lucky.domain;

import java.io.Serializable;

public class User implements Serializable {
private String name;
private Integer age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

ParamsController.java

package lucky.controller;

import lucky.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; /**
* 请求参数绑定
*/
@Controller
@RequestMapping(path = "/params")
public class ParamsController {/**
* 把请求参数封装绑定到javabean的类中
* @return
*/
@RequestMapping(path = "/testParamAccount")
public String testParamAccount(Account account){
System.out.println("testParamAccount方法执行了");
System.out.println(account);
return "success";
}
}

jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>params_bind</title>
</head>
<body>
<%--请求参数的绑定--%>
<%--name 属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。--%>
<%--只有设置了 name 属性的表单元素才能在提交表单时传递它们的值。--%>
<%--注意:name属性值必须与javabean的成员变量名称一模一样,否则无法识别--%>
<form action="/day18_spring_test01_quickstart/params/testParamAccount" method="post">
姓名:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
金额:<input type="text" name="money"><br>
用户名:<input type="text" name="user.name"><br>
年龄:<input type="text" name="user.age"><br>
<input type="submit" value="提交">
</form>
</body>
</html>

控制台输出:

3.常用注解

(1)@RequestParam

  <1>作用:把请求中指定名称的参数给控制器中的形参赋值。
  <2>属性:
    value:请求参数中的名称。
    required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

  <3>使用案例

  AnnotationController.java

package lucky.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; /**
* 常用的注解
* @RequestParam(value= "name") 把(annotation.jsp)请求中指定名称的参数(name)给控制器中的形参(username)赋值。
*/
@Controller
@RequestMapping(path = "/annotation")
public class AnnotationController {
@RequestMapping(path = "/testRequestParam")
public String testRequestParam(@RequestParam(value= "name") String username){
System.out.println("执行了testRequestParam");
System.out.println(username);
return "success";
}
}

  jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>annotation</title>
</head>
<body>
<%--常用的注解--%>
<a href="/day18_spring_test01_quickstart/annotation/testRequestParam?name=lucky">RequestParam</a>
</body>
</html>

(2)@PathVaribale

  <1>作用:
    用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
    url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 restful 风格 URL 的一个重要标志。
  <2>属性:
    value:用于指定 url 中占位符名称。
    required:是否必须提供占位符。

  <3>REST 风格的URL

  REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
  restful 的优点
    它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
  restful 的特性:
    资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
    表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
    状态转化(State Transfer):每 发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
restful 的示例:
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 删除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account

  <4>使用案例

AnnotationController.java

package lucky.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; /**
* 常用的注解
* @RequestParam(value= "name") 把(annotation.jsp)请求中指定名称的参数(name)给控制器中的形参(username)赋值。
*/
@Controller
@RequestMapping(path = "/annotation")
public class AnnotationController {
/**
* PathVariable注解使用案例
* @param id
* @return
*/
@RequestMapping(path = "/testPathVariable/{id}")
public String testPathVariable(@PathVariable(value = "id") String id){
System.out.println("执行了testPathVariable");
System.out.println(id);
return "success";
}
}

jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>annotation</title>
</head>
<body>
<%--常用的注解--%> <a href="/day18_spring_test01_quickstart/annotation/testPathVariable/10">PathVariable</a>
</body>
</html>

(3)@RequestBody

  作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。

相关代码:

  /**
* 模拟异步请求
* springmvc会自动的将json数据转为javabean对象
*/
@RequestMapping(path = "/testAjax")
public @ResponseBody User testAjax(@RequestBody User user) throws Exception{
System.out.println("testAjax方法执行了");
System.out.println(user);
//模拟查询数据库操作
user.setUsername("linda");
user.setAge(31);
return user;
}

注意:一般情况下,推荐使用@RequestParam注解来接受Http请求参数。

16 SpringMVC 的请求参数的绑定与常用注解的更多相关文章

  1. springmvc请求参数的绑定和获取

    请求参数的绑定和获取: 获取页面请求的参数,是javaweb必不可少的一个环节,在struts中,是通过再Action中定义属性,或者Model的方式进行数据绑定和获取.需要提供setter或gett ...

  2. SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  3. springmvc:请求参数绑定集合类型

    一.请求参数绑定实体类 domain: private String username; private String password; private Double money; private ...

  4. SpringMVC RequestMapping & 请求参数

    SpringMVC 概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC ...

  5. SpringMVC接受请求参数、

    1. 接收请求参数 1.1. [不推荐]通过HttpServletRequest 在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getPara ...

  6. SpringMVC——映射请求参数

    Spring MVC 通过分析处理方法的签名,将 HTTP 请求信息绑定到处理方法的相应人参中. @PathVariable @RequestParam @RequestHeader 等) Sprin ...

  7. SpringMvc接受请求参数的几种情况演示

    说明: 通常get请求获取的参数是在url后面,而post请求获取的是请求体当中的参数.因此两者在请求方式上会有所不同. 1.直接将接受的参数写在controller对应方法的形参当中(适用于get提 ...

  8. SpringMVC底层——请求参数处理流程描述

    在DispatcherServlet.java的doDispatch方法中,springmvc通过handlermapping里面找哪个handler能处理请求,handler封装了目标方法的信息, ...

  9. SpringMVC 接受请求参数、作用域传值

    目录 原生servlet接收参数 Spring MVC最基础的参数获取 接收基本数据类型参数 方法参数列表和请求参数不一致的处理方式 接收对象引用数据类型 接收复选框这种多个同名的参数 接收obj.f ...

随机推荐

  1. linux mustache bash 实现mo 做为docker容器运行动态配置工具数组的处理

    前面有说过关于使用mo 工具的简单配置使用,但是实际中我们可能存在比较复杂的数据处理,比如数组,mo 可以进行数组的处理,但是在测试的过程中,一直失败,查看了官方的demo以及帮助命令发现可以通过参数 ...

  2. 常用方法 DataTable转换为Entitys

    备注:摘自网上 有附地址 public static List<T> DataTableToEntities<T>(this DataTable dt) where T : c ...

  3. poj2398 Toy Storage 计算几何,叉积,二分

    poj2398 Toy Storage 链接 poj 题目大意 这道题的大概意思是先输入6个数字:n,m,x1,y1,x2,y2.n代表卡片的数量,卡片竖直(或倾斜)放置在盒内,可把盒子分为n+1块区 ...

  4. 新手AS常见问题集锦

    开发环境 以前开发android的时候可以使用eclipse,虽然现在也能使用eclipse,但是google已经不再支持使用eclipse开发android了.因为google有了自己的IDE--- ...

  5. Linux禁止ping和开启ping的方法

    Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping.   一.通过修改 ...

  6. 织梦一二级导航菜单被点击顶级栏目高亮(加class)解决方法

    织梦一二级导航菜单被点击的栏目高亮显示方法详解,废话不多说直接举例说明: 织梦一级菜单被点击栏目高亮调用方法: {dede:channel typeid ='1'  type ='son' curre ...

  7. js svg转图片格式

      1.情景展示 闲来无事的时候,发现chrome扩展程序里面有图像,本想下载下来,却发现文件格式是svg格式,如何将svg文件改成图片格式? chrome-extension://jlgkpaici ...

  8. Mysql中联合索引的最左匹配原则(百度)

    创建联合索引时列的选择原则 经常用的列优先(最左匹配原则) 离散度高的列优先(离散度高原则) 宽度小的列优先(最少空间原则) 在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先.如果我们 ...

  9. Java Thread dump 日志分析

    jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on conditio ...

  10. python 五星红旗

    import turtle turtle.setup(600,400,0,0) turtle.bgcolor("red") turtle.fillcolor("yello ...