不明白接缝中的传递参数

时间:2009-10-21 15:12:16

标签: java-ee parameters seam

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

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

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

至于参数本身...根据我所见,您可以使用以下三种方法之一传递参数:

  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传递任何参数。怎么可能?
  4. 我确信这个问题显示出很多无知。

    希望你们其中一位雄辩的人能“得到”我所要求的东西并给我一个解释这个过程。

    提前致谢。

    TDR

2 个答案:

答案 0 :(得分:27)

  

如果您没有提交表格   然后,从一个页面到另一个页面   你在做什么?

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

  

我的应用涉及输入信息   在一个表单中,按一下按钮然后   转到显示的新页面   运行查询后的结果。它   好像我看过这个活动   用s:按钮放置

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

home.page.xml包含:

<param name="name" value="#{person.name}"/>

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

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

<s:link value="Go to Page 2" view="/page2.xhtml">
  <f:param name="name" value="#{person.name}"/>
</s:link>

点击该链接并导航至http://mydomain.com/myapp/page2.seam page2.page.xml包含:

<param name="name" value="#{someOtherBean.name}"/>

然后会调用someOtherBean.setName("damo")

Page2可能有一个像这样的s:按钮:

<s:button value="Say Hello" action="#{someOtherBean.sayHello}">
  <f:param name="subject" value="#{someOtherBean.name}"/>
</s:button>

方法可以是:

@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);
  }
}

希望这有帮助!

答案 1 :(得分:2)

这个问题已经有了很好的答案。我只想添加一些额外的信息。

  

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

  1. 已经在@Damo的回答中被提出
  2. 在使用按钮的onclick属性导航到下一页之前,进行客户端验证或运行javascript。
  3. 使用action属性调用bean中的方法。
  4.   

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

    1. 如@ Damo的回答<s:button> / <s:link>所述,我们不会提交表单,因此您可以在第二页运行查询,但肯定没有先前输入的数据。
    2. 但是如果您在第一页中使用了<a4j:support> / <a4j:ajax>标记和输入字段,那么如果您在长时间运行的对话中或者您的bean中,您可以在第二页中访问该数据是会话作用域。如果您在第二页中看到表单数据,则可能是原因。
    3.   

      可以选择将@RequestParameter注释添加到辅助bean。我收集的是,当你在视图中设置f:param时也会使用它。这是否意味着page.xml中的那个被忽略了?

      是的,通过page.xml设置的值将被覆盖。请看下面的例子 假设您的page.xml有以下行。

      <param name="name" value="#{myBean.name}"/>
      

      并且您的bean具有getter属性的settername方法,您可以将变量name定义如下。

      @RequestParameter
      String name;
      

      现在,如果你这样调用这个页面。

      http://...../app_name/home.seam?name=william
      

      将调用setName并将名称property设置为“william”。

      现在假设您像这样定义变量。

      @RequestParameter("userName")
      String name;
      

      并像这样调用页面。

      http://...../app_name/home.seam?name=william&userName=tony
      

      然后调用setName方法并将name属性设置为“william”。但是这个值被“tony”值覆盖了。