Spring MVC表单教程

本教程将展示如何在Spring MVC中处理表单提交。 我们将定义一个控制器来处理页面加载和表单提交。 您可以在GitHub上获取代码。

先决条件:

您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序,请按照本教程进行操作 。 对于本教程,我们将制作一个简单的订阅新闻通讯的表格。 该表格将包含以下字段:

  • 名称–输入字段
  • 年龄–输入栏
  • 电子邮件–输入字段
  • 性别-选择下拉菜单
  • receiveNewsletter –复选框
  • 新闻通讯频率-选择下拉菜单

要求:

  • 仅在选中receiveNewsletter复选框时, newsletterFrequency下拉列表才应处于活动状态
  • 在此示例中,我们将不执行任何验证(敬请留意,以备以后使用)
  • 用户提交表单时,将重新加载同一页面
  • 重新加载的页面应显示一条消息,指示提交成功并显示保存的值

完成后,我们将出现一个如下所示的页面:

Spring MVC表单屏幕截图

首先,让我们设置用于存储订户信息的对象。 在包com.codetutr.form创建类Subscriber 。 这是一个基本的Java bean。 请注意,我们使用枚举来存储性别和新闻通讯频率字段。 为简单起见,我在同一类中定义了枚举。 还要注意,我们正在定义toString 。 这样做是为了便于我们在提交后轻松获取要打印的值。

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 + "]";}}

现在,让我们创建控制器。 在包com.codetutr.controller创建类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";}
}

让我们看一下上面代码中的几件事。 首先,请注意,两个请求处理程序(用@RequestMapping注释的方法)都映射到相同的URL –“ form”。 映射的唯一区别是,一个处理HTTP GET请求,另一个处理POST。 当用户导航到“表单”页面时,将调用第一个处理程序(用于GET请求),因为他们将使用GET请求访问该页面。 提交表单时会调用POST处理程序(因为它将通过HTTP POST提交到“表单” URL)。 当然,您可以使用任何HTTP方法将表单提交到任何URL –只需确保在此处相应地映射处理程序即可。

让我们看一下GET处理程序。 它需要一个Model ,我们用一个空的Subscriber对象填充它。 该对象是我们用来填充表单的对象。 我们在这里没有设置任何值,但是如果我们愿意,例如将默认的receiveNewsletter复选框设置为true,并将默认的新闻通讯频率设置为每小时,则可以执行以下操作:

Subscriber subscriber = new Subscriber();
subscriber.setReceiveNewsletter(true);
subscriber.setNewsletterFrequency(Frequency.HOURLY);
m.addAttribute("subscriber", subscriber);

还要注意,如果我们不向模型添加名为“ subscriber”的对象,那么当我们尝试访问JSP时,Spring会抱怨,因为我们将设置JSP将表单绑定到“ subscriber” model属性。 您将看到一个JSP错误:“ Bean名称'subscriber'的BindingResult和普通目标对象都不能用作请求属性”,并且JSP无法呈现。

控制器代码中最后要看的是@ModelAttribute方法。 当使用@ModelAttribute注释方法时,Spring会在每个处理程序方法之前运行它,并将返回值添加到模型中。 我们在注释中指定将“频率”值添加到模型中作为“频率”。 该对象将用于在JSP表单中填充新闻通讯频率下拉框。 代替使用@ModelAttribute方法,我们可以将以下行添加到每个请求处理程序中:

m.addAttribute("frequencies", Frequency.values())

最后,让我们设置jsp。 在WEB-INF/view (或配置JSP所在的任何位置)中创建一个名为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>

让我们看一下我们正在使用的表单标签。 请注意页面顶部的行: <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 。 这将导入我们将要使用的Spring Form标签。 当我们使用<form:form>标记打开表单时,请注意,我们正在指定model属性。 这告诉Spring在Model中查找属性并将其绑定到表单。 也可以指定actionmethod属性。 如果未指定(如本例所示),则它们分别默认为当前URL和“ POST”(就像常规HTML表单一样)。

请注意,我们的每个输入字段都使用Spring Form taglib(form:前缀)。 这些字段中的每个字段还指定一个path属性。 根据标准Java bean约定(get / is,设置为前缀为首字母大写的字段名称),它必须对应于model属性(在本例中为Subscriber类)的getter或setter。 加载页面时,Spring将填充输入字段,Spring将调用绑定到输入字段的每个字段的getter。 提交表单后,将调用设置器以将表单的值保存到对象。

<form:input>标签很容易说明。 注意使用了<form:select>的两个实例。 请注意,在第一个选择下拉列表的“性别”字段中,我们手动列出了所有选项。 不过,在新闻通讯的“频率选择”下拉列表中,我们遍历了“ frequencies模型属性(请记住,已通过Controller中的@ModelAttribute -annotated方法将其添加到模型中),并将每个项目添加为下拉菜单中的选项。 提交表单时,只要所选选项的值是有效的枚举名称,Spring就会自动将表单值绑定到枚举。

提交表单后,将调用控制器中的POST处理程序。 表单自动绑定到我们传入的订户参数。@ @ModelAttribute批注实际上在这里不是必需的。 我将在另一篇文章中写更多有关它的内容。

你有它! 我强烈建议您下载源代码并运行代码。 在下面的评论中发表您的任何问题。

完整资源: ZIP和GitHub要运行本教程中的代码:必须已安装Gradle 。 下载ZIP。 提取。 打开命令提示符以提取位置。 运行gradle jettyRunWar。 在浏览器中导航到http:// localhost:8080 / form。

资源资源

  • Spring Form TagLib参考文档
  • DZone – Spring Form标签教程

参考:我们的JCG合作伙伴 Steve Hanson在CodeTutr博客上提供的Spring MVC Form Tutorial 。

翻译自: https://www.javacodegeeks.com/2013/04/spring-mvc-form-tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们十组的cantool装置的使用

十组的cantool装置的使用 下图是连接好的示意图&#xff0c;灯亮。 如果在串口关闭的时候输入C&#xff0c;cantool装置就会报错&#xff0c;因为串口是关闭的。正如需求文档里写的&#xff0c;当串口关闭&#xff0c;输入C要有返回\BEL的,关闭串口的前提是串口打开。 正确发送…

2018-05-05(在小程序中使用图标)

项目中常常需要使用到字体图标&#xff0c;微信小程序中使用字体图标与在平常的web前端中类似但是又有区别。下面以使用阿里图标为例子讲解如何在微信小程序中使用字体图标。 第一步&#xff1a;下载需要的字体图标 进入阿里图标官网http://iconfont.cn/搜索自己想要的图标&…

Django的模板系统

一、模板的组成 html代码和逻辑控制代码 二、逻辑控制代码的形式 1、变量&#xff08;使用双大括号引用变量&#xff09; a、template和context 语法 : {{ var_name }} 模板系统不仅可以传字符串&#xff0c;它可以传递任意对象&#xff0c;对于向列表、字典、元组等对象&…

Java SE 7 Update 25 –发行说明进行了解释。

昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是与所有其他Oracle产品一起不符合Oracle关键补丁更新计划的最后一个更新。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布周期。 但…

Ansible: hosts文件拆分为inventory和定义inventory全局变量

前言 随着管理机器的增多&#xff0c;我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题&#xff0c;极其不便于管理&#xff0c;而将hosts文件拆分为inventory就可解决该问题&#xff1b;另外&#xff0c;hosts中的每个主机条目需要指定用户名和私钥或密码&#xff0…

Eclipse中 如何实现 多行同时编辑

在编辑的时候按下 SHIFT ALT A 之后 鼠标变为 号 选择要同时编辑几行 即可编辑&#xff08;现在eclipse好像只能是编辑一块地方 不能像vs那样 任何地方可以同时编辑 这点很鸡肋&#xff09; 如图 退出编辑 再次 按 SHIFT ALT A 即可 转载于:https://www.cnblogs.com…

检测和删除多余无用的css

本文主要讲解如何检测页面中多余无用的css。 1、chrome浏览器 F12审查元素的Audits 说明&#xff1a;使用Audits&#xff0c;会检测出页面中没有用到的css&#xff0c;需要手动删除多余的css&#xff1b;同时需要说明的是检测出多余无用的css块&#xff0c;而不是某一行css。 …

vue支付密码

从网上搜索了好多都很麻烦&#xff0c;花了点事件自己做了个&#xff0c;简单轻便&#xff0c;老少皆宜 <template> <section class"pay-mask" click"close_mask" v-show"payshow"> <div class"container"> <div…

打造智能建筑商

构建API时&#xff0c;您应该始终考虑谁将使用它。 当API简单易用时&#xff0c;用户就会感到满意。 当用户满意时&#xff0c;每个人也都会满意。 但是出色的可用性并非总是容易实现的。 有一些模式对此有所帮助&#xff0c;在这篇文章中&#xff0c;我将重点介绍经典的构建器…

结合BeautyEye开源UI框架实现的较美观的Java桌面程序

BeautyJavaSwingRobot 结合BeautyEye开源UI框架实现的较美观的Java桌面程序&#xff0c;主要功能就是图灵机器人和一个2345网站万年历的抓取。。。。   挺简单而且实用的一个项目&#xff0c;实现出来的效果也还不错。希望可以学到知识的小可爱不对应该是帅哥&#xff0c;可…

【从入门到放弃】23种设计模式(1):设计模式综述

一、设计模式的分类 总体来说设计模式分为三大类&#xff1a; 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式&#xff08;Factory Method&#xff09;、抽象工厂模式&#xff08;Abstract Factory&#xff09;、单例模式&#xff08;Singleton&#xff09;、建造者模式…

【2017级面向对象程序设计】第2次成绩排行

作业地址 https://edu.cnblogs.com/campus/fzu/OOP/homework/1864 评分标准 1&#xff09; C 流程图 or 文字描述程序结构 5分C 类图 or 文字描述程序结构 5分2&#xff09; 代码 共 10 分构造函数 &#xff1a;2 分析构函数 &#xff1a;2 分成员函数 显示当前所处楼层&#x…

css定位position

闲言碎语不多说&#xff0c;直接开写&#xff01; 关于定位 我们可以使用css的position属性来设置元素定位类型&#xff0c;position的设置项如下&#xff1a; a、relative生成相对定位元素&#xff0c;元素所占据的文档流的位置不变&#xff08;即元素不会脱离文档流&#x…

php运城,运城php培训

作用域&#xff1a;全局的request恳求   描绘&#xff1a;经过在Global中完成Application_Error办法&#xff0c;来到达侦听未经处置的异常   详细代码如下&#xff1a;sudo dtrace -qFn pid$target:Finding?Ray:Finding?Ray:r{ printf("%s\n", probefunc); } …

利用爬虫模拟网页微信wechat

1.登录页面&#xff0c;显示二维码 当我们打开网页微信时&#xff0c;会看到一个用于扫码登录的二维码&#xff0c;所以我们要模拟该页面给我们的页面也弄一个二维码 通过查看网页代码我们发现&#xff0c;这个二维码的标签为 这个src属性的最后一段每次访问都是不同的&#xf…

爬取饿了么商铺信息

分析&#xff1a; 当我们访问https://www.ele.me/home/时&#xff0c;看看我们得到了什么 1.png我们发现所有的城市名称和他的经纬度&#xff0c;还有一个风流的男子 然后随机输入一些东西看看&#xff0c;进入某个地区看一看 在新的界面里我们看到了这样一条url: https://main…

linux基本命令du,Linux常用操作命令汇总

你还在为不知道Linux常用操作命令汇总而不知所措么?下面来是学习啦小编为大家收集的Linux常用操作命令汇总&#xff0c;欢迎大家阅读&#xff1a;Linux常用操作命令汇总1.ls 命令ls以默认方式显示当前目录文件列表服务器教程ls -a显示所有文件包括隐藏文件ls -l显示文件属性&a…

后处理效果栈

Unity官方的Github实现&#xff1a;Post Processing Stack Post-processing is the process of applying full-screen filters and effects to a camera’s image buffer before it is displayed to screen. It can drastically improve the visuals of your product with litt…

linux 安装tcl命令,TCL/TK Linux下安装 | 勤奋的小青蛙

原创文章&#xff0c;转载请注明&#xff1a; 转载自勤奋的小青蛙本文链接地址: TCL/TK Linux下安装在Linux下安装TCL/TK&#xff0c;可以有编译源代码的方式安装&#xff0c;也可以有直接通过二进制压缩包进行解压缩安装&#xff0c;本文采用比较快捷的方式&#xff0c;用二进…

安全性中的Spring AOP –通过方面控制UI组件的创建

以下文章将显示在我参与的一个项目中&#xff0c;我们如何使用Spring的AOP来介绍一些与安全性相关的功能。 这样的概念是为了使用户能够看到一些UI组件&#xff0c;他需要具有一定级别的安全特权。 如果不满足该要求&#xff0c;则不会显示UIComponent。 让我们看一下项目结构&…