我有一个最初由seam-gen生成的Seam应用程序,其中包含View.xhtml。
Search.xhtml有许多输入字段,其中一半绑定到Office实体,一半绑定到Devices实体。
例如,如果输入主机名,它将绑定到“设备”中的字段,如果您输入“城市”,则它将绑定到Office中的字段。
默认情况下,目标网页将为OfficeResult.xhtml,如果已输入“设备”属性,则为DeviceResult.xhtml。
我的问题有两部分:
我应该在Search.xhtml中使用哪个组件作为提交按钮?我假设h:commandButton,但那我该怎么用于动作呢?如果我使用目标视图,是否会被page.xml文件中的导航规则覆盖?
如何设置我的Search.page.xml文件?如何调整参数的导航?
这是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>
答案 0 :(得分:0)
我很难理解导航的工作原理。我终于让我的工作在某种程度上有一些我会尝试的想法:
首先使用pages.xml进行验证,以验证您的导航是否可以使用默认的简单规则集。 /WEB-INF/pages.xml
如果您不确定发生了什么,请启用应用程序的跟踪日志级别,可能是Seam无法找到组件。 如果您没有在components.xml中导入它,则可能找不到2.1#{devicesList ...},除非该组件的名称是devicesList。我的组件使用其完全限定名称com.stackoverflow ...这样做的好处是,您可以避免冲突,但是要访问组件,您必须写出完整路径或执行上述导入。
验证视图ID是否存在(/OfficeResult.xhtml和/DeviceResult.xhtml)
确保每个页面只声明一次
你的commandButton应该是我理解的实际组件。如果你有一个searchAction,那么它将是:
#{searchAction.search}
查看接缝示例,它们运作良好并向您展示如何做很多不同的事情。您可以使用大约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>