【Spring-MVC】获取请求参数

30 篇文章 1 订阅

SpringMVC–04获取请求参数

5.1 直接获取

我们可以通过和前端的数据传递时的name来获取数据,SpringMVC会将数据名一样的数据帮我们转化好,我们只需要在参数列表中加上对应的名字的数据即可

Jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>参数测试</title>
</head>
<body>
<h2>参数测试</h2>
<form method="post" action="/">

    姓名:<input type="text" name="name">
    <br/>
    年龄:<input type="number" name="age" min="0" max="100" value="18">岁
    <br/>
    <button>doPost New</button>
</form>
<div>
${msg}
</div>
</body>
</html>

Java:

@Controller
public class ParameterTestController {
    /**
     * 首页
     *
     * @return 返回首页
     */
    @GetMapping("/")
    public String welcomePage() {
        return "index";
    }

    /**
     * 使用post请求进行拦截
     * @param name 传入name
     * @param age 传入age
     * @param model model模型
     * @return 视图
     */
    @PostMapping("/")
    public String getInfo(String name, Integer age, Model model) {
        model.addAttribute("msg", name + "--->" + age);
        return "index";
    }
}

5.2 绑定获取

很多时候后端使用小驼峰命名的方法,而前端使用下划线连接,这时我们就不可以使用上面通过名字直接去获得了,而是需要去将前端的参数绑定

@Controller
public class ParameterTestController {
    /**
     * 首页
     *
     * @return 返回首页
     */
    @GetMapping("/")
    public String welcomePage() {
        return "index";
    }

    /**
     * 使用post请求进行拦截
     *
     * @param userName 传入name,绑定请求中name
     * @param userAge  传入age,绑定请求中age
     * @param model    model模型
     * @return 视图
     */
    @PostMapping("/")
    public String getInfo(@RequestParam("name") String userName, @RequestParam("age") Integer userAge, Model model) {
        model.addAttribute("msg", userName + "--->" + userAge);
        return "index";
    }
}

5.5 获取多个参数

如果前端传入多个参数,我们也可以使用list或者数组来接受,但是这时候必须要使用@RequestParam来标识这个数据需要SpringMVC来帮我们处理

Jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>参数测试</title>
</head>
<body>
<h2>参数测试</h2>
<form method="post" action="/">

    姓名:<input type="text" name="name">
    <br/>
    年龄:<input type="number" name="age" min="0" max="100" value="18">岁
    <br/>
    爱好:
    <div>
        <input type="checkbox" name="hobbies" value="sing">唱
        <input type="checkbox" name="hobbies" value="dance">跳
        <input type="checkbox" name="hobbies" value="basketball">篮球
        <input type="checkbox" name="hobbies" value="other">其他
    </div>
    <button>doPost New</button>
</form>
<div>
    ${msg}
</div>
</body>
</html>

List:

@PostMapping("/")
// 																						 这里需要标记list,通知SpringMVC帮助处理
public String getInfo(String name, Integer age,@RequestParam(required = false) List<String> hobbies, Model model) {
  model.addAttribute("msg", name + "--->" + age + "--->" + hobbies.toString());
  return "index";
}

数组:

@PostMapping("/")
//																							这里同样也需要标注
public String getInfo(String name, Integer age,@RequestParam(defaultValue ="noHobby") String[] hobbies, Model model) {
  model.addAttribute("msg", name + "--->" + age + "--->" + Arrays.toString(hobbies));
  return "index";
}

5.4 map获取

在比较原始的方法中是可以通过map集合来获取前端的参数,这样的好处是不需要通过注解去绑定值,参数的name和值会以k-v形式完整的放在map中。

缺点:

  • 因为map中的key是唯一的,所有多个同名参数传来的时候是不能存储的,而且因为在SpringMVC中转化参数时也进行了处理,如果是map来接收的话,value会以第一次存入的为主,不会被后面覆盖。
  • 多参数,还是需要集合或者数组来接收

Java:

@PostMapping("/")
//										使用map的话也需要标注注解,交给SpringMVC来处理								 多个参数还是通过数组获取
public String getInfo(@RequestParam(required = false) Map<String,Object> map, @RequestParam(defaultValue ="noHobby") String[] hobbies, Model model) {
  								  			// map获取name								map获取age	
  model.addAttribute("msg", map.get("name") + "--->" + map.get("age") + "--->" + Arrays.toString(hobbies));
  return "index";
}

5.5 对象获取

我们也可以通过一个对应的对象来获得参数,SpringMVC会来识别参数,如果是对对象参数的话,会帮助我们自动装配到对应的属性上。

特点:

  • 值得注意的是,对于多个参数的获取,不需要我们去通知Spring来处理了,也就是说我们不需要任何对的注解,使用对象就可以简单的活到
  • 但是要注意的是我们同样也需要将前端的名字和对象的属性名对应

pojo:

public class AdminInfo {
    private String name;
    private Integer age;
    private List<String> hobbies;

    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;
    }

    public List<String> getHobbies() {
        return hobbies;
    }

    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }

    @Override
    public String toString() {
        return "AdminInfo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hobbies=" + hobbies +
                '}';
    }
}

Java:

@PostMapping("/")
// 									  这里通过编写的实体类来获得,SpringMVC识别到对象会自动装配
public String getInfo(AdminInfo adminInfo, Model model) {
  model.addAttribute("msg", adminInfo.getName() + "--->" + adminInfo.getAge() + "--->" + adminInfo.getHobbies());
  return "index";
}

5.6 Restful风格获取参数

Restful风格的参数不再是在后面使用?来绑定参数,而是通过/来匹配参数

Jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>参数测试</title>
</head>
<body>
<h2>参数测试</h2>
姓名:<input type="text" name="name" id="name">
<br/>
年龄:<input type="number" name="age" id="age" min="0" max="100" value="18">岁
<br/>
爱好:
<div>
    <input type="checkbox" name="hobbies" value="sing">唱
    <input type="checkbox" name="hobbies" value="dance">跳
    <input type="checkbox" name="hobbies" value="basketball">篮球
    <input type="checkbox" name="hobbies" value="other">其他
</div>
<button id="submit_btn" οnclick="submit()">doPost New</button>
<div>
    ${msg}
</div>
</body>
<script type="application/javascript">
    let submit = function () {
        // 获取name值
        let name = document.getElementById("name").value;
        // 获取age值
        let age = document.getElementById("age").value;
        // 声明字符串和数组
        let hobbies = "", arr = [];
        // 获得爱好标签
        let els = document.getElementsByName("hobbies");
        // 遍历标签
        for (let i = 0; i < els.length; i++) {
            // 如果选择,加入数组
            if (els[i].checked === true) {
                arr.push(els[i].value);
            }
        }
        // 将数组转化为字符串
        hobbies = arr.join(",");
        // restful风格访问
        window.location = "/" + name + "/" + age + "/" + hobbies;
    }
</script>
</html>

Java:

// 将参数声明在url
@GetMapping("/{name}/{age}/{hobbies}")
//										绑定参数
public String getInfo(@PathVariable("name") String adminName, @PathVariable Integer age, @PathVariable String[] hobbies, Model model) {
  model.addAttribute("msg", adminName + "--->" + age + "--->" + Arrays.toString(hobbies));
  return "index";
}

5.7 关联对象的接收

如果是俩个对象嵌套为一个对象,SpringMVC也可以通过对象来获取,这时候我们需要在前端传值的时候,需要我们来指定对象里面的对象,比如我们在Form对象里面嵌套一个EmsInfo对象

pojo:

public class EmsInfo implements Serializable {
    private static final long serialVersionUID = 3866110295644636936L;

    private String address;
    private String phone;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "EmsInfo{" +
                "address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}
public class Form implements Serializable {
    private static final long serialVersionUID = 3485707772111567814L;
    private String name;
    private String lady;
    private List<Integer> reason;
  	// 在Form中嵌套emsInfo对象
    private EmsInfo emsInfo;
    
    public EmsInfo getEmsInfo() {
        return emsInfo;
    }

    public void setEmsInfo(EmsInfo emsInfo) {
        this.emsInfo = emsInfo;
    }

    public String getName() {
        return name;
    }

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

    public String getLady() {
        return lady;
    }

    public void setLady(String lady) {
        this.lady = lady;
    }

    public List<Integer> getReason() {
        return reason;
    }

    public void setReason(List<Integer> reason) {
        this.reason = reason;
    }

    @Override
    public String toString() {
        return "Form{" +
                "name='" + name + '\'' +
                ", lady='" + lady + '\'' +
                ", reason=" + reason +
                ", emsInfo=" + emsInfo +
                '}';
    }
}

前端传输name:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>调查问卷</title>
</head>
<body>
<h1>你喜欢什么样的女孩子</h1>
<form action="/" method="post">
    <h3><label for="name">你的名字是:</label></h3>
    <input id="name" name="name"><br/>

    <h3><label for="lady">你的女神是:</label></h3>
    <select id="lady" name="lady">
        <option value="Yoona">林允儿</option>
        <option value="Orange">橙子</option>
        <option value="Actress">天海翼</option>
        <option value="Java">Java</option>
    </select>
    <h3><label for="lady">你喜欢她的原因是:</label></h3>
    <div>
        <h3>你喜欢她的原因是:</h3>
        <input type="checkbox" name="reason" value="1">长相甜美
        <input type="checkbox" name="reason" value="2">为了学习
        <input type="checkbox" name="reason" value="3">演技精湛
        <input type="checkbox" name="reason" value="4">其他
    </div>
    <div>
        <%--在这里的name是我们对应form对象里面的emsinfo对象,所以我们使用emsInfo来点出属性--%>
        邮件地址:<input type="text" name="emsInfo.address"><br/>
        手机:<input type="text" name="emsInfo.phone">
    </div>
    <button>点我提交</button>
</form>
</body>
</html>

Java获得数据:

@PostMapping("/")
public String getData(Form form){
  System.out.println(form);
  return "index";
}

5.8 获得时间参数

正常的Spring支持将2021/6/5这样的格式进行转化为一个Date类

@PostMapping("/testDate")
public String testDate(Form form,Date time) {
		return "FreeMarkerDemo";
}

局部解决方法:

但是通过其他的方式进行传输的话Spring是不会帮我们转化的,这时候我们需要一个注解@DateTimeFormat,其中的属性pattern代表时间的格式参数 "yyyy年MM月dd日",如果使用的包装类中,我们只需要把该注解加在对应的Date的属性字段上

@PostMapping("/testDate")
//																这里的注解只是局部的,不会影响到其他方法
public String testDate(Form form, @DateTimeFormat(pattern = "yyyy年MM月dd日") Date time) {
  return "FreeMarkerDemo";
}

全局解决方案:

全局的解决方案可以通过编写一个Converter类来处理数据的转化,在后面有详细的说明

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值