使用Spring 3 MVC處理表單

本文是有關Spring 3的一系列文章的一部分。該系列的上一篇文章可以在此處獲得 。

在本文中,我們向Spring MVC邁出了又一步。 [此外: 術語MVC的創建者提供的pdf 。]從上一篇文章構建,讓我們添加將“聯系人”添加到應用程序所需的代碼。 首先,我們需要添加一些UI組件來啟動該過程。 為了簡單起見,讓它成為一個簡單的鏈接。

文件:/springwebapp001/src/main/webapp/index.jsp

[...]  
<a href="contacts/addNew.html"> Add new contact.</a>  [...]

如您所見,我們已將此鏈接指向“ contacts / addNew.html”。 這意味著我們需要某些東西–正在尋找此請求的控制器和/或方法。 讓我們創建一個控制器,該控制器將處理所有以“聯系人”開頭的請求。

文件:src / main / java / org / academy / ui / spring3 / controllers / ContactCtlr.java

package org.academy.ui.spring3.controllers;                     import org.academy.ui.spring3.forms.ContactFrm;                 
import org.slf4j.Logger;                                        
import org.slf4j.LoggerFactory;                                 
import org.springframework.stereotype.Controller;               
import org.springframework.validation.BindingResult;            
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;            @Controller                                                     
@RequestMapping(value = "/contacts")                            
public class ContactCtlr {                                      private final static Logger logger = LoggerFactory          .getLogger(ContactCtlr.class);                      
[...]  
}

Spring還必須知道它必須掃描控制器的特定軟件包。

文件:/springwebapp001/src/main/webapp/WEB-INF/spring-servlet.xml

[...]  
<context:component-scan base-package="org.academy.ui.spring3.controllers" />     
[...]

設置好之后,我們將需要在ContactCtlr中使用一個方法來為/addNew.html字段獲取GET請求。 [另外:GET和POST請求有什么區別? 在這里閱讀。 ]

文件:src / main / java / org / academy / ui / spring3 / controllers / ContactCtlr.java

[...]  
private final String addNewView = "Contacts/AddNew";            @RequestMapping(value = "/addNew", method = RequestMethod.GET)  
public String addNewContact() {                                 logger.debug("Display form to add a new contact.");         return addNewView;                                          
}                                                               
[...]

在這里,我們只是將控件定向到“ Contacts / AddNew”,其簡化為/springwebapp001/src/main/webapp/WEB-INF/views/Contacts/AddNew.jsp。

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>  
<html>  
<head>  
<title>Add New Contact</title>  
</head>  
<body>  
<form:form method="post" commandName="contact" action="addNew.html">  
<table>  
<tr>  
<td colspan="2">Add a new contact.</td>  
</tr>  
<tr>  
<td><form:label path="firstname">First Name</form:label></td>  
<td><form:input path="firstname" /></td>  
</tr>  
<tr>  
<td><form:label path="lastname">Last Name</form:label></td>  
<td><form:input path="lastname" /></td>  
</tr>  
<tr>  
<td><form:label path="email">Email</form:label></td>  
<td><form:input path="email" /></td>  
</tr>  
<tr>  
<td><form:label path="telephone">Telephone</form:label></td>  
<td><form:input path="telephone" /></td>  
</tr>  
<tr>  
<td colspan="2"><input type="submit" value="Add Contact" /></td>  
</tr>  
</table>  
</form:form>  
</body>  
</html>

此表單將需要一個Java pojo作為后盾,該pojo將保存jsp中提到的所有表單元素。

文件:/springwebapp001/src/main/java/org/academy/ui/spring3/forms/ContactFrm.java

package org.academy.ui.spring3.forms;  public class ContactFrm {  private String firstname;   private String lastname;   private String email;   private String telephone;  public String getFirstname() {  return firstname;  }  public void setFirstname(String firstname) {  this.firstname = firstname;  }  public String getLastname() {  return lastname;  }  public void setLastname(String lastname) {  this.lastname = lastname;  }  public String getEmail() {  return email;  }  public void setEmail(String email) {  this.email = email;  }  public String getTelephone() {  return telephone;  }  public void setTelephone(String telephone) {  this.telephone = telephone;  }  }

在AddNew.jsp中,您可以看到該表單期望某人處理對“ addNew.html”的調用。 和以前一樣,讓我們??回到控制器并向“ addNew.html”添加一個處理POST請求的方法。 請注意,這是一個POST請求,而不是我們之前處理過的GET請求。

文件:/springwebapp001/src/main/java/org/academy/ui/spring3/controllers/ContactCtlr.java

[...]  
@RequestMapping(value = "/addNew", method = RequestMethod.POST)           
public ModelAndView addNewContact(                                        @ModelAttribute("contact") ContactFrm contactFrm,                 BindingResult result) {                                           logger.debug("Adding a new contact. {}", contactFrm.getFirstname());  // Some code to work on the data received from the user.                                                                       return new ModelAndView(addNewView, "contact", new ContactFrm());     
}  
[...]

瞧,如果您在任何servlet容器(例如Tomcat)中編譯并運行此應用程序,您將獲得一個鏈接,該鏈接將導致一個Form,該鏈接將允許您放入數據,并將該數據傳輸到位于服務器端,然后返回表格以了解更多信息。 那些在MVC框架應運而生之前設計和開發Web應用程序的聽眾肯定會濕潤的。 即使您使用過早期的MVC框架,Struts(最成功的框架)也將使花在將三個組件(M,V和C)結合在一起上的時間花費,現在我們可以在10分鐘內完成。 軟件開發肯定已經走了很長一段路。

在下一節中,我們將向該應用程序添加單元測試和日志記錄 。 快樂的編碼。

相關鏈接

  • Struts –我可以推薦的唯一其他MVC框架
  • GET和POST之間的區別
  • MVC一詞的由來

繼續使用Spring 3 MVC處理表單驗證

參考:來自Tech for Enterprise博客的JCG合作伙伴 Partho 使用Spring 3 MVC處理表單 。


翻譯自: https://www.javacodegeeks.com/2012/08/handling-form-validation-with-spring-3.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372056.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

插入排序法之——直接插入排序、折半插入排序、希爾排序

// test20.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include<iostream> #include<vector> #include<string> #include<queue> #include<stack> #include<cstring> #include<string.h> #include<de…

linux idea 快捷鍵,Linux 下 IDEA 的 Ctrl+Alt+S

前言這是個困擾我一年多的問題&#xff0c;今天終于解決了……起因一年前將主系統換成 Arch Linux 后&#xff0c;其他一切正常就是 IDEA 的打開設置的快捷鍵 ctrlalts 失效&#xff0c;讓我很是頭疼。雖然不是很重要&#xff0c;但是對于我這種強迫癥來說別提多難受了……我曾…

修改input的placeholder顏色

1、CSS選擇器 因為每個瀏覽器的CSS選擇器有所差異&#xff0c;所以需要針對每個瀏覽器做單獨的設定。 ::-webkit-input-placeholder { /* WebKit browsers */ color: #999; } :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #999; } ::-moz-placeholder { /* Mozil…

解決Spring自動裝配中的循環依賴

我認為這篇文章是在企業應用程序開發中使用Spring的最佳實踐。 使用Spring編寫企業Web應用程序時&#xff0c;服務層中的服務量可能會增加。 服務層中的每個服務可能會消耗其他服務&#xff0c;這些服務將通過Autowire注入。 問題&#xff1a;當服務數量開始增加時&#xff0…

01.MD5加密

namespace _01.MD5加密{ class Program { static void Main(string[] args) { //MD5加密就是給想要的密碼或者其它字符加密 //如果字符串被加密成MD5值之后,是不可逆的. //字符串123 的MD5 64位加密形式是 202cb962ac59075b964b07152d234b70 Console.WriteLine("請輸入需要…

C語言數字3轉變字符 3 程序,大學c語言知識點總結

大學c語言知識點總結C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。一起來看看大學c語言知識點總結吧!大學c語言知識點總結1、編譯預處理不是C語言的一部分&#xff0c;不再運行時間。C語言編…

接觸Jenkins(Hudson)API,第1部分

哪一個-哈德森還是詹金斯&#xff1f; 都。 幾個月前&#xff0c;我開始使用Hudson v1.395來從事這個小項目&#xff0c;在出現巨大分歧之后又回到了這個項目。 我以此為契機&#xff0c;看我將來選擇永久搬到詹金斯時是否會遇到任何重大問題。 有很多麻煩-最值得注意的是&…

使用javascript模擬常見數據結構(四)

七、樹 樹是一種非線性的分層的數據結構&#xff0c;在現實生活中比較常見的例子比如家譜和公司的組織架構圖&#xff0c;如下所示&#xff1a; 一個樹結構存在著一系列的父子結構&#xff0c;并且有著一個根節點&#xff0c;這種結構本質上表明了一對多的關系。 那&#xff0c…

C語言中實際參數太多,c – 宏的實際參數太多了?

碼&#xff1a;#include using namespace std;#define ADD(x,y) ((x)(y))int main( int argc, char** argv ){cout << ADD(1,2,) << endl;return 0;}編譯器輸出&#xff1a;1>Compiling…1>main.cpp1>c:\warn_test\main.cpp(9) : warning C4002: too many…

Web開發框架–第2部分:Play Framework 2.0

作為 評估系列 的第一個候選人&#xff0c; 我們回顧了 Play Framework v2.0 。 可以從Play 文檔站點獲得本文所使用的教程和參考文檔。 本文的第一部分將介紹我們建議對每個框架執行的一組任務&#xff0c;然后繼續評估每個標準項。 在開發工作站中安裝框架 非常簡單&#…

最全Pycharm教程(10)——Pycharm調試器總篇

最全Pycharm教程&#xff08;1&#xff09;——定制外觀 最全Pycharm教程&#xff08;2&#xff09;——代碼風格 最全Pycharm教程&#xff08;3&#xff09;——代碼的調試、執行 最全Pycharm教程&#xff08;4&#xff09;——有關Python解釋器的相關配置 最全Pycharm教程&am…

Looper.prepare()和Looper.loop()

什么時候需要 Looper Looper用于封裝了android線程中的消息循環&#xff0c;默認情況下一個線程是不存在消息循環&#xff08;message loop&#xff09;的&#xff0c;需要調用Looper.prepare()來給線程創建一個消息循環&#xff0c;調用Looper.loop()來使消息循環起作用&#…

超速問題的c語言編程,超速行駛問題--精選.doc

超速行駛問題摘要本文主要研究的是探討驅車從始發地至目的地的最短時間路徑問題和最少花費問題&#xff0c;以及在超速情況下的最短時間和最少花費問題。首先&#xff0c;從整個題目的兩個問題入手&#xff0c;發現兩個問題都是優化問題&#xff0c;具有一定的聯系。然后針對第…

重新查看Play Framework發布的值

與Play Framework 2.0一起使用發布的值而不定義表單映射&#xff0c;可能不像Play 1.x那樣明顯&#xff0c;這就是為什么我要編寫此快速備忘單。 對于此快速示例&#xff0c;讓我們定義以下視圖&#xff1a; app / views / index.scala.html (message: String)message: messa…

matlab 微積分

符號變量&#xff0c;symbolic variable 1. 高階導數 高階導數的計算&#xff0c;當然可以用手工的方式&#xff0c;但顯然這種機械重復的推導&#xff0c;更適用于計算機的計算方式&#xff1a; f(x)sinxx24x3?d4fdx4>> syms x; >> f sin(x) / (x^24*x3); >&…

如何查看Ubuntu版本,以及Linux內核版本??

查看Ubuntu版本&#xff1a; 方法一&#xff1a; cat /etc/issue 方法二&#xff1a; sudo lsb_release -a 查看內核版本&#xff1a; uname -r 轉載于:https://www.cnblogs.com/tanrong/p/6937749.html

c語言編碼風格,講嵌入式C語言編碼風格.ppt

講嵌入式C語言編碼風格目 錄 簡介及說明 語言規則 1.基礎 2.數據 3.說明與表達式 4.函數 5.內存及資源 6.源文件 風格指導 7.程序書寫 8.命名 9.文檔 簡介及說明 正確性 易維護性 易移植性 代碼的高效性 語言規則——基礎 編寫清晰表達設計思路和意圖的代碼 針對易讀來優化代碼…

使用Gradle引導舊式Ant構建

Gradle提供了幾種不同的方式來利用您現有的對Ant的投資&#xff0c;包括積累的知識和您已經放入構建文件中的時間。 這可以極大地方便將Ant生成的項目移植到Gradle的過程&#xff0c;并為您提供逐步進行此操作的路徑。 Gradle文檔在描述如何在Gradle構建腳本中使用Ant方面做得很…

實現chrome擴展啟動本地進程 - 補充

實現chrome擴展啟動本地進程 - 補充 標簽&#xff1a; chrome擴展啟動本地程序訪問本地磁盤2014-10-17 11:42 6753人閱讀 評論(17) 收藏 舉報分類&#xff1a;Chrome Plugin版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 示例 主要包含如下部分 c…

SpringMVC整合MongoDB

首先&#xff0c;在pom文件中新增spring-data-mongodb的依賴&#xff1a; <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.8.1.RELEASE</version>&l…