现在的位置: 首页 > 综合 > 正文

Struts秘籍之第2段:第3.4式:在表单中使用索引属性

2013年08月16日 ⁄ 综合 ⁄ 共 4297字 ⁄ 字号 评论关闭
 

第3.4式. 在表单中使用索引属性

问题

你想要在表单中创建对应于一个Bean中的索引属性的一套输入字段。

动作要领

在Struts html标签库的标签中使用indexed属性来产生属性值:

 

<html:form action="TestOneAction"><p>
  
<logic:iterate name="MyForm" property="stringArray" 
                   id
="stringValue" indexId="ctr">
    
<br/>
    
<html:text property="stringArray" indexed="true"/>
</logic:iterate>
</html:form>

 

动作变化

如第3.3时所示,访问索引值以供显示是很容易的。但是,在表单中使用索引属性则有些麻烦。如果所产生的输入字段的名称没有正确的格式化,在HTML表单被提交后, Apache Struts Web Framework 便不能正确的装配ActionForm。Struts 要使用Jakarta Commons BeanUtils 包来从HTTP请求中的值组装ActionForm。特别地,BeanUtils.populate( )方法是从表单提交时从HTTP请求数据发送的数据中装载ActionForm的。

对于索引值,BeanUtils.populate( )使用请求参数来决定适当的setter 方法以调用ActionForm。表3-3 列出了不同的表单输入字段是如何处理的。表中列出了HTML 标签,对应的HTTP 请求响应对,以及在请求被处理时在ActionForm之上调用的方法。

表3-3. ActionForm 组装示例

HTML form 输入标记

产生的请求对

导致的方法调用

<input type="text" name="bar">

bar=someValue

Form.setBar("someValue")

<input type="text" name="sna.fug">

sna.fug=blah

Form.getSna( ).setFug("blah");

<input type="text" name="baz[0]">

baz[0]=someValue

Form.setBaz(0,"firstVal");

<input type="text" name="glub[1].waf">

glub[1].waf=halb

Form.getGlub(1).setWaf("halb");

<input type="text" name="dog.leg[2]">

dog.leg[2]=lame

Form.getDog( ).setLeg(2, "lame");

 

考虑一个允许用户输入最喜爱列表,比如颜色和网站,的表单。持有这些数据的ActionForm包含一个表示用户名称的String属性,表示用户喜好颜色的String数组,以及一个表示用户喜好网站的WebLink对象的List。WebLink类如Example 3-5所示,它定义了一个简单的JavaBean,具有表示站点名称和URL的属性。

Example 3-5. WebLink JavaBean

 

package com.oreilly.strutsckbk;

public class WebLink {
    
public String getName( ) {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public String getUrl( ) {
        
return url;
    }

    
public void setUrl(String url) {
        
this.url = url;
    }

    
private String url;
    
private String name;
}

 

form bean, FavoritesForm, 则包含了用户名称,喜爱颜色,以及喜好网站。如Example 3-6所示:

Example 3-6. FavoritesForm form bean

 

package com.oreilly.strutsckbk;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts.action.ActionForm;

public final class FavoritesForm extends ActionForm  {
    
public FavoritesForm( ) {
        webLinks 
= new ArrayList( );
        
for (int i=0; i<5; i++) webLinks.add(new WebLink( )); 
        colors 
= new String[3];
    }
    
    
public String getName( ) {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public String getColor(int index) {
        
return colors[index];
    }

    
public void setColor(int index, String color) {
        colors[index] 
= color;
    }

    
public String[] getColor( ) {
        
return colors;
    }

    
public List getWebLinks( ) {
        
return webLinks;
    }

    
public WebLink getWebLink(int index) {
        
return (WebLink)webLinks.get(index);
    }

    
public void setWebLink(int index, WebLink webLink) {
        webLinks.
set(index, webLink);
    }

    
    
public void reset( ) {
        webLinks.clear( );
        colors 
= new String[3];
    }

    
    
private List webLinks;
    
private String name;        
    
private String[] colors;    
}

 

现在你可以创建一个JSP 页面 (favorites.jsp) ,通过它用户可以输入表单中的相应数据,其代码如Example 3-7所示.

Example 3-7. FavoritesForm JSP

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

<html:html locale="true">
<head>
<title><bean:message key="index.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<h2>Favorites Poll</h2>
<html:form action="/admin/ViewFavorites">
    
<p>
        What is your name:
        
<br/><html:text property="name"/>
    
</p>
    
<p>
        What are your three favorite colors:
        
<br/><html:text property="color[0]"/>
        
<br/><html:text property="color[1]"/>
        
<br/><html:text property="color[2]"/>
    
</p>
   
<p>
      What are your favorite links?
      
<table>
         
<tr>
            
<th>Name</th>
            
<th>URL</th>
         
</tr>
         
<tr>
            
<td><html:text property="webLink[0].name"/></td>
            
<td><html:text property="webLink[0].url"/></td>
         
</tr>
      
</table>
   
</p>
    
<html:submit/>
    
<html:reset/>
</html:form>
</body>
</html:html>

 

因为Example 3-7 中的索引值是硬编码,不是动态的,html:text标签的property值便很容易构造,所以产生的HTML 标签便具有适当的name属性值。然而,假设你想要使用logic:iterate标签来产生重复的输入字段。比如,为了对color属性这样做,你可能想要尝试以下的JSP 代码:

 

What are your three favorite colors:
  
<logic:iterate <

抱歉!评论已关闭.