posts - 70,comments - 408,trackbacks - 0

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 我心依旧 阅读(3021) 评论(8)  编辑  收藏

FeedBack:
# re: Struts视图组件(原创)
2005-10-26 16:47 | redvale
不错,说的蛮详细的  回复  更多评论
  
# re: Struts视图组件(原创)
2006-02-22 15:29 | ychyl@yeah.net
我现在有个问题, 就是ActionForm中只要是int型或者Integer的属性, 没有值时总是初始化为0, 我希望没有值, 则跟对象一样, 初始化为null, 你知道怎么办吗?  回复  更多评论
  
# re: Struts视图组件(原创)
2006-08-09 13:23 | 衙内乖乖
我是初学者,文章很不错,收藏啦~~
希望你再接再厉写出更好的文章~~  回复  更多评论
  
# re: Struts视图组件(原创)
2006-08-31 09:57 | 周利军
public Object get(String name)  回复  更多评论
  
# re: Struts视图组件(原创)
2006-08-31 09:59 | 周利军
写得很好,支持
  回复  更多评论
  
# re: Struts视图组件(原创)
2006-09-20 17:32 | 甜蜜的豆沙包
请教一下:为什么会有Cannot find bean org.apache.struts.taglib.html.BEAN in any scope异常?
我的"struts-config.xml"如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
<data-sources />
<form-beans >
<form-bean name="setVoteForm" dynamic="true" type="org.apache.struts.action.DynaActionForm" >
<form-property name="topicName" type="java.lang.String"/>
<form-property name="itermNumber" type="java.lang.String"/>
<form-property name="iterContent" type="java.lang.String"/>
</form-bean>
</form-beans>

<global-exceptions />
<global-forwards />
<action-mappings >
<action
validate="false"
input="/form/SetVote.jsp"
name="setVoteForm"
path="/setVote"
scope="request"
type="cn.cbsw.vote.settingvote.controller.SetVoteAction" />
</action-mappings>

<message-resources parameter="cn.cbsw.vote.struts.ApplicationResources" />
</struts-config>


  回复  更多评论
  
# re: Struts视图组件(原创)
2007-09-12 15:55 | Java_oracle
想识恨晚  回复  更多评论
  
# re: Struts视图组件(原创)
2007-12-16 09:37 | 朱仔
写得很好,每天都期待你的新作品。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: