转(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) 方法 |
|