知識庫 / Spring / Spring MVC RSS 訂閱

探索 SpringMVC 的 Form 標籤庫

Spring MVC
HongKong
5
02:51 PM · Dec 06 ,2025

1. 概述

在本文檔系列的第一篇文章中,我們介紹了使用表單標籤庫及其如何將數據綁定到控制器。

在本文檔中,我們將涵蓋 Spring MVC 提供的各種標籤,以幫助我們 創建和驗證表單

2. 輸入標籤

我們將從 輸入標籤 開始。此標籤使用綁定值和默認的 type='text' 渲染 HTML 輸入標籤

<form:input path="name" />

從 Spring 3.1 開始,你可以使用其他 HTML5 專屬類型,例如電子郵件、日期等。例如,如果我們想要創建一個電子郵件字段,我們可以使用 <em type=’email’:</em >

<form:input type="email" path="email" />

同樣,要創建一個日期字段,我們可以使用 type=’date’,這將在許多支持 HTML5 的瀏覽器中渲染一個日期選擇器:

<form:input type="date" path="dateOfBirth" />

3. 密碼 標籤

此標籤渲染一個 HTML <em >input</em> 標籤,使用綁定值,並設置 <em >type=’password’</em> 屬性。此 HTML 輸入字段會隱藏用户輸入的數值。

<form:password path="password" />

4. <em>textarea</em> 標籤

此標籤渲染一個 HTML `textarea`。

<form:textarea path="notes" rows="3" cols="20"/>

我們可以以與 HTML textarea 相同的方式指定 行數列數

5. <em >複選框</em><em >複選框組</em> 標籤

<em >複選框</em> 標籤會渲染一個 HTML <em >輸入</em> 標籤,其中 <em >type=’checkbox’</em>。 Spring MVC 的表單標籤庫提供了多種 <em >複選框</em> 標籤的方法,以滿足我們所有的 <em >複選框</em> 需求:

<form:checkbox path="receiveNewsletter" />

上述示例生成了一個經典的單選框,具有一個布爾值。如果將綁定值設置為true,則此單選框將默認選中。

以下示例生成多個單選框。在這種情況下,單選框的值在 JSP 頁面中硬編碼:

Bird watching: <form:checkbox path="hobbies" value="Bird watching"/>
Astronomy: <form:checkbox path="hobbies" value="Astronomy"/>
Snowboarding: <form:checkbox path="hobbies" value="Snowboarding"/>

在這裏,綁定值是 arrayjava.util.Collection 類型:

String[] hobbies;

複選框標籤的目的是渲染多個複選框,其中複選框的值在運行時生成。

<form:checkboxes items="${favouriteLanguageItem}" path="favouriteLanguage" />

為了生成我們傳遞到 ArrayListMap 中可用的選項,這些選項位於 items 屬性中,我們需要在控制器中初始化我們的值:

List<String> favouriteLanguageItem = new ArrayList<String>();
favouriteLanguageItem.add("Java");
favouriteLanguageItem.add("C++");
favouriteLanguageItem.add("Perl");

通常,綁定屬性是一個集合,因此可以包含用户選擇的多個值:

List<String> favouriteLanguage;

6. <em>radiobutton</em> 和 <em>radiobuttons</em> 標籤

此標籤渲染一個 HTML `input` 標籤,帶有 `` 屬性。

Male: <form:radiobutton path="sex" value="M"/>
Female: <form:radiobutton path="sex" value="F"/>

典型的使用模式通常涉及多個標籤實例,這些實例具有不同的值綁定到同一個屬性上:

private String sex;

就像 <em >checkboxes</em > 標籤一樣,<em >radiobuttons</em > 標籤也會渲染多個 HTML <em >input</em > 標籤,其中 <em >type=’radio’</em >

<form:radiobuttons items="${jobItem}" path="job" />

在這種情況下,我們可能希望將可用的選項作為ArrayListMap傳遞,其中包含可用的選項,並存儲在items屬性中:

List<String> jobItem = new ArrayList<String>();
jobItem.add("Full time");
jobItem.add("Part time");

7. select 標籤

此標籤渲染一個 HTML 的 select 元素:

<form:select path="country" items="${countryItems}" />

為了生成我們傳遞到 ArrayListMap 中可用的選項,請在 items 屬性中提供一個包含這些選項的列表。 再次強調,我們可以在控制器內部初始化我們的值:

Map<String, String> countryItems = new LinkedHashMap<String, String>();
countryItems.put("US", "United States");
countryItems.put("IT", "Italy");
countryItems.put("UK", "United Kingdom");
countryItems.put("FR", "France");

<select> 標籤也支持使用嵌套的 <option><options> 標籤。

雖然 <option> 標籤渲染一個 HTML <option> 元素,但 <options> 標籤渲染一個 HTML <option> 元素的列表。

<options> 標籤接受一個包含 items 屬性中可用選項的 ArrayListMap,就像 <select> 標籤一樣:

<form:select path="book">
    <form:option value="-" label="--Please Select--"/>
    <form:options items="${books}" />
</form:select>

當我們需要同時選擇多個項目時,我們可以創建一個多選列表框。要渲染這種類型的列表,只需在<select>標籤中添加<em multiple=”true”> 屬性。

<form:select path="fruit" items="${fruit}" multiple="true"/>

這裏,bound屬性是一個數組或一個java.util.Collection

List<String> fruit;

8. 隱藏標籤 (Hidden Tag)

此標籤會渲染一個 HTML input 標籤,並使用綁定值,設置 type=’hidden’

<form:hidden path="id" value="12345" />

9. Errors 標籤

字段錯誤消息由與控制器相關的驗證器生成。我們可以使用 Errors 標籤來渲染這些字段錯誤消息:

<form:errors path="name" cssClass="error" />

這段字段會顯示指定在 path屬性中的錯誤。錯誤消息默認渲染在 span標籤內,並將 path值作為 id附加,並可選擇從 cssClass屬性中獲取CSS類,用於對輸出進行樣式設置:

<span id="name.errors" class="error">Name is required!</span>

為了使用不同的元素(而不是默認的 span 標籤)來包含錯誤消息,我們可以通過在 element 屬性中指定所需的元素來實現:

<form:errors path="name" cssClass="error" element="div" />

這段代碼會渲染錯誤消息,並將其包含在 div 元素內:

<div id="name.errors" class="error">Name is required!</div>

除了能夠針對特定輸入元素顯示錯誤之外,我們還可以顯示給定頁面上所有錯誤的完整列表(不考慮字段)。這通過使用通配符 * 實現的:

<form:errors path="*" />

9.1. 驗證器

為了顯示給定字段中的錯誤,我們需要定義一個驗證器:

public class PersonValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name");
    }
}

在這種情況下,如果字段 name 為空,則驗證器會返回由 從資源包中標識的錯誤消息。

資源包在 Spring 的 配置文件中定義如下:

<bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
     <property name="basename" value="messages" />
</bean>

或者,在純 Java 配置風格中:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages");
    return messageSource;
}

錯誤信息定義在 messages.properties文件中:

required.name = Name is required!

為了應用此驗證,我們需要在控制器中包含對驗證器的引用,並在當用户提交表單時調用的控制器方法中調用 validate 方法:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @ModelAttribute("person") Person person, 
  BindingResult result, 
  ModelMap modelMap) {

    validator.validate(person, result);

    if (result.hasErrors()) {
        return "personForm";
    }
    
    modelMap.addAttribute("person", person);
    return "personView";
}

9.2. JSR 303 Bean 驗證

從 Spring 3 開始,我們可以使用 JSR 303(通過 @Valid 註解)進行 Bean 驗證。為此,需要在 classpath 中添加一個 JSR303 驗證框架。我們將使用 Hibernate Validator(參考實現)。以下是需要在 POM 中包含的依賴項:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>8.0.1.Final</version>
</dependency>

為了使 Spring MVC 支持通過 @Valid 註解使用 JSR 303 驗證,我們需要在我們的 Spring 配置文件中啓用以下內容:

<mvc:annotation-driven/>

或者在 Java 配置中,使用相應的註解 @EnableWebMvc

@EnableWebMvc
@Configuration
public class ClientWebConfigJava implements WebMvcConfigurer {
    // All web configuration will go here
}

接下來,我們需要使用 @Valid 註解對我們想要驗證的控制器方法進行註釋:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @Valid @ModelAttribute("person") Person person, 
  BindingResult result, 
  ModelMap modelMap) {
 
    if(result.hasErrors()) {
        return "personForm";
    }
     
    modelMap.addAttribute("person", person);
    return "personView";
}

現在我們可以為實體的屬性添加註釋,以使用 Hibernate 驗證器註解進行驗證:

@NotEmpty
private String password;

默認情況下,此註解將在我們留空密碼輸入字段時顯示

我們可以通過在驗證器示例中定義的資源包中創建屬性來覆蓋默認錯誤消息。消息鍵遵循 的規則:

NotEmpty.person.password = Password is required!

10. 結論

在本教程中,我們探討了 Spring 提供的用於處理表單的各種標籤。

我們還查看了用於顯示驗證錯誤標籤以及配置自定義錯誤消息所需的配置。

當項目在本地運行時,可以從以下網址訪問表單示例:

http://localhost:8080/spring-mvc-xml/person

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.