2

我有两个类,一个是 Action 类MyAction,另一个是 POJO 类User。在里面MyAction,我为User班级做了getter-setter。

然后我有index.jsp用户输入页面。在此,我使用 struts 2push标记存储在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>

但我收到一个错误。如果我删除 push 标签并在User属性前加上user,那么它运行良好。任何人都可以指导我,我错在哪里以及如何push在表单中的输入字段中使用标签。

4

3 回答 3

1

您的代码看起来不错,但要从文本字段发送值,您需要再次将user对象推送到堆栈。params最好在拦截器填充操作之前使用一些拦截器。同样的事情是在做modelDriven拦截器

模型驱动拦截器监视ModelDriven动作并将动作的模型添加到top值堆栈上。

注意:如果您希望将参数应用于模型,则ModelDrivenInterceptor必须在两者之前。StaticParametersInterceptorParametersInterceptor

注意:只有当ModelDrivenInterceptor模型不是时才会将模型推入堆栈null,否则将被忽略。

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

使用ModelDriven方法的例子。

于 2014-10-09T10:03:05.387 回答
1

无论您是否使用<s:push>, <s:set/>,<s:iterator>及其varIteratorStatus属性...:

  • 展现价值,任何方式都是好方式;
  • 发送一个值,唯一name的方法是在属性中指定完整的“路径” 。

例如,可以在 value 属性中使用 push 的对象,但要使其在提交时起作用,仍然需要放入userin 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>在你的情况下使用完全没用。

但是在源和目标不同的用例中,例如。您user.fname从 ActionSource 中读取,并将其值以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>

所以它会做“一些有用的事情”

但根据我的经验,你几乎不会使用 push。如果你需要它,你的数据结构可能太复杂了。

于 2014-10-09T08:57:14.107 回答
0

Push 不是 ui 标签。Push 用于将对象放入值堆栈的顶部。如果您的对象不在堆栈顶部,您可以使用object.attributname. 如果您的对象在值堆栈中,您可以直接访问它attributename

于 2014-10-09T07:29:46.080 回答