SpringMVC -- POJO/@RequestParam (3)

使用POJO对象绑定请求参数值

SpringMVC 会按照请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值,支持联级属性.

如dept.deptId , dept.address


继续沿用以前的例子...

创建两个model..

User和Address

package com.springmvc.model;

/**
 * Created by cyx on 2016/3/31.
 */
public class User {
    private String username;
    private String password;
    private String email;
    private int age;
    private Address address;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }

    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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

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

Address

package com.springmvc.model;

/**
 * Created by cyx on 2016/3/31.
 */
public class Address {
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

然后在控制器中写相对应的调用方法

(最上面一个方法)

package com.springmvc.test;

import com.springmvc.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * Created by cyx on 2016/3/31.
 */

@RequestMapping("/springmvc")
@Controller
public class SpringMVCTestCode {

    private static final String SUCCESS = "success";


    /**
     * SpringMVC会按照请求参数名和POJO属性名进行自动匹配.
     * 自动为该对象填充属性值,支持联级属性
     * 如: dept.deptId,address.tel
     * @param user
     * @return
     */
    @RequestMapping("/testPojo")
    private String testPojo(User user) {
        System.out.println("testPojo:" +user);
        return SUCCESS;
    }



    /**
     * 了解
     * @CookieValue: 映射一个Cookie值,属性同@RequestParam
     * @param sessionId
     * @return
     */
    @RequestMapping("/testCookieValue")
    private String testCookieValue(@CookieValue("JSESSIONID") String sessionId) {
        System.out.println("testCookieValue sessionId:"+sessionId);
        return SUCCESS;
    }




    /**
     * @RequestParam 来映射请求参数
     * value值,即为请求参数的参数名
     * required 该参数是否必须,默认为true
     * defaultValue 请求参数的默认值
     *
     * required = false
     * 如果前台传空值的话,会报错误信息.这时候,required就是设置 请求参数中必须包含对应的参数
     * 默认为true,  false 表示 参数中不一定要包含请求参数
     *
     * @param userName
     * @param age
     * @return
     */
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(value = "username") String userName,
                                   @RequestParam(value = "age",required = false , defaultValue = "0") int age) {
        System.out.println("testRequestParam userName: "+userName +",age: "+age);
        return SUCCESS;
    }





    @RequestMapping("/testRest4/{id}")
    public String TestRestPUT(@PathVariable Integer id) {
        System.out.println("TestRestPUT : "+id);
        return SUCCESS;
    }


    @RequestMapping("/testRest3/{id}")
    public String TestRestDELETE(@PathVariable Integer id) {
        System.out.println("TestRestDELETE : "+id);
        return SUCCESS;
    }


    @RequestMapping("/testRest2")
    public String TestRestPost() {
        System.out.println("TestRestPost");
        return SUCCESS;
    }


    @RequestMapping(value="/testRest1/{id}",method=RequestMethod.GET)
    public String TestRestGet(@PathVariable Integer id) {
        System.out.println("TestRestGet : "+id);
        return SUCCESS;
    }

}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: cyx
  Date: 2016/3/30
  Time: 20:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>


    <!-- 模拟发送请求POJO -->
  <form action="springmvc/testPojo" method="post">
      username:<input type="text" name="username">
      <br>
      password:<input type="password" name="password">
      <br>
      email:<input type="text" name="email">
      <br>
      age:<input type="text" name="age">
      <br>
      city:<input type="text" name="address.city">
      <br>
      province:<input type="text" name="address.province">
      <br>
      <input type="submit" value="submit">
  </form>
  <br><br>



  <a href="springmvc/testCookieValue">testCookieValue</a>
  <br><br>

  <a href="springmvc/testRequestParam?username=cyx&age=11">TestRequestParam</a>
  <br><br>


  <!-- 模拟Rest风格URL -->
    <form action="springmvc/testRest4/1" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="TestRestPUT">
    </form>
  <br><br>
    <form action="springmvc/testRest3/1" method="post">
        <input type="hidden" name="_method" value="DELETE"/>
        <input type="submit" value="TestRestDELETE">
    </form>
  <br><br>
    <form action="springmvc/testRest2" method="post">
        <input type="submit" value="TestRestPost">
    </form>
  <br><br>
    <a href="springmvc/testRest1/1">TestRestGet</a>
  <br><br>




      <!-- @PathVariable 映射URL绑定的占位符-->
      <!--
        带占位符的URL是Spring3.0新增的功能.
        通过@PathVariable可以讲URL中占位符参数绑定到控制器处理方法的入参中..
      -->
      <a href="/springmvc/testPathVariable/1">testPathVariable</a>
      <br><br>

      <!-- 创建form表单,模拟POST请求 -->
      <form action="/springmvc/testMethod" method="post">
        <input type="submit" value="submit">
      </form>

      <!--这里先模拟一个get请求,因为RequestMapping设置为只接受POST请求,所以不会应答-->
      <a href="/springmvc/testMethod">testMethod</a>
    <br><br>
      <a href="/springmvc/testRequestMapping">@RequestMapping</a>
    <br><br>
      <a href="helloworld">HelloWorld</a>
  </body>
</html>

然后就可以部署,运行了..

附上截图





//----------------------------------------------------------------------------------------------------------------------------------


SpringMVC通过分析处理方法的签名,将HTTP请求信息绑定到处理方法的相应参数中.

SpringMVC对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名.

必要时 可以对 方法及方法入参 标注相应的注解(@PathVariable,@RequestParam,@RequestHeader等..)

SpringMVC框架会将HTTP请求的信息绑定到相应的方法入参中,并根据方法的返回值类型作出相应的后续处理


使用@RequestParam绑定请求参数
在处理方法入参处使用@RequestParam可以把请求参数传递给请求方法
-value 参数名
-required 是否必须. 默认为true,表示请求参数中必须包含对应的参数,若不存在,抛出异常.


接上面的案例....

直接在index.jsp 模拟发送请求就可以了....

这个不用配置 配置文件

<%--
  Created by IntelliJ IDEA.
  User: cyx
  Date: 2016/3/30
  Time: 20:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>

  <!-- @RequestParam -->
  <a href="springmvc/testRequestParam?username=cyx&age=11">TestRequestParam</a>
  <br><br>

  
  <!-- 模拟Rest风格URL -->
    <form action="springmvc/testRest4/1" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="TestRestPUT">
    </form>
  <br><br>
    <form action="springmvc/testRest3/1" method="post">
        <input type="hidden" name="_method" value="DELETE"/>
        <input type="submit" value="TestRestDELETE">
    </form>
  <br><br>
    <form action="springmvc/testRest2" method="post">
        <input type="submit" value="TestRestPost">
    </form>
  <br><br>
    <a href="springmvc/testRest1/1">TestRestGet</a>
  <br><br>




      <!-- @PathVariable 映射URL绑定的占位符-->
      <!--
        带占位符的URL是Spring3.0新增的功能.
        通过@PathVariable可以讲URL中占位符参数绑定到控制器处理方法的入参中..
      -->
      <a href="/springmvc/testPathVariable/1">testPathVariable</a>
      <br><br>

      <!-- 创建form表单,模拟POST请求 -->
      <form action="/springmvc/testMethod" method="post">
        <input type="submit" value="submit">
      </form>

      <!--这里先模拟一个get请求,因为RequestMapping设置为只接受POST请求,所以不会应答-->
      <a href="/springmvc/testMethod">testMethod</a>
    <br><br>
      <a href="/springmvc/testRequestMapping">@RequestMapping</a>
    <br><br>
      <a href="helloworld">HelloWorld</a>
  </body>
</html>

控制器中 写对应的调用方法

package com.springmvc.test;

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.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Created by cyx on 2016/3/31.
 */

@RequestMapping("/springmvc")
@Controller
public class SpringMVCTestCode {

    private static final String SUCCESS = "success";


    /**
     * @RequestParam 来映射请求参数
     * value值,即为请求参数的参数名
     * required 该参数是否必须,默认为true
     * defaultValue 请求参数的默认值
     *
     * required = false
     * 如果前台传空值的话,会报错误信息.这时候,required就是设置 请求参数中必须包含对应的参数
     * 默认为true,  false 表示 参数中不一定要包含请求参数
     *
     * @param userName
     * @param age
     * @return
     */
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(value = "username") String userName,
                                   @RequestParam(value = "age",required = false , defaultValue = "0") int age) {
        System.out.println("testRequestParam userName: "+userName +",age: "+age);
        return SUCCESS;
    }




    @RequestMapping("/testRest4/{id}")
    public String TestRestPUT(@PathVariable Integer id) {
        System.out.println("TestRestPUT : "+id);
        return SUCCESS;
    }


    @RequestMapping("/testRest3/{id}")
    public String TestRestDELETE(@PathVariable Integer id) {
        System.out.println("TestRestDELETE : "+id);
        return SUCCESS;
    }


    @RequestMapping("/testRest2")
    public String TestRestPost() {
        System.out.println("TestRestPost");
        return SUCCESS;
    }


    @RequestMapping(value="/testRest1/{id}",method=RequestMethod.GET)
    public String TestRestGet(@PathVariable Integer id) {
        System.out.println("TestRestGet : "+id);
        return SUCCESS;
    }

}


上两张图片..

注意:第二行@RequestParam后面的参数类型被修改为Integer

在没写 required=false 的情况下,如果你的age 并没有传入参数..会报500错误....因为默认为true,是必须要传值的

如果你这里写了required=false,就说明 age 这个参数 ,可以传值,也可以不传值...

那问题就来了...

要是你不传值,后台还写个int类型,那也会抛出异常...因为你不传值嘛,那前台传来的就是null..int 和null  不是一个类型嘛....

http://localhost:8088/springmvc/testRequestParam?username=cyx&age=11

http://localhost:8088/springmvc/testRequestParam?username=cyx



如果你前台既不想传值,后台又想用int怎么办呢...

就是下面那个 defaultValue....

将age 的值 默认设置为 0 ....

http://localhost:8088/springmvc/testRequestParam?username=cyx&age=11

http://localhost:8088/springmvc/testRequestParam?username=cyx






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值