注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

IOS & JAVA KEY

(iMilo)

 
 
 

日志

 
 
关于我

All the splendor in the world is not worth a good friend!! Hello my friend!!

网易考拉推荐

SpringMVC控制器—SimpleFormController浅析  

2010-05-20 22:17:50|  分类: Spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

说明:

具体的FormController 实现了提供了from视图和success视图,并提供了一个重要方便的onSubmit链,提交后自动对form视图进行错误验证,如果验证成功将回到一个success视图。

       该控制器不同于AbstractFormController所描述的,它不同的是不需要继承showFormprocessFormSubmission,而且form视图和success视图能在配置文件{[servlet-name]-servlet.xml}中被声明.

 

工作流程(除了父类以外)

①:通过processFormSubmission检测错误对象,即:是否有错误发生在绑定和验证的过程中;

②:如果有错误发生,这个控制器将根据配置文件返回到formView所代表的视图,并且可能会在该页面上展示错误信息;

③:如果isFormChangeRequest被覆盖,并且返回TRUE,控制器也会返回到formView,在这种情况下,该控制器将阻止验证。在返回formView之前,控制器将调用onFormChange(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse java.lang.Object,org.springframework.validation.BindException,object),改变绑定的对象,对request刻意的改变form的结构,在任何情况下,不会引起验证和现实;

④:如果没有错误发生,并在默认的控制器将会使用所用参数,调用onSubmit,默认的情况下,调用onSubmit代表的指令对象,默认将返回successView配置。

 

最后,onSubmit可以进行定制,提交的行为也可以执行定制验证。

 

步骤:{我们以Spring MVC入门实例为基础,展示AbstractFormController的基本功能}

一、User.javaBean类添加一个dept的属性,类型为String,并添加其get***,set***方法;

二、修改login.jsp页面,代码如下:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>Spring MVC Demo 用户注册</title>

  </head>

  <body>

  <center>

  <br/>

  <br/>

  <h5 style="color:pink" >Spring MVC Demo 用户注册</h5>

    <form action="login.do" method="post">

        <table>

            <tr><td>账号:</td><td><input type="text" name="id" /></td></tr>

            <tr><td>姓名:</td><td><input type="text" name="name" /></td></tr>

            <tr><td>生日:</td><td><input type="text" name="birth" /></td></tr>

            <tr><td>卡号:</td><td><input type="text" name="cardID" /></td></tr>

            <tr><td>部门:</td>

                <td>

                    <select name="dept"><!—修改在此处-->

                        <c:forEach items="${deptList}" var="dept">

                            <option value="{dept}">${dept}</option>

                        </c:forEach>

                    </select>

                </td>

            </tr>

            <tr><td><input type="submit" value="   "/></td><td align="center"><input type="reset" value=" "/></td></tr>

        </table>

    </form>

  </center>

  </body>

</html>

说明:我们在此用到jstl标签

三、编写LoginFormController.java,包结构为:com.teana.controller,此类继承了FormController类,其代码如下:

package com.teana.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

import com.teana.vo.User;
/**
 * @author TEANA -- 2010-5-20
 * 使用SimpleFormController作为控制器
 * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
 */
@SuppressWarnings("deprecation")
public class LoginFormController extends SimpleFormController
{
 @SuppressWarnings("unchecked")
 @Override
 protected Map referenceData(HttpServletRequest request) throws Exception
 {
  Map<String, Object> model = new HashMap<String, Object>();
  model.put("deptList", new String[]{"销售部","技术部","咨询部"});
  return model;
 }
 @Override
 protected ModelAndView onSubmit(Object command) throws Exception
 {
  User user = (User)command;
  System.out.println(user);
  return new ModelAndView("success");
 }
 /**
  * 数据绑定,及数据类型转换
  */
 @Override
 protected void initBinder(HttpServletRequest request,
   ServletRequestDataBinder binder) throws Exception
 {
  binder.registerCustomEditor(Date.class,
    new CustomDateEditor(
      new SimpleDateFormat("yyyy-MM-dd"), true));
 }
}

说明referenceData方法,相当于前置事件,在后面会具体说明.

四、修改springMVC-servlet.xml文件,代码如下:

 <?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:aop="http://www.springframework.org/schema/aop"

    xmlns:tx="http://www.springframework.org/schema/tx" 

    xmlns:context="http://www.springframework.org/schema/context" 

    xsi:schemaLocation="  

    http://www.springframework.org/schema/beans   

    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  

    http://www.springframework.org/schema/aop   

    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  

    http://www.springframework.org/schema/tx   

    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd  

    http://www.springframework.org/schema/context  

    http://www.springframework.org/schema/context/spring-context-2.5.xsd">

   

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

    <property name="mappings">

         <props>

             <prop key="login.do">userController</prop>

         </props>

    </property>

    </bean>

     <bean id="userController" class="com.teana.controller.LoginFormController">

         <property name="commandClass" value="com.teana.vo.User" /><!—绑定类-->

         <property name="formView" value="login" /><!—进入视图-->

         <property name="successView" value="success" /><!—成功视图-->

     </bean>

    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"><!-- 指定策略解析 -->

    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /><!-- 指定视图处理 -->

    <property name="prefix" value="/WEB-INF/jsp/" />

    <property name="suffix" value=".jsp" />

    </bean>

 </beans>

 

执行流程:首先请求http://localhost:8080/spring/login.do,然后在springMVC-servlet.xml中查找,找到相应的fromView所代表的视图,当然它会根据控制类去查看控制类中是否有前置事件,即在此处就是referenceData()方法,然后将设置的数据将其在formView所代表的视图显示。然后在该视图,点击提交,地址栏还是:http://localhost:8080/spring/login.do,只不过这个提交是以post的形式提交,然后通过post找到successVIew所代表的视图,前提是,校验通过,绑定数据类型转换成功。

注意:fromViewvalue必须是和mapping名称前缀相同的,如:{value=”login”   key=”login.do”}

 

                                                               2010-05-20

  评论这张
 
阅读(2164)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017