Struts 2复选框:当fieldValue只能为true或false时,value属性的用途是什么?

Dau*_*aud 2 java checkbox struts struts2

  • 为什么我们需要一个value属性以及tag中的fieldValue属性s:checkbox,不像s:textfield只有value属性?

  • s:checkbox标签的fieldValue属性是否允许" true "或" false " 以外的字符串?在Struts2 in Action(Manning)中,它描述了fieldValue属性

复选框将提交的实际值.也许是真是假

也就是说,如果我使用

<s:checkbox name="wantMoreChocolates" fieldValue="true"/>

那么wantMoreChocolate只能是java类中的布尔类型.在这种情况下,为什么文档将fieldValue的类型指定为String而不是Boolean

  • 而且,关于价值属性,它说

与其他UI组件一样,value属性指向组件绑定到的实际Java端属性,在本例中为布尔值.

如果通过" value "我们指定组件绑定到的实际属性,那么name属性的作用是什么.因为name属性必须指向一个布尔值,为什么它必须使用value属性将它绑定到另一个布尔值?

  • 为什么不能仅根据与name属性对应的属性进行预填充

Wes*_*Gun 7

我想我可以对此有所了解,因为我在这个话题上遇到了很多困难.

我们在官方文档中可以找到的内容fieldValue<s:checkbox>:

Name           fieldValue
Required       FALSE
Default        TRUE
Evaluated      FALSE
Description    The actual HTML value attribute of the checkbox.
Run Code Online (Sandbox Code Playgroud)

但它没有说什么.我建议把它改成:

有了fieldValue,我们可以将一个String类型值提交到动作类中.

它的意思是:

  • 当字符串字面上是"true"或者"false",并且动作类中的变量是boolean类型时,字符串将自动解析为布尔值以存储在boolean类型变量中.
  • 如果我们根本没有定义fieldValue,那么"true"字符串类型的默认值总是提交给变量,如果Action类中有任何定义来保存它.

请注意,如果我们已fieldValue设置,但未选中复选框,则不会向后端发送任何内容,这意味着String接收复选框值的类型字段将为null.

但是,它可以做更多的事情.让我们看一个结合<s:checkbox />Struts 2 Action类字段的命名规则的真实示例.

想象一下,我有一个复选框列表,例如,要选择的用户列表,每个复选框都包含idUser要处理的复选框.现在如果我想解析多个idUser来完成我的任务,我可以定义:

<s:iterator value="listUsers">
    <s:checkbox name="userId" id="userId" fieldValue="%{idUser}"
    ....
</s:iterator>
Run Code Online (Sandbox Code Playgroud)

现在我们将在动作类中收到一个数字列表,但是相同name.然后我们定义一个类型List<String>或数组的字段来接收用户的所有这些ID:

private List<String> userId;
Run Code Online (Sandbox Code Playgroud)

用它的吸气剂/二传手.然后我们可以用这个列表做我们想做的事情.请记住,如果我们想用它们进行计算,必须将这些数字解析为Integer/Long /无论你喜欢什么.

此外,如果我们想在一个复选框中提交"YES/NO"或"1/0"或"radiant/dire"(你给它命名,现在你知道我玩的是什么游戏),我们可以放一个简单的JavaScript函数在onchange此复选框的事件来监视其状态,或者更简单地说,分析它的动作类值.

如果我们有:

<s:checkbox id="myCamp" name="myCamp" fieldValue="radiant"></s:checkbox>
Run Code Online (Sandbox Code Playgroud)

在行动课中,我们必须:

String myCampString = null;
if (StringUtils.isBlank(myCamp)){  //myCamp = null, means I am in Dire.
    myCampString = "dire";
} else if (myCamp.equalsIgnoreCase("radiant")){ //myCamp = "radiant", means I am in Radiant.
    myCampString = "radiant";
}
// then we process myCampString, now it cannot be null.
Run Code Online (Sandbox Code Playgroud)

***************************我是中间河*******************************

至于value="true"/"false",我认为这是一个很好的例子,我们程序员不能正确地命名并认为每个人都能理解我们在谈论的内容:).它可以有一些更明确的名称,如preselected/ selectByDefault等.

再次,重新启动Struts 2 DOC,我们有:

Name         value
Required     FALSE
Default  
Evaluated    FALSE
Type         String
Description  Preset the value of input element.
Run Code Online (Sandbox Code Playgroud)

实际上,如果我们提出以下情况会更好:

value<s:checkbox>定义是否呈现时首次此复选框应进行检查.(*)

(*)请注意,如果value在完成加载页面后进行更改,Struts 2将不会将值填充到其中<s:checkbox />以更改其状态.JavaScript函数负责此部分,例如AngularJS.

例如,如果我想User用表单创建一个新的,并且默认情况下每个用户都是active在创建它时,我们可以这样做:

    <s:checkbox name="isActive" id="isActive" value="true"></s:checkbox>
Run Code Online (Sandbox Code Playgroud)

但是,当以编辑用户的形式,我们希望在用户处于活动状态时进行检查,并且在未处于活动状态时不进行检查,我们可以这样做:

<s:checkbox name="isActive" id="isActive" value="%{user.isActive}"
Run Code Online (Sandbox Code Playgroud)

所以这是一些让它更容易理解的技巧,尽管DOC已经明确了(我认为这是作者的方式).