一个数据仓库Product.java如下:
public class Product{
  private String product_id;
  private String product_name;  public String getProduct_id() {
     return product_id;
  }
  public void setProduct_id(String product_id) {
     this.product_id = product_id;
  }
  public String getProduct_name() {
     return product_name;
  }
  public void setProduct_name(String product_name) {
     this.product_name = product_name;
  }
}
又有一个ProductPage.java 如下:
public class ProductPage {
  private ArrayList browselist;
  private ArrayList modifylist;
  
  public ArrayList getModifylist() {
    return modifylist;
  }
  public void setModifylist(ArrayList modifylist) {
    this.modifylist = modifylist;
  }  public String toList(){
    .......
    .......
    modifylist = XXXXX.YYYY();
    browselist = new ArrayList();
    for(int i=0;i<modifylist.size-1;i++){
      browselist.add(modifylist.get(i));
    }
    return "list";
  }
  
  public String toModify() {
    int i = 0;
    String[] products_id = new String[modifylist.size()];
    Iterator it = modifylist.iterator();
    Iterator it2 = browselist.iterator();
    while (it.hasNext()) {
      Product PB = (Product) it.next();
      Product PB2 = (Product) it2.next();
      if (!(PB.product_name.equals(PB2.product_name))) {
products_id[i] = PB.getProduct_id();
i++;
      }
    }
    ......
    ......
    return "next";
  } 
}
页面当中有如下代码片段:
<t:dataTable var = "list" value = "#{ProductPage.modifylist}">
   <h:column>
      <f:facet name="header">
<h:outputText value = "产品名" />
      </f:facet>
      <h:outputText value = "#{list.product_name}" />
   </h:column>
</t:dataTable>

解决方案 »

  1.   

    首先更正一下
    if (!(PB.product_name.equals(PB2.product_name))) 这句应为
    if (!(PB.getProduct_name.equals(PB2.getProduct_name)))
     
    <h:outputText value = "#{list.product_name}" />这句按楼主的需要赢改为
    <h:inputText value = "#{list.product_name}" />
    下面我对上述代码做一下说明:
    Product.java这个类没什么说的只是用来存储数据
    ProductPage.java 这个类是具体操作的类 在JSF的配置文件里将它的传值方法设为session传值(这点很重要)
    toList()方法是得到显示结果modifylist的方法(假设modifylist存储的是从数据库里取得的product_id和product_name) 也就是触发它得到结果然后通过return "list";导航到显示的页面上 其中的for循环是用来将modifylist做一个备份以便以后比较 当然你也可以用clone或其它方法达到相同的目的 这里只是为了演示
    return "list";这句中的字符串"list"是在JSF配置文件里定义的导航字符串 用来导航到含有上面页面代码的页面
    toModify()方法应该就是楼主想要的方法 也就是楼主所说的那一个按钮要触发的方法 因为ProductPage.java是用session传值所以modifylist始终存在所以在toModify()方法里可以直接用 用两个迭代器分别迭代修改过的modifylist和备份的browselist 并对其中的product_name属性进行比较 如果不同则将product_id取出存入数组String[] products_id 
    估计以上所写应该对楼主有所帮助吧
      

  2.   

    WIN_ANGEL(WIN_ANGEL) ( ) 方法应该可以,没有试过但是理论上是可以的,因为jsf 可以把你页面的list修改和后台自动绑定过去所以你提交的时候,数据修改直接就体现在了那个list上了,而list 里面是bean信息,循环就可以进行处理了
      

  3.   

    因为我在此之前用做过一个批量删除的工作 就是迭代出来的所有记录前都有个<h:selectBooleanCheckbox>(单选框)可以选中多个 然后点下面有个总的删除按钮 就可以将所有选中的记录删除 用的就是类似上面给出的方法 我相信楼主的问题可以用同样的方法解决 应该不用动用js的
    因为现在手上有工作 所以没办法专门调试 楼主在之前说到的“会乱掉”具体是怎么回事呢?可以具体描述一下么 或者你用断点调试跟踪一下看看是哪里出了问题 因为我上面的代码只是给出个思想 程序里可能会有错 这个问题我本身也很感兴趣 希望能通过继续的讨论把它解决掉
      

  4.   

    晕 我好像知道问题出在哪了 确实可能是那两个list的问题 换个笨办法
    public class ProductPage {
      private ArrayList browselist;
      private ArrayList modifylist;
      
      public ArrayList getModifylist() {
        return modifylist;
      }
      public void setModifylist(ArrayList modifylist) {
        this.modifylist = modifylist;
      }  public ArrayList getBrowselist() {
        return Browselist;
      }
      public void setBrowselist(ArrayList browselist) {
        this.browselist = browselist;
      }  public String toList(){
        .......
        .......
        modifylist = XXXXX.YYYY();
        browselist = XXXXX.YYYY(); //这句 够笨吧 和上句一样得到相同的结果集 因为之前的复制方法两个list里相对应的对象一样的所以当他们都调用getXXXX()取值时会出现问题 换这个方法试试 只是访问了2次数据库 比较差的解决办法 先试试看看能不能实现你想要的 然后再想优化的方法 先实现后优化嘛 ^_^ 
      }
      
      public String toModify() {
        int i = 0;
        String[] products_id = new String[modifylist.size()];
        Iterator it = modifylist.iterator();
        Iterator it2 = browselist.iterator();
        while (it.hasNext()) {
          Product PB = (Product) it.next();
          Product PB2 = (Product) it2.next();
          if (!(PB.getProduct_name.equals(PB2.getProduct_name))) {
             products_id[i] = PB.getProduct_id();
             i++;
          }
        }
        ......
        ......
        return "next";
      } 
    }
      

  5.   

    为什么不放在request里面呢,首先从数据库中取出记录,通过Product.java里面的get方法,可以取出所有的结果。如果你修改了表单里面的数据,最后提交的时候通过Product.java里面的set方法,从新就值放进去放在一个list里面,在操作数据库的时候再从list里面取不就得了。
      

  6.   

    回fufengchun() 
    正如leojay1(绯村剑心) 所说“因为jsf 可以把你页面的list修改和后台自动绑定过去
    所以你提交的时候,数据修改直接就体现在了那个list上了,而list 里面是bean信息”
    其实当在toModify() 里操作modifylist时 modifylist就是那个已经改过的list 现在问题是楼主只想要改过的那些记录 而不是所有的 这就要比较哪些是改过的 我也在想有没有好的办法能知道哪些是改过的 希望能有高手给出好的办法
      

  7.   

    楼主指的乱了是指
    for(int i=0;i<modifylist.size-1;i++){
          browselist.add(modifylist.get(i));
    }
    吧 
    确实不小心打错了 应当是i<modifylist.size; 不好意思 
    改下看看能好用不 不行的话就换后来说的访问2次数据库的方法 
    希望能有高手来指点一下 有什么比较好的办法 能知道一个list存的 对象 的属性 被改动过
      

  8.   

    WIN_ANGEL(WIN_ANGEL)我理解你的方法是这样,
    1、先从数据库把数据输出到页面
    2、获得从页面提交的数据,
    3、把2次数据对比我猜想这1、2 两个步骤没有指定任何排序的方法,也无法指定,会不会在传递中把数据的次序排列弄混乱。这些数据的内容也有重复的,其实只要让我记录一下数据库的id到该条数据就可以了
    可是就是没地方,我试了讲<h:inputText的 name和id属性设置为数据库中的id。但是都不允许。要是实在没办法,只能自己写一个可以带id的组件了,只是太浪费时间。
    我想扩展一下原来的<h:inputText或者myfaces的<t:inputText 可是还没找到他的源代码的文件。
    不知道放在哪个文件中?
      

  9.   

    楼主
    “我猜想这1、2 两个步骤没有指定任何排序的方法,也无法指定,会不会在传递中把数据的次序排列弄混乱。”
    上面那句我没太明白 因为ArrayList 本身是有序的 因此不会出现排列次序混乱的情况(指从modifylist取出再装入browselist 那这两个list里数据的顺序应该是一样的)“这些数据的内容也有重复的,其实只要让我记录一下数据库的id到该条数据就可以了”这句里的“数据库的id到该条数据就可以了”我没太理解 你能再具体描述一下你的需求么?
      

  10.   

    WIN_ANGEL(WIN_ANGEL)1、第2个arrayList是根据浏览器回传的数据组成的,
    浏览器会不会把原来第2位置的那条数据先传回来呢?或者他是按照什么次序来传递数据的2、这到没什么,只是想说明下那些数据重复,如果没重复,到好办我直接对比就知道。
    我的功能是修改产品分类数据。先将这些分类全部显示出来,然后修改,然后再保存回数据库,
    我想一次性全部修改好后保存,但是修改后不知道这些数据对于原来的哪条了也可以我的方向错误了,我想自己写个组件也未必能解决
      

  11.   

    回楼主 上面leojay1(绯村剑心) 也说过了 “因为jsf 可以把你页面的list修改和后台自动绑定过去” list显示在页面上的值和普通属性一样 是被绑定的 因此你修改后里面的值自然就变了 而且不会出现错乱的现象 只改变了值没有改变顺序 所以我才给出了上面的方法 因为以前我做过类似的方法 是成批的删除 被选中的多个记录也是通过1个按钮全部删除 而且在此之前我也曾与你提的这个问题擦肩而过 有一次做项目差点就要求这样做了 不知道后来上面为什么取消了这个决定 但当时确实有提出过 我也简单的想过 当时大概的考虑就是上面给出的那个方法 因为最后没有做 所以也就没深考虑 直到前几天看到你提的这个问题才又想起了这个话题 我感觉单纯用JSF和JAVA是完全可以实现的 你做的项目里id应该是主键吧 只要知道那些记录不同就可以将修改过的list里的值取出 然后连接数据库通过id为条件进行update
      

  12.   

    我忘记说重要的一点了。我那里的情况是一个树,因为是产品的分类
    具体是这样的
    比如:
       百货
         └卫生用品
         └餐具
       家电
         └厨房电器
                 └烧水类是这样的一个不定深度的树组成的。页面显示用的是tree2,
    让tree2每个节点显示为一个<h:inputText
    然后修改了之后全部更新到数据库。所以我需要对应<h:inputText输出数据的那个id。啊。,你的做法应该确实是可行的,我现在明白了。原来我一直担心2次数据之间没关联,现在知道了
    后台数据关联这一步是JSF自己完成的。
      

  13.   

    ^_^ 我升级啦 前几天刚来的时候还是一个三角裤 现在2个啦 我要变成猩猩 HOHO~
    我们一起学习一起提高 叔的话你可以看一下这里xiekaiwen发的《请问树读取数据库的难题》也是比较靠上的帖子 也许对你会有用