Struts框架的视图负责为客户端提供动态的网页内容.主要是由JSP网页构成.还提供了Struts客户化标签和ActionForm Bean,这些组件提供对国际化,接收用户表单输入的数据,表单验证和错误处理等功能.视图是模型的外在表现形式,用户通过视图来了解模型的状态,同一个模型可以有多种视图.框架中视图由JSP组件构成,除此之外还包括以下组件:
1) HTML文档
2) JSP客户化标签
3) JavaScripet和stylesheet
4) 多媒体文件
5) 消息资源(Resource Bundle)
6) ActionForm Bean
ActionForm属于一种Bean,什么是Bean呢?是可重用的平台独立的JAVA组件,JavaBean
支持属性,事件,方法和持久化.Struts框架仅仅利用了JavaBean的一小部分特性.Bean和普通的JAVA类很相似,不过它应该遵守以下的规范:
1) 必须提供不带参数的构造方法
2) 为Bean的所有属性提供公共的get/set方法
3) 对于boolean类型的属性要提供isXXX()方法,那么该方法返回Boolean类型的属性
4) 对于数组类型的属性,应该提供getXXX(int index)和setXXX(index,value)方法来读取和设置数组元素.
Struts利用JavaBean来创建数据传输对象,Data Transfer Object简称DTO,用于不同的层之间传递数据.
ActionForm是Struts框架提供的DTO,用于在视图层和控制器之间传递HTML表单数据,控制层可以从ActionForm中读取用于输入的表单数据,也可以把来自模型的数据保存到ActionForm中,然后返回给视图.ActionForm具有表单验证的功能.由于ActionForm类使用了ServletAPI,因此不提倡直接把ActionForm传递给模型,而是应该在控制层把它的数据重新组装到自定义的DTO中,在把它传递给模型层.在配置文件中<action>元素的scope属性设置ActionForm的范围默认是session.Action的生命周期如下:
1) 控制器接收到请求
2) 从request或者session范围内取出ActionForm的实例,没有就新建一个
3) 调用Form的reset()方法
4) 把ActionForm实例保存到request或者session范围中
5) 把用户输入的表单数据装到ActionForm中
6) 如果validate属性是true则调用validate方法
7) 验证成功就把ActionForm实例以参数传递给Action的execute方法,如果失败把请求转发给<action>的input属性指定的Web组件(大多JSP),ActionForm依然保存在request或者session范围内.
Struts框架的ActionForm类是抽象类,必须在应用中创建它的子类,来捕获具体的HTML表单数据.其中的属性和表单的属性一一对应.如果配置文件中<form-bean>元素的name属性和<action>元素的name属性匹配,<action>元素中的的validate属性为true.的时候.validate方法会被调用,基类的返回值是null,如果扩展了ActionForm类,那么应该覆盖validate方法,这个方法主要负责检验格式和语法,而不负责检查数据是否符合业务逻辑.对于一个请求控制器首先调用的是ActionForm的reset()方法,然后在把用户输入的表单数据组装到ActionFrom中.这个方法负责恢复属性的默认值,例如把boolean类型的属性设置成true或者false,把字符串设置为null或者某个初始值.感觉如果ActionForm在request范围内,那么对于每个新的请求都会创建新的ActionForm实例,当新的实例创建后,它的属性就是默认值,所以在写reset()方法就没什么意义了.如果是在session范围内,一个实例可以接收多次请求,那么reset()方法就非常有用了!如果是从request或者session范围中取出Form的值,可以用例如Form f=(Form)session.getAttribute(“Form”)的方法取出.这时Form的名字就是共享对象中的一个key不过如果是在Action的execute()方法中就很简单了,可以Form f=(Form)Form这样来获取一个Form也可以通过其中的具体的get方法来获取具体的属性,注意一定要转换类型.有的时候,由于表单的数量太多,无法在同一个页面显示,可以把他们拆分成多个表单,分多个页面显示.在这种情况下,即可以为每一个表单创建一个单独的ActionForm,也可以只创建一个,和多个表单对应.
下面研讨以下如何使用动态的ActionForm,在Struts框架中,ActionForm对象用来包装HTML表单数据,并能够动态返回用于显示给用户的数据.自己写的Form必须符合JavaBean的规范,继承ActionForm同时可以选择的重写reset()和validate()方法.虽然ActionForm简化了Web开发,但是对于大型的项目如果HTML表单改变对应的ActionForm也一定要修改,所以Strust1.1对此做出了修改引入了动态的DynaActionForm类.它支持载配置文件中完成ActionForm的全部配置,没必要写额外的程序来创建具体的ActionForm类,配置动态的方法是在配置文件中一个<form-bean>元素.如下:
<form-beans>
<form-bean name=”loginForm”
type=”org.apache.struts.action.DynaActionForm”
//上面是指定DynaActionForm类,名字是loginForm
<form-property name=”username” type=”java.lang.String”/>
<form-property name=”password” type=”java.lang.String”/>
</form-bean>
</form-beans>
<form-bean>元素的子元素<form-property>来设置动态的ActionForm属性.name指定属性的名称,type指定属性的类型.ActionForm的类型表单的类型.如果要设置JAVA的基本类型,在配置的时候应该用相应的包装类型来替换,例如int的包装类型就是Integer.动态的Form类DynaActionForm提供了initialize()方法,它把调但所有的属性都恢复为默认值.表单属性默认值由<form-bean>元素的<form-peoprety>子元素的initial属性来决定.如果没设置,则表单的默认属性由其JAVA类型来自动决定.例如对象类型的默认就是null.整型是0.Boolean是false.如果希望Struts每次把表单数据组装到动态的ActionForm之前,先把所有的属性恢复为默认值,可以定义一个DynaActionForm的子类,然后覆盖reset()方法,在其中调用initalize()方法就OK了.
Action类和JSP都可以访问动态的ActionForm类,使用方法与标准的Form大致相同.有一点区别就是如果使用标准的Form类,用get和set方法就可以,而DynaActionForm是把所有的属性保存在一个Map类对象中.访问的方法如下:
public Object get(String name)
public void set(Strig name,Object value)
DynaActionForm基类的validate()方法没有提供任何默认的验证行为,可以定义扩展它的子类,然后覆盖validate()方法,但是以编程的方法来验证动态的ActionForm违背了Struts框架提供的机制.幸运的是,可以采用另一种机制.Validator框架来完成验证,如果想了解Validator验证框架,不要急继续关注我的Blog,我还会漫漫道来.
今天侧重研讨了构成Struts视图组件的ActionForm,因为它非常重要,必须彻底的了解它算能真正的学会Struts,它可以存放在session和request范围内.下面说一些开发技巧希望能对关注我的Blog的朋友们,在如后的开发中有所帮助.
1) 在HTML表单中定义<html;hidden properyt=”page”/>隐藏字段来标示当前页面
2) 在ActionForm中定义page属性,它和表单中的隐藏字段page对应
3) 在ActionForm的reset()方法中,只能把当前表单相关的属性值恢复默认值.
4) 在ActionFomr的validate()方法中,只能对当前表单的相关属性进行验证.
5) 在配置ActionForm和Actin的映射的时候,应该把ActionForm的范围设为session
Struts框架还引入了DynaActionForm类,是动态创建ActionForm的类,要注意的如下:
1)<form>的<form-porperty>子元素是用来配置动态Form的.type属性指定ActionForm的属性的类型.如果是JAVA基本类型,则用JAVA包装类型.
2)提倡使用Validator框架来验证动态的ActionForm.这样可以避免用编程的方法来实现validate()方法.
3)通常不需要扩展DynaActionForm类,如果需要提供属性的复位功能,则扩展此类,然后重写reset方法中去调用initialize()方法进行复位,通常ActionForm在Session范围内使用此方法.
4)如果访问DynaActionForm的属性,应该调用以下方法:
public Object(String name)
public void set(String name,Object value)
name参数代表属性的名称.
写的手好累呵呵,希望看过的朋友能给点评价,如果有响应的错误请大家多多指教.(网友们的支持,是我继续写技术文章的动力!)
posted on 2005-10-26 13:58
我心依旧 阅读(3035)
评论(8) 编辑 收藏