我有一个包含许多问题的JSP页面和一个带有输入名称和值的Map的ActionForm。
当我加载页面时,未设置无线电输入的值(已检查属性),但复选框是。
表单定义:
<bean:define id="form" name="questionForm" type="com.example.QuestionForm"/>
Radio(jsp):
<html:radio property="<%=\"boolean(\" + questionBase + \"V\" + respLabel + \")\"%>" styleClass="pepperoni1" value="1" >Yes</html:radio>
<html:radio property="<%=\"boolean(\" + questionBase + \"V\" + respLabel + \")\"%>" styleClass="pepperoni0" value="0" >No</html:radio>
Radio(html):
<input type="radio" class="pepperoni1" value="1" name="boolean(pepperoniVNever)">Yes
<input type="radio" class="pepperoni0" value="0" name="boolean(pepperoniVNever)">No
复选框(jsp):
<html:checkbox property="<%=\"boolean(\" + questionBase + \"V\" + respLabel + \")\"%>" styleClass="pepperoni" />
复选框(html):
<input type="checkbox" class="pepperoni" checked="checked" value="on" name="boolean(pepperoniV1)">
在getBoolean
/ setBoolean
提交的页面加载/表单访问时,未设置已检查的属性,但值非空。
我的ActionForm类提供了以下相关方法:
public void setValue(String key, String value) {
if (value != null)
values.put(key, value);
}
public String getValue(String key) {
return values.get(key);
}
public boolean getBoolean(String key) {
if (values.get(key) != null){
if(values.get(key).equalsIgnoreCase("1")){
return true;
} else if(values.get(key).equalsIgnoreCase("0")){
return false;
}
return "yes".equalsIgnoreCase(values.get(key));
}
return false;
}
public void setBoolean(String key, boolean value) {
if(value){
values.put(key, "yes");
}
}
我在Ubuntu 14.04上使用struts 1.2.7,Hibernate 3,DisplayTag 1.0,OpenJDk 6和Tomcat 6。
但是,以下无线电输入执行有效(正如您在“已检查”属性中看到的那样:
Radio(jsp):
<html:radio property="<%=\"value(\" + questionBase + \"B)\"%>" value="No">No</html:radio>
<html:radio property="<%=\"value(\" + questionBase + \"B)\"%>" value="Yes">Yes</html:radio>
Radio(html):
<input name="value(noteB)" value="Yes" checked="checked" type="radio">
<input name="value(noteB)" value="No" type="radio">
但在使用boolean
编辑输入以使用value
后,checked
属性仍未设置为加载。
在进行shinjw推荐的更改后,值会正确保存(这是一个单独的问题)但是当getBoolen
返回true时,仍未为某些单选按钮设置checked属性。
答案 0 :(得分:1)
首先,布尔结果只有真或假。不是0或1
<html:radio property="<%=\"boolean(\" + questionBase + \"V\" + respLabel + \")\"%>" styleClass="pepperoni1" value="true" >Yes</html:radio>
<html:radio property="<%=\"boolean(\" + questionBase + \"V\" + respLabel + \")\"%>" styleClass="pepperoni0" value="false" >No</html:radio>
最好使用自动装箱的Boolean
对象而不是布尔值。这样,必须将值设置为布尔值,以使其包含值。
执行此操作还会在代码中显示逻辑问题。
public void setBoolean(String key, boolean value) {
values.put(key, value ? "yes" : "");
}
当您的布尔值始终设置为 false 时,您认为可能会发生什么? public void setBoolean(String key,boolean value){ values.put(key,value?&#34; yes&#34;:&#34;&#34;); }
这样的事情可能会成为更好的解决方案
Map<String, Boolean> values = new Hashmap<String,Boolean>
public void setBoolean(String key, Boolean value) {
values.put(key, value);
}
答案 1 :(得分:1)
在Struts中,当Getter方法接受一个参数(我相信它不遵循JavaBean规范)时,不能通过struts访问类属性。映射属性或索引属性功能(()和[])只能用于提交数据,而不能用于显示字段。
因此,获取checked属性的唯一方法是使用JSP scriptlet,为此,您必须在JSP页面(<bean:define id="form" name="<form name, as it is in struts-config.xml>"/>
)中定义表单对象,并且您将能够编写类似这样的内容:
<html:radio property='<%=\"value(" + questionBase + "B)"%>' <%=form.getBoolean(questionBase) ? "checked" : "" %> value="No">No</html:radio>
。
或者你可以使用JSTL。
答案 2 :(得分:1)
尝试使用动作类本身中的模态设置表单类的布尔属性,struts将在加载jsp之前调用