Jakarta ee 不了解seam中的传递参数

Jakarta ee 不了解seam中的传递参数,jakarta-ee,parameters,seam,Jakarta Ee,Parameters,Seam,在调试seam应用程序时,我突然意识到我并不真正理解参数传递是如何工作的。下面的术语真的把我弄糊涂了。所以我问这个非常普遍的问题,希望能得到一个很好的解释,什么是有效的,什么是特定的东西 首先,要从一页转到下一页,可以使用h:commandButton或s:button。我知道s:button没有提交表单,但这并不能帮助我理解其中的区别。如果你不是通过从一页转到下一页来提交表格,那么你在做什么 我的应用程序包括在表单中输入信息,点击一个按钮,然后进入一个新页面,在运行查询后显示结果。似乎我已经看

在调试seam应用程序时,我突然意识到我并不真正理解参数传递是如何工作的。下面的术语真的把我弄糊涂了。所以我问这个非常普遍的问题,希望能得到一个很好的解释,什么是有效的,什么是特定的东西

首先,要从一页转到下一页,可以使用h:commandButton或s:button。我知道s:button没有提交表单,但这并不能帮助我理解其中的区别。如果你不是通过从一页转到下一页来提交表格,那么你在做什么

我的应用程序包括在表单中输入信息,点击一个按钮,然后进入一个新页面,在运行查询后显示结果。似乎我已经看到这个活动是用s:button进行的,那么如果它不是“提交表单”,那又如何呢?我觉得我错过了一些基本的东西

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

  • f:参数。这似乎在与s:button的组合中比与h:commandbutton的组合中更常见。为什么呢
  • 此外,还可以使用page.xml文件“传递”(或其他)参数。该参数似乎必须同时出现在source page.xml和target page.xml中,才能显示在URL中
  • 最后,可以选择将@RequestParameter注释添加到支持bean中。我推测,当您在视图中设置f:param时,也会使用该选项。这是否意味着page.xml中的内容会被忽略?我注意到在seam发行版的注册示例中,填充用户bean时没有通过page.xml为f:param传递任何参数。这怎么可能
  • 我相信这个问题暴露出许多无知

    希望你们中有一位能言善辩的人能“理解”我的要求,并对这个过程给我一个解释

    提前谢谢

    TDR

    如果您没有在 从一页转到下一页,然后 你在干什么

    导航到其他页面而不提交任何表单字段

    我的应用程序包括输入信息 在表单中,点击一个按钮,然后 转到显示的新页面 运行查询后的结果。信息技术 看来我已经看到了这项活动 用s:按钮放置

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

    f:param 与s:按钮/链接一起使用更频繁,因为这些按钮/链接通常用于导航。可以使用f:param将已填充的值传递到另一个页面。h:commandButton/链接用于提交表单,因此值位于表单字段中。当然,没有什么可以阻止您使用f:param来实现此目的

    page.xml 此处使用的参数用于将请求参数应用于模型,反之亦然

    @请求参数 可以与上述所有参数一起使用,但与page.xml参数一起使用时有点毫无意义,因为它们可以用于执行相同的任务

    例子 如果从本页开始:

    http://mydomain.com/myapp/home.seam?name=damo
    
    并且home.page.xml具有:

    <param name="name" value="#{person.name}"/>
    
    <param name="name" value="#{someOtherBean.name}"/>
    
    当您单击链接并导航到 而page2.page.xml具有:

    <param name="name" value="#{person.name}"/>
    
    <param name="name" value="#{someOtherBean.name}"/>
    
    方法可以是:

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

    希望这有帮助

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

    如果你不是通过从一页转到下一页来提交表格,那么你在做什么?

  • 已经在@Damo的回答中解释了
  • 在导航到下一页之前,使用按钮的
    onclick
    属性执行客户端验证或运行javascript
  • 使用
    action
    属性调用bean中的方法
  • 我的应用程序包括在表单中输入信息,点击一个按钮,然后进入一个新页面,在运行查询后显示结果。似乎我已经看到这个活动发生在s:button上

  • 如@Damo的回答中所述,
    /
    没有提交表单,因此您可以在第二页运行查询,但肯定没有以前输入的数据
  • 但是,如果您在第一页的输入字段中使用了
    /
    标记,那么如果您在长时间运行的对话中,或者如果您的bean是会话范围的,那么您可以在第二页访问该数据。如果您在第二页中看到表单数据,这可能就是原因
  • 可以选择向支持bean添加@RequestParameter注释。我推测,当您在视图中设置f:param时,也会使用该选项。这是否意味着page.xml中的内容会被忽略

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

    <param name="name" value="#{myBean.name}"/>
    
    现在,如果你像这样调用页面

    http://...../app_name/home.seam?name=william
    
    http://...../app_name/home.seam?name=william&userName=tony
    
    将调用
    setName
    ,并将name
    属性设置为“william”

    现在假设您这样定义变量

    @RequestParameter("userName")
    String name;
    
    然后像这样调用页面

    http://...../app_name/home.seam?name=william
    
    http://...../app_name/home.seam?name=william&userName=tony
    
    然后仍然调用
    setName
    方法,并将
    name
    属性设置为“william”。但是这个值被值“tony”覆盖