分享

ITspy: 转(spring mvc-SimpleFormController笔记)

 雨忆 2008-04-21

转(spring mvc-SimpleFormController笔记)

一个SimpleFormController的运作全过程:
servlet请求->SimpleFormController.formBackingObject()->显示页面->提交页面-> SimpleFormController的Validator.validate()->SimpleFormController. onSubmit()->view导向



===================================

分析 "org.springframework.samples.jpetstore.web.spring.AccountFormController" .
   AccountFormController继承SimpleFormController,该子类非常适合处理表单提交事件。 相当于struts中得action。它的处理流程是这样的:
  get请求来到时,这样处理:
    a) 请求传递给一个controller对象
    b) 调用formBackingObject()方法,创建一个command对象的实例。
    c) 调用initBinder(),注册需要的类型转换器
    d) 调用showForm()方法,返回准备呈现给用户的视图
    e) 调用referenceData()方法,准备给用户显示相关的数据。如用户登录需要选择的年度信息
    f) 返回formView指定的视图
  post请求来到时,这样处理:
    a) 调用formBackingObject()方法,创建一个command对象的实例。
    b) 将请求传来的参数写入command对象
    c) 如果设置为要求验证,则调用validator类进行数据验证
    d) 调用onBindAndValidate()方法,该方法允许自定义数据绑定和校验处理
    e) 调用onSubmit()方法,进行业务逻辑处理
  
  我们分析下AccountFormController的相关方法:
AccountFormController() 构造子,初始化相关的设定
formBackingObject 创建一个command对象的实例,Command对象也就是(POJO),用来封装表单交互传递的数据。
onBindAndValidate 自定义数据绑定和校验处理
referenceData 准备给用户显示相关的数据。让用户选择语言信息
onSubmit 进行业务逻辑处理(最关键部分):根据isNewAccount()判断是新增还是更新用户,具体对数据库操作class为“SqlMapAccountDao”,而SqlMapAccountDao继承于SqlMapClientDaoSupport,spring提供了对ibatis的支持(通过getSqlMapClientTemplate()方法,
其中创建用户时候,会调用 insertAccount(Account account),而方法内部,调用了 getSqlMapClientTemplate().insert("insertAccount", account);
getSqlMapClientTemplate().insert("insertProfile", account);
getSqlMapClientTemplate().insert("insertSignon", account);
等方法,这个协参数设置,在 Account.xml 配置了,相关的更新语句参考以下xml的定义的sql语句,请留意id的值是不是和上面的传入的参数值一致

<insert id="insertAccount">
insert into account (email, firstname, lastname, status, addr1, addr2, city, state, zip, country, phone, userid) values (#email#, #firstName#, #lastName#, #status#, #address1#, #address2:varchar#, #city#, #state#, #zip#, #country#, #phone#, #username#)
</insert>

<insert id="insertProfile">
insert into profile (langpref, favcategory, mylistopt, banneropt, userid) values (#languagePreference#, #favouriteCategoryId#, #listOptionAsInt#, #bannerOptionAsInt#, #username#)
</insert>

<insert id="insertSignon">
insert into signon (password,username) values (#password#,#username#)
</insert>


我们接下来继续分析AccountFormController.java 中的 onSubmit() 方法

接下来取得用户的 UserSession 信息,UserSession 中保存了和用户相关的信息。系统使用PagedListHolder来进行显示数据,用setPageSize(4)来设置每页显示的数据数目。最后调用超类的 super.onSubmit(request, response, command, errors) 方法

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多