Spring MVC获取请求参数

一、紧耦合方式:通过 HttpServletRequest 获取请求参数

DispatcherServlet中的service方法直接将此次请求的request对象传递给调用的单元方法即可。同时在单元方法上声明形参HttpServletRequest来接收request实参即可。

案例演示:还是在之前项目的基础上

1.在com.augus.controller新建名为ParamController的 Controller 类,代码如下:

package com.augus.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class ParamController {
    //访问success页面,将用户名和密码提交给/getRquertParam
    @RequestMapping("/saySuccess")
    public String saySuccess(){
        return "success";
    }

    @RequestMapping("/getRquertParam")
    public String rquertParam(HttpServletRequest request){
        //获取传递过来的参数
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        System.out.println("用户名:"+name);
        System.out.println("密码:"+pwd);
        return "index";
    }
}

2.创建success.jsp和index.jsp内容分别如下

<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/8
  Time: 15:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="getRquertParam" method="post">
    <table style="text-align: center;">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="name" required><br></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<h1>欢迎您登录springmvc学习网站</h1>
</body>
</html>

3.部署到 Tomcat 服务器中,启动 Tomcat,使用浏览器访问“http://localhost:8080/springmvc_01_war_exploded/saySuccess控制台输出如下。

 

输入用户名和密码,点击提交后,会显示如下,并且会在控制台打印处理,提交的内容

二、解耦合方式(熟练)

1.通过控制器方法的形参获取请求参数

在 Controller 的控制器方法中设置与请求参数同名的形参,以获取请求中携带的参数。当浏览器发送的请求匹配到这个控制器方法时,Spring MVC 会自动将请求参数赋值给相应的方法形参。

通过控制器方法的形参获取请求参数时,我们需要注意以下几点。

1.1. 必须保证参数名一致

我们必须保证控制器方法的形参名称与请求中携带参数的名称完全一致(区分大小写),否则控制器方法接收到的请求参数值会是 null。

1.2. 无视数据类型

此方式无视参数的数据类型的,我们可以在控制器方法中使用 String 字符串类型的形参接收所有的请求参数,也可以根据实际情况在控制器方法中使用对应数据类型的参数来接收请求参数,而无须自行进行数据类型转换。

1.3. 不适用于请求参数过多的请求

当请求中携带的参数过多时,如果我们还使用这种方式来获取请求参数,那就需要我们在控制器方法中设置大量的形参,这会让使代码变得十分臃肿,不易维护。

1.4. 同名请求参数的处理方式

当请求中包含多个同名的请求参数时,我们可以通过以下 2 种类型的形参来获取请求参数。

形参的数据类型获取到的请求参数值举例
String(字符串) 所有同名请求参数的值通过逗号(“,”)拼接在一起。 例如:下面案例中的用户名和面面
数组 由所有同名请求参数值组成的数组。

该数组通常为 String(字符串)类型的,如果所有同名请求参数值都符合同一个数据类型的规范,我们还可以使用与之对应的数据类型的数组进行接收。
例如:下面案例中的学历信息

1.5示例 

1.5.1. 在 com.augus.controller 包下,创建一个名为 FormalParamController的 Controller 类,代码如下。
package com.augus.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Arrays;

@Controller
public class FormalParametersController {
    //打开注册页面,将登录信息,提交给另一个地址
    @RequestMapping("/reg")
    public String sayRegister(){
        return "register";
    }

    /**
     * String phonenumber: 手机号码
     * String name,  用户名
     * String pwd,  这里是将多个值提交给了字符串,  格式如: 密码1,密码2
     * String[] education 定义了一个数组接受多个值
     */

    @RequestMapping("getFormalParame")
    public String getFormalParame(String phonenumber, String name, String pwd, String[] education){
        System.out.println("手机号码:"+phonenumber);
        System.out.println("用户名:"+name);
        System.out.println("密码or确认密码:"+ pwd);
        System.out.println("学校:"+ Arrays.toString(education));
        return "main";
    }

}
1.5.2.在 webapp/WEB-INF/view 目录中创建一个register.jsp和main.jsp代码分别如下。
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<form action="getFormalParame" method="post">
    <table style="margin: auto;">
        <tr>
            <td>手机号码:</td>
            <td><input type="text" name="phonenumber" required><br></td>
        </tr>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="name" required><br></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td>确认密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td>大学:</td>
            <td><input type="text" name="education" required><br></td>
        </tr>
        <tr>
            <td>研究生:</td>
            <td><input type="text" name="education" required><br></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交" style="margin: auto;">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<h1>注册成功</h1>
</body>
</html>
1.5.3. 启动 Tomcat 服务器,使用浏览器访问“http://localhost:8080/springmvc_01_war_exploded/reg”,结果如下

1.5.4. 输入如下内容,点击提交,即可在控制台输出提交的内容

 

1.6.使用 @RequestParam 注解获取请求参数

在控制器方法中通过 @RequestParam 注解,在请求参数与控制器方法的形参之间建立起映射关系将其绑定起来。即使请求参数与控制器方法中的形参名称不一致,也能获取到对应的请求参数值。

// 可以通过执行name属性的值和形参简历绑定关系,当name属性的值和形参名不一致的时候也可以进行,括号里面写name属性的值
    //同时需要注意@RequestParam 如果形参不是数组类型,则不能使用
    @RequestMapping("getFormalParame")
    public String getFormalParame(@RequestParam("phonenumber") String phonenumber, @RequestParam("name") String name,@RequestParam("pwd") String pwd,String[] education){
        System.out.println("手机号码:"+phonenumber);
        System.out.println("用户名:"+name);
        System.out.println("密码or确认密码:"+ pwd);
        System.out.println("学校:"+ Arrays.toString(education));
        return "main";
    }

2.通过实体类对象获取请求参数(推荐)

在 Controller 控制器方法的形参中设置一个实体类形参,如果请求参数的参数名与实体类中的属性名一致,那么 Spring MVC 会自动将请求参数封装到该实体类对象中。此时我们就可以通过该实体类对象获取所需的请求参数了。

2.1.案例演示

在com.augus下面创建包pojo,并在下面创建实体类User的,内容如下
package com.augus.pojo;


import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private String pwd;
    private String phonenumber;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", phonenumber=" + phonenumber +
                '}';
    }

    /*
    * 注意这里使用实体类赋值的是,需要通过set方法*/
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }
}
在com.augus.controller下面创建包UserController,内容如下
package com.augus.controller;

import com.augus.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {

    //访问注册信息提交页面,然后输入内容提交给getuser
    @RequestMapping("/user")
    public String user(){
        return "user";
    }

    @RequestMapping("/getuser")
    public String getUser(User user){
        System.out.println("name:"+user.getName());
        System.out.println("password:"+user.getPwd());
        System.out.println("phone:"+user.getPhonenumber());
        return "main";//没有报错则提示注册成功
    }
}
在WEB-INF下view包中创建user.jsp和main,jsp
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<form action="getuser" method="post">
    <table style="margin: auto;">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="name" required><br></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td>手机号码:</td>
            <td><input type="text" name="phonenumber" required><br></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交" style="margin: auto;">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<h1>注册成功</h1>
</body>
</html>
重新部署在Tomcat,访问http://localhost:8080/springmvc_01_war_exploded/user,即可看到

 

2.2.日期类型转换

在页面中,有时候需要提交时间日期,那么这里是需要特殊处理的,要通过一下方式进行

方式1 : 注解方式   (推荐该方式) 

实现方式通过 @DateTimeFormat(pattern = "yyyy-MM-dd") 可以用于方法参数列表和 类的属性上

在WEB-INF下view包中创建user.jsp和main,jsp(在user.jsp上增加了日期的提交)
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<form action="getuser" method="post">
    <table style="margin: auto;">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="name" required><br></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td>手机号码:</td>
            <td><input type="text" name="phonenumber" required><br></td>
        </tr>
        <tr>
            <td>出生日期:</td>
            <td><input type="text" name="birthday" required><br></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交" style="margin: auto;">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<h1>注册成功</h1>
</body>
</html>
实体类
package com.augus.pojo;


import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private String name;
    private String pwd;
    private String phonenumber;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", phonenumber=" + phonenumber +
                '}';
    }

    /*
    * 注意这里使用实体类赋值的是,需要通过set方法*/

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
在com.augus.controller下面创建包UserController,内容如下
package com.augus.controller;

import com.augus.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Date;

@Controller
public class UserController {

    //访问注册信息提交页面,然后输入内容提交给getuser
    @RequestMapping("/user")
    public String user(){
        return "user";
    }

    /*@RequestMapping("/getuser")
    public String getUser(User user){
        System.out.println("name:"+user.getName());
        System.out.println("password:"+user.getPwd());
        System.out.println("phone:"+user.getPhonenumber());
        System.out.println("birthday: "+ user.getBirthday());
        return "main";//没有报错则提示注册成功
    }*/

    //也可以在方法参数列表上指定,时间日期格式的转换
    @RequestMapping("/getuser")
    public String getUser(String name, String pwd, String phonenumber,@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
        System.out.println("name:"+name);
        System.out.println("password:"+pwd);
        System.out.println("phone:"+phonenumber);
        System.out.println("birthday: "+ birthday);
        return "main";//没有报错则提示注册成功
    }
}
访问http://localhost:8080/springmvc_01_war_exploded/user

方式2 : 配置转换器  (了解) 
定义转换器,在com.augus下创建util包,在里面创建StringToDateConverter用于定义转换器,内容如下
package com.augus.util;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateConverter implements Converter<String, Date> {
    private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date convert(String s) {
        Date date = null;
        try {
            date = dateFormat.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

}
在springmvc.xml 中配置转换器,添加内容:
 <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--配置类型转换器-->
        <property name="converters">
            <array>
                <!--注入自定义转换器对象-->
                <bean class="com.augus.util.StringToDateConverter"></bean>
            </array>
        </property>
    </bean>

    <!--配置转换工厂服务-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
准备controller控制器,其中控制器方法参数中无需特殊处理,即可将页面上提交的日期格式自动转换,其中需要使用user.jsp和main.jsp和之前一样,
package com.augus.controller;

import com.augus.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Date;

@Controller
public class UserController {

    //访问注册信息提交页面,然后输入内容提交给getuser
    @RequestMapping("/user")
    public String user(){
        return "user";
    }


    @RequestMapping("/getuser")
    public String getUser(String name, String pwd, String phonenumber,@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
        System.out.println("name:"+name);
        System.out.println("password:"+pwd);
        System.out.println("phone:"+phonenumber);
        System.out.println("birthday: "+ birthday);
        return "main";//没有报错则提示注册成功
    }
}
访问http://localhost:8080/springmvc_01_war_exploded/user,即可查看结果

 

2.3对于在实例类中使用 List集合接收参数

准备user.jsp和main.jsp(这个main,jsp使用之前的即可)
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<form action="getuser" method="post">
    <table style="margin: auto;">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="name" required><br></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td>手机号码:</td>
            <td><input type="text" name="phonenumber" required><br></td>
        </tr>
        <tr>
            <td>出生日期:</td>
            <td><input type="text" name="birthday" required><br></td>
        </tr>
        <tr>
            <td>兴趣爱好:</td>
            <td><input type="text" name="hobby" required><br></td>
            <td><input type="text" name="hobby" required><br></td>
            <td><input type="text" name="hobby" required><br></td>
        </tr>
        <%--宠物信息提交过去使用List集合保存,数组中存放的是一个一个的宠物对象--%>
        <tr>
            <%--
            pets[0].petName pets是user类中属性的值,petName则是该pet类的属性
            就是给pets集合索引为0的位置的存放的pet对象设置petName属性的值为页面输入进来的内容
            --%>
            <td>宠物一:</td>
            <td><input type="text" name="pets[0].petName" placeholder="名字" required><br></td>
            <td><input type="text" name="pets[0].petType" placeholder="种类" required><br></td>
        </tr>
        <tr>
            <td>宠物二:</td>
            <td><input type="text" name="pets[1].petName" placeholder="名字" required><br></td>
            <td><input type="text" name="pets[1].petType" placeholder="种类" required><br></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交" style="margin: auto;">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
创建实体类User和pet
package com.augus.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Pet implements Serializable {
    /**
     * 两个属性分别是宠物的名称和种类*/
    private String petName;
    private String petType;
}
package com.augus.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
    private String name;
    private String pwd;
    private String phonenumber;
    //进行时间格式转换
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    //这是数组保存多个值
    private String[] hobby;
    //使用List集合保存传递过来的宠物对象
    private List<Pet> pets;

}
在com.augus.controller下创建控制器类UserController,内容如下:
package com.augus.controller;

import com.augus.pojo.User;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Arrays;

@Controller
public class UserController {

    //访问注册信息提交页面,然后输入内容提交给getuser
    @RequestMapping("/user")
    public String user(){
        return "user";
    }

    @RequestMapping("/getuser")
    public String getUser(User user){
        System.out.println("name:"+user.getName());
        System.out.println("password:"+user.getPwd());
        System.out.println("phone:"+user.getPhonenumber());
        System.out.println("birthday: "+ user.getBirthday());
        System.out.println("hobby: "+ Arrays.toString(user.getHobby()));
        System.out.println("Pet: "+user.getPets());
        return "main";//没有报错则提示注册成功
    }
}
重新部署,访问http://localhost:8080/springmvc_01_war_exploded/user,内容如下

 

2.4.对于在实例类中使用 Map集合接收参数

准备user.jsp和main.jsp(这个main,jsp使用之前的即可)
<%--
  Created by IntelliJ IDEA.
  User: Augus
  Date: 2022/9/6
  Time: 12:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>springmvc学习网站</title>
</head>
<body>
<form action="getuser" method="post">
    <table style="margin: auto;">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="name" required><br></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="text" name="pwd" required><br></td>
        </tr>
        <tr>
            <td>手机号码:</td>
            <td><input type="text" name="phonenumber" required><br></td>
        </tr>
        <tr>
            <td>出生日期:</td>
            <td><input type="text" name="birthday" required><br></td>
        </tr>
        <tr>
            <td>兴趣爱好:</td>
            <td><input type="text" name="hobby" required><br></td>
            <td><input type="text" name="hobby" required><br></td>
            <td><input type="text" name="hobby" required><br></td>
        </tr>
        <%--宠物信息提交过去使用List集合保存,数组中存放的是一个一个的宠物对象--%>
        <%--<tr>
            &lt;%&ndash;
            pets[0].petName pets是user类中属性的值,petName则是该pet类的属性
            就是给pets集合索引为0的位置的存放的pet对象设置petName属性的值为页面输入进来的内容
            &ndash;%&gt;
            <td>宠物一:</td>
            <td><input type="text" name="pets[0].petName" placeholder="名字" required><br></td>
            <td><input type="text" name="pets[0].petType" placeholder="种类" required><br></td>
        </tr>
        <tr>
            <td>宠物二:</td>
            <td><input type="text" name="pets[1].petName" placeholder="名字" required><br></td>
            <td><input type="text" name="pets[1].petType" placeholder="种类" required><br></td>
        </tr>--%>
        <%--以Map集合方式提交保存的数据
        petMap['a'].petName petMap是实体类重的一个属性,该属性提交的是一个Map集合,以a或者b作为键,值为pet对象
        而.petName则表示给那个属性赋值
        --%>
        <tr>
            <td>宠物一:</td>
            <td><input type="text" name="petMap['a'].petName" placeholder="名字" required><br></td>
            <td><input type="text" name="petMap['a'].petType" placeholder="种类" required><br></td>
        </tr>
        <tr>
            <td>宠物二:</td>
            <td><input type="text" name="petMap['b'].petName" placeholder="名字" required><br></td>
            <td><input type="text" name="petMap['b'].petType" placeholder="种类" required><br></td>
        </tr>

        <tr>
            <td colspan="2">
                <input type="submit" value="提交" style="margin: auto;">
            </td>
        </tr>
    </table>
</form>
</body>
</html>
创建实体类User和pet
package com.augus.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
    private String name;
    private String pwd;
    private String phonenumber;
    //进行时间格式转换
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    //这是数组保存多个值
    private String[] hobby;
    //使用List集合保存传递过来的宠物对象
    //private List<Pet> pets;

    //使用Map集合保存传递过来的宠物对象
    private Map<String, Pet> petMap;
}
package com.augus.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Pet implements Serializable {
    /**
     * 两个属性分别是宠物的名称和种类*/
    private String petName;
    private String petType;
}
在com.augus.controller下创建控制器类UserController,内容如下:
package com.augus.controller;

import com.augus.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Arrays;
import java.util.Date;

@Controller
public class UserController {

    //访问注册信息提交页面,然后输入内容提交给getuser
    @RequestMapping("/user")
    public String user(){
        return "user";
    }
@RequestMapping("/getuser") public String getUser(User user){ System.out.println("name:"+user.getName()); System.out.println("password:"+user.getPwd()); System.out.println("phone:"+user.getPhonenumber()); System.out.println("birthday: "+ user.getBirthday()); System.out.println("hobby: "+ Arrays.toString(user.getHobby())); System.out.println("Pet: "+user.getPetMap()); //输出Map集合 return "main";//没有报错则提示注册成功 } }
重新部署,访问http://localhost:8080/springmvc_01_war_exploded/user,内容如下
 

 

三、解决获取请求参数的乱码问题

当我们在 post 请求中传递的参数为中文时,控制器方法获取到的参数值会出现乱码的情况。Spring MVC 默认提供了一个过滤器 CharacterEncodingFilter,在 web.xml 中添加如下内容即可解决请求和响应中的中文乱码问题,代码如下。

<!--请求和响应的字符串过滤器-->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--设置请求的编码-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <!--设置响应的编码,这里我们可以省略-->
    <init-param>
      <param-name>forceResponseEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

重启 Tomcat 服务器,再次访问http://localhost:8080/springmvc_01_war_exploded/user,输入数据提交,在控制台打印即可发现已经不会再有乱码

posted @ 2019-10-23 16:32  酒剑仙*  阅读(448)  评论(0编辑  收藏  举报