2014-10-09 54 views
2

我有两个类一个是行动类MyAction和其他是POJO类User。在MyAction里面,我做了User类的getter-setter。如何在表单输入字段中使用Struts 2推标签?

然后我有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

您的帮助在这里:http://www.mkyong.com/struts2/struts-2-push-tag-example/ – Imran 2014-10-09 07:23:52

+0

谢谢@Imran。所以根据mkyong的说法,我们必须先创建'bean',然后将这个bean引用到'push'的值。你的(mkyong)解决方案很好,但是没有直接的方法吗?假设,我有一个很长的OGNL表达式,比如'user.address.city' ...如何实现这个。我知道我听起来很生气,但是能否帮助我在长链标签中使用OGNL。 – JPG 2014-10-09 07:40:13

+0

抱歉打断你@伊姆兰,但是谢谢。我清除了我的困惑。祝你今天愉快! – JPG 2014-10-09 07:48:09

回答

0

推并不是一个UI标签。 Push用于将对象放入值栈顶部。如果你的对象不在栈顶,你可以使用object.attributname来获得你的值。如果你的对象在值栈中,你可以直接访问它attributename

1

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

  • 显示值,任何方式是一个很好的方式;
  • 发送的值,则仅方式被指定完整的“路径”,在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,并将其值发送到ActionDestination在selectedFname字符串中,JSP将

<s:push value="user"> 
    <s:textfield name="selectedId" value="id" />  <!-- user.id --> 
    <s:textfield name="selectedFname" value="fname"/>  <!-- user.fname --> 
</s:push> 

所以会做“有用的东西”

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

+0

谢谢@Andrea。我想问一下,我可以使用'push'标签和'bean'标签。就像首先用'var'属性为'User'类创建一个bean,然后将其引用到'push'值。这里是我得到这个逻辑的链接:http://www.mkyong.com/struts2/struts-2-push-tag-example/ – JPG 2014-10-09 09:08:00

+1

我几乎从不使用(并且,在你问之前, )标签。这本身并不是一个坏习惯,我只是认为它是思考方式的一种旧方式。我多年前就用过它们,我再也不需要了。 – 2014-10-09 09:10:02

+2

@JSK我看到了未来:[*和,在你问之前, *](http://stackoverflow.com/q/26291223/1654265):D PS:如果你发现答案有用,请考虑对它进行投票。 – 2014-10-10 08:24:42

1

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

模型驱动拦截手表ModelDriven行动,并增加值堆的top作用的模型。

注:如果你想要的参数被应用到模型的ModelDrivenInterceptor必须拿出两个StaticParametersInterceptorParametersInterceptor之前。

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

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

The example of using ModelDriven approach

+0

谢谢@roman在某种程度上清除我的疑惑。是的,我使用过'ModelDrivenInterceptor'。这里我只是想了解'push'标签是如何工作的。为了通过'push'内的'properties'标签接收数据,没有问题。但是,当我尝试使用相同的'push'标签发送数据时出现错误。所以,根据你的理解是:当我按下提交按钮时,'param'拦截器在这里触发,并且它(param)再次重新初始化值栈。从而忽略推送的对象。我错了还是对吗? – JPG 2014-10-09 11:09:31

+1

推送的对象从标签末尾的堆栈弹出,让您不快。同时提交表单需要一个新的请求到服务器,以及新的动作上下文和值栈。 – 2014-10-09 11:19:04

+0

噢,它从''的堆栈中弹出。随着你的神奇评论,现在毫无疑问,我现在很开心。谢谢。 :)另外,你能否稍微解释一下,为什么'push'标签神秘地开始工作时,结合s:bean'标签。像这里http://www.mkyong.com/struts2/struts-2-push-tag-example/ – JPG 2014-10-09 11:32:08

相关问题