概述
表单标签库中包含了可以用在JSP页面中渲染HTML元素的标签。
JSP页面中使用Spring表单标签库时,必须在JSP页面开头处声明taglib指令:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
在表单标签库中有form、input、password、hidden、textarea、checkbox、checkboxes、
radiobutton、Iradiobuttons、select、option、options、errors等标签。
常用标签
表单标签
语法:
<form:form modelAttribute="" method="post" servletRelativeAction="">
</form:form>
表单标签除了具有HTML表单元素属性以外,还具有acceptCharset、commandName、
cssSClass、cssStyle、htmlEscape和modelAttribute等属性。
- acceptCharset:定义服务器接受的字符编码列表。
- commandName:暴露表单对象的模型属性名称,默认为command。
- cssClass:定义应用到form元素的CSS类。
- cssStyle:定义应用到form元素的CSS样式。
- htmlEscape:true或false,表示是否进行HTML转义。
- modelAttribute:暴露form backing object的模型属性名称,默认为command。
其中,commandName和modelAttribute属性的功能基本一致,属性值绑定一个JavaBean对象。
input标签
语法:
<form:input path="xxx"/>
该标签有cssClass、cssStyle、htmlEscape及path属性。
path属性将文本框输入值绑定到form backing object上。
password标签
语法:
<form:password path="xxx"/>
hidden标签
语法:
<form:hidden path="xxx"/>
表示隐藏的元素,故不支持cssClass和cssStyle属性。
textarea标签
语法:
<form:textarea path="xxx"/>
checkbox标签
语法:
<form:checkbox path="xxx" value="xxx"/>
多个path相同的checkbox标签,它们是一个选项组,允许多选,选项值绑定到一个数组属性。
例:
<form:checkbox path="language" value="汉语"/>汉语
<form:checkbox path="language" value="英语"/>英语
<form:checkbox path="language" value="俄语"/>俄语
<form:checkbox path="language" value="拉丁语"/>拉丁语
<form:checkbox path="language" value="法语"/>法语
checkboxes标签
与多个path相同的checkbox标签功能相同。
三个重要属性:
- items:用于生成input元素的Collection、Map或Array。
- itemLabel:items属性中指定的集合对象的属性,为每个input元素提供label。
- itemValue:items属性中指定的集合对象的属性,为每个input元素提供value。
语法:
<form:checkboxes items="xxx" path="xxx"/>
radiobutton标签
语法:
<form:radiobutton path="xxx" value="xxx"/>
多个path相同的radiobutton标签是一个选项组,只支持单选。
radiobuttons标签
语法:
<form:radiobuttons path="xxx" items="xxx"/>
等价于多个path形同的radiobutton标签,也只支持单选。
select标签
语法:
<form:select path="xxx" items="xxx"/>
或
<form:select path="xxx" items="xxx">
<option value="xxx">xxx</option>
</form:select>
或
<form:select path="xxx">
<form:options items="xxx"/>
</form:select>
select标签的选项来自属性items指定集合或者嵌套的option标签或options标签。
options标签
和select标签嵌套使用。
errors标签
渲染一个或者多个的span元素,每个span元素包含一个错误消息。
显示所有错误消息的语法:
<form:errors path="*"/>
显示特定的错误消息的语法:
<form:errors path="xxx"/>
实例
本项目要用到的jar包:
创建springmvc项目并按照下图创建文件及文件夹:
各文件代码如下:
StudentController.java
package springmvcdemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import springmvcdemo.pojo.Student;
import springmvcdemo.service.StudentService;
import java.util.ArrayList;
import java.util.HashMap;
@Controller
@RequestMapping("/student")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping("input")
public String inputUser(Model model) {
HashMap<java.lang.String, java.lang.String> hobbys = new HashMap<>();
hobbys.put("阅读", "阅读");
hobbys.put("运动", "运动");
hobbys.put("游戏", "游戏");
hobbys.put("旅行", "旅行");
model.addAttribute("student", new Student());
model.addAttribute("hobbys", hobbys);
model.addAttribute("studentClass", new java.lang.String[]{"高三1班", "高三2班", "高三3班"});
return "studentAdd";
}
@RequestMapping("/addStudent")
public String addStudent(@ModelAttribute Student student, Model model) {
if (studentService.addStudent(student)) {
System.out.println("添加成功");
return "redirect:/student/studentsList";
} else {
System.out.println("添加失败");
HashMap<java.lang.String, java.lang.String> hobbys = new HashMap<>();
hobbys.put("阅读", "阅读");
hobbys.put("运动", "运动");
hobbys.put("游戏", "游戏");
hobbys.put("旅行", "旅行");
// 不需要model.addAttribute(),因为@ModelAttribute指定了form backing object
// model.addAttribute("student",new Student());
model.addAttribute("hobbys", hobbys);
model.addAttribute("studentClass", new java.lang.String[]{"高三1班", "高三2班", "高三3班"});
return "studentAdd";
}
}
@RequestMapping("studentsList")
public String studentsList(Model model) {
ArrayList<Student> students = studentService.getStudents();
model.addAttribute("students", students);
return "studentsList";
}
}
Student.java
package springmvcdemo.pojo;
public class Student {
private String name;
private String sex;
private String[] hobby;
private String studentClass;
private String memo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getStudentClass() {
return studentClass;
}
public void setStudentClass(String studentClass) {
this.studentClass = studentClass;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
}
StudentService.java
package springmvcdemo.service;
import springmvcdemo.pojo.Student;
import java.util.ArrayList;
public interface StudentService {
/**
* 添加学生
*
* @param student 学生
* @return 返回是否添加成功,如果是true则添加成功,false表示没有添加成功
*/
boolean addStudent(Student student);
/**
* 获取学生
*
* @return 返回学生集
*/
ArrayList<Student> getStudents();
}
StudentServiceImpl.java
package springmvcdemo.service;
import org.springframework.stereotype.Service;
import springmvcdemo.pojo.Student;
import java.util.ArrayList;
@Service
public class StudentServiceImpl implements StudentService{
private static ArrayList<Student> students=new ArrayList<>();
@Override
public boolean addStudent(Student student) {
if (!"张三".equals(student.getName())) {
students.add(student);
return true;
}
return false;
}
@Override
public ArrayList<Student> getStudents() {
return students;
}
}
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
<context:component-scan base-package="springmvcdemo.controller"/>
<!--使用扫描机制扫描服务类,服务类都在service包及其子包下-->
<context:component-scan base-package="springmvcdemo.service"/>
<!--配置视图解析器-->
<!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
studentAdd.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加学生</title>
</head>
<body>
<form:form modelAttribute="student" method="post" action="/student/addStudent">
姓名:<form:input path="name"/><br>
性别:<form:radiobutton path="sex" value="男"/>男
<form:radiobutton path="sex" value="女"/>女<br/>
爱好:<form:checkboxes path="hobby" items="${hobbys}"/><br/>
班级:<form:select path="studentClass">
<form:option value="请选择班级">请选择班级</form:option>
<form:options items="${studentClass}"/>
</form:select><br/>
备注:<form:textarea path="memo" rows="5"/><br/>
<input type="reset" id="reset">
<input type="submit" id="submit" value="添加学生">
</form:form>
</body>
</html>
studentList.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>学生列表</title>
</head>
<body>
<h1>学生列表</h1><br>
<a href="/student/input">继续添加</a>
<table>
<tr>
<th>姓名</th>
<th>性别</th>
<th>爱好</th>
<th>班级</th>
<th>备注</th>
</tr>
<c:forEach items="${students}" var="student">
<tr>
<td>${student.name}</td>
<td>${student.sex}</td>
<td>
<c:forEach items="${student.hobby}" var="hobby">
${hobby}
</c:forEach>
</td>
<td>${student.studentClass}</td>
<td>${student.memo}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--部署DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--配置文件的位置-->
<param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
</init-param>
<!--表示容器在启动时立即加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--处理所有URL-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--避免中文乱码-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
运行效果
点击【添加学生】按钮
点击【继续添加】超链接即可继续添加。
如果添加失败,表单中的信息也不会消失。(例如添加姓名为张三的学生)
这是数据绑定的自动回填(但必须结合form标签)。