惰性动态Action表单

来源:互联网 发布:godaddy 阿里云 编辑:程序博客网 时间:2024/04/30 22:18

 

当属性的值不确定或者完全在运行时才可知的情况下,想创建一个表单。

解决方案

使用Niall Pemberton的Lazy DynaBean表单,可以从http://www.niallp.pwp. blueyonder.co.uk/下载。

在struts-config.xml中声明form-bean:

<form-bean name="LazyForm"

type="lib.framework.struts.LazyValidatorForm"/>

接着,就像使用普通的ActionForm一样使用JSP页面的表单。例5.8显示一个JSP页面(lazy_form_test.jsp),此页面使用了之前声明的LazyForm。

例5.8:在HTML表单中使用LazyValidatorForm

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix=  "html" %>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix=  "bean" %>

<html>

<head>

  <title>Struts Cookbook - Chapter 5 : Lazy Form</title>

</head>

<body>

  <h2>Lazy Form Test</h2>

  <html:form action="/ProcessLazyForm">

    What is your name:<br />

      First Name: <html:text property="firstName"/><br />

      Last Name: <html:text property="lastName"/><br />

    Do you want to subscribe to our newsletter?<br />

      <html:checkbox property="subscribe"/><br />

    Who are your 3 friends:<br />

      Friend 1: <html:text property="friend[0].name"/><br />

      Friend 2: <html:text property="friend[1].name"/><br />

      Friend 3: <html:text property="friend[2].name"/><br />

    <html:submit/>

  </html:form>

  <hr />

  Your name is: <bean:write name="LazyForm" property="firstName"/>&nbsp;

                <bean:write name="LazyForm" property="lastName"/><br />

  Your friends are:<br />

  <bean:write name="LazyForm" property="friend[0].name"/><br />

  <bean:write name="LazyForm" property="friend[1].name"/><br />

  <bean:write name="LazyForm" property="friend[2].name"/><br />

</body>

</html>

在接收表单的Action中,把表单转化为DynaBean (org.apache.commons.beanutils. DynaBean)。接下来,通过使用get("name")方法访问属性。由于LazyValidatorForm 继承自ValidatorForm,您可以在您的validation.xml文件中定义一个标准的Struts Validator验证规则。

讨论

有时候,您可能需要显示一组数据的输入字段,而这些要到运行时才知道。考虑一个允许潜在购买者配置所购产品的应用——例如在线购买计算机。可供选择的配置随产品和目前的促销而改变。配置的数据通常从实际的数据库中来,所以页面需要依实际情况确定。

LazyValidatorForm和LazyValidatorActionForm允许form属性在需要时自动创建。特别的,在这些类中索引属性受LazyList支持。此列表在必要时调整大小,而不是在您试图访问一个超出现有大小的索引时抛出IndexOutOfBoundsException异常。像DynaActionForm那样,这些表单实现了DynaBean接口并且在Map中存储属性。尽管如此,和DynaActionForm不同的是,新的属性可以在任何时间加入其中。在这个解决方案中,在struts-config.xml中声明表单就像是定义一个自定义的ActionForm,没有指定任何form-property。

在使用表单的JSP页面中,Struts标签的用法和普通的ActionForm没有什么区别。在这个解决方案中,创建了两个文本字段(“firstName”和“lastName”)、一个Boolean字段 (“subscribe”)以及三个索引属性 (friend[i].name)值被创建。

这些类的使用并不常见,然而,它们能够在某些场合发挥作用。使用这些类的一个场合是当您原型化一个应用程序或者新的特性时。一旦明确需求,就可以使用正常的ActionForm 或者DynaActionForm替换lazy action。

警告:使用惰性action表单避开了ActionForm通常提供的防火墙。换句话说,lazy ActionForm实例会被填入所有请求参数,不论您是否希望如此。要保证您不会盲目地接受这些值并把它们传递到业务模型中,而是找到您希望的特定值。

原创粉丝点击