`

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的日志功能基于...

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

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

    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则提供了...

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

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

    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+...

    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框架提供了服务层管理和依赖注入,...

    SpringMVC实现笔记_SpringMVC实现笔记_

    开发步骤①导入SpringMVC相关坐标②配置SpringMVC核心控制器DispathcerServlet③创建Controller类和视图页面④使用注解配置Controller类中业务方法的映射地址⑤配置SpringMVC核心文件 spring-mvc.xml⑥客户端发起...

    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。...

    SpringMVC注册功能的实现.docx

    SpringMVC 框架是基于 Java 语言的 Web 应用程序框架,提供了一个强大且灵活的 MVC 架构模式。今天,我们将讨论 SpringMVC 中注册功能的实现方法和代码逻辑。 注册功能的实现 注册功能是指用户在网站或应用程序中...

    SpringMVC+Maven实现用户简单登录

    在后台,SpringMVC通过DispatcherServlet接收请求,根据配置的映射规则找到对应的Controller处理方法。这个Controller方法可能接收`HttpServletRequest`和`HttpServletResponse`对象,从中获取或设置请求参数。例如...

Global site tag (gtag.js) - Google Analytics