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

基本类型、包装类型

  • 定义处理器
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>

这里写图片描述
这里写图片描述

注意:处理器中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>

这里写图片描述
这里写图片描述


简单对象、复杂对象

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

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>

这里写图片描述
这里写图片描述

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>

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

这里写图片描述


集合类型

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

使用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=李四

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80355336
今日推荐