如何在 Struts 2 中使用 <s:push> 标签作为表单输入字段?

问题描述 投票:0回答:3

我有两个类,一个是

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>
标签。

java jsp struts2 ognl struts-tags
3个回答
1
投票

无论您使用

<s:push>
<s:set/>
<s:iterator>
及其
var
IteratorStatus
属性... :

  • 显示一个值,任何方式都是好方式;
  • 发送一个值,only方式是在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
投票
您的代码看起来不错,但要从文本字段发送值,您需要再次将

user

 对象推入堆栈。最好在 
params
 拦截器填充操作之前使用一些拦截器来完成此操作。同样的事情正在做 
modelDriven
 拦截器
.

模型驱动拦截器监视

ModelDriven

 操作,并将操作的模型添加到值堆栈的 
top
 上。

注意: 如果要将参数应用于模型,ModelDrivenInterceptor

 必须位于 
StaticParametersInterceptor
ParametersInterceptor
 之前。

注意: ModelDrivenInterceptor

只会在模型不是
null
时才会将模型压入堆栈,否则将被忽略。

您可以使用模型驱动的方法,它为视图和控制器推送模型。您的代码中缺少最后一个。

使用ModelDriven

方法的示例


0
投票
Push 不是 ui 标签。 Push 用于将对象放入值堆栈的顶部。如果您的对象不在堆栈顶部,您可以使用

object.attributname

 获取值。如果你的对象在值栈中,你可以直接访问它
attributename

© www.soinside.com 2019 - 2024. All rights reserved.