javascript
Spring MVC表单教程
本教程將展示如何在Spring MVC中處理表單提交。 我們將定義一個(gè)控制器來(lái)處理頁(yè)面加載和表單提交。 您可以在GitHub上獲取代碼。
先決條件:
您應(yīng)該有一個(gè)運(yùn)行中的Spring MVC應(yīng)用程序。 如果尚未設(shè)置正常的Spring MVC應(yīng)用程序,請(qǐng)按照本教程進(jìn)行操作 。 對(duì)于本教程,我們將制作一個(gè)簡(jiǎn)單的訂閱新聞通訊的表格。 該表格將包含以下字段:
- 名稱(chēng)–輸入字段
- 年齡–輸入欄
- 電子郵件–輸入字段
- 性別-選擇下拉菜單
- receiveNewsletter –復(fù)選框
- 新聞通訊頻率-選擇下拉菜單
要求:
- 僅在選中receiveNewsletter復(fù)選框時(shí), newsletterFrequency下拉列表才應(yīng)處于活動(dòng)狀態(tài)
- 在此示例中,我們將不執(zhí)行任何驗(yàn)證(敬請(qǐng)留意,以備以后使用)
- 用戶提交表單時(shí),將重新加載同一頁(yè)面
- 重新加載的頁(yè)面應(yīng)顯示一條消息,指示提交成功并顯示保存的值
完成后,我們將出現(xiàn)一個(gè)如下所示的頁(yè)面:
首先,讓我們?cè)O(shè)置用于存儲(chǔ)訂戶信息的對(duì)象。 在包c(diǎn)om.codetutr.form創(chuàng)建類(lèi)Subscriber 。 這是一個(gè)基本的Java bean。 請(qǐng)注意,我們使用枚舉來(lái)存儲(chǔ)性別和新聞通訊頻率字段。 為簡(jiǎn)單起見(jiàn),我在同一類(lèi)中定義了枚舉。 還要注意,我們正在定義toString 。 這樣做是為了便于我們?cè)谔峤缓筝p松獲取要打印的值。
Subscriber.java
package com.codetutr.form;public class Subscriber {private String name;private String email;private Integer age;private Gender gender;private Frequency newsletterFrequency;private Boolean receiveNewsletter;public enum Frequency {HOURLY, DAILY, WEEKLY, MONTHLY, ANNUALLY}public enum Gender {MALE, FEMALE}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Gender getGender() {return gender;}public void setGender(Gender gender) {this.gender = gender;}public Frequency getNewsletterFrequency() {return newsletterFrequency;}public void setNewsletterFrequency(Frequency newsletterFrequency) {this.newsletterFrequency = newsletterFrequency;}public Boolean getReceiveNewsletter() {return receiveNewsletter;}public void setReceiveNewsletter(Boolean receiveNewsletter) {this.receiveNewsletter = receiveNewsletter;}@Overridepublic String toString() {return "Subscriber [name=" + name + ", age=" + age + ", gender=" + gender+ ", newsletterFrequency=" + newsletterFrequency+ ", receiveNewsletter=" + receiveNewsletter + "]";}}現(xiàn)在,讓我們創(chuàng)建控制器。 在包c(diǎn)om.codetutr.controller創(chuàng)建類(lèi)FormController :
FormController.java
package com.codetutr.controller;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 org.springframework.web.bind.annotation.RequestMethod;import com.codetutr.form.Subscriber; import com.codetutr.form.Subscriber.Frequency;@Controller public class FormController {@ModelAttribute("frequencies")public Frequency[] frequencies() {return Frequency.values();}@RequestMapping(value="form", method=RequestMethod.GET)public String loadFormPage(Model m) {m.addAttribute("subscriber", new Subscriber());return "formPage";}@RequestMapping(value="form", method=RequestMethod.POST)public String submitForm(@ModelAttribute Subscriber subscriber, Model m) {m.addAttribute("message", "Successfully saved person: " + subscriber.toString());return "formPage";} }讓我們看一下上面代碼中的幾件事。 首先,請(qǐng)注意,兩個(gè)請(qǐng)求處理程序(用@RequestMapping注釋的方法)都映射到相同的URL –“ form”。 映射的唯一區(qū)別是,一個(gè)處理HTTP GET請(qǐng)求,另一個(gè)處理POST。 當(dāng)用戶導(dǎo)航到“表單”頁(yè)面時(shí),將調(diào)用第一個(gè)處理程序(用于GET請(qǐng)求),因?yàn)樗麄儗⑹褂肎ET請(qǐng)求訪問(wèn)該頁(yè)面。 提交表單時(shí)會(huì)調(diào)用POST處理程序(因?yàn)樗鼘⑼ㄟ^(guò)HTTP POST提交到“表單” URL)。 當(dāng)然,您可以使用任何HTTP方法將表單提交到任何URL –只需確保在此處相應(yīng)地映射處理程序即可。
讓我們看一下GET處理程序。 它需要一個(gè)Model ,我們用一個(gè)空的Subscriber對(duì)象填充它。 該對(duì)象是我們用來(lái)填充表單的對(duì)象。 我們?cè)谶@里沒(méi)有設(shè)置任何值,但是如果我們?cè)敢?#xff0c;例如將默認(rèn)的receiveNewsletter復(fù)選框設(shè)置為true,并將默認(rèn)的新聞通訊頻率設(shè)置為每小時(shí),則可以執(zhí)行以下操作:
Subscriber subscriber = new Subscriber(); subscriber.setReceiveNewsletter(true); subscriber.setNewsletterFrequency(Frequency.HOURLY); m.addAttribute("subscriber", subscriber);還要注意,如果我們不向模型添加名為“ subscriber”的對(duì)象,那么當(dāng)我們嘗試訪問(wèn)JSP時(shí),Spring會(huì)抱怨,因?yàn)槲覀儗⒃O(shè)置JSP將表單綁定到“ subscriber” model屬性。 您將看到一個(gè)JSP錯(cuò)誤:“ Bean名稱(chēng)'subscriber'的BindingResult和普通目標(biāo)對(duì)象都不能用作請(qǐng)求屬性”,并且JSP無(wú)法呈現(xiàn)。
控制器代碼中最后要看的是@ModelAttribute方法。 當(dāng)使用@ModelAttribute注釋方法時(shí),Spring會(huì)在每個(gè)處理程序方法之前運(yùn)行它,并將返回值添加到模型中。 我們?cè)谧⑨屩兄付▽ⅰ邦l率”值添加到模型中作為“頻率”。 該對(duì)象將用于在JSP表單中填充新聞通訊頻率下拉框。 代替使用@ModelAttribute方法,我們可以將以下行添加到每個(gè)請(qǐng)求處理程序中:
m.addAttribute("frequencies", Frequency.values())最后,讓我們?cè)O(shè)置jsp。 在WEB-INF/view (或配置JSP所在的任何位置)中創(chuàng)建一個(gè)名為formPage.jsp的文件:
formPage.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><!DOCTYPE HTML> <html><head><title>Sample Form</title><script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><style>body { background-color: #eee; font: helvetica; }#container { width: 500px; background-color: #fff; margin: 30px auto; padding: 30px; border-radius: 5px; box-shadow: 5px; }.green { font-weight: bold; color: green; }.message { margin-bottom: 10px; }label {width:70px; display:inline-block;}form {line-height: 160%; }.hide { display: none; }</style></head><body><div id="container"><h2>Subscribe to The Newsletter!</h2><c:if test="${not empty message}"><div class="message green">${message}</div></c:if><form:form modelAttribute="subscriber"><label for="nameInput">Name: </label><form:input path="name" id="nameInput" /><br/><label for="ageInput">Age: </label><form:input path="age" id="ageInput" /><br/><label for="emailInput">Email: </label><form:input path="email" id="emailInput" /><br/><label for="genderOptions">Gender: </label><form:select path="gender" id="genderOptions"><form:option value="">Select Gender</form:option><form:option value="MALE">Male</form:option><form:option value="FEMALE">Female</form:option></form:select><br/><label for="newsletterCheckbox">Newsletter? </label><form:checkbox path="receiveNewsletter" id="newsletterCheckbox" /><br/><label for="frequencySelect">Freq:</label><form:select path="newsletterFrequency" id="frequencySelect"><form:option value="">Select Newsletter Frequency: </form:option><c:forEach items="${frequencies}" var="frequency"><form:option value="${frequency}">${frequency}</form:option></c:forEach></form:select><br/><br/><input type="submit" value="Submit" /></form:form></div><script type="text/javascript">$(document).ready(function() {toggleFrequencySelectBox(); // show/hide box on page load$('#newsletterCheckbox').change(function() {toggleFrequencySelectBox();})});function toggleFrequencySelectBox() {if(!$('#newsletterCheckbox').is(':checked')) {$('#frequencySelect').val('');$('#frequencySelect').prop('disabled', true);} else {$('#frequencySelect').prop('disabled', false);}}</script></body> </html>讓我們看一下我們正在使用的表單標(biāo)簽。 請(qǐng)注意頁(yè)面頂部的行: <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 。 這將導(dǎo)入我們將要使用的Spring Form標(biāo)簽。 當(dāng)我們使用<form:form>標(biāo)記打開(kāi)表單時(shí),請(qǐng)注意,我們正在指定model屬性。 這告訴Spring在Model中查找屬性并將其綁定到表單。 也可以指定action和method屬性。 如果未指定(如本例所示),則它們分別默認(rèn)為當(dāng)前URL和“ POST”(就像常規(guī)HTML表單一樣)。
請(qǐng)注意,我們的每個(gè)輸入字段都使用Spring Form taglib(form:前綴)。 這些字段中的每個(gè)字段還指定一個(gè)path屬性。 根據(jù)標(biāo)準(zhǔn)Java bean約定(get / is,設(shè)置為前綴為首字母大寫(xiě)的字段名稱(chēng)),它必須對(duì)應(yīng)于model屬性(在本例中為Subscriber類(lèi))的getter或setter。 加載頁(yè)面時(shí),Spring將填充輸入字段,Spring將調(diào)用綁定到輸入字段的每個(gè)字段的getter。 提交表單后,將調(diào)用設(shè)置器以將表單的值保存到對(duì)象。
<form:input>標(biāo)簽很容易說(shuō)明。 注意使用了<form:select>的兩個(gè)實(shí)例。 請(qǐng)注意,在第一個(gè)選擇下拉列表的“性別”字段中,我們手動(dòng)列出了所有選項(xiàng)。 不過(guò),在新聞通訊的“頻率選擇”下拉列表中,我們遍歷了“ frequencies模型屬性(請(qǐng)記住,已通過(guò)Controller中的@ModelAttribute -annotated方法將其添加到模型中),并將每個(gè)項(xiàng)目添加為下拉菜單中的選項(xiàng)。 提交表單時(shí),只要所選選項(xiàng)的值是有效的枚舉名稱(chēng),Spring就會(huì)自動(dòng)將表單值綁定到枚舉。
提交表單后,將調(diào)用控制器中的POST處理程序。 表單自動(dòng)綁定到我們傳入的訂戶參數(shù)。@ @ModelAttribute批注實(shí)際上在這里不是必需的。 我將在另一篇文章中寫(xiě)更多有關(guān)它的內(nèi)容。
你有它! 我強(qiáng)烈建議您下載源代碼并運(yùn)行代碼。 在下面的評(píng)論中發(fā)表您的任何問(wèn)題。
完整資源: ZIP和GitHub要運(yùn)行本教程中的代碼:必須已安裝Gradle 。 下載ZIP。 提取。 打開(kāi)命令提示符以提取位置。 運(yùn)行g(shù)radle jettyRunWar。 在瀏覽器中導(dǎo)航到http:// localhost:8080 / form。
資源資源
- Spring Form TagLib參考文檔
- DZone – Spring Form標(biāo)簽教程
翻譯自: https://www.javacodegeeks.com/2013/04/spring-mvc-form-tutorial.html
總結(jié)
以上是生活随笔為你收集整理的Spring MVC表单教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何通过手机设置无线路由器密码如何访问无
- 下一篇: Spring休眠3