Form中是不能直接修改List的,需要你把修改的信息取出来,自己手动加入List

解决方案 »

  1.   

    把修改的信息取出来,再加入deviceList
      

  2.   

    <html:text name="device" property="deviceNo"/>
    <html:text name="device" property="deviceName"/>
    用actionform取出来
      

  3.   

    我在Action里取的还是修改之前的数据,更新后的数据取不到.
    是不是struts不能动态更新ActionForm中的ArrayList?
      

  4.   

    用HttpServletRequest.getParameterValues("device")来取,得到一个数组,然后再取出来
      

  5.   

    bp69() 用你的方法取到的是null.
    我要实现的功能其实很简单,在前台页面列表中选择一个记录(点checkbox),在后台把选中的记录取出来.
    <logic:iterate id="device" name="ExampleForm" property="deviceList">
      <html:checkbox name="device" property="isChecked"/>
        <html:text name="device" property="deviceNo"/>
        <html:text name="device" property="deviceName"/>
    </logic:iterate>
    isChecked是deviceForm中的一个Boolean类型的属性,用来保存用户是否选种当前记录,如果选中,他的值为true,在Action中取出ActionForm中的deviceList,遍历deviceList,取出每一个记录(deviceForm类型),当isChecked属性是true时,把它加到另外一个list中去.
     我现在的问题是每次我取出deviceList时,它的值都是原来的值,不是我页面修改的值(isChecked=null),请问我该怎么办?
      

  6.   

    <html:checkbox name="device" property="isChecked"/>
        <html:text name="device" property="deviceNo"/>
        <html:text name="device" property="deviceName"/>
    这三个不同类型的组件用了同一个名字,不出错才怪,改为:
    <%int i=0;%>
    <logic:iterate id="device" name="ExampleForm" property="deviceList">
    <%i++;%>
    <html:checkbox name="device1" property="isChecked" value="<%=i%>"/>
        <html:text name="device2" property="deviceNo"/>
        <html:text name="device3" property="deviceName"/>
    </logic:iterate>
    再用String[] checked=HttpServletRequest.getParameterValues("device1"),如果选中第一第二个记录,cheched={"1","2"}
    text也一样的道理,有问题再说吧
      

  7.   

    在Action中取出ActionForm中的deviceList
    ----〉这个deviceList是不会变的,因为你修改提交之后,没有对deviceList做任何动作,所以deviceList还是原来的值,前台修改,action,servlet没有动作,是没意义的
    用你的方法取到的是null
    ----〉这几个不同类型的组件用了同一个名字,所以用HttpServletRequest.getParameterValues("device")来取,就出问题了
    我要实现的功能其实很简单,在前台页面列表中选择一个记录(点checkbox),在后台把选中的记录取出来
    -----〉如果是这样,就不要用<logic:iterate>了,直接用循环,把值都取出来,想怎么控制都行。
    <logic:iterate>用来循环显示数据还好,修改数据不是很方便,可能是我见识少:)
    你现在的问题是
    1,取表单数据因为(text,checkbox)名字都是一样的,所以取值不好取
    2,action没有对deviceList作修改,所以deviceList还是原来的值
    解决办法:
    1,<%循环......控制%>这个就不说了,很简单,但是嵌入java代码
    2,
    <logic:iterate id="device" name="ExampleForm" property="deviceList" type="..">
      <%if(device.getisChecked())%>
             { 
              <html:checkbox name="device1" checked="checked" />
             }
        <%else%>
             {
              <html:checkbox name="device1"/>
             }
        <html:text name="device2" value="<%=device.getdeviceNo()%>"/>
        <html:text name="device3" value="<%=device.getdeviceName()%>"/>
    </logic:iterate>---〉这个可以试试
    action用HttpServletRequest.getParameterValues("device1")这个方法来得到可能有更好的办法,我就知道这些了,希望能够对你有用
      

  8.   

    楼主的这个方法,想法不错(虽然我从来不敢想象能这么干:-)),不过仔细想想,
    <html:form>
    <logic:iterate id="device" name="ExampleForm" property="deviceList">
        <html:text name="device" property="deviceNo"/>
        <html:text name="device" property="deviceName"/>
    </logic:iterate>
    </html:form>你想想你的这块代码转成html会是什么样?
    <form>
          <input name="deviceNo"..
          <input name="deviceName"
          <input name="deviceNo"..
          <input name="deviceName"
          <input name="deviceNo"..
          <input name="deviceName"
          ....  
    </form>当这个form提交的时候,struts在根据request中的parameter来组装formbean的时候,会发生什么呢,会找formbean中的deviceNo这个arraylist,显然你的ExampleForm中没有,当然不能按照你的意愿得到数据。我一般这样处理这种问题,给每个html:input的name置成类似deviceNo+n的形式,然后在action中对n做循环去request中拿parametname是deviceNo+n对应的值。可能有说的不准确的地方,请大家指出来。
      

  9.   

    likeBean(喜欢吃咖啡豆)
     你的想法提醒了我,如果我在formbean中分别为列表中每个输入值定义一个数组,例如:
          String[]isChecked;
          String[]deviceNO;
          String[]deviceName
     这样可不可以动态接受前台修改的数据?如果可以的话可以直接在数组里面取值不是很方便?