- 浏览: 562498 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (145)
- apache-struts (3)
- apache-shiro (4)
- apache-wicket (1)
- spring (34)
- spring-data-jpa (2)
- spring-mvc (20)
- spring-security (1)
- spring-webflow (1)
- hibernate (2)
- mongodb (1)
- ibatis (5)
- mysql (4)
- 开源组件 (18)
- java (3)
- maven (7)
- jBPM (1)
- EJB (1)
- JMS (2)
- servlet / jsp (9)
- javascript / jquery (10)
- 工作技巧 (12)
- ubuntu (6)
- bootstrap (10)
- javaee (1)
- 他山石 (7)
- jetbrick (1)
最新评论
-
yubao2008:
[size=x-small]为什么我也这样试了, 就是没有生效 ...
javax.servlet.http.HttpServletResponse 得到 status_code -
chenrl:
...
SpringMVC杂记(十五) spring-mvc controller 的切面 -
LONGTENGLONG:
你好,这样配置的,得到的集合为空,是什么原因?
apache-shiro杂记(一) 统计在线用户数目 -
xiafengfeiwu:
[flash=200,200][url]引用[/url][/f ...
apache-shiro 学习笔记 -
3108493554:
你好 ,有些问题想请教下,加下我qq310849354,你这上 ...
SpringMVC杂记(十二) 自定义Interceptor从Active Directory得到域信息
SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)
1) 项目需要必须使用向导型Controller,Spring2.x时代的org.springframework.web.servlet.mvc.AbstractWizardFormController
已经在Spring 3.1中被标上了过时。只好自己动手,用标注实现同样的逻辑。
2) 首先是表单类,最终用户提交的数据都用这个保存起来。
3) 设计表单
3.1 第一个页面要求用户填写用户名,性别,生日
3.2 第二个页面要求用户填写手机号和电子邮件地址
3.3 第三个页面填写自己的兴趣爱好
4) Controller类的编写
4.1 首先把页面需要的MasterData准备好,放在ModelMap中保存。
4.2 跳到第一个视图的方法
4.3 注意,由于[上一个],[下一个],[完成]按钮都会触发submit动作,所以一个方法是不够的,三个按钮触发的提交必须区别对待。
1) 项目需要必须使用向导型Controller,Spring2.x时代的org.springframework.web.servlet.mvc.AbstractWizardFormController
已经在Spring 3.1中被标上了过时。只好自己动手,用标注实现同样的逻辑。
2) 首先是表单类,最终用户提交的数据都用这个保存起来。
public class UserRegistForm implements java.io.Serializable { private String username; private String sex; private String birthday; @Pattern(regexp = "\\d{3}-\\{d4}-\\d{4}") private String phoneNumber; // 电话号码用JSR303标注验证,因为只是示例程序别字段的就不验证了。 private String emailAddress; private List<String> interests = new ArrayList<String>(); // 篇幅关系 getter 和 setter 就不写了 }
3) 设计表单
3.1 第一个页面要求用户填写用户名,性别,生日
<%@ page language="java" %> <%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <%@ page isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <base href="<%=basePath%>" /> <title>注册</title> </head> <body> <form action="" method="post"> <input type="hidden" name="_page" value="1"> <table> <tr> <td>用户名</td> <td><input type="text" name="username" value="${form.username}"></td> </tr> <tr> <td>性别</td> <td> <select name="sex"> <option value="男" <c:if test="${form.sex == '男'}">selected="selected"</c:if>>男</option> <option value="女" <c:if test="${form.sex == '女'}">selected="selected"</c:if>>女</option> </select> </td> </tr> <tr> <td>生日</td> <td><input type="text" name="birthday" value="${form.birthday}"></td> </tr> <tr> <td colspan="2"><input type="submit" value="下一个" name="_next"></td> </tr> </table> </form> </body> </html>
3.2 第二个页面要求用户填写手机号和电子邮件地址
<%@ page language="java" %> <%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <%@ page isELIgnored="false" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <base href="<%=basePath%>" /> <title>注册</title> </head> <body> <form action="" method="post"> <input type="hidden" name="_page" value="2"> <table> <tr> <td>手机号</td> <td><input type="text" name="phoneNumber" value="${form.phoneNumber}"></td> </tr> <tr> <td>邮件地址</td> <td><input type="text" name="emailAddress" value="${form.emailAddress}"></td> </tr> <tr> <td><input type="submit" value="上一个" name="_prev"></td> <td><input type="submit" value="下一个" name="_next"></td> </tr> </table> </form> </body> </html>
3.3 第三个页面填写自己的兴趣爱好
<%@ page language="java" %> <%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <%@ page isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="mfn" uri="http://www.wicresoft.com/jsp/functions" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <base href="<%=basePath%>" /> <title>注册</title> </head> <body> <form action="" method="post"> <input type="hidden" name="_page" value="3"> <table> <tr> <td>兴趣</td> <td> <c:forEach items="${interestList}" var="interest"> <input type="checkbox" name="interests" value="${interest}" <c:if test="${mfn:contains(form.interests, interest)}">checked="checked"</c:if>> ${interest} <br/> </c:forEach> </td> </tr> <tr> <td><input type="submit" value="上一个" name="_prev"></td> <td><input type="submit" value="完成" name="_finish"></td> </tr> </table> </form> </body> </html>
4) Controller类的编写
4.1 首先把页面需要的MasterData准备好,放在ModelMap中保存。
public class RegistWizardFormController { private static final Logger LOGGER = LoggerFactory.getLogger(RegistWizardFormController.class); // 三个页面分别对应的逻辑视图名 private static final String[] VIEW_NAMES = new String[] { "regist1", "regist2", "regist3" }; @ModelAttribute("form") public UserRegistForm initForm() { LOGGER.debug("initForm()"); return new UserRegistForm(); } // Master Data @ModelAttribute("interestList") public List<String> initInterests() { return Arrays.asList("吃,喝,嫖,赌".split(",")); } }
4.2 跳到第一个视图的方法
public class RegistWizardFormController { // ... // 访问“http://localhost:8080/demo/user/regist”时,进入第一个页面 @RequestMapping(value = "/regist", method = {RequestMethod.GET}) public String go(@ModelAttribute("form") UserRegistForm form) { return VIEW_NAMES[0]; } // ... }
4.3 注意,由于[上一个],[下一个],[完成]按钮都会触发submit动作,所以一个方法是不够的,三个按钮触发的提交必须区别对待。
public class RegistWizardFormController { // @RequestMapping标注的 params 参数来判断到底哪个按钮被点击引发了提交。 @RequestMapping(value = "/regist", method = {RequestMethod.POST}, params = {"_next", "!_prev", "!_finish"}) public String processNext(@RequestParam(value = "_page", required = true) int page, @ModelAttribute("form") UserRegistForm form) { LOGGER.debug("process 'next', next logic view name : {}", VIEW_NAMES[page]); return VIEW_NAMES[page]; } @RequestMapping(value = "/regist", method = {RequestMethod.POST}, params = {"!_next", "_prev", "!_finish"}) public String processPrev(@RequestParam(value = "_page", required = true) int page, @ModelAttribute("form") UserRegistForm form) { LOGGER.debug("process 'prev', previous logic view name : {}", VIEW_NAMES[page - 2]); return VIEW_NAMES[page - 2]; } @ResponseBody @RequestMapping(value = "/regist", method = {RequestMethod.POST}, params = {"!_next", "!_prev", "_finish"}) public UserRegistForm processFinish(@Valid @ModelAttribute("form") UserRegistForm form, BindingResult bindingResult, SessionStatus sessionStatus) { if (bindingResult.hasErrors()) { // 数据绑定有问题的话,仅仅用一条日志而已 LOGGER.warn("Data-binding has errors."); } // 现在得到的是完整的表单了,怎么做就看业务啦。 // 我这里只是把表单的数据用JSON的方式发给浏览器 sessionStatus.setComplete(); return form; } // ... }
- demo.zip (43.5 KB)
- 下载次数: 135
评论
3 楼
yingzhor
2012-09-18
第一个问题答案: 你试过就知道了,不过你也页面没有提交的话,当然不会帮你验证了。
第二个问题答案: 请参考我另一篇博客http://yingzhuo.iteye.com/blog/1455438最后也有一个Demo供你下载。 一看便知。
第二个问题答案: 请参考我另一篇博客http://yingzhuo.iteye.com/blog/1455438最后也有一个Demo供你下载。 一看便知。
2 楼
bennet2009
2012-09-17
还有, 如果在最后提交表单的时候, 验证没有通过, 怎么回填写有误的表单页呢?
1 楼
bennet2009
2012-09-17
请问这种分步提交的表单, 如果验证的? 我使用 JSR 303 - Bean Validation 来进行验证, 但是第一个页面提交的时候,不仅只验证了第一个页面上的字段,后面的字段也要进行验证,但第一个页面上根本就没有这些字段。
发表评论
-
SpringMVC杂记(十八) ServletRequestAttributes的应用
2014-02-28 12:38 14212看了一下SpringMVC的源代码,原来SpringMVC也提 ... -
SpringMVC杂记(十七) HandlerMethodArgumentResolver接口应用example
2014-01-24 15:29 12199自从spring3.1 开始就有了这个接口,可以为@Reque ... -
SpringWebflow杂记(一) 框架初探,与SpringMVC的集成
2013-10-23 17:18 1711今日研究了一下SpringWebFlow这个项目,作为Spri ... -
SpringMVC杂记(十六) spring-mvc 与 openid4java
2013-10-12 15:25 3869SpringMVC杂记(十六) spring-mvc 与 op ... -
SpringMVC杂记(十五) spring-mvc controller 的切面
2013-08-01 19:42 6136SpringMVC杂记(十五) spring-mvc cont ... -
Spring集成CXF
2013-06-24 15:53 1569Spring集成CXF 零) jar依赖 <dep ... -
SpringMVC杂记(十四) Ajax方式的JSR303认证
2013-06-13 07:29 4520自己定义一个Exception,用来表示数据绑定失败 im ... -
SpringMVC杂记(十三) 使用FreeMarker作为视图层
2013-06-09 11:55 3398实在没什么好说的,直接上配置文件好了 <bean i ... -
SpringMVC杂记(十二) 自定义Interceptor从Active Directory得到域信息
2013-06-04 14:04 3201一)最近项目中要求实现Web应用的SSO(Single Sig ... -
通过spring,javamail,和freemarker集成发送HTML方式的电子邮件
2013-05-30 14:02 4870一) 现在项目中用的javamail和org.springfr ... -
SpringMVC杂记(十一) 使用Excel视图
2013-04-06 16:06 6623SpringMVC杂记(十一) 使用Excel视图 一) 其 ... -
Spring集成junit
2012-12-24 10:43 1503package junit; import org. ... -
BootstrapPlugin - daterangepicker 使用笔记
2012-11-13 12:17 21073BootstrapPlugin - daterangepick ... -
SpringMVC杂记(十) 验证码生成
2012-11-06 10:18 2783以前写过一篇关于这个的博客,现在用SpringMVC了,重写一 ... -
SpringMVC杂记(九) 模拟其他类型(非GET,POST)的请求
2012-10-22 10:49 26901) 以前一个小兄弟问我,SpringMVC是否可以使用很多浏 ... -
SpringMVC杂记(八) 使用阿里巴巴的fastjson
2012-07-21 08:27 102691) 国产开源软件要支持的 <dependency& ... -
ActiveMQ学习笔记(二) JMS与Spring
2012-06-24 10:21 7425上文可见,JMS Native API使用起来不是特别方便。好 ... -
我的SpringSecurity实践
2012-04-08 07:49 8979我的SpringSecurity实践 (一) 数据库与实体类 ... -
SpringMVC杂记(七) Jackson与Hibernate LazyLoding无法正常工作解决办法
2012-03-21 13:35 7054SpringMVC杂记(七) Jackson与Hibernat ... -
SpringMVC杂记(六) 下载文件
2012-03-21 09:04 4278SpringMVC杂记(六) 下载文件 1) jar依赖 ...
相关推荐
基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...
SSM框架是Java web开发中常用的三大框架Spring MVC、Spring和MyBatis的组合,这里的"4.0"和"3.1.1"分别指的是Spring框架和MyBatis框架的版本号。Spring MVC作为Spring的一部分,负责处理HTTP请求,Spring则提供了...
Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...
基于spring+springMVC+mybatis+easyui技术实现的医药后台管理系统 项目描述 基于spring+springMVC+mybatis+easyui技术实现的医药管理系统 运行环境 jdk7+tomcat7+mysql+eclipse/IntelliJ IDEA+maven 项目技术...
SpringMVC提供了多种Controller实现,如AbstractFormController和AbstractWizardFormController,以方便开发者处理用户输入。 SpringMVC的灵活性还表现在其可扩展的组件体系。例如,DispatcherServlet允许开发者...
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring...
基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+...
在IT行业中,SpringMVC和MyBatis是两个非常重要的框架,它们分别负责Web层的控制和持久层的数据访问。本项目将这两种技术结合,并利用策略设计模式和拦截器来实现一个按年份划分的数据库分表策略。下面将详细阐述这...
- Controller:处理业务逻辑,通常是一个实现了 Controller 接口或带有 @Controller 注解的类。 - HandlerMapping:映射请求到处理器。 - ViewResolver:解析视图,将处理结果呈现给用户。 3. **整合步骤**: -...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。在本项目"springmvc实现demo"中,我们将探讨如何使用 Spring MVC ...
在SpringMVC中,我们使用`@Controller`注解来标识一个类作为控制器。例如,你可以创建一个名为`HelloController`的类,并添加`@RequestMapping`注解来处理特定的URL请求。如下所示: ```java @Controller public...
在这个4.3版本的教程中,作者开涛将带领我们深入理解Controller在SpringMVC中的核心作用和实现机制。 Controller是SpringMVC中的一个关键组件,它扮演着处理HTTP请求和调用业务逻辑的角色。在SpringMVC的架构中,当...
SpringMVC + Spring3.1.1 + Hibernate4.1.0 是一个经典的Java Web开发技术栈,用于构建高效、可扩展的企业级应用程序。在这个组合中,SpringMVC作为前端控制器处理HTTP请求,Spring框架提供了服务层管理和依赖注入,...
基于SpringSecurity+springMVC+mybatis+mysql实现。基于SpringSecurity权限控制的简单工程DEMO。maven构建,用户信息存储在mysq数据库中
在SSM整合中,Spring作为整体的容器,负责管理所有组件,包括SpringMVC的Controller和MyBatis的SqlSessionFactory。SpringMVC处理HTTP请求,并将控制权交给Spring容器中的Service层进行业务逻辑处理。而MyBatis作为...
本项目"springmvc+mybatis+mysql整合实现列表展示、新增、更新、删除功能"旨在提供一个基础的Maven项目模板,帮助开发者快速搭建具备CRUD(Create、Read、Update、Delete)操作的Web应用。 首先,让我们深入理解...
在本文中,我们将探讨如何构建一个基于SpringMVC的项目,并实现一个基本的用户登录功能。SpringMVC是Spring框架的一个模块,它提供了处理HTTP请求和响应的强大功能,是开发Web应用程序的首选工具之一。 **一、...
在“SpringMVC精品资源--基于springMVC实现的解决方案系统.zip”这个压缩包中,我们可以推测包含了一系列关于SpringMVC开发的教程、示例代码或完整的项目模板,用于帮助开发者更好地理解和应用SpringMVC。...
系统采用技术:Spring+SpringMVC+Hibernate+jQuery+Ajax+面向接口编程。 简介:该图书管理项目实现了三种角色的功能,分别是超级管理员,图书管理员和读者。在系统中,实现了图书管理,统计管理,系统管理和系统监控...