注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

 
 
 

日志

 
 

2.2 ActionForm类 -《深入浅出Struts》  

2011-08-15 23:56:46|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在导入包的时候,org.apache后面的打不出来了。
第一,请确认你是否已加入struts支撑的jar包  第二,为什么要手打呢?把光标移到ActionForm后面 按快捷键 alt+/ 就会有提示. 
 
 
 

2.2  ActionForm类

org.apache.struts.action.ActionForm类是一个与HTML表单相关联的JavaBean。动作表单里的每一个属性分别代表HTML表单里的一个字段,那些属性的名字必须与它们各自关联的字段完全一样。

如果要对动作表单的属性值初始化,你还需要重写ActionForm类的reset方法。请注意,reset方法不能用来对相关HTML表单里的字段进行初始化。

如果你想编写自己的输入验证规则,还需要重写ActionForm类的validate方法。下面是validate方法的签名:

其中ActionErrors是一个由ActionError对象构成的集合(详见第3章)。

如果validate方法返回的是空值null或一个空的ActionErrors对象,就表示来自用户的输入通过了验证(验证成功);如果它返回的是一个非空的ActionErrors对象,则表示来自用户的输入没有通过验证(验证失败)。

比如说,如果你已经定义了:在添加一种产品的时候,它的productName和description属性必须填写,就必须写出如下所示的输入验证规则:

如果验证成功,控制权就将转交给添加产品动作的动作对象。如果验证失败,控制权将转交给相应的action元素的input属性所指定的资源。如果程序员没有给出input属性,用户将在浏览器里看到一条由系统提供的出错消息。

动作servlet对动作表单的处理流程如图2-1所示。

在与动作表单打交道的时候,你需要用到相应的动作元素里的以下属性:name、input、scope和validate。Struts动作servlet会在需要调用某个动作的时候做以下几件事情:

(1) 如果action元素的name属性存在,则为相应的ActionForm类创建一个实例。那个类的名字可以从相应的form-bean元素里检索到。

(2) 根据action元素的scope属性值,把新建的ActionForm实例存入HttpServletRequest或HttpSession对象。如果有关代码里没有给出scope属性,这个实例将默认保存为HttpServletRequest对象的一个属性。

(3) 调用HttpServletRequest对象的getParameterValues方法把HttpServletRequest对象的各有关参数填充到新建的动作表单里。

(4) 如果action元素的validate属性不等于false,则调用这个动作表单的validate方法对这个动作表单进行输入验证。如果validate方法返回了一个非空的ActionErrors对象,把这个ActionErrors对象保存为HttpServletRequest对象的一个属性。

(5) 如果输入验证成功,调用关联动作对象的execute方法(如果有的话),然后把控制权转交给有关视图。如果输入验证失败,就把控制权返回给由那个action元素的input属性指定的资源。

图2-1  动作servlet对动作表单的处理流程

 

2.3  使用动作表单

作为动作表单的一个用法示例,我们将实现一个用来添加产品信息的app02a应用程序。这个应用程序的目录结构如图2-2所示。

图2-2  app02a应用程序的目录结构

这个示例程序有两个动作:displayAddProductForm和saveProduct。displayAdd- ProductForm动作将向用户显示输入产品信息的表单。saveProduct动作负责保存产品信息。这个示例程序的struts-config.xml文件见代码清单2-1。

代码清单2-1  app02a应用程序的Struts配置文件

displayAddProductForm动作没有与之相关的动作类,在调用这个动作的时候,forward属性会把用户直接引导到displayAddProductForm.jsp页面。

再看saveProduct动作,它有一个app02a.action.saveProductAction类型的动作类。更重要的是,这个动作定义了name、input和scope等属性。定义的name属性意味着调用这个动作必须创建一个动作表单。该动作表单的类型是app02a.form.ProductForm,这是由相应的form-bean元素决定的。ProductForm类的代码见代码清单2-2。

代码清单2-2  ProductForm类

请特别注意ProductForm类里的validate方法。这个方法里的规则表明,productName和description属性不得为空。换句话说,与这个动作表单相关联的HTML表单里的productName和description字段必须有值。

displayAddProductForm.jsp页面包含着相关联的HTML表单,它的代码见代码清单2-3。

代码清单2-3  displayAddProductForm.jsp页面

请注意,这个HTML表单里的字段与ProductForm动作表单里的属性是一一对应的。我们将在下一个示例程序里向大家介绍一种更好的HTML表单编写办法。

于是,用户提交这个HTML表单的行为将调用saveProduct动作。此时,Struts将创建ProductForm类的实例并调用validate方法。如果productName或description字段为空,输入验证将失败,而Struts就将按照名为SaveProduct的action元素的input属性的指定把控制权转交给displayAddProductForm.jsp页面。如果输入验证成功,Struts将调用相关动作对象(该对象是SaveProductAction类的一个实例)的execute方法。SaveProductAction类的代码见代码清单2-4。

代码清单2-4  SaveProductAction类

SaveProductAction类的execute方法将创建ProductTO对象(ProductTO类的代码参见第1章),把它插入数据库,然后保存到HttpServletRequest对象。请注意,ProductTO实例是从动作表单获取其各有关属性值的。把这个传输对象插入数据库的代码在这里没有给出对象持久化的问题将在第15章讨论。

SaveProductAction类将把控制权转交给displaySavedProduct.jsp页面(见代码清单2-5),该页面使用JSTL库显示ProductTO对象里的各项值。

 

代码清单2-5  displaySavedProduct.jsp页面

运行app02a应用程序

运行app02a应用程序的办法很简单,使用如下所示的URL就可以调用displayAdd- ProductForm动作:

这个动作是由struts-config.xml文件里的action元素定义的:

我们没有为这个action元素定义type属性,所以该动作将把控制权直接转交给display- AddProductForm页面,你将在浏览器里看到一个如图2-3所示的HTML表单。

图2-3  Add Product页面

现在,请在前两个字段里输入数值,但不要填写最后一个字段。这么做的结果是:当提交表单时,你将再次看到同样的页面。

接下来,在所有的字段里都输入数值并再次提交这个表单。这一次,你应该在浏览器里看到如图2-4所示的画面。

图2-4  displaySavedProduct.jsp页面

app02a应用程序的控制流程见图2-5。

图2-5  app02a应用程序的控制流程

在调用displayAddProductForm动作的时候(图2-5中的请求1),Struts将把控制权转交给displayAddProductForm.jsp页面(响应1),你将看到如图2-3所示的HTML表单。

如果没有给所有的字段都输入数值的情况下就提交了HTML表单(请求2A),将调用saveProduct动作。这个动作是由struts-config.xml文件里如下所示的action元素定义的:

在提交HTML表单之后,如上定义的动作servlet将创建app02a.form.ProductForm类的实例并调用其validate方法。但因为这一次的输入验证失败, validate方法将返回一个非空的ActionErrors对象。作为结果,这个动作servlet将尝试获取相应action元素里的input属性值。具体到这个示例,你将看到displayAddProductForm.jsp页面(响应2A)。

现在,填好所有的字段并提交这个HTML表单(请求2B),saveProduct动作将再次调用,示例程序的动作servlet将再次创建ProductForm实例并调用其validate方法。这一次,输入验证成功,将发送一个saveProductAction实例给动作表单。这个saveProductAction实例的execute方法将返回ActionForward对象,该对象使得控制权转交给了displaySavedProduct. jsp页面,而最终的结果是你将在浏览器里看到如图2-4所示的确认消息(响应2B)。

注解    input元素的值还可以是另外一个动作的路径。

  评论这张
 
阅读(414)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018