Struts读书笔记五(10.9)

Struts读书笔记五(10.9)
-《Struts In Action》第五章

 

第五章着重讲述ActionFormStruts中的概念、作用、地位。

51 废进宝出

我们在设计一个web application的时候,很多的时间都花在提交数据表单上面。JSP拥有众多表单处理的标签库,而struts却有一个处理表单的标准方法:ActionForm.

 

注意点:JavaBean中的property,指的是我们用以获取变量的一种方法,而不是表明一个实际

位置、字域或者变量。

 

在完成一次表单提交之前,一般对表单进行“验证”(validate),成功则提交给业务层,否则返回到输入页面。

511  ActionForm要求:

l         ActionForm必须继承于org.apache.struts.ActionForm,其基类无法实例化。

l         对于其将要在请求中获取的每一个HTML控件都必须定义一个公共属性。(public property

另外ActionForm还有两个可选要求。(optional requirements

l         如果你想在提交之前验证表单,请实现validate()方法。

l         如果你想在表单生成之前进行初始化,请实现reset()方法。

除了手动创建一个ActionForm,你也可以在struts-config.xml中设置一个动态ActionForm(DynaActionForm)

 

52 ActionForm的多个功能。

ActionForm是个多面手,可作为字域收集器、数据缓冲器、类型装换器。

5.2.1 作为字域收集器的ActionForm

许多应用程序都需要用户的输入数据,而web application更是如此。HTML提供的数据输入控件几乎不够用,而Struts则使用ActionForm来弥补HTML的这点不足。HTML是一个简单的让人惊讶的协议,所有东西都是以最简单的方式来传送的,尽管作为一种协议,他容易实现甚至还工作良好,但是用于应用程序的时候,他给程序员留下太多需要手工实现的细节了。

通过HTTP提交字域

通过HTTP提交的表单无论是用get还是post方法,最终都归于字符,不存在二进制数据。

通过HTTP提交文件

有一些表单允许用户提交文件,而在处理过程中,文件也要进行编译使得最终也只有文本字符被传送。我们可以传送二进制文件,但我们需要编译,再反编译。

通过HTTP提交空字域

如果一个文字域是空的,浏览器会返回一个空的参数。特别是当一个复选框是空的话,原则上是不应该返回空的,而应该返回错误或者无效。

通过HTTP接受

HTTP的文本流中查找变量对并不是一个令人愉快的工作。Servlet API提供了几个有效的方法用来帮你了解什么东西被提交了,方便获取你所要的变量,但仍然涉及烦人的编码工作。

ActionForm的解决方法

Struts HTTP参数处理的解决方法是将其转换成JavaBean中的一个属性。当一个ActionForm的属性与HTTP请求中的一个字域匹配的时候,Struts自动将其属性设置成字域的值。Struts开发人员就可以在可信任的JavaBean中处理数据而把那繁杂冗余的HTTP留给框架处理。

5.2.2 作为数据缓冲器的ActionForm

在传统的(web)用户界面中,控件本身内置了一个数据缓冲器,而HTML控件没有,ActionForm就像是给HTML控件打上数据缓冲的补丁。

 

 

5.2.3 作为数据验证器的ActionForm

目前存在的项目中一般都会有一些JavaBean用于验证数据,但几乎没有对数据进行缓冲而让用户修正的。ActionFormvalidate()方法是一个延展点,其中可以调用业务层的方法(它们知道如何验证一个数据)。当验证失败时,ActionForm可以将全部事宜送返到web页面上,让用户try again.

在将数据传送给业务层处理之前,必须先对其类型进行验证。

这是第一层的验证,知道一个数据是整型数据并不意味着它是一个正确的整型数据。许多应用程序分两层来验证数据。首先使用ActionFormvalidate()方法验证数据的类型是否正确以及能否传送给业务逻辑处理。当这一层的处理完成之后,Action类进行更进一步的验证,来确定数据的数据是否与要求的数据匹配。如果第二层的业务验证失败,处理方法与第一层一样。

5.2.4 作为类型转换器的ActionForm

ActionForm的缺点之一就是他的属性只有两种类型:String以及Boolean。所以在实际工作中,我们必须不断地进行类型转换。而大多数的应用程序要求一些诸如电话号码、总计等等的变量必须进行格式化。Java的核心包提供了转换的工具,但把这些东西综合起来使用还是有一些挑战性。

Struts开发人员经常在ActionForm中附带类型转换的帮助方法,该方法的实现方式是多种多样的。

 

5.2.5 作为传送对象的ActionForm

作为数据的载体,ActionForm在应用程序中扮演一个传送对象的角色,为其他过程提供数据。和其他的传送对象一样,ActionForm所传送的数据大部分是映射而不是实际存在的数据(如,数据库中的一个表),而与传统的传送对象不同的是,ActionForm里面的属性可以单独处理。

 

5.2.6 作为防火墙的ActionForm

 当一个请求发生时,ActionServlet自动地将请求的ActionForm属性的值设置成为它从请求中所获得的变量。这样的话,你就可以通过控制ActionForm暴露的属性来控制哪些请求变量将被接受,同时意味着如果你设计ActionForm不够仔细的时候会失去对请求变量的控制。

ActionForm就像一个防火系统中的非武装区域。

 

 

 

 

 

5.3           ActionForm 设计的重要作用

ActionForm的设计有多个重要作用:

l         与业务逻辑共享属性名称

l         最小化用户代码

l         封装helper方法

l         包含其他的JavaBean

 

5.3.1 ActionForm共享属性名称

由于要和业务逻辑交互,ActionForm经常使用与业务逻辑一样的属性名,这是很不错的一种原则。虽然这两个属性名称互无关联,在各自的空间中各自发展,但最终都实现了同一个数据。业务逻辑表现模型层,而ActionForm则表现在请求层、会话层。如果说ActionForm是在“野外”收集并验证数据,那么业务逻辑就是“在办公室里”处理这些事情了。

 

5.3.2 ActionForm最小化用户代码

ActionForm帮助实现代码的分层,业务代码放在业务逻辑层,表现代码放在表现层。

5.3.3 ActionForm封装helper方法

在实际工作中,我们发现一个变量格式化或者验证它是否遵守业务逻辑层的规则很有帮助。由于ActionForm是一个JavaBean,它可以传递输入数据致业务层,经过格式化、验证之后,把结果送返给表现层。

public String getTelephoneText() {

return ContactBean.formatTelephone(

this.telephoneText,getLocale());

}

 

5.3.4 ActionForm包含其他的JavaBean

54  ActionForm的新特性

Struts 1.1 中,基本的ActionForm有两个标准的更改:Map-backed ActionForms DynaActionForms

 

5.4.1 Map-Backed ActionForms

许多大型的web应用程序都要使用到多达数百个的属性。这些程序的开发人员开玩笑说创建和维护ActionForm所做的不过是声明一个属性,然后写一个setter,再一个getter

Struts1.1中,ActionForm支持映射的属性。

5.4.2 DynaActionForms

DynaActionForm的目的就是减少ActionForm的数目,利用它你不必创建一个个具体的ActionForm类,而是在配置文件中配置出所需的虚拟ActionForm

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值