Struts 1 ActionForm中的单选按钮没有“已选中”

时间:2015-04-28 17:06:35

标签: java forms jsp java-ee struts-1

我有一个包含许多问题的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属性仍未设置为加载。

更新(5/10/15)

在进行shinjw推荐的更改后,值会正确保存(这是一个单独的问题)但是当getBoolen返回true时,仍未为某些单选按钮设置checked属性。

3 个答案:

答案 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之前调用