Form中是不能直接修改List的,需要你把修改的信息取出来,自己手动加入List
解决方案 »
- Spring Security3 循环重定向
- “123456”,使用utf8编码进行base64,结果的utf8编码再进行md5,结果是什么
- 为什么数据库连接不上
- mysql,spring+ibatis事务机制问题
- urlrewritefilter 的映射问题
- 如何替换空格
- hibernate连接oracle数据库出错!请问如何解决?谢谢
- BigDecimal的用法 (struts+hibernate)
- 在struts的标签中,如何让表单的某个字段值不能修改??
- Weblogic7的example的console用户名和密码?
- weblogic新手问题
- 用过Eclipse+Tomcat+lomboz的请看一下
<html:text name="device" property="deviceName"/>
用actionform取出来
是不是struts不能动态更新ActionForm中的ArrayList?
我要实现的功能其实很简单,在前台页面列表中选择一个记录(点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),请问我该怎么办?
<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也一样的道理,有问题再说吧
----〉这个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")这个方法来得到可能有更好的办法,我就知道这些了,希望能够对你有用
<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对应的值。可能有说的不准确的地方,请大家指出来。
你的想法提醒了我,如果我在formbean中分别为列表中每个输入值定义一个数组,例如:
String[]isChecked;
String[]deviceNO;
String[]deviceName
这样可不可以动态接受前台修改的数据?如果可以的话可以直接在数组里面取值不是很方便?