欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springmvc基础知识(4):参数传递

程序员文章站 2024-01-28 17:10:52
...

基本类型、包装类型

  • 定义处理器
package com.springmvc.controller;

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

@Controller
@RequestMapping("/controller")
public class RegisterController {

    @RequestMapping("/register.do")
    public String register(String userName,int password){
        System.out.println("用户名:"+userName+"\n密码:"+password);
        return "success";
    }
}
  • 当提交的数据少时,使用方法的参数匹配接收前台提交的数据。 如这里可以接收前台提交的name=”userName”和name=”password”的数据。
  • 注意,前台提交的数据都是字符串类型的,springmvc提前加载了一些默认的格式转换器,会自动根据数据进行类型转换。比如这里的password自动由字符串转换成了int类型。
  • 测试页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>注册</title>
</head>
<body>
    <form action="controller/register.do">
        用户名:<input type="text" name="userName">
        密码:<input type="text" name="password">
        <button type="submit">提交</button>
    </form>
</body>
</html>

springmvc基础知识(4):参数传递
springmvc基础知识(4):参数传递

注意:处理器中password参数定义的是Int类型的,如果前台传的参数是空的,会报错。可以使用包装类型Integer,这个允许为空。

使用@RequestParam映射数据

@RequestMapping("/register.do")
public String register(@RequestParam("userName")String name,Integer password){
    System.out.println("用户名:"+name+"\n密码:"+password);
    return "success";
}

使用@RequestParam将匹配到的数据绑定到参数上,这样就不需要参数直接匹配,参数名可以任意取。

也可以使用request.getParameter(“userName”);获取参数

@RequestMapping("/register.do")
public String register(HttpServletRequest request){
    String userName = request.getParameter("userName");
    String password = request.getParameter("password");
    System.out.println("用户名:"+userName+"\n密码:"+password);
    return "success";
}

数组类型

如果前台传输了多个相同name的数据,比如多选框,springmvc可以在处理器方法中使用数组参数接收这些数据。

@RequestMapping("/register.do")
public String register(String userName,Integer password,String[] hobby){
    System.out.println("用户名:"+userName+"\n密码:"+password);

    System.out.println("爱好:"+Arrays.asList(hobby));
    return "success";
}

测试页面:

<form action="controller/register.do">
  用户名 :<input type="text" name="userName">
  密码 :  <input type="text" name="password">
  爱好 :  <input type="checkbox" name="hobby" value="电影">电影
          <input type="checkbox" name="hobby" value="逛街">逛街
          <input type="checkbox" name="hobby" value="打游戏">打游戏
          <button type="submit">提交</button>
</form>

springmvc基础知识(4):参数传递
springmvc基础知识(4):参数传递


简单对象、复杂对象

如果一次传输的数据太多,可以将之封装到实体中进行传输。

1.简单对象

  • User实体类
package com.springmvc.domain;

import java.util.Arrays;

public class User {

    private String userName;
    private Integer password;
    private String[] hobby;

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getPassword() {
        return password;
    }
    public void setPassword(Integer password) {
        this.password = password;
    }
    public String[] getHobby() {
        return hobby;
    }
    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }
    @Override
    public String toString() {
        return "User [userName=" + userName + ", password=" + password
                + ", hobby=" + Arrays.toString(hobby) + "]";
    }

}
  • 处理器
package com.springmvc.controller;

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

import com.springmvc.domain.User;

@Controller
@RequestMapping("/userController")
public class UserController {

    @RequestMapping("/getUser.do")
    public String getUser(User user){

        System.out.println(user);
        return "success";
    }
}

直接在参数中使用实体类进行数据接收,提交的数据的name值和实体类中的属性进行匹配。

  • 测试页面
<form action="userController/getUser.do">
      用户名 :<input type="text" name="userName">
        密码 :<input type="text" name="password">
        爱好 :<input type="checkbox" name="hobby" value="电影">电影
             <input type="checkbox" name="hobby" value="逛街">逛街
             <input type="checkbox" name="hobby" value="打游戏">打游戏
      <button type="submit">提交</button>
    </form>

springmvc基础知识(4):参数传递
springmvc基础知识(4):参数传递

2.多层级对象

  • ContactInfo实体类
package com.springmvc.domain;

public class ContactInfo {

    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 "Address [address=" + address + ", phone=" + phone + "]";
    }

}
  • 在User类中引用ContactInfo类
package com.springmvc.domain;


public class User {

    private String userName;
    private ContactInfo contactInfo;


    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public ContactInfo getContactInfo() {
        return contactInfo;
    }
    public void setContactInfo(ContactInfo contactInfo) {
        this.contactInfo = contactInfo;
    }
    @Override
    public String toString() {
        return "User [name=" + userName + ", contactInfo=" + contactInfo + "]";
    }

}
  • 处理器
package com.springmvc.controller;

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

import com.springmvc.domain.User;

@Controller
@RequestMapping("/userController")
public class UserController {

    @RequestMapping("/getUser.do")
    public String getUser(User user){

        System.out.println(user);
        return "success";
    }
}
  • 测试
<form action="userController/getUser.do">
      用户名 : <input type="text" name="userName">
    地址: <input type="text" name="contactInfo.address">
    电话: <input type="text" name="contactInfo.phone">
  <button type="submit">提交</button>
</form>

注意这里使用属性连缀的方式进行多层级数据的赋值

springmvc基础知识(4):参数传递


集合类型

可能会有这种情况:前台页面批量录入信息并提交,比如班主任批量录入学生信息.像这样一次性提交多个相同的实体类,就需要后台使用集合进行接受了。

使用List

  • 需要定义一个实体类集合:
package com.test.domain;

import java.util.List;

public class UserListForm {
    List<User> users;

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "UserListForm [users=" + users + "]";
    }
}
  • 处理器:
@RequestMapping("/getUserList.do")
public String getUserList(UserListForm users){

    System.out.println(users);
    return "success";
}

前台访问:

http://localhost:8080/springmvc-demo/userController/getUserList.do?users[0].userName=张三&users[1].userName=李四

list会根据请求的参数自动设置长度,比如这里最大的是users[1],List长度为2,如果这时候设置了一个users[20].userName=xx,那么List长度为21,没有设置值的User会自动赋Null.

使用Map

定义一个User的map集合

package com.springmvc.domain;

import java.util.Map;

public class UserMapForm {
    Map<String,User> users;

    public Map<String, User> getUsers() {
        return users;
    }

    public void setUsers(Map<String, User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "UserListMap [users=" + users + "]";
    }

}
  • 处理器
@RequestMapping("/getUserMap.do")
public String getUserMap(UserMapForm users){

    System.out.println(users);
    return "success";
}
  • 前台请求:
http://localhost:8080/springmvc-demo/userController/getUserMap.do?users[x].userName=张三&users[y].userName=李四