如何使用Struts 2 push标签表单输入字段?

时间:2014-10-09 07:21:17

标签: java jsp struts2 ognl struts-tags

我有两个类,一个是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标记作为输入字段。

3 个答案:

答案 0 :(得分:1)

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

  • 显示 一个值,任何方式都是好方法;
  • 发送 一个值, 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 :(得分:1)

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

  

Model-Driven拦截器监视ModelDriven个动作,并在值堆栈的top上添加动作模型。

     

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

     

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

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

The example of using ModelDriven approach

答案 2 :(得分:0)

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

相关问题