我使用JBoss AS/WildFly与JSF 2.2。这是faces-config.xml文件的一个示例。从我的起始页(菜单页)的结果,我想调用下一个,to-view-id使用EL。
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<!-- Sales -->
<navigation-case>
<from-outcome>AUFTRAGSSUCHE</from-outcome>
<to-view-id>#{salesOrders.start()}</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>AUFTRAGSERFASSUNG</from-outcome>
<to-view-id>#{salesOrderEntry.start()}</to-view-id>
</navigation-case>
</navigation-rule>
可以工作,但问题是,用户在之前的所有情况下都选择了AUFTRAGSERFASSUNG,这里只评估了AUFTRAGSSUCHE。虽然结果是不同的。实际上,导航案例的列表要长得多。如果用户选择开始最后一个条目,则计算之前的所有其他条目。意味着bean被实例化,…这不是一件无足轻重的事情。所以你可以感觉到不同,第一个菜单项开始快,最后一个非常慢。
为什么要对这些EL表达式求值?我能把这个关掉吗?还有其他建议吗?
阅读mojorra 2.2源代码,很明显,无论观察到的from-outcome是什么,都要对to-view-id进行评估。没有其他方法可以配置。
为什么el表达式首先在那里?你是否做了一些动作然后返回视图id?
一个更好的方法可能是使用视图操作:
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<!-- Sales -->
<navigation-case>
<from-outcome>AUFTRAGSSUCHE</from-outcome>
<to-view-id>/sales-order/start.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
然后在/sales-order/start.xhtml中这样做:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h=" "
xmlns:f=" ">
<f:metadata>
<f:viewAction action="#{salesOrders.start}"/>
</f:metadata>
<h:head>
<title>Sales Order Start< /title>
</h:head>
<h:body>
<!-- Sales order page here -->
</h:body>
</html>
我们只需让salesorder。start()返回void