我正在试用MyFaces CODI,它有很棒的特性。一个非常有用的东西是类型安全导航。我可以在我的控制器bean中指定操作方法的结果,如下所示:
public Class<? extends ViewConfig> goBack() {
return Pages.ListView.class;
}这真的很酷,因为每个开发IDE都有过多的重构能力。
但是当我想要使用这个特性时,我在将viewParameter传递给下一个视图时遇到了问题。我必须使用命令按钮来调用此操作方法,如下所示:
<h:commandButton id="backButton" value="#{msgs.Button_Back}"
action="#{viewBean.goBack()}" />如果我使用这个命令按钮,我不能传递参数。一个“普通”按钮或一个链接就可以做到:
<h:button id="backButton" value="#{msgs.Button_Back}" outcome="siteBefore.xhtml">
<f:param name="itemId" value="5" />
</h:button>缺点是“正常”按钮不使用action方法,因此我不能参与CODI类型安全导航的优点。
那么,有没有可能将这两个特性结合起来呢?(传递viewparams和使用类型安全导航)
提前感谢!
发布于 2011-08-20 00:41:07
他们实现了你想要的东西。请参阅https://issues.apache.org/jira/browse/EXTCDI-216
发布于 2011-08-09 03:03:21
@StevenR
CODI在使用类型安全导航时不支持包含viewParams,但是如果你关注他们的问题跟踪系统,它似乎是一个预期的功能:
https://issues.apache.org/jira/browse/EXTCDI-171
从问题的历史记录可以看出,他们最近(大约4周前)更新了状态,可能很快就会包含进来。也许其中一个comitters正在关注这篇文章,并可以更新我们这个新功能的大致时间线?
此外,在JSF规范中还讨论了类型安全导航的特性:
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-977
作为一种变通办法,我建议遵循CODI wiki中的提示(参见下面的部分网址),并使用Pages.ListView.class.getName(),您可以在支持bean的操作方法中连接额外的viewParams。这样,您的导航是类型安全的,并且您可以利用IDE的重构功能。只有参数不是类型安全的...
我建议你使用<f:attribute/>标签,这样你就不必像这样走槽了
String viewParam = "";
for (UIComponent comp : event.getComponent().getChildren()) {
if (comp instanceof UIParameter ) {
UIParameter myParameter = (UIParameter) comp;
if (myParameter.getName().equals("myParameterName")) {
viewParam = myParameter.getValue());
}
}
}
// add your viewParam to the navigation string here这里的缺点是参数的硬编码名称在代码内部的某处。因此,一旦CODI带来了新特性,重构可能是值得的。
cwiki.apache.org/EXTCDI/jsf-usage.html#JSFUsage-TypesafeNavigation
https://stackoverflow.com/questions/6958821
复制相似问题