【问题标题】:Radio buttons don't have "checked" in Struts 1 ActionForm单选按钮在 Struts 1 ActionForm 中没有“选中”
【发布时间】:2015-07-07 16:09:51
【问题描述】:

我有一个带有许多问题的 JSP 页面和一个带有输入名称和值的 Map 的 ActionForm。

当我加载页面时,没有设置单选输入的值(选中属性),但复选框是。

表格定义:

<bean:define id="form" name="questionForm" type="com.example.QuestionForm"/>

无线电(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>

广播(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。

更新

但是,以下无线电输入确实可以工作(正如您可以通过“checked”属性看到的那样:

无线电(jsp):

<html:radio property="<%=\"value(\" + questionBase + \"B)\"%>" value="No">No</html:radio>
<html:radio property="<%=\"value(\" + questionBase + \"B)\"%>" value="Yes">Yes</html:radio>

广播(html):

<input name="value(noteB)" value="Yes" checked="checked" type="radio">
<input name="value(noteB)" value="No" type="radio">

但在使用boolean 编辑输入以使用value 后,checked 属性仍未在加载时设置。

更新(2015 年 5 月 10 日)

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

【问题讨论】:

  • 能否请您发布使用单选按钮的语法?
  • 添加了收音机和复选框的语法
  • 在前端填充单选按钮后,您能否从 HTML 源代码中发布单选按钮的代码??
  • 是价值问题吗?从你的措辞我看不出来。哪个值?未选中?
  • @DaveNewton 单选按钮(示例中的按钮)的值在提交时为空。复选框通过正常。

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


【解决方案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 时,您认为会发生什么? 公共无效setBoolean(字符串键,布尔值){ values.put(键,值?“是”:“”); }

这样的事情可能是一个更好的解决方案

Map<String, Boolean> values = new Hashmap<String,Boolean>

public void setBoolean(String key, Boolean value) {
    values.put(key, value);
}

【讨论】:

  • 由于一些问题(未在此处发布)值是字符串,我无法更改 HashMap,但我确实更改了 get/setBoolean 方法以使用 1/0 以及较旧的“是”值。调试表明 get/setBooelan 方法正在返回正确的响应。我会用新方法更新我的问题。
  • 您的回答修复了未保存的数据,但当getBoolen 返回 true 时,单选按钮仍然没有“已检查”属性。有什么想法吗?
  • 好吧,你回答了赏金问题,因为我认为提交问题和显示问题是同一个问题。不想浪费掉。对显示问题有什么想法吗?
  • 你能澄清一下吗?您是说表单没有默认选择吗?两个空单选按钮?
  • 表单应该加载之前通过表单指定的值(用户可以返回、前进、保存和恢复等),但是表单加载时没有选择每个组中的单选按钮,即使 getBoolen 方法为该组(单选按钮名称)返回 true 或 false(通过 eclipse 调试查看)
【解决方案2】:

在 Struts 中,当 Getter 方法接受参数时(我认为这不符合 JavaBean 规范),无法通过 struts 访问类属性。映射属性或索引属性功能(() 和 [])只能用于提交数据,不能用于显示字段。
因此,获取选中属性的唯一方法是使用 JSP 脚本,为此您必须在 JSP 页面 (&lt;bean:define id="form" name="&lt;form name, as it is in struts-config.xml&gt;"/&gt;) 中定义表单对象,然后您将能够编写如下内容: &lt;html:radio property='&lt;%=\"value(" + questionBase + "B)"%&gt;' &lt;%=form.getBoolean(questionBase) ? "checked" : "" %&gt; value="No"&gt;No&lt;/html:radio&gt;
或者你可以使用 JSTL。

【讨论】:

  • 但是复选框(和一些无线电输入)成功地使用了get/setBoolean 方法。
  • 我确实定义了表单对象,抱歉没有将它包含在问题中,现在更新...
【解决方案3】:

尝试在动作类本身中使用您的模态设置表单类的布尔属性,一个struts将在您的jsp加载之前调用

【讨论】:

  • 如果我不明白你的答案,请告诉我,但值的 HashMap 已经由 Action 类设置,这就是 get/setBoolean 方法的来源。
  • 我不确定 如何调用表单类的 get Boolean 方法。我总是将我的表单 bean 设计为在其中包含变量作为 boolean radio1、boolean radio2 等。并在操作类期间设置它的值。基本假设是 HTML:radio 标记将从表单 bean 调用 get"property attribute" 值。所以我的表单 bean 将是返回布尔值的 getRadio1。我的 HTML:radio 的属性属性将是“radio1”
  • 好的,有道理。我会,但是我正在使用的应用程序使用一个 ActionForm 来处理多个表单,因此是键/值的 HashMap。
  • OK 只是一个小提示尝试在您用来检查是否被调用的 getboolean 中添加一个打印行。并且html收音机的Property属性应该是表单Bean的变量名
  • 使用 Eclipse 的调试器观看,看起来 get/setBoolean 方法正在被调用并正确返回 true/false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多