`

SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

阅读更多
SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

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;
	}

	// ...
}
分享到:
评论
3 楼 yingzhor 2012-09-18  
第一个问题答案: 你试过就知道了,不过你也页面没有提交的话,当然不会帮你验证了。
第二个问题答案: 请参考我另一篇博客http://yingzhuo.iteye.com/blog/1455438最后也有一个Demo供你下载。 一看便知。
2 楼 bennet2009 2012-09-17  
还有, 如果在最后提交表单的时候, 验证没有通过, 怎么回填写有误的表单页呢?
1 楼 bennet2009 2012-09-17  
请问这种分步提交的表单, 如果验证的? 我使用 JSR 303 - Bean Validation 来进行验证, 但是第一个页面提交的时候,不仅只验证了第一个页面上的字段,后面的字段也要进行验证,但第一个页面上根本就没有这些字段。

相关推荐

    基于springmvc实现文件上传下载 基于AOP的日志功能

    基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...

    springMVC+spring4.0+mybatis3.1.1+restful

    SSM框架是Java web开发中常用的三大框架Spring MVC、Spring和MyBatis的组合,这里的"4.0"和"3.1.1"分别指的是Spring框架和MyBatis框架的版本号。Spring MVC作为Spring的一部分,负责处理HTTP请求,Spring则提供了...

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码.zip

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...

    基于spring+springMVC+mybatis+easyui技术实现的医药后台管理系统

    基于spring+springMVC+mybatis+easyui技术实现的医药后台管理系统 项目描述 基于spring+springMVC+mybatis+easyui技术实现的医药管理系统 运行环境 jdk7+tomcat7+mysql+eclipse/IntelliJ IDEA+maven 项目技术...

    SpringMVC controller

    SpringMVC提供了多种Controller实现,如AbstractFormController和AbstractWizardFormController,以方便开发者处理用户输入。 SpringMVC的灵活性还表现在其可扩展的组件体系。例如,DispatcherServlet允许开发者...

    springMVC_day01.xmind

    SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring...

    基于SpringMVC+Hibernate实现的在线购物商城.zip

    基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+...

    springmvc +mybatis采用策略设计模式基于拦截器实现按年分表

    在IT行业中,SpringMVC和MyBatis是两个非常重要的框架,它们分别负责Web层的控制和持久层的数据访问。本项目将这两种技术结合,并利用策略设计模式和拦截器来实现一个按年份划分的数据库分表策略。下面将详细阐述这...

    netty整合SpringMVC实现下载

    - Controller:处理业务逻辑,通常是一个实现了 Controller 接口或带有 @Controller 注解的类。 - HandlerMapping:映射请求到处理器。 - ViewResolver:解析视图,将处理结果呈现给用户。 3. **整合步骤**: -...

    springmvc实现demo

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。在本项目"springmvc实现demo"中,我们将探讨如何使用 Spring MVC ...

    springMVC基本配置(Controller+Service+Dao)

    在SpringMVC中,我们使用`@Controller`注解来标识一个类作为控制器。例如,你可以创建一个名为`HelloController`的类,并添加`@RequestMapping`注解来处理特定的URL请求。如下所示: ```java @Controller public...

    跟开涛学SpringMVC(4.3)Controller接

    在这个4.3版本的教程中,作者开涛将带领我们深入理解Controller在SpringMVC中的核心作用和实现机制。 Controller是SpringMVC中的一个关键组件,它扮演着处理HTTP请求和调用业务逻辑的角色。在SpringMVC的架构中,当...

    SpringMVC + spring3.1.1 + hibernate4.1.0

    SpringMVC + Spring3.1.1 + Hibernate4.1.0 是一个经典的Java Web开发技术栈,用于构建高效、可扩展的企业级应用程序。在这个组合中,SpringMVC作为前端控制器处理HTTP请求,Spring框架提供了服务层管理和依赖注入,...

    SpringSecurity+springMVC+mybatis+mysql实现。基于SpringSecurity权限控制的简单工程DEMO

    基于SpringSecurity+springMVC+mybatis+mysql实现。基于SpringSecurity权限控制的简单工程DEMO。maven构建,用户信息存储在mysq数据库中

    ssm(Spring+SpringMVC+MyBatis)整合框架

    在SSM整合中,Spring作为整体的容器,负责管理所有组件,包括SpringMVC的Controller和MyBatis的SqlSessionFactory。SpringMVC处理HTTP请求,并将控制权交给Spring容器中的Service层进行业务逻辑处理。而MyBatis作为...

    springmvc+mybatis+mysql整合实现列表展示、新增、更新、删除功能

    本项目"springmvc+mybatis+mysql整合实现列表展示、新增、更新、删除功能"旨在提供一个基础的Maven项目模板,帮助开发者快速搭建具备CRUD(Create、Read、Update、Delete)操作的Web应用。 首先,让我们深入理解...

    SpringMVC项目一之项目搭建实现简单登录

    在本文中,我们将探讨如何构建一个基于SpringMVC的项目,并实现一个基本的用户登录功能。SpringMVC是Spring框架的一个模块,它提供了处理HTTP请求和响应的强大功能,是开发Web应用程序的首选工具之一。 **一、...

    SpringMVC精品资源--基于springMVC实现的解决方案系统.zip

    在“SpringMVC精品资源--基于springMVC实现的解决方案系统.zip”这个压缩包中,我们可以推测包含了一系列关于SpringMVC开发的教程、示例代码或完整的项目模板,用于帮助开发者更好地理解和应用SpringMVC。...

    基于Spring+SpringMVC+Hibernate的图书管理系统

    系统采用技术:Spring+SpringMVC+Hibernate+jQuery+Ajax+面向接口编程。 简介:该图书管理项目实现了三种角色的功能,分别是超级管理员,图书管理员和读者。在系统中,实现了图书管理,统计管理,系统管理和系统监控...

Global site tag (gtag.js) - Google Analytics