我想我可以谈谈这个,因为我在这个话题上挣扎了很多。
我们可以在官方文档中找到关于fieldValue
of 的内容<s:checkbox>
:
Name fieldValue
Required FALSE
Default TRUE
Evaluated FALSE
Description The actual HTML value attribute of the checkbox.
但它什么也没说。我建议将其更改为:
有了fieldValue
,我们可以将类型值提交String
到动作类中。
它的意思是:
- 当字符串字面意思是
"true"
or "false"
,并且 action 类中的变量是boolean
type 时,字符串会被自动解析为 boolean 值,存储在boolean
type 变量中。
- 如果我们根本不定义
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>
现在我们将在我的动作类中收到一个数字列表,但具有相同的name
. 然后我们定义一个类型的字段List<String>
或一个数组来接收所有这些用户的 ID:
private List<String> userId;
用它的getter/setter。然后我们可以用这个列表做我们想做的事。请记住,如果我们想用它们进行计算,这些数字必须被解析为 Integer/Long/Whatever you like。
此外,如果我们想在一个复选框中提交“YES/NO”或“1/0”,或“radiant/dire”(你可以命名它,现在你知道我玩什么游戏了),我们可以放一个简单的 JavaScript 函数在onchange
这个复选框的情况下监控它的状态,或者更简单地说,在动作类中解析它的值。
如果我们有:
<s:checkbox id="myCamp" name="myCamp" fieldValue="radiant"></s:checkbox>
在行动课上,我们必须:
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.
******************************我是中江****************** *************
至于value="true"/"false"
,我认为这是一个很好的例子,我们程序员无法正确命名事物并认为每个人都可以理解我们在说什么:)。它可以有一些更清晰的名称,例如preselected
/selectByDefault
等。
同样,参考 Struts 2 DOC,我们有:
Name value
Required FALSE
Default
Evaluated FALSE
Type String
Description Preset the value of input element.
实际上,如果我们输入以下内容会更好:
value
在<s:checkbox>
定义第一次渲染时是否应选中此复选框。(*)
(*) 请注意,如果value
在页面加载完成后发生更改,Struts 2 将不会填充该值<s:checkbox />
来更改其状态。JavaScript 函数负责这部分,例如 AngularJS。
例如,如果我想User
用表单创建一个新用户,并且默认情况下每个用户都active
在创建它时,我们可以这样写:
<s:checkbox name="isActive" id="isActive" value="true"></s:checkbox>
但是,当在编辑用户的形式中,我们想让它在用户活跃时被检查,而不是在用户不活跃时被检查,我们可以这样做:
<s:checkbox name="isActive" id="isActive" value="%{user.isActive}"
所以这是一些使它更容易理解的提示,尽管 DOC 已经明确了(我认为是以作者的方式)。