用于MyBatis CRUD操作的Spring MVC 3控制器

到目前为止,我们已经为域类“ User ”创建了CRUD数据库服务,并且还将MyBatis配置与Spring Configuration文件集成在一起。 接下来,我们将使用Spring MVC创建一个网页,以使用MyBatis CRUD服务对数据库执行操作。

  1. 使用MyBatis 3创建DAO类,这将有助于对数据库执行CRUD操作。
  2. 设置环境以集成MyBatis 3和Spring MVC 3框架。
  3. 创建用于执行CRUD操作的Spring MVC 3控制器。

因此,在这一部分中,我们将经历以下会话,这些会话使我们能够使用Spring MVC和MyBatis CRUD服务为示例创建用户界面:

  1. Spring表单验证器
  2. Spring MVC控制器
  3. 用于执行UI创建的jsp页面和JavaScript文件
  4. 最后一个Spring MVC配置文件

Spring表单验证器

首先,我们将看到此示例中使用的表单验证器。 这是代码:

package com.raistudies.validator;import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;import com.raistudies.domain.User;@Component
public class RegistrationValidator implements Validator {public boolean supports(Class<?> c) {return User.class.isAssignableFrom(c);}public void validate(Object command, Errors errors) {ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "field.name.empty");ValidationUtils.rejectIfEmptyOrWhitespace(errors, "standard", "field.standard.empty");ValidationUtils.rejectIfEmptyOrWhitespace(errors, "age", "field.age.empty");ValidationUtils.rejectIfEmptyOrWhitespace(errors, "sex", "field.sex.empty");User usrBean = (User)command;if(!isNumber(usrBean.getAge().trim()))errors.rejectValue("age", "field.age.NAN");}private boolean isNumber(String str){for (int i = 0; i < str.length(); i++) {//If we find a non-digit character we return false.if (!Character.isDigit(str.charAt(i)))return false;}return true;}
}

如您所见,我们对表单值设置了一些限制,例如每个字段都应该有值,而“ age ”字段中的值应该是数字。 您可以根据需要从此类的validate()方法中为表单值添加更多限制。 错误消息值的包含在属性文件messages.properties中定义,如下所示:

field.name.empty=Name field is mandatory.
field.standard.empty=Standard field is mandatory.
field.age.empty=Age field is mandatory.
field.sex.empty=Sex field is mandatory.field.age.NAN=Age should be a number.

这就是表单验证部分的全部内容,现在我们将看到控制器部分。

Spring MVC控制器

控制器会将请求从浏览器投射到MyBatis服务。 波纹管是代码:

package com.raistudies.controllers;import java.util.List;
import java.util.UUID;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
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;import com.raistudies.domain.User;
import com.raistudies.persistence.UserService;
import com.raistudies.validator.RegistrationValidator;@Controller
@RequestMapping(value="/registration")
public class RegistrationController {private RegistrationValidator validator = null;private UserService userService = null;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public RegistrationValidator getValidator() {return validator;}@Autowiredpublic void setValidator(RegistrationValidator validator) {this.validator = validator;}@RequestMapping(method=RequestMethod.GET)public String showForm(ModelMap model){List<User> users = userService.getAllUser();model.addAttribute("users", users);User user = new User();user.setId(UUID.randomUUID().toString());model.addAttribute("user", user);return "registration";}@RequestMapping(value="/add", method=RequestMethod.POST)public ModelAndView add(@ModelAttribute(value="user") User user,BindingResult result){validator.validate(user, result);ModelAndView mv = new ModelAndView("registration");if(!result.hasErrors()){userService.saveUser(user);user = new User();user.setId(UUID.randomUUID().toString());mv.addObject("user", user);}mv.addObject("users", userService.getAllUser());return mv;}@RequestMapping(value="/update", method=RequestMethod.POST)public ModelAndView update(@ModelAttribute(value="user") User user,BindingResult result){validator.validate(user, result);ModelAndView mv = new ModelAndView("registration");if(!result.hasErrors()){userService.updateUser(user);user = new User();user.setId(UUID.randomUUID().toString());mv.addObject("user", user);}mv.addObject("users", userService.getAllUser());return mv;}@RequestMapping(value="/delete", method=RequestMethod.POST)public ModelAndView delete(@ModelAttribute(value="user") User user,BindingResult result){validator.validate(user, result);ModelAndView mv = new ModelAndView("registration");if(!result.hasErrors()){userService.deleteUser(user.getId());user = new User();user.setId(UUID.randomUUID().toString());mv.addObject("user", user);}mv.addObject("users", userService.getAllUser());return mv;}
}

控制器使用两个bean进行CRUD操作,一个是我们上面说过的用来验证表单数据的RegistrationValidator ,另一个是我们在上一部分中使用MyBatis 3创建的UserService ,以对表单数据执行数据库操作。 两个豆将在Spring使用二传手注射自动接线。

控制器具有以下操作方法来处理对表单数据的CRUD请求:

  • showForm():此操作将首次显示该表单,这就是我们将方法类型设置为RequestMethod.GET的原因。该方法还将使用UserService的 getAllUser()方法提供数据库中所有可用的用户以显示在表上表格如下。
  • add():此操作将处理创建操作。 首先,它将验证表单数据,如果没有错误发生,则它将使用UserService的 saveUser()方法将表单数据保存到数据库中以创建新用户。 它还将使用表单绑定一个新的User对象。
  • update(): update方法将使用UserService的 updateUser()方法将用户详细信息更新到数据库,并且在此之前,它将使用RegistrationValidator验证数据
  • delete():此方法用于从数据库中删除用户,并从UserServicedeleteUser()方法获得帮助。

用于执行UI创建的jsp页面和JavaScript文件

在此会话中,我们将看到示例的用户界面部分。 我们将创建一个如下所示的网页:

Spring MVC和MyBatis 3集成–用户表单

用户界面功能:

  • “保存更改”按钮将用于创建新用户或更新现有用户。
  • “新用户”按钮将用于设置表单以创建新用户。
  • “删除用户”按钮将用于删除表格中显示其详细信息的用户
  • 单击任何行将把相应的行数据带到表单域以进行更新或删除。

让我们看一下与该网页对应的jsp代码:

</div>
<div>
<pre><!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page session="true" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Hello World with Spring 3 MVC</title><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><script type="text/javascript" src='<c:url value="/resources/common.js"/>'></script><script type="text/javascript" src='<c:url value="/resources/registration.js"/>'></script><script type="text/javascript">var projectUrl = '<c:url value="/"/>';if(projectUrl.indexOf(";", 0) != -1){projectUrl = projectUrl.substring(0, projectUrl.indexOf(";", 0));}</script></head><body><fieldset><legend>Registration Form</legend><center><form:form commandName="user" action="/SpringMVCMyBatisCRUDExample/app/registration/add" name="userForm"><form:hidden path="id"/><table><tr><td colspan="2" align="left"><form:errors path="*" cssStyle="color : red;"/></td></tr><tr><td>Name : </td><td><form:input path="name" /></td></tr><tr><td>Standard : </td><td><form:input path="standard" /></td></tr><tr><td>Age : </td><td><form:input path="age" /></td></tr><tr><td>Sex : </td><td><form:select path="sex"><form:option value="Male"/><form:option value="Female"/></form:select></td></tr><tr><td colspan="2"><input type="submit" value="Save Changes"/>&nbsp;<input type="reset" name="newUser" value="New User" onclick="setAddForm();" disabled="disabled"/>&nbsp;<input type="submit" name="deleteUser" value="Delete User" onclick="setDeleteForm();" disabled="disabled"/></td></tr></table></form:form></center></fieldset><c:if test="${!empty users}"><br /><center><table width="90%"><tr style="background-color: gray;"><th>Name</th><th>Standard</th><th>Age</th><th>Sex</th></tr><c:forEach items="${users}" var="user"><tr style="background-color: silver;" id="${user.id}" onclick="setUpdateForm('${user.id}');"><td><c:out value="${user.name}"/></td><td><c:out value="${user.standard}"/></td><td><c:out value="${user.age}"/></td><td><c:out value="${user.sex}"/></td></tr></c:forEach></table></center><br /></c:if></body>
</html></pre>
</div>
<div>

如您所见,表单的默认操作是使用控制器的add方法将表单详细信息添加到数据库。 单击“删除用户”后,它将调用JavaScript函数,该函数将更改表单url以删除用户。 我们已经使用<c:forEach /> jstl来显示表上的所有用户,并且每一行都声明了单击,即使这将把表行数据带到表单中,也将改变表单的提交URL来调用控制器的update()方法。

Spring MVC配置文件

最后,我们将看到用于配置控制器和其他所有东西的Spring MVC配置。 以下是配置文件:

</div>
<div>
<pre><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><!-- Application Message Bundle --><bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="basename" value="/WEB-INF/messages" /><property name="cacheSeconds" value="3000" /></bean><!-- Scans the classpath of this application for @Components to deploy as beans --><context:component-scan base-package="com.raistudies" /><!-- Configures the @Controller programming model --><mvc:annotation-driven /><!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><import resource="jdbc-context.xml"/>
</beans></pre>
</div>
<div>

该配置文件包括themessages.properties作为资源包,还包括jdbc-context.xml配置文件,其中包含将MyBatis 3与Spring集成的配置。

在运行示例时,您将得到上面的屏幕,该屏幕还将显示数据库中存在的所有记录。 单击“ 保存更改 ”按钮,您将获得以下屏幕,该屏幕将在空白表单值上显示验证错误:

Spring MVC和MyBatis 3集成–带有验证错误的用户表单

现在,用有效数据填写表格,然后单击“保存更改”按钮,它将表格数据带到下面的表格中。

仅此示例而已。 希望您喜欢学习!! :)

  1. 使用MyBatis 3创建DAO类,这将有助于对数据库执行CRUD操作。
  2. 设置环境以集成MyBatis 3和Spring MVC 3框架。
  3. 创建用于执行CRUD操作的Spring MVC 3控制器。

参考: Spring MVC 3控制器,用于通过 Rai Studies博客的JCG合作伙伴 Rahul Mondal 使用MyBatis(iBatis)3执行CRUD操作 。


翻译自: https://www.javacodegeeks.com/2012/05/spring-mvc-3-controller-for-mybatis.html

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

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

相关文章

2pin接口耳机_拆解报告:雷柏首款真无线耳机XS200

-----我爱音频网拆解报告第185篇-----雷柏是一家历史悠久的鼠标和键盘厂商&#xff0c;截至目前&#xff0c;雷柏(rapoo)总共出了四款耳机&#xff0c;此前曾推出过三款蓝牙耳机&#xff0c; 分别是S500 蓝牙立体声麦克风耳机&#xff0c;S200 蓝牙立体声麦克风耳机&#xff0c…

深入理解javascript原型和闭包(3)——prototype原型

转载&#xff0c;原文地址http://www.cnblogs.com/wangfupeng1988/p/3978131.html 既typeof之后的另一位老朋友&#xff01; prototype也是我们的老朋友&#xff0c;即使不了解的人&#xff0c;也应该都听过它的大名。如果它还是您的新朋友&#xff0c;我估计您也是javascript的…

python 温度 符号_Python通过小实例入门学习---1.0(温度转换)

1.安装Python 3 下载地址: Welcome to Python.org​www.python.org 2.“温度转换”实例:摄氏度--->华氏度 / 华氏度--->摄氏度 TempConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in ["f","F"]:C = (eval(Tem…

mysql 修改root密码

1.找到配置文件my.ini &#xff0c;然后将其打开&#xff0c;可以选择用记事本打开 C:\Program Files (x86)\MySQL\MySQL Server 5.0 2.打开后&#xff0c;搜索mysqld关键字&#xff0c;找到后&#xff0c;在mysqld下面添加skip-grant-tables&#xff0c;保存退出。 PS&#x…

联想计算机CDROM启动,联想电脑光驱启动问题?

1、开机按del键或f2进入bios设置(不同主板按键不一样&#xff0c;一般是DEL&#xff0c;也可能是F2&#xff0c;可以参考下主板说明)&#xff0c;将计算机的启动模式调成从光盘启动。也就是从cdrom启动&#xff0c;根据主板的不同&#xff0c;bios设置有所差异(一般是&#xff…

string 大小写转换

STL的algorithm库确实给我们提供了这样的便利&#xff0c;使用模板函数transform可以轻松解决这个问题&#xff0c;开发人员只需要提供一个函数对象&#xff0c;例如将char转成大写的toupper函数或者小写的函数tolower函数。 transform原型&#xff1a; 1 #include <string&…

linux服务器上svn的log_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器 | Linux 中国...

在 Centos 8 和 RHEL 8 系统中&#xff0c;默认未安装 VNC 服务器&#xff0c;它需要手动安装。在本文中&#xff0c;我们将通过简单的分步指南&#xff0c;介绍如何在 Centos 8 / RHEL 8 上安装 VNC 服务器。-- Pradeep KumarVNC(虚拟网络计算Virtual Network Computing)服务器…

Windows上的Java线程CPU分析

本文将为您提供一个教程&#xff0c;介绍如何在Windows OS上快速查明Java线程贡献者与CPU严重问题有关。 Windows与Linux&#xff0c;Solaris和AIX等其他操作系统一样&#xff0c;使您可以在进程级别监视CPU利用率&#xff0c;还可以监视在进程中执行任务的单个线程。 在本教程…

flask 继承模版的基本使用1

转载于:https://www.cnblogs.com/wanghaonull/p/6399492.html

计算机日期函数公式大全,Excel技巧: 根据日期汇总月份的计算公式

在许多情况下&#xff0c;Excel记录的数据将按照发生的日期进行记录&#xff0c;但是根据日期记录的数据将非常分散&#xff0c;通常需要每月汇总相应的数据. 在这种情况下&#xff0c;您需要将日期转换为月份. 本文介绍了如何使用SUMPRODUCT函数按月汇总数据.公式提示在SUMPRO…

coverity代码检测工具介绍_微服务测试之静态代码扫描

静态代码扫描为整个发展组织增加价值。无论您在开发组织中发挥的作用如何&#xff0c;静态代码扫描解决方案都具有附加价值&#xff0c;拥有软件开发中所需要的尖端功能&#xff0c;最大限度地提高质量并管理软件产品中的风险。背景微服务架构模式具有服务间独立&#xff0c;可…

ADF:在任务流终结器中支持bean作用域

介绍 当我们需要在任务流消失之前完成一些最终工作&#xff08;干净的资源&#xff0c;紧密的连接等&#xff09;时&#xff0c;这是使用任务流终结器的非常普遍的推荐做法。 和往常一样&#xff0c;我们使用在任务流中声明的托管bean。 托管Bean可以具有不同的范围-请求&#…

linux中匿名用户怎么登陆_南京课工场IT培训:Linux中vsftpd服务配置(匿名,用户,虚拟用户)...

vsftpd概述vsftpd 是“very secure FTP daemon”的缩写&#xff0c;安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字&#xff0c;它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面&#xff0c;是一个完全免费的、开放源代码的ftp服务…

Java High CPU故障排除指南–第1部分

本文是该系列的第1部分&#xff0c;它将为您提供有关如何进行故障排除和识别Java高CPU问题根本原因的综合指南。 该指南也适用于独立的Java程序&#xff0c;但旨在帮助涉及Java EE企业日常生产支持的个人。 它还将包括最常见的高级CPU问题列表以及高级解决方案。 生产问题解决…

php进程间通信 yoc_swoole的process模块创建和使用子进程

swoole中为我们提供了一个进程管理模块 Process&#xff0c;替换PHP的 pcntl 扩展&#xff0c;方便我们创建进程&#xff0c;管理进程&#xff0c;和进程间的通信。swoole提供了2种进程间的通信&#xff1a;1、基于 unix socket 的管道 pipe。2、基于 sysvmsg 的消息队列。我们…

mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?

阿里妹导读&#xff1a;如何治理测试稳定性问题&#xff1f;很多人会说&#xff1a;环境、流程管控、监控、工具化、加机器、专人负责、等等。这些都是对的。不过这些都是解决方案层面的&#xff0c;而不是方法论和理论体系层面的。今天&#xff0c;阿里研究员郑子颖来说说测试…

HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

【iOS开发】---- 强大的UI修改工具 UIAppearance-有图片效果

iOS5及其以后提供了一个比较强大的工具UIAppearance&#xff0c;可以轻松的统一你的界面&#xff0c;它提供如下两个方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一个方法是统一全部改&#xff0c;比如你设置UINav…

使用Jetty设置JNDI(嵌入式)

我在开发工作区上运行嵌入式Jetty&#xff0c;从而节省了一些编译和部署恶性循环的时间。 我与Jetty的合作不多&#xff0c;易用性使我着迷于它。 我需要设置JNDI才能检索与数据库相关的活动的连接池。 尽管某些地方有完整的文档&#xff0c;但大多数都是分散的。 因此&#xf…

交华为换机access配置_华为交换机Hybrid接口及基础配置

一、回顾VLANVLAN基本概念VLAN即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域(多个VLAN)的通信技术。VLAN内的主机间可以直接通信&#xff0c;而VLAN间不能直接互通&#xff0c;从而将广播报文限制在一个VLAN内。由于VLAN之间的隔离&#xff0c;所以一些类…