不明白接缝中的传递参数

apr*_*l26 13 parameters seam java-ee

当我调试我的接缝应用程序时,我突然意识到我并不真正理解参数传递的工作原理.以下术语让我很困惑.所以我在问这个非常普遍的问题,希望能够很好地解释什么与什么以及某些事物的作用有什么关系.

首先,要从一个页面到下一个页面,您可以使用h:commandButton或s:按钮.我理解s:按钮不提交表单,但这并不能帮助我理解差异.如果您没有通过从一个页面到下一个页面提交表单,那么您在做什么?

我的应用程序涉及在表单中输入信息,点击按钮然后转到运行查询后显示结果的新页面.我似乎已经看到这个活动是用s:按钮进行的​​,那么如果它不是"提交表单"怎么办呢?我觉得我在这里缺少一些基本的东西.

至于参数本身...从我看到的你可以使用3种方法之一传递参数:

  1. F:PARAM.这似乎更常发生在使用s:button而不是h:commandbutton的组合中.这是为什么?
  2. 此外,您可以使用page.xml文件"传递"(或某些)参数.该参数似乎必须同时出现在源page.xml和目标page.xml中,以使其显示在URL中.
  3. 最后,可以选择将@RequestParameter注释添加到您的支持bean.我收集的是,当你在视图中设置f:param时也会使用它.这是否意味着page.xml中的那个被忽略了?我注意到在seam分布的注册示例中,用户bean被填充而没有通过page.xml为f:param传递任何参数.怎么可能?

我敢肯定,这个问题揭示了很多无知.

希望你们中的一个有说服力的人会"得到"我所要求的东西并给我一个解释这个过程的方法.

提前致谢.

TDR

Dam*_*amo 27

如果您没有通过从一个页面到下一个页面提交表单,那么您在做什么?

导航到另一个页面而不提交任何表单字段.

我的应用程序涉及在表单中输入信息,点击按钮然后转到运行查询后显示结果的新页面.我似乎已经看到这个活动发生在s:button

s:按钮不会提交表单,因此页面上的值不会应用于模型.您必须使用commandButton/Link.您可能看到的活动是将已填充的值传递给另一个页面.

F:PARAM

经常使用s:button/link,因为这些通常用于导航.您可以使用f:param将已填充的值传递到另一个页面.h:commandButton/Link用于提交表单,因此值在表单字段中.当然没有什么能阻止你使用f:param来实现这一点.

page.xml

这里使用的参数用于将请求参数应用于模型,反之亦然.

@RequestParameter

可以与上述所有内容结合使用,但与page.xml params一起使用时有点无意义,因为它们可用于执行相同的工作

如果您从这个页面开始:

http://mydomain.com/myapp/home.seam?name=damo
Run Code Online (Sandbox Code Playgroud)

home.page.xml有:

<param name="name" value="#{person.name}"/>
Run Code Online (Sandbox Code Playgroud)

然后,当加载页面时,person.setName("damo")将调用URL,因为URL中存在匹配的请求参数.

您可以将param的值存储在下一页的链接中:

<s:link value="Go to Page 2" view="/page2.xhtml">
  <f:param name="name" value="#{person.name}"/>
</s:link>
Run Code Online (Sandbox Code Playgroud)

单击链接并导航到http://mydomain.com/myapp/page2.seam 并且page2.page.xml具有:

<param name="name" value="#{someOtherBean.name}"/>
Run Code Online (Sandbox Code Playgroud)

然后someOtherBean.setName("damo")将被召唤.

Page2可能有:像这样的按钮:

<s:button value="Say Hello" action="#{someOtherBean.sayHello}">
  <f:param name="subject" value="#{someOtherBean.name}"/>
</s:button>
Run Code Online (Sandbox Code Playgroud)

方法可以是:

@Name("someOtherBean")
public class SomeOtherBean {

  @RequestParameter("subject")  //same value as the 'name' in f:param
  private String subject;

  public void sayHello() {
    System.out.println("Hello "+subject);
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!