如何在参数的接缝中调节导航

时间:2009-06-30 16:22:18

标签: navigation seam

我有一个最初由seam-gen生成的Seam应用程序,其中包含View.xhtml。

Search.xhtml有许多输入字段,其中一半绑定到Office实体,一半绑定到Devices实体。

例如,如果输入主机名,它将绑定到“设备”中的字段,如果您输入“城市”,则它将绑定到Office中的字段。

默认情况下,目标网页将为OfficeResult.xhtml,如果已输入“设备”属性,则为DeviceResult.xhtml。

我的问题有两部分:

  1. 我应该在Search.xhtml中使用哪个组件作为提交按钮?我假设h:commandButton,但那我该怎么用于动作呢?如果我使用目标视图,是否会被page.xml文件中的导航规则覆盖?

  2. 如何设置我的Search.page.xml文件?如何调整参数的导航?

  3. 这是Search.xhtml(伪代码):

    <h:inputText value="#{devicesList.devices.devSerialNum}" />
    <h:inputText id="state" value="#{officeList.office.state}" />
    
    <h:commandButton id="search" action="/OfficeResult.xhtml" value="Search"  />
    

    Search.page.xml(伪代码):

    <navigation>
      <rule if devSerNum is set >
    <redirect view-id="/DeviceResult.xhtml"/>
      </rule>
      <rule if state is set >
        <redirect view-id="/OfficeResult.xhtml"/>
      </rule>
    </navigation>
    

2 个答案:

答案 0 :(得分:0)

我很难理解导航的工作原理。我终于让我的工作在某种程度上有一些我会尝试的想法:

  1. 首先使用pages.xml进行验证,以验证您的导航是否可以使用默认的简单规则集。 /WEB-INF/pages.xml

  2. 如果您不确定发生了什么,请启用应用程序的跟踪日志级别,可能是Seam无法找到组件。 如果您没有在components.xml中导入它,则可能找不到2.1#{devicesList ...},除非该组件的名称是devicesList。我的组件使用其完全限定名称com.stackoverflow ...这样做的好处是,您可以避免冲突,但是要访问组件,您必须写出完整路径或执行上述导入。

  3. 验证视图ID是否存在(/OfficeResult.xhtml和/DeviceResult.xhtml)

  4. 确保每个页面只声明一次

  5. 你的commandButton应该是我理解的实际组件。如果你有一个searchAction,那么它将是:

    #{searchAction.search}

  6. 查看接缝示例,它们运作良好并向您展示如何做很多不同的事情。您可以使用大约130 MB的接缝源代码下载它们,包括所有这些示例。

    沃尔特

答案 1 :(得分:0)

如果我正确理解你的问题,并根据你目前的设计,我相信你可以做类似的事情:

您的 Search.xhtml 文件:

<h:inputText value="#{devicesList.devices.devSerialNum}" />
<h:inputText id="state" value="#{officeList.office.state}" />

<h:commandButton id="search" action="#{devicesList.isDeviceSearch()}" value="Search"  />

DevicesList.java 文件

添加新方法
@Name("devicesList")
public class DevicesListImpl implements DevicesList {

    ...other properties and methods...

    public boolean isDeviceSearch() {

        boolean result;

        ...logic to determine if the search value exists...

        return result;

    }
}

然后在 Search.page.xml 文件中:

<navigation from-action="#{devicesList.isDeviceSearch()}">
    <rule if-outcome="true">
        <redirect view-id="/DeviceResult.xhtml" />
    </rule>

    <redirect view-id="/OfficeResult.xhtml" />
</navigation>