我有两个类,一个是Action类MyAction
,另一个是POJO类User
。在MyAction
内,我为User
类制作了getter-setter。
然后我有index.jsp
页面供用户输入。在这里,我使用struts 2 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>
但是我收到了一个错误。如果我删除了推送标记并在User
属性前添加了user
,那么它运行正常。任何人都可以指导我,我错了,以及如何在表单中使用push
标记作为输入字段。
答案 0 :(得分:1)
无论您使用<s:push>
,<s:set/>
,<s:iterator>
及其var
或IteratorStatus
属性......:
name
属性中的完整“路径”。 例如,您可以在value属性中使用推送的对象,但要在提交时使其工作,您仍需要将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>
所以它会完成“有用的东西”。
但根据我的经验,你几乎不会使用推送。如果需要,您的数据结构可能过于复杂。
答案 1 :(得分:1)
您的代码看起来没问题,但要从文本字段发送值,您需要再次将user
对象推送到堆栈。在params
拦截器填充操作之前,最好使用一些拦截器。 model-driven interceptor正在做同样的事情。
Model-Driven拦截器监视
ModelDriven
个动作,并在值堆栈的top
上添加动作模型。注意:如果您希望将参数应用于模型,则
ModelDrivenInterceptor
必须位于StaticParametersInterceptor
和ParametersInterceptor
之前。注意:
ModelDrivenInterceptor
只会在模型不是null
时将模型推入堆栈,否则将被忽略。
您可以使用模型驱动方法为视图和控制器推送模型。您的代码中缺少最后一个。
答案 2 :(得分:0)
Push不是ui标签。 Push用于将对象放入值堆栈的顶部。如果您的对象不在堆栈顶部,则可以使用object.attributname
获取您的值。如果您的对象位于值堆栈中,则可以直接访问attributename
。