Struts的Indexed属性用处

04-03-03 banq

说明:这是Struts的一种高级用法,struts-el中有相关说明,这里讨论在一般struts标签库下如何实现。

场景:

有一个JavaBeans:如下:

public class LabelValueBean implements Serializable {
    public LabelValueBean(String label, String value) {
        this.label = label;
        this.value = value;
    }
    private String label;

    public String getLabel() {
        return this.label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    private String value;

    public String getValue() {
        return this.value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        StringBuffer sb = new StringBuffer("LabelValueBean[");
        sb.append(this.label);
        sb.append(", ");
        sb.append(this.value);
        sb.append("]");
        return (sb.toString());
    }


}
<p>

这是非常普通的JavaBeans, 如果ActionForm是这样:

public class TestBean extends ActionForm {

  .....
  private List lvbeans =  new ArrayList();

  .....
}
<p>

lvbeans是LabelValueBean的集合,如此组合,如果需要在Jsp页面中对LabelValueBean的label和value值进行增删改,怎么办?

使用indexed属性,TestBean类如下:

public class TestBean extends ActionForm {

  .....
  private List lvbeans =  new ArrayList();

  public TestBean(){ //初始化数值
       lvbeans.add(new LabelValueBean("1", "1"));
       lvbeans.add(new LabelValueBean("2", "2"));
       lvbeans.add(new LabelValueBean("3", "3"));

    }

  public  LabelValueBean getLvbeans(int index) {
      return (LabelValueBean)lvbeans.get(index);
  }

  public  List getLvbeans() {
      return lvbeans;
  }

  .....
}
<p>

注意上述两个get方法很重要,Jsp页面代码如下:

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<jsp:useBean id="test2" scope="page" class="test.TestBean"/>

<h2>Test:
 <logic:iterate name="test2" property="lvbeans" id="foo"  indexId="ctr">
    <html:text name="test2"
               property='<%= "lvbeans[" + ctr + "].label" %>' />
   </logic:iterate>

</h2>

这样,运行后的输出结果是:


<h2>Test:
 
    <input type="text" name="lvbeans[0].label" value="1">
   
    <input type="text" name="lvbeans[1].label" value="2">
   
    <input type="text" name="lvbeans[2].label" value="3">
   

</h2>

这样修改TestBean中的List中的LabelValueBean数值了。

参考:

http://jakarta.apache.org/struts/faqs/indexedprops.html

参考文中有些说不清楚,注意陷井。

julian_zzx
2004-03-06 10:54

不明白banq这篇东东要说明什么问题,没有应用场景。

仅次于狼
2004-03-07 14:33

在逻辑标记库中定义了<logic:iterate>标记,它能够根据特定集合中元素的数目对标记体的内容进行重复的检查。集合的类型可以是java.util.Iterator,java.util.Collection

,java.util.Map或是一个数组。有三种方法可以定义这个集合:

l 使用运行时间表达式来返回一个属性集合的集合

l 将集合定义为bean,并且使用name属性指定存储属性的名称。

l 使用name属性定义一个bean,并且使用property属性定义一个返回集合的bean属性。

当前元素的集合会被定义为一个页作用域的bean。属性如下,所有这些属性都能使用运行时表达式。

属性

描述

collection

如果没有设置name属性,它就指定了要进行重复的集合

Id

页作用域bean和脚本变量的名称,它保存着集合中当前元素的句柄

indexed

页作用域JSP bean的名称,它包含着每次重复完成后集合的当前索引

Length

重复的最大次数

Name

作为集合的bean的名称,或是一个bean名称,它由property属性定义的属性,是个集合

Offset

重复开始位置的索引

property

作为集合的Bean属性的名称

Scope

如果指定了bean名称,这个属性设置bean的作用域。若没有设置,搜索范围从页到应用程序作用域

Type

为当前定义的页作用域bean的类型

例如:

<logic:iterate id=”currentInt”

collection=”<% =myList %>”

type=”java.lang.Integer”

offset=”1”

length=”2”>

<% =currentint %>

</logic:iterate>

代码将从列表中的第一个元素开始重复两个元素并且能够让当前元素作为页作用域和java.lang.Integer类型的脚本变量来使用。也就是说,如果myList包含元素1,2,3,4等,代码将会打印1和2。

弓虽
2004-03-11 16:54

标签实在是鸡肋

2Go 1 2 下一页