程序员社区

23. Spring MVC 表单标签库

Spring MVC 表单标签库

​ ​ Spring MVC 的表单标签库的语法与 JSTL 标签库的语法非常类似,包含了一组可以在 JSP 页面中渲染 form 表单元素的标签。在 JSP 页面中使用 Spring MVC 表单标签库时,必须在 JSP 页面的开头处声明 taglib 指令,指令代码如下:

<!-- 前缀prefix可以自定义,通常为form -->
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

​ ​ 在表单标签库中有 form、input、password、hidden、textarea、checkbox、checkboxes、radiobutton、radiobuttons、select、option、options、errors等标签。

1. 表单标签库的基本使用

1、创建实体类 Person

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

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
}

注:使用 lombok 自动生成实体类的 Getter、Setter 和 toString 方法;

2、模型数据绑定;

@Controller
public class doHandler {
    @GetMapping("/form")
    public ModelAndView test(){
        Person person = new Person();
        person.setId(1);
        person.setName("张三");
        person.setAge(23);
        person.setGender("男");
        ModelAndView modelAndView = new ModelAndView("form");
        modelAndView.addObject("person",person);
        return modelAndView;
    }
}

3、在表单标签中取出业务模型;

​ ​ 业务模型进行绑定后,直接通过 Spring MVC 提供的表单标签库将业务模型的值取出。其中,modelAttribute 的属性值是存入 ModelAndView 中的 key 值,path 属性值是存入 ModelAndView 中对象的属性值;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>用户信息修改</h2>
    <form:form modelAttribute="person" method="post">
        编号:<form:input path="id"/><br/>
        姓名:<form:input path="name"/><br/>
        年龄:<form:input path="age"/><br/>
        性别:<form:input path="gender"/><br/>
        <input type="submit" value="提交">
    </form:form>
</body>
</html>


23. Spring MVC 表单标签库插图

要点归纳:

  1. JSP 页面导入 Spring MVC 表单标签库,与导入 JSTL 标签库的语法非常相似,前缀 prefix 可以自定义,通常定义为 form;
  2. 将 form 表单与模型数据进行绑定,通过 modelAttribute 属性完成绑定,将 modelAttribute 的值设置为模型数据对应的键值 key;
  3. form 表单完成绑定之后,将模型数据的值取出绑定到不同的标签中,通过设置标签的 path 属性完成,将 path 属性的值设置为模型数据对应的属性名即可;

2. 表单标签库的常用标签

2.1 form 标签

form 标签相当于是 HTML 中的 <form></form> 元素,通过 modelAttribute 属性完成绑定的具体业务数据;

<form:form modelAttribute="person" method="post"></form:form>

2.2 input 标签

input 标签相当于 HTML 中的 <input type="text"> 元素,form 标签绑定的业务数据,input 标签绑定的是业务数据中的属性值,通过 path 与业务数据的属性名对应,并支持级联属性。

地址信息:<form:input path="address.city"/>

2.3 password 标签

password 标签相当于 HTML 中的 <input type="password"/> 元素,与 input 标签类似,通过 path 属性与业务数据的属性名对应,但是 password 标签的值不会在页面中显示。

用户密码:<form:password path="password">

2.4 checkbox 标签

checkbox 标签相当于是 HTML 中的 <input type="checkbox"/> 元素,通过 path 属性与业务数据的属性名对应,可以绑定布尔、数组和集合

  • 如果绑定的是布尔类型的变量,该变量的值为 true,则表示选中,false 表示不选中;
  • 如果绑定的是数组、LIst 集合类型的变量,数组/集合中的元素等于 checkboxvalue 值,则该选项被选中,否则不被选中;

在 Person 对象中添加一个属性 private String[] hobby;

@GetMapping("/form")
public ModelAndView test(){
    Person person = new Person();
    String[] args = {"听音乐","看电影","玩游戏","阅读"};
    person.setHobby(args);
    ModelAndView modelAndView = new ModelAndView("form");
    modelAndView.addObject("person",person);
    return modelAndView;
}
<form:form modelAttribute="person" method="post">
    个人爱好:
    <form:checkbox path="hobby" value="摄影"></form:checkbox>摄影<br/>
    <form:checkbox path="hobby" value="听音乐"></form:checkbox>听音乐<br/>
    <form:checkbox path="hobby" value="看电影"></form:checkbox>看电影<br/>
    <form:checkbox path="hobby" value="编程"></form:checkbox>编程<br/>
    <form:checkbox path="hobby" value="玩游戏"></form:checkbox>玩游戏<br/>
    <form:checkbox path="hobby" value="阅读"></form:checkbox>阅读<br/>
    <form:checkbox path="hobby" value="旅行"></form:checkbox>旅行<br/>
    <input type="submit" value="提交">
</form:form>

在这里插入图片描述

2.5 checkboxes 标签

checkboxes 标签渲染的是 HTML 中的一组 <input type="checkbox"/>,是对 <form:checkbox/> 的一种简化,需要结合 itemspath 属性来使用,items 绑定被遍历的集合或数组,path 绑定被选中的集合或数组。可以这样理解,items 为全部可选集合,path 为默认的选中集合。

在 Person 对象中修改属性 private List selected;

@GetMapping("/form")
public ModelAndView test(){
    Person person = new Person();
    String[] selected = {"摄影","听音乐","看电影","编程"};
    person.setSelected(Arrays.asList(selected));
    ModelAndView modelAndView = new ModelAndView("form");
    String[] hobbies = {"摄影","听音乐","看电影","编程","玩游戏","阅读","旅行"};
    List<String> hobby = Arrays.asList(hobbies);
    modelAndView.addObject("hobby",hobby);
    modelAndView.addObject("person",person);
    return modelAndView;
}
<form:form modelAttribute="person" method="post">
    个人爱好:<br/>
    <form:checkboxes path="selected" items="${hobby}"/>
    <input type="submit" value="提交">
</form:form>

在这里插入图片描述

需要注意的是 path 可以直接绑定模型数据的属性值,而 items 则需要通过 EL 表达式的形式从域对象中获取数据,所以要导入 <%@ page isELIgnored="false" %>

2.6 radiobutton 标签

radiobutton 标签渲染的是 HTML 中的 <input type="radio"/>,绑定的数据与标签 value 值相等时,则为选中。在 Person 对象中添加属性 private Integer level;

Person person = new Person();
person.setLevel(4);
ModelAndView modelAndView = new ModelAndView("form");
modelAndView.addObject("person",person);
最高学历:<br/>
<form:radiobutton path="level" value="1"/>小学学历<br/>
<form:radiobutton path="level" value="2"/>初中学历<br/>
<form:radiobutton path="level" value="3"/>高中学历<br/>
<form:radiobutton path="level" value="4"/>本科学历<br/>
<form:radiobutton path="level" value="5"/>硕士学历<br/>
<form:radiobutton path="level" value="6"/>博士学历<br/>

在这里插入图片描述

2.7 radiobuttons 标签

radiobuttons 标签渲染的是 HTML 中的一组 <input type="radio"/>,这里需要结合 itemspath 两个属性来使用,items 绑定被遍历的集合或数组,path 绑定被选中的值,items 为全部的可选类型,path 为默认选中 的选项,⽤法与<form:checkboxes/>⼀致。

@GetMapping("/form")
public ModelAndView test(){
    Map<Integer,String> map = new HashMap<Integer,String>();
    map.put(1,"小学学历");
    map.put(2,"初中学历");
    map.put(3,"高中学历");
    map.put(4,"本科学历");
    map.put(5,"硕士学历");
    map.put(6,"博士学历");
    person.setLevel(4);

    ModelAndView modelAndView = new ModelAndView("form");
    modelAndView.addObject("levels",map);
    modelAndView.addObject("person",person);
    return modelAndView;
}
最高学历:
<form:radiobuttons path="level" items="${levels}"/><br/>

在这里插入图片描述

2.8 select 标签

select 标签渲染的是 HTML 中的 <select/> 标签,需要结合 itemspath 两个属性来使⽤,items 绑定被遍历的集合或数组,path绑定被选中的值。select 标签需要结合 options 或 option 使用:

在 Person 对象中添加属性 private Integer cityId;

@GetMapping("/form")
public ModelAndView test(){
    Person person = new Person();

    Map<Integer,String> cityMap = new HashMap<Integer,String>();
    cityMap.put(1,"北京");
    cityMap.put(2,"上海");
    cityMap.put(3,"⼴州");
    cityMap.put(4,"深圳");
    person.setCityId(2);

    ModelAndView modelAndView = new ModelAndView("form");
    modelAndView.addObject("cities",cityMap);
    modelAndView.addObject("person",person);
    return modelAndView;
}

options 标签<form:select> 结合 <form:options> 使用,<form:select> 只定义 path 属性,在 <form:select> 标签内部添加一个子标签 <form:options>,设置 items 属性,获取被遍历的集合;

所在城市:
<form:select path="cityId">
    <form:options items="${cities}"></form:options>
</form:select>

在这里插入图片描述

同样地,还可以使用 option 标签<form:select> 结合 <form:option> 的使⽤, <form:select> 定义 path 属性,给每⼀个 <form:option> 设置 value 值,path 的值与哪个 value 值相等,该项默认选中。

所在城市:<form:select path="cityId">
     <form:option value="1">北京</form:option>
     <form:option value="2">上海</form:option>
     <form:option value="3">广州</form:option>
     <form:option value="4">深圳</form:option>
</form:select><br/>

2.9 textarea 标签

textarea 标签渲染的是 HTML 中的 <textarea/> 标签,path 绑定模型数据的属性值,作为文本输入域的默认值。在 Person 对象中添加属性 private String desc;

Person person = new Person();
person.setDesc("这个人很懒,什么也没有留下...");
ModelAndView modelAndView = new ModelAndView("form");
modelAndView.addObject("person",person);
个人简介:<form:textarea path="desc"/><br/>

在这里插入图片描述

errors 标签用于处理错误信息,一般用在数据校验时,该标签需要结合 Spring MVC 的验证器使用。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 23. Spring MVC 表单标签库

一个分享Java & Python知识的社区