我有两个类,一个是
Action
类MyAction
,另一个是POJO类User
。在 MyAction
内部,我为 User
类制作了 getter-setter。
然后我有
index.jsp
页面供用户输入。在此,我使用 Struts 2 <s:push>
标签来存储在 User
类中的属性。它看起来像这样:
<s:form action="go" method="post">
<s:push value="user">
<s:textfield name="id" label="usr-id"/> <!-- user.id -->
<s:textfield name="fname" label="first-name"/> <!-- user.fname -->
</s:push>
<s:submit/>
<s:token/>
</s:form>
但我收到错误。如果我删除
<s:push>
标签并为 User
属性添加 user
前缀,那么它就可以正常运行。任何人都可以指导我,我错在哪里以及如何在表单中的输入字段中使用 <s:push>
标签。
无论您使用
<s:push>
、<s:set/>
、<s:iterator>
及其 var
或 IteratorStatus
属性... :
name
属性中指定完整的“路径”。
user
放在 name 属性中:
<s:push value="user">
<s:textfield name="user.id" value="id" /> <!-- user.id -->
<s:textfield name="user.fname" value="fname"/> <!-- user.fname -->
</s:push>
这使得在您的情况下使用
<s:push>
完全没有用。但是在源和目标不同的用例中,例如。您从 ActionSource 读取
user.fname
,并将其值以
selectedFname
字符串形式发送到 ActionDestination,jsp 将是
<s:push value="user">
<s:textfield name="selectedId" value="id" /> <!-- user.id -->
<s:textfield name="selectedFname" value="fname"/> <!-- user.fname -->
</s:push>
所以它会做
“有用的事情”。
但根据我的经验,你不会几乎从不使用推送。如果您需要它,您的数据结构可能太复杂了。
user
对象推入堆栈。最好在
params
拦截器填充操作之前使用一些拦截器来完成此操作。同样的事情正在做
modelDriven
拦截器.
模型驱动拦截器监视您可以使用模型驱动的方法,它为视图和控制器推送模型。您的代码中缺少最后一个。
ModelDriven
操作,并将操作的模型添加到值堆栈的top
上。注意: 如果要将参数应用于模型,
ModelDrivenInterceptor
必须位于StaticParametersInterceptor
和ParametersInterceptor
之前。注意:
ModelDrivenInterceptor
只会在模型不是null
时才会将模型压入堆栈,否则将被忽略。
方法的示例。
object.attributname
获取值。如果你的对象在值栈中,你可以直接访问它
attributename
。