使用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.mzph.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…