`
dongguoh
  • 浏览: 70670 次
  • 性别: Icon_minigender_1
  • 来自: 山水之乡
社区版块
存档分类
最新评论

Spring 版的 JpetStore 中的 AccountFormController 学习笔记

阅读更多
AccountFormController 这个控制器在JpetStore中应该算是比较难的一个控制器,我把我的心得体会记录下来
希望对一同学习JpetStroe的人有些帮助
我下的是spring-framework-2.0.6中自带的 ,如果我有写错或理解错的地方,请大家提醒一下.
java 代码
 
  1. public class AccountFormController extends SimpleFormController {  
  2.     private Log log = LogFactory.getLog(AccountFormController.class);  
  3.   
  4.     public static final String[] LANGUAGES = { "english""japanese" };  
  5.   
  6.     private PetStoreFacade petStore;  
  7.   
  8.     public AccountFormController() {  
  9.         setSessionForm(true);  
  10.         /* 
  11.          * 当设为false时就是不自动与 Validator 自动绑定,它会通过onBindAndValidate()这个方法 
  12.          * 去调用如getValidator().validate(account, errors); 如果我们不调用前面的这个方法的话, 
  13.          * 那么AccountValidator这个验证器就不会执行,而setValidateOnBinding()这里默认的是true 
  14.          * 而当这里调用的时候不会调用 Validator中的supports那个方法 
  15.          */  
  16.         setValidateOnBinding(false);  
  17.         setCommandName("accountForm");  
  18.   
  19.         // 这里设置啦当表单没有验证或者是表单验证没有通过时的 要到指定的*.jsp页面上去  
  20.         setFormView("EditAccountForm");  
  21.         log.info("****   AccountFormController()........\n");  
  22.   
  23.     }  
  24.   
  25.     public void setPetStore(PetStoreFacade petStore) {  
  26.         this.petStore = petStore;  
  27.     }  
  28.   
  29.     /* 
  30.      * 当初始化这个类的时候就会 调用这个方法并返回一个AccountForm对象供jsp页面绑定用 
  31.     *  再到onBindAndValidate ()去验证,才会调用验证器Validator 
  32.      */   
  33.     protected Object formBackingObject(HttpServletRequest request)  
  34.             throws Exception {  
  35.         UserSession userSession = (UserSession) WebUtils.getSessionAttribute(  
  36.                 request, "userSession");  
  37.         log.info("****   formBackingObject()........\n");         
  38.         if (userSession != null) {  
  39.             return new AccountForm(this.petStore.getAccount(userSession  
  40.                     .getAccount().getUsername()));  
  41.         } else {  
  42.             return new AccountForm();  
  43.         }  
  44.     }  
  45.   
  46.     /* 
  47.      * 在这里我们可以在实现啦Validator这个接口验证之前做一些做一些预先的处理 
  48.      */  
  49.     protected void onBindAndValidate(HttpServletRequest request,  
  50.             Object command, BindException errors) throws Exception {  
  51.         log.info("****  onBindAndValidate()........\n");  
  52.           
  53.         AccountForm accountForm = (AccountForm) command;  
  54.         Account account = accountForm.getAccount();  
  55.         if (request.getParameter("account.listOption") == null) {  
  56.             account.setListOption(false);  
  57.         }  
  58.         if (request.getParameter("account.bannerOption") == null) {  
  59.             account.setBannerOption(false);  
  60.         }  
  61.         /* 
  62.          * 设置我们将要用验证器去验证的一个对象,而这个对象呢就是AccountForm中的account 
  63.          * 如果这里不设的话,那么会在AccountValidator中找不到firstName.....这些字段的 
  64.          * 换句话说就是设一个将要验证的对象的子对象,其实在这里我们不设为account也可以的, 
  65.          * 如果不设的话,那么在AccountValidator中的 validate(Object obj, Errors errors) 
  66.          * 中要写成ValidationUtils.rejectIfEmpty(errors, 
  67.          * "account.firstName",...);这种形式的, 
  68.          * 那么在调用的时候传accountForm去就可以啦,如getValidator().validate(accountForm, 
  69.          * errors); 
  70.          */  
  71.         errors.setNestedPath("account");  
  72.   
  73.         getValidator().validate(account, errors);  
  74.         // getValidator().validate(accountForm, errors);  
  75.   
  76.         log.info("**** getValidator().validate(account, errors);........\n");  
  77.         /* 
  78.          * 这里要把它还原,要不然在下面的ValidationUtils.rejectIfEmpty(errors, 
  79.          * "account.username",..); 
  80.          * 将会出现错误,如果你这里不设回去的话,那么上面这句要改成ValidationUtils.rejectIfEmpty(errors, 
  81.          * "username",..);这样也可以. 但是还要在ValidationUtils.rejectIfEmpty(errors, 
  82.          * "username",..);这句的下面把它还原,要不然的话它回到 页面显示的时候会出现错误. 
  83.          *  
  84.          */  
  85.         errors.setNestedPath("");  
  86.   
  87.         if (accountForm.isNewAccount()) {  
  88.             account.setStatus("OK");  
  89.             ValidationUtils.rejectIfEmpty(errors, "account.username","USER_ID_REQUIRED""User ID is required.");  
  90.             /* ValidationUtils.rejectIfEmpty(errors,"username","USER_ID_REQUIRED", "User ID is required."); 
  91.             */  
  92.             log.info("**** after ValidationUtils.rejectIfEmpty(errors, \"account.username\",..) ........\n");  
  93.             errors.setNestedPath("");  
  94.             if (account.getPassword() == null  
  95.                     || account.getPassword().length() < 1  
  96.                     || !account.getPassword().equals(  
  97.                             accountForm.getRepeatedPassword())) {  
  98.                 errors.reject("PASSWORD_MISMATCH",  
  99.                                 "Passwords did not match or were not provided. Matching passwords are required.");  
  100.             }  
  101.         } else if (account.getPassword() != null  
  102.                 && account.getPassword().length() > 0) {  
  103.             if (!account.getPassword().equals(accountForm.getRepeatedPassword())) {  
  104.                 errors.reject("PASSWORD_MISMATCH",  
  105.                                 "Passwords did not match. Matching passwords are required.");  
  106.             }  
  107.         }  
  108.     }  
  109.   
  110.     /* 
  111.      * 如果验证通过就不会再调用这个方法,还有就是每次进入这个页面时都会调用一次这个方法,而这个方法在这里就是绑定一些 下拉菜单中的数据 
  112.      */  
  113.     protected Map referenceData(HttpServletRequest request) throws Exception {  
  114.         log.info("****   referenceData()........\n");  
  115.         Map model = new HashMap();  
  116.         model.put("languages", LANGUAGES);  
  117.         model.put("categories"this.petStore.getCategoryList());  
  118.         return model;  
  119.     }  
  120.   
  121.     // 只有当我们验证通过的时候才会调用这个方法  
  122.     protected ModelAndView onSubmit(HttpServletRequest request,  
  123.             HttpServletResponse response, Object command, BindException errors)  
  124.             throws Exception {  
  125.         log.info("****   onSubmit()........\n");  
  126.         AccountForm accountForm = (AccountForm) command;  
  127.   
  128.         try {  
  129.             if (accountForm.isNewAccount()) {  
  130.                 this.petStore.insertAccount(accountForm.getAccount());  
  131.             } else {  
  132.                 this.petStore.updateAccount(accountForm.getAccount());  
  133.             }  
  134.         } catch (DataIntegrityViolationException ex) {  
  135.             errors.rejectValue("account.username""USER_ID_ALREADY_EXISTS",  
  136.                     "User ID already exists: choose a different ID.");  
  137.             return showForm(request, response, errors);  
  138.         }  
  139.   
  140.         UserSession userSession = new UserSession(this.petStore  
  141.                 .getAccount(accountForm.getAccount().getUsername()));  
  142.         PagedListHolder myList = new PagedListHolder(this.petStore  
  143.                 .getProductListByCategory(accountForm.getAccount()  
  144.                         .getFavouriteCategoryId()));  
  145.         myList.setPageSize(4);  
  146.         userSession.setMyList(myList);  
  147.         request.getSession().setAttribute("userSession", userSession);  
  148.         return super.onSubmit(request, response, command, errors);  
  149.     }  
  150.   
  151. }  
分享到:
评论

相关推荐

    学习Spring 的例子JpetStore

    《Spring框架学习:以JpetStore为例》 Spring框架是Java企业级应用开发中的核心框架,它为开发者提供了丰富的功能,简化了开发流程,提高了代码的可测试性和可维护性。JpetStore作为Spring的经典示例项目,是学习...

    MyEclipse中加载Spring的JPetStore

    在MyEclipse中加载和运行JPetStore,不仅可以帮助我们学习Spring框架的基本用法,还能让我们熟悉MyEclipse的项目管理和服务器部署。同时,通过对JPetStore源码的阅读和修改,可以进一步提升对MVC模式、Spring的IoC和...

    spring例子: jpetstore

    在压缩包文件名称 "springapp-petclinic" 中,"petclinic"可能是JPetStore的一个变体或者相关项目,通常Spring PetClinic是一个与JPetStore类似的学习资源,用于教授Spring Boot和Spring Data JPA等现代Spring技术。...

    spring的jpetstore工程(myeclipse)

    JPetStore作为Spring官方提供的一个示例项目,是学习Spring框架的最佳实践之一。本篇文章将深入探讨如何在MyEclipse环境中搭建和运行这个基于Spring的JPetStore工程,并介绍其中涉及的关键技术点。 首先,JPetStore...

    jpetstore4.0 (spring+struts+ibatis)

    在jpetstore4.0中,Spring主要负责以下职责: 1. **控制反转(IOC)**:Spring通过反转对象创建和管理的过程,使得开发者可以专注于业务逻辑,而无需关心对象的创建和销毁。 2. **服务层管理**:Spring的Bean工厂...

    spring之jpetstore

    而JPetStore作为Spring框架的经典示例项目,是学习和理解Spring核心特性的绝佳起点。本文将深入探讨Spring JPetStore项目,揭示其中蕴含的诸多技术知识点,帮助开发者提升对Spring的理解和应用能力。 1. **Spring...

    eclipse_spring_jpetstore.rar

    本文将深入探讨如何在Eclipse环境中使用Spring框架,以JPetStore项目为例,帮助开发者了解Spring的核心特性和实际应用。 一、Eclipse与Spring框架 Eclipse是一款开源的Java IDE,提供了丰富的插件支持,使得开发者...

    Spring+jpetstore+Myeclipse

    最新spring带的JPetStore的MyEclipse项目,包括了数据库,可用hsqldb直接运行,可以直接导入MyEclipse中并部署运行。 在Myeclipse里新建一个web项目,导入shopping项目即可,数据库在db文件夹里

    spring jpetstore spring附带的例子

    9. 整合Struts:虽然Spring MVC已经成为主流的Web开发框架,但在JPetStore中,Struts被用作对比和学习的工具,展示了如何在Spring环境中集成其他MVC框架,这有助于开发者理解不同框架之间的协同工作。 通过深入研究...

    Spring源码学习-JPetStore.part3

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包

    jpetstore spring 的经典完整可直接运行的例子 jpetstore

    总的来说,jpetstore项目是一个极好的学习资源,对于想要深入理解和掌握Spring、iBatis和Struts的人来说,它是不可或缺的实践案例。通过分析和调试这个项目,你不仅可以提升自己的编程技能,还能对Java Web开发的...

    JPetStore (Struts + Spring + Hibernate)版

    综上所述,JPetStore (Struts + Spring + Hibernate)版是一个理想的学习资源,它展示了如何在实际项目中集成和使用这些流行的技术,对于Java Web开发人员来说,深入研究这个项目可以提升他们对现代企业级应用开发的...

    spring jpetstore2.5

    6. **配置Hibernate**:由于JPetStore使用了Hibernate作为ORM工具,需要配置Hibernate的SessionFactory,并在Spring中进行声明。 7. **运行与调试**:最后,配置Tomcat服务器,部署项目并启动,通过浏览器访问应用...

    Spring jpetstore

    这个项目是Spring官方提供的,旨在帮助开发者学习和理解Spring的工作原理以及如何在实际开发中运用Spring。 ### 1. Spring MVC框架 Spring MVC是Spring框架的一部分,它是一个用于构建Web应用的轻量级MVC(Model-...

    Struts+Spring+Hibernate实现的jpetstore

    在 jpetstore 中,Spring 作为整个应用的“胶水”,管理各个组件的生命周期和依赖关系。它可能通过XML配置或注解驱动的方式来定义bean,这些bean可以是DAO(数据访问对象)、Service、Controller等。Spring还提供了...

    jpetstore开源学习代码

    jpetstore项目是一个示例应用,它展示了如何在实际环境中运用多种设计模式,为学习J2EE提供了一个生动的实践场景。 J2EE,即Java企业版,是Java平台的一部分,专为开发和部署分布式企业级应用程序而设计。它提供了...

    spring+ibatis的jpetstore实例工程,包含完整源代码和jar包

    在JPetStore实例中,Spring主要负责控制反转(IOC)和面向切面编程(AOP)。IOC使得对象之间的依赖关系由Spring容器管理,而AOP则实现了如事务管理这样的横切关注点。 2. **iBatis**:iBatis是一个持久层框架,它...

    Spring源码学习-JPetStore.part1

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导入eclipse中运行。共3个压缩包

    Spring源码学习-JPetStore.part2

    spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包

    springMVC自带的jpetstore源码

    **Spring MVC 自带的 JPetStore 源码解析** `Spring MVC` 是一个轻量级的、模型-视图-控制器(Model-...通过学习和分析 `jpetstore`,开发者可以更好地理解和掌握 Spring MVC 的工作原理,为自己的项目开发提供借鉴。

Global site tag (gtag.js) - Google Analytics