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 class="indent">


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

public class TestBean extends ActionForm {

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

  .....
}
<p class="indent">



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 class="indent">


注意上述两个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
标签实在是鸡肋

jakarta99
2004-03-12 08:14
通常@N indexed 用在固定档 Y料 post

假如你的列表面有做分
每都是 5 PY料
你就可以在 ActionForm 之中 做 Array 包含了 5 Bean
<code>

[updateall]
===================================================
| id | name | password
+----+-----------------+---------------------
| 11 | [alex ] | [******** ]
+----+-----------------+---------------------
| 22 | [bruce ] | [******** ]
+----+-----------------+---------------------
| 33 | [catherine ] | [******** ]
+----+-----------------+---------------------
| 44 | [david ] | [******** ]
+----+-----------------+---------------------
| 55 | [eva ] | [******** ]
==================================================

[updateall]
</code>


第一 row 就是
<input type="hidden" name="user[0].id" value="11">
<input type="text" name="user[0].name" value="eva">
<input type="password" name="user[0].password" value="testpwd">
其N推, 使用 struts taglib r候
要注意加上 indexed attribute

@涌梢宰龅揭淮味 row 的 update
如果加上 checkbox 就可以做到多 row 的 delete
如果是裼 select 也可以呼叫 Map 橹鞯 actionForm

然 如果你不想@N做
action 用圈接值硪彩强梢赃_到相同效果
但是你淼r候 必先跑圈砻傩灾
一物件越多傩 你就要花更多程式a硗瓿

透^ indexed properties
action 接收到 actionForm 之後就可以直接{用 bean 的 array
@更符合 j2ee vo 的 概念 相同的 我\用完之後
也是 array 放回 actionForm.

banq
2004-03-27 20:08
上传多个图片, 利用Struts的Map Index特性:

ActionForm内容:

  private Map fileMap = new HashMap();//图片名称集合
  private Map nameMap = new HashMap();//图片数据集合

  public FormFile getFile( int index ){
      return (FormFile) fileMap.get( new Integer( index ) );
  }

  public void setFile(int index, FormFile file){
    fileMap.put(new Integer(index), file);
  }

  public FormFile[] getFiles(){
      return (FormFile[])fileMap.values().toArray(new FormFile[fileMap.size()]);
  }

  public String getName( int index ){
      return (String)nameMap.get( new Integer( index ) );
  }

  public void setName(int index, String name){
    nameMap.put(new Integer(index), name);
  }

  public String[] getNames(){
      return (String[])nameMap.values().toArray(new String[0]);
  }

<p class="indent">


Jsp内容:

<html:text property="name[0]" size="20"/>
<html:file property="file[0]" size="30" />

<html:text property="name[1]" size="20"/>
<html:file property="file[1]" size="30" />

<html:text property="name[2]" size="20"/>
<html:file property="file[2]" size="30" />

<p class="indent">


如果ActionForm直接使用FormFile[] 则报错,参数不匹配。