未选中迭代器生成的单个复选框不起作用 [英] Single checkbox generated with iterator not working while it is not checked
问题描述
在我的Struts2测试应用程序之一中,我使用了类似iterator的标记创建了多个复选框
In one of my Struts2 test application, I created multiple checkboxes using iterator tag like
<s:iterator value="valueAddedServicesMap">
<s:checkbox name="reportData.valueAddedServices" id="valueAddedServices" fieldValue="%{key}" value="%{key in reportData.valueAddedServices}"/> <s:property value="value"/><br/>
</s:iterator>
其中valueAddedServicesMap是具有键值对(例如{"1","VAS 1"},{"2","VAS 2"})的映射,并且我具有List< Long>在reportData.valueAddedServices的活动类中
where valueAddedServicesMap is a map having key-value pairs like {"1", "VAS 1"}, {"2", "VAS 2"} and I have List<Long> in action class for reportData.valueAddedServices
如果有多个复选框,则可以正常工作.它会使用与选中的复选框相关联的值来填充活动列表,如果未选中任何复选框,则将其保留为空.
In case of more than one checkboxes it is working fine. It populates list in action with values associated wit selected checkboxes or keeps it null if no checkbox is selected.
如果仅显示一个复选框并被选中,它也会填充单个值,但是当仅显示一个复选框且未被选中时,它将给出异常.
It is also populating single value in case of only one checkbox to dispaly and it is selected but it gives exception while only one checkbox to display and it is not selected.
例外就像:
[09 May 2013 10:48:45,081] [DEBUG] unable to convert value using type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter]
Unparseable number: "false" at position 0 - [unknown location]
at com.opensymphony.xwork2.conversion.impl.NumberConverter.convertValue(NumberConverter.java:41)
at com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter.doConvertToNumber(XWorkBasicConverter.java:213)
at com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter.convertValue(XWorkBasicConverter.java:116)
at com.opensymphony.xwork2.conversion.impl.XWorkConverter.convertValue(XWorkConverter.java:340)
at com.opensymphony.xwork2.ognl.OgnlTypeConverterWrapper.convertValue(OgnlTypeConverterWrapper.java:39)
at com.opensymphony.xwork2.ognl.XWorkTypeConverterWrapper.convertValue(XWorkTypeConverterWrapper.java:36)
at com.opensymphony.xwork2.conversion.impl.CollectionConverter.convertValue(CollectionConverter.java:54)
at com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter.doConvertToCollection(XWorkBasicConverter.java:197)
at com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter.convertValue(XWorkBasicConverter.java:110)
at com.opensymphony.xwork2.conversion.impl.XWorkConverter.convertValue(XWorkConverter.java:340)
at com.opensymphony.xwork2.ognl.OgnlTypeConverterWrapper.convertValue(OgnlTypeConverterWrapper.java:39)
at ognl.OgnlRuntime.getConvertedType(OgnlRuntime.java:1064)
at ognl.OgnlRuntime.getConvertedTypes(OgnlRuntime.java:1081)
at ognl.OgnlRuntime.getConvertedMethodAndArgs(OgnlRuntime.java:1107)
at ognl.OgnlRuntime.getAppropriateMethod(OgnlRuntime.java:1193)
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1207)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1478)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:27)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2315)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.ASTChain.setValueBody(ASTChain.java:227)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:217)
at com.opensymphony.xwork2.ognl.OgnlValueStack.trySetValue(OgnlValueStack.java:186)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:173)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:151)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:317)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:228)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com.test.app.web.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:48)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:432)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
在此问题上的任何帮助将不胜感激
any help on this issue would be greatly appreciated
推荐答案
如果只有一个复选框并且未选中,则Struts2(以防万一)设置false
值.
您可以通过在checkbox
拦截器配置中设置setUncheckedValue
来定制将设置的默认值.
If it is only one checkbox and it isn't checked, Struts2 (just in case) sets false
value.
You can customize what default value will be set by setting setUncheckedValue
in checkbox
interceptor configuration.
此功能也有解决方法.它将添加带有复选框名称以__checkbox_
为前缀的隐藏字段.那么它将不会是单个复选框,并且不会提交false
.
Also there is a workaround to this feature. It is to add hidden field with your checkbox name prefixed with __checkbox_
to the form. Then it won't be single checkbox and false
will not be submitted.
<s:hidden name="__checkbox_YOUR-CHECKBOX-NAME"/>
这篇关于未选中迭代器生成的单个复选框不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!