在本教程中,我们将通过一个示例讨论所有与Spring MVC相关的JSP表单标签。
在本教程中,我们将使用下面重要的弹簧MVC表单标签进行讨论:
- 表单标签
- 文本字段标签
- 选择标签
- 复选框
- 无线电盒
- 密码标签
- 按钮标签
- 错误标签等
所以我们都知道HTML表单,对吧?我们将学习如何在Spring中使用表单。特别是,Spring支持表单标签,这些是可配置的表单标签,我们可以在网页上重复使用它们。
在开始之前,请查看 Spring Data JPA 教程和 Spring MVC 教程
春季MVC教程和文章
- 春季 MVC 5 - Hello World 示例
- 春季 MVC 5 - 注册表单处理示例
- 春季 MVC JSP 表单标签教程
- 弹簧 MVC 5 带批注的表单验证教程
- Spring MVC 5 + Hibernate 5 + JSP + MySQL CRUD Tutorial
- Spring MVC 5 + Spring Data JPA + Hibernate 5 + JSP + MySQL Tutorial
- Spring MVC + Spring Boot2 + JSP + JPA + Hibernate 5 + MySQL 示例
- Spring Boot 2 MVC Web Application Thymeleaf JPA MySQL 示例
- Spring MVC + Spring Boot2 + JSP + JPA + Hibernate 5 + MySQL 示例
- Spring Boot 2 MVC Web Application Thymeleaf JPA MySQL 示例
- 弹簧启动 2 - 弹簧 MVC + 百里糖输入表单验证
- Spring Boot 2 + Spring MVC + Spring Security + JPA + Thymeleaf + MySQL Tutorial
- 使用 Spring Boot 和 Spring Security 使用 LDAP 对用户进行身份验证
- 弹簧@Controller和@RestController注释与示例
- 弹簧@RequestBody和@ResponseBody注释
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping和@PatchMapping
- Spring Web MVC Annotations
- 使用Spring Boot + Spring MVC + Spring Security的迷你待办事项管理项目
- 使用 Spring Boot + Spring MVC + Spring Security + Hibernate 5 的用户注册模块
- 20多个使用Spring框架的免费开源项目
好吧,这些Spring MVC表单标签为我们提供了额外的支持。例如,它们支持数据绑定,因此这允许我们自动设置数据并从Java对象和bean中检索数据。
从2.0版本开始,Spring提供了一组全面的数据绑定感知标签,用于在使用JSP和Spring Web MVC时处理表单元素。
每个标记都支持其对应的 HTML 标记对应项的属性集,使标记熟悉且直观易用。标记生成的 HTML 符合 HTML 4.01/XHTML 1.0 标准。
在本教程中,我们将首先讨论所有Spring的表单标签,稍后我们将看到Spring MVC的完整端到端示例。
Spring的表单标签库
- 表单标记
- 输入标签
- 复选框标记
- 复选框标记
- 单选按钮标签
- 单选按钮标签
- 密码标记
- 选择标记
- 选项标签
- 选项标签
- 文本区域标记
- 隐藏的标记
- 错误标记
- 标签
让我们浏览所有这些表单标记,并查看如何使用每个标记的示例。我们包含了生成的 HTML 代码段,其中某些标记需要进一步的评论。
使用和配置 Spring MVC 表单标签的步骤
表单标签库捆绑在 spring-webmvc.jar 中。库描述符称为spring-form.tld。
如何引用弹簧MVC表单标签
要使用此库中的标记,请将以下指令添加到 JSP 页的顶部:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
其中,表单是要用于此库中的标记的标记名称前缀。
表单标记
此标记呈现 HTML"窗体"标记,并向内部标记公开绑定路径以进行绑定。它将命令对象放在 PageContext 中,以便可以通过内部标记访问该命令对象。此库中的所有其他标记都是表单标记的嵌套标记。
假设我们有一个名为 User 的域对象。它是一个具有诸如名字和姓氏等属性的JavaBean。我们将使用它作为表单控制器的表单支持对象,该对象返回 form.jsp。下面是一个表单.jsp的示例:
<form:form>
<table>
<tr>
<td>First Name:td>
<td>
<form:input path="firstName" />
td>
tr>
<tr>
<td>Last Name:td>
<td>
<form:input path="lastName" />
td>
tr>
<tr>
<td colspan="2">
<input type="submit" value="Save Changes" />
td>
tr>
table>
form:form>
firstName 和 lastName 值由页面控制器从放置在 PageContext 中的命令对象中检索。
加载表单时,spring MVC 将调用 getter 方法 - user.getFirstName() 和 user.getLastName() 来获取值。提交表单后,Spring MVC 将调用 user.setFirstName() 和 user.setLastName() 方法来设置值。
生成的 HTML 看起来像一个标准表单:
<form method="POST">
<table>
<tr>
<td>First Name:td>
<td><input name="firstName" type="text" value="Harry" />td>
tr>
<tr>
<td>Last Name:td>
<td><input name="lastName" type="text" value="Potter" />td>
tr>
<tr>
<td colspan="2">
<input type="submit" value="Save Changes" />
td>
tr>
table>
form>
输入标签
默认情况下,此输入标记使用绑定值和 type='text' 呈现 HTML"输入"标记。例如:
<form:input path="firstName"/>
<form:input path="lastName"/>
生成的 HTML 看起来像一个标准表单:
<input name="firstName" type="text" value="Harry"/>
<input name="lastName" type="text" value="Potter"/>
从Spring 3.1开始,您可以使用其他类型,例如HTML5特定的类型,如"电子邮件","电话","日期"等。
复选框标记
此标记呈现类型为"复选框"的 HTML"输入"标记。
让我们假设我们的用户有偏好,例如订阅时事通讯和爱好列表。下面是首选项类的示例:
public class Preferences {
private boolean receiveNewsletter;
private String[] interests;
private String favouriteWord;
public boolean isReceiveNewsletter() {
return receiveNewsletter;
}
public void setReceiveNewsletter(boolean receiveNewsletter) {
this.receiveNewsletter = receiveNewsletter;
}
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
public String getFavouriteWord() {
return favouriteWord;
}
public void setFavouriteWord(String favouriteWord) {
this.favouriteWord = favouriteWord;
}
}
表单.jsp如下所示:
<form:form>
<table>
<tr>
<td>Subscribe to newsletter?:td>
<%-- Approach 1: Property is of type java.lang.Boolean --%>
<td>
<form:checkbox path="preferences.receiveNewsletter" />
td>
tr>
<tr>
<td>Interests:td>
<%-- Approach 2: Property is of an array or of type java.util.Collection --%>
<td>
Quidditch:
<form:checkbox path="preferences.interests" value="Quidditch" /> Herbology:
<form:checkbox path="preferences.interests" value="Herbology" /> Defence Against the Dark Arts:
<form:checkbox path="preferences.interests" value="Defence Against the Dark Arts" />
td>
tr>
<tr>
<td>Favourite Word:td>
<%-- Approach 3: Property is of type java.lang.Object --%>
<td>
Magic:
<form:checkbox path="preferences.favouriteWord" value="Magic" />
td>
tr>
table>
form:form>
有3种方法可以使用复选框标签,这些方法应该可以满足我们所有的复选框需求。
-
方法一 - 当绑定值类型为 java.lang.Boolean 时,如果绑定值为 true,则输入(复选框)将标记为"选中"。value 属性对应于 setValue(Object) 值属性的解析值。
-
方法二 - 当绑定值为 array 或 java.util.Collection 类型时,如果绑定集合中存在配置的 setValue(Object) 值,则输入(复选框)将标记为"选中"。
-
方法三 - 对于任何其他绑定值类型,如果配置的 setValue(Object) 等于绑定值,则输入(复选框)将标记为"选中"。
请注意,无论采用哪种方法,都会生成相同的 HTML 结构。以下是一些复选框的 HTML 代码段:
<tr>
<td>Interests:td>
<td>
Quidditch: <input name="preferences.interests" type="checkbox" value="Quidditch" />
<input type="hidden" value="1" name="_preferences.interests" /> Herbology: <input name="preferences.interests" type="checkbox" value="Herbology" />
<input type="hidden" value="1" name="_preferences.interests" /> Defence Against the Dark Arts: <input name="preferences.interests" type="checkbox" value="Defence Against the Dark Arts" />
<input type="hidden" value="1" name="_preferences.interests" />
td>
tr>
复选框标记
此标记呈现多个类型为"复选框"的 HTML"输入"标记。
下面是使用此标记的 JSP 的示例:
<form:form>
<table>
<tr>
<td>Interests:td>
<td>
<%-- Property is of an array or of type java.util.Collection --%>
<form:checkboxes path="preferences.interests" items="${interestList}" />
td>
tr>
table>
form:form>
单选按钮标签
此标记呈现类型为"radio"的 HTML"输入"标记。
典型的使用模式将涉及绑定到同一属性但具有不同值的多个标签实例。
<tr>
<td>Sex:td>
<td>
Male:
<form:radiobutton path="sex" value="M" /> <br/> Female:
<form:radiobutton path="sex" value="F" />
td>
tr>
单选按钮标签
此标记呈现多个类型为"radio"的 HTML"输入"标记。例如:
<tr>
<td>Sex:td>
<td>
<form:radiobuttons path="sex" items="${sexOptions}" />
td>
tr>
密码标记
此标记使用绑定值呈现类型为"password"的 HTML"输入"标记。
<tr>
<td>Password:td>
<td>
<form:password path="password" />
td>
tr>
请注意,默认情况下,不显示密码值。如果您确实希望显示密码值,请将"showPassword"属性的值设置为 true,如下所示。
<tr>
<td>Password:td>
<td>
<form:password path="password" value="^76525bvHGq" showPassword="true" />
td>
tr>
选择标记
此标记呈现 HTML"select"元素。它支持与所选选项的数据绑定,以及使用嵌套选项和选项标记。
假设用户具有技能列表。
<tr>
<td>Skills:td>
<td>
<form:select path="skills" items="${skills}" />
td>
tr>
如果用户的技能在 Herbology 中,则"技能"行的 HTML 源代码将如下所示:
<tr>
<td>Skills:td>
<td>
<select name="skills" multiple="true">
<option value="Potions">Potionsoption>
<option value="Herbology" selected="selected">Herbologyoption>
<option value="Quidditch">Quidditchoption>
select>
td>
tr>
选项标签
此标记呈现一个 HTML"选项"。它根据绑定值适当地设置"选定"。
<tr>
<td>House:td>
<td>
<form:select path="house">
<form:option value="Gryffindor" />
<form:option value="Hufflepuff" />
<form:option value="Ravenclaw" />
<form:option value="Slytherin" />
form:select>
td>
tr>
如果用户的房子在格兰芬多,那么"房子"行的HTML源代码将如下所示:
<tr>
<td>House:td>
<td>
<select name="house">
<option value="Gryffindor" selected="selected">Gryffindoroption>
<option value="Hufflepuff">Hufflepuffoption>
<option value="Ravenclaw">Ravenclawoption>
<option value="Slytherin">Slytherinoption>
select>
td>
tr>
选项标签
此标记呈现 HTML"选项"标记的列表。它根据绑定值适当地设置"选定"属性。
<tr>
<td>Country:td>
<td>
<form:select path="country">
<form:option value="-" label="--Please Select" />
<form:options items="${countryList}" itemValue="code" itemLabel="name" />
form:select>
td>
tr>
如果用户居住在英国,则"国家/地区"行的 HTML 源将如下所示:
<tr>
<td>Country:td>
<td>
<select name="country">
<option value="-">--Please Selectoption>
<option value="AT">Austriaoption>
<option value="UK" selected="selected">United Kingdomoption>
<option value="US">United Statesoption>
select>
td>
tr>
文本区域标记
此标记呈现 HTML"文本区域"。
<tr>
<td>Notes:td>
<td>
<form:textarea path="notes" rows="3" cols="20" />
td>
<td>
<form:errors path="notes" />
td>
tr>
隐藏的标记
此标记使用绑定值呈现类型为"hidden"的 HTML"输入"标记。要提交未绑定的隐藏值,请使用类型为"hidden"的 HTML 输入标记。
<form:hidden path="house"/>
如果我们选择将"house"值作为隐藏值提交,则HTML将如下所示:
<input name="house" type="hidden" value="Gryffindor"/>
错误标记
此标记在 HTML"span"标记中呈现字段错误。它提供对控制器中创建的错误或由与控制器关联的任何验证程序创建的错误的访问。
假设我们希望在提交表单后显示 firstName 和 lastName 字段的所有错误消息。我们有一个名为 UserValidator 的 User 类实例的验证器。
public class UserValidator implements Validator {
public boolean supports(Class candidate) {
return User.class.isAssignableFrom(candidate);
}
public void validate(Object obj, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
}
}
表单.jsp如下所示:
<form:form>
<table>
<tr>
<td>First Name:td>
<td>
<form:input path="firstName" />
td>
<%-- Show errors for firstName field --%>
<td>
<form:errors path="firstName" />
td>
tr>
<tr>
<td>Last Name:td>
<td>
<form:input path="lastName" />
td>
<%-- Show errors for lastName field --%>
<td>
<form:errors path="lastName" />
td>
tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
td>
tr>
table>
form:form>
如果我们在 firstName 和 lastName 字段中提交一个包含空值的表单,则 HTML 将如下所示:
<form method="POST">
<table>
<tr>
<td>First Name:td>
<td><input name="firstName" type="text" value="" />td>
<%-- Associated errors to firstName field displayed --%>
<td><span name="firstName.errors">Field is required.span>td>
tr>
<tr>
<td>Last Name:td>
<td><input name="lastName" type="text" value="" />td>
<%-- Associated errors to lastName field displayed --%>
<td><span name="lastName.errors">Field is required.span>td>
tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
td>
tr>
table>
form>
如果我们想显示给定页面的整个错误列表,该怎么办?下面的示例显示,错误标记还支持一些基本的通配符功能。
path="*" - 显示所有错误
path="姓氏" - 显示与姓氏字段关联的所有错误
如果省略路径 - 仅显示对象错误
以下示例将在页面顶部显示错误列表,然后在字段旁边显示特定于字段的错误:
<form:form>
<form:errors path="*" cssClass="errorBox" />
<table>
<tr>
<td>First Name:td>
<td>
<form:input path="firstName" />
td>
<td>
<form:errors path="firstName" />
td>
tr>
<tr>
<td>Last Name:td>
<td>
<form:input path="lastName" />
td>
<td>
<form:errors path="lastName" />
td>
tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
td>
tr>
table>
form:form>
HTML 将如下所示:
<form method="POST">
<span name="*.errors" class="errorBox">Field is required.<br/>Field is required.span>
<table>
<tr>
<td>First Name:td>
<td><input name="firstName" type="text" value="" />td>
<td><span name="firstName.errors">Field is required.span>td>
tr>
<tr>
<td>Last Name:td>
<td><input name="lastName" type="text" value="" />td>
<td><span name="lastName.errors">Field is required.span>td>
tr>
<tr>
<td colspan="3">
<input type="submit" value="Save Changes" />
td>
tr>
table>
form>
标签
从Spring 3开始,Spring表单标签库允许输入动态属性,这意味着您可以输入任何HTML5特定的属性。
在Spring 3.1中,表单输入标签支持输入"text"以外的类型属性。这旨在允许呈现新的HTML5特定输入类型,例如"电子邮件","日期","范围"等。请注意,输入 type='text' 不是必需的,因为 'text' 是默认类型。
春季MVC表单标签完整示例
让我们创建一个简单的 Spring MVC 项目,以演示在 JSP 中使用一些 Spring MVC 表单标记。
在这个例子中,我们将使用一个基于Java的配置,即我们使用所有Java代码(没有XML)配置Spring Dispatcher Servlet和spring beans配置。
使用的工具和技术
- 春季 MVC - 5.1.0 发布
- JDK - 1.8 或更高版本
- 梅文 - 3.5.1
- 阿帕奇雄猫 - 8.5
- IDE - STS/Eclipse Neon.3
- 日本工业大学 - 1.2.1
- JSP - 2.3.1
按照以下11个开发步骤开发完整的端到端Spring MVC表单处理应用程序。
开发步骤
- 创建 Maven Web 应用程序
- 添加依赖项 - pom.xml 文件
- 项目结构
- 弹簧配置 - MVC配置.java
- Servlet Container Initialization - SpringMvcDispatcherServletInitializer.java
- 模型类 - 用户.java
- 控制器类 - 用户控制器.java
- 视图 - 用户.jsp和用户.jsp
- 构建和运行应用程序
- 演示
1. 创建 Maven Web 应用程序
让我们使用命令行或从 Eclipse IDE 创建一个基于 Maven 的 Web 应用程序。
- 使用"创建 Maven Web 应用程序指南"链接可以使用命令行创建 maven 项目。
- 使用"使用 Eclipse IDE 创建 Maven Web 应用程序"链接使用 IDE Eclipse 创建 Maven Web 应用程序。创建 maven Web 应用程序后,请参阅 pom.xml 文件 jar 依赖项。
2. 添加依赖项 - pom.xml 文件
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>net.javaguides.springmvcgroupId>
<artifactId>springmvc5-form-tagsartifactId>
<packaging>warpackaging>
<version>0.0.1-SNAPSHOTversion>
<name>springmvc5-form-tags Maven Webappname>
<url>http://maven.apache.orgurl>
<properties>
<failOnMissingWebXml>falsefailOnMissingWebXml>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.1.0.RELEASEversion>
dependency>
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>javax.servlet.jsp.jstl-apiartifactId>
<version>1.2.1version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>javax.servlet.jsp-apiartifactId>
<version>2.3.1version>
<scope>providedscope>
dependency>
dependencies>
<build>
<sourceDirectory>src/main/javasourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>3.5.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
project>
请注意,我们正在对Spring MVC Web应用程序使用spring-webmvc依赖关系。
接下来,让我们创建一个标准的项目结构,请参考下图。
3. 项目结构
标准项目结构供您参考 -
正在上传…重新上传取消
顾名思义,Spring MVC,看看上面的图表,我们使用的是模型 - 视图 - 控制器方法。
型号 - 用户.java
视图 - 用户.jsp、用户.jsp
控制器 - 用户控制器.java
下一步,我们将使用基于 Java 的配置来配置 Spring Bean。
4. 弹簧配置 - MVC配置.java
创建一个 MVCConfig 类,并使用@Configuration、@EnableWebMvc和@ComponentScan注释对其进行批注。
package net.javaguides.springmvc.form.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
/**
* @author Ramesh Fadatare
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {
"net.javaguides.springmvc.form"
})
public class MVCConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
5. Servlet Container Initialization - SpringMvcDispatcherServletInitializer.java
在Spring MVC中,DispatcherServlet需要声明和映射,以便使用java或web.xml配置处理所有请求。
在 Servlet 3.0+ 环境中,可以使用 AbstractAnnotationConfigDispatcherServletInitializer 类以编程方式注册和初始化 DispatcherServlet,如下所示。
package net.javaguides.springmvc.form.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* @author Ramesh Fadatare
*/
public class SpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class << ? > [] getRootConfigClasses() {
// TODO Auto-generated method stub
return null;
}
@Override
protected Class << ? > [] getServletConfigClasses() {
return new Class[] {
MVCConfig.class
};
}
@Override
protected String[] getServletMappings() {
return new String[] {
"/"
};
}
}
6. 模型类 - 用户.java
让我们创建一个 User Java 类,用于将数据绑定到模型并在视图上呈现模型数据。
package net.javaguides.springmvc.form.model;
public class User {
private String username;
private String password;
private String address;
private boolean receivePaper;
private String[] favoriteFrameworks;
private String gender;
private String favoriteNumber;
private String country;
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public boolean isReceivePaper() {
return receivePaper;
}
public void setReceivePaper(boolean receivePaper) {
this.receivePaper = receivePaper;
}
public String[] getFavoriteFrameworks() {
return favoriteFrameworks;
}
public void setFavoriteFrameworks(String[] favoriteFrameworks) {
this.favoriteFrameworks = favoriteFrameworks;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getFavoriteNumber() {
return favoriteNumber;
}
public void setFavoriteNumber(String favoriteNumber) {
this.favoriteNumber = favoriteNumber;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
7. 控制器类 - 用户控制器.java
让我们创建一个 UserController 控制器类,该类使用注释进行注释@Controller,如下所示:
package net.javaguides.springmvc.form.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import net.javaguides.springmvc.form.model.User;
@Controller
public class UserController {
@RequestMapping(value = "/user", method = RequestMethod.GET)
public ModelAndView user() {
User user = new User();
user.setFavoriteFrameworks((new String[] {
"Spring MVC",
"Struts 2"
}));
user.setGender("M");
ModelAndView modelAndView = new ModelAndView("user", "command", user);
return modelAndView;
}
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String addUser(@ModelAttribute("SpringWeb") User user,
ModelMap model) {
model.addAttribute("username", user.getUsername());
model.addAttribute("password", user.getPassword());
model.addAttribute("address", user.getAddress());
model.addAttribute("receivePaper", user.isReceivePaper());
model.addAttribute("favoriteFrameworks", user.getFavoriteFrameworks());
model.addAttribute("gender", user.getGender());
model.addAttribute("favoriteNumber", user.getFavoriteNumber());
model.addAttribute("country", user.getCountry());
return "users";
}
@ModelAttribute("webFrameworkList")
public Object[] getWebFrameworkList() {
List < String > webFrameworkList = new ArrayList < String > ();
webFrameworkList.add("Spring MVC");
webFrameworkList.add("Struts 1");
webFrameworkList.add("Struts 2");
webFrameworkList.add("Apache Wicket");
return webFrameworkList.toArray();
}
@ModelAttribute("numbersList")
public List < String > getNumbersList() {
List < String > numbersList = new ArrayList < String > ();
numbersList.add("1");
numbersList.add("2");
numbersList.add("3");
numbersList.add("4");
return numbersList;
}
@ModelAttribute("countryList")
public Map < String, String > getCountryList() {
Map < String, String > countryList = new HashMap < String, String > ();
countryList.put("US", "United States");
countryList.put("CH", "China");
countryList.put("SG", "Singapore");
countryList.put("MY", "Malaysia");
return countryList;
}
}
8. 视图 - 用户.jsp和用户.jsp
用户.jsp
<%@taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%><%@ page isELIgnored="false" %>
<html>
<head>
<title>Spring MVC Form Handlingtitle>
head>
<body>
<h2>User Informationh2>
<form:form method = "POST" action = "addUser">
<table>
<tr>
<td>
<form:label path = "username">User Nameform:label>
td>
<td>
<form:input path = "username" />
td>
tr>
<tr>
<td>
<form:label path = "password">Passwordform:label>
td>
<td>
<form:password path = "password" />
td>
tr>
<tr>
<td>
<form:label path = "address">Addressform:label>
td>
<td>
<form:textarea path = "address" rows = "5" cols = "30" />
td>
tr>
<tr>
<td>
<form:label path = "receivePaper">Subscribe Newsletterform:label>
td>
<td>
<form:checkbox path = "receivePaper" />
td>
tr>
<tr>
<td>
<form:label path = "favoriteFrameworks">Favorite Web Frameworksform:label>
td>
<td>
<form:checkboxes items = "${webFrameworkList}" path = "favoriteFrameworks" />
td>
tr>
<tr>
<td>
<form:label path = "gender">Genderform:label>
td>
<td>
<form:radiobutton path = "gender" value = "M" label = "Male" />
<form:radiobutton path = "gender" value = "F" label = "Female" />
td>
tr>
<tr>
<td>
<form:label path = "favoriteNumber">Favorite Numberform:label>
td>
<td>
<form:radiobuttons path = "favoriteNumber" items = "${numbersList}" />
td>
tr>
<tr>
<td>
<form:label path = "country">Countryform:label>
td>
<td>
<form:select path = "country">
<form:option value = "NONE" label = "Select"/>
<form:options items = "${countryList}" />
form:select>
td>
tr>
<tr>
<td colspan = "2">
<input type = "submit" value = "Submit"/>
td>
tr>
table>
form:form>
body>
html>
用户.jsp
<%@taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%>
<html>
<head>
<title>Spring MVC Form Handlingtitle>
<%@ page isELIgnored="false" %>
head>
<body>
<h2>Submitted User Informationh2>
<table>
<tr>
<td>Usernametd>
<td>${username}td>
tr>
<tr>
<td>Passwordtd>
<td>${password}td>
tr>
<tr>
<td>Addresstd>
<td>${address}td>
tr>
<tr>
<td>Subscribed to Newslettertd>
<td>${receivePaper}td>
tr>
<tr>
<td>Favorite Web Frameworkstd>
<td>
<% String[] favoriteFrameworks = (String[])request.getAttribute("favoriteFrameworks");
for(String framework: favoriteFrameworks) {
out.println(framework);
}
%>
td>
tr>
<tr>
<td>Gendertd>
<td>${(gender=="M"? "Male" : "Female")}td>
tr>
<tr>
<td>Favourite Numbertd>
<td>${favoriteNumber}td>
tr>
<tr>
<td>Countrytd>
<td>${country}td>
tr>
table>
body>
html>
9. 构建并运行应用程序
由于我们首先使用 maven 构建工具,因此我们需要使用以下 maven 命令构建此应用程序:
clean install
一旦构建成功,那么我们将在IDE中的tomcat服务器8.5上运行此应用程序,或者我们也可以在外部tomcat webapps文件夹中部署war文件并运行该应用程序。
10. 演示
一旦应用程序在tomcat服务器中启动并运行,然后点击以下链接进入浏览器:http://localhost:8080/springmvc5-form-tags/user
输入URL后,您将看到以下页面。
填写上面的用户信息表单,点击提交按钮将导航到用户信息页面,如下所示:
这就是Spring的表单标签。
GitHub 上的源代码
本教程的源代码可在spring-mvc-tutorials的GitHub存储库中找到。