我在这里错过了一点。如何使用隐式导航处理JSF 2.0中具有多个结果的请求 例如,使用显式导航,我可以编写以下内容:
<navigation-rule>
<from-view-id>/products/DeleteItem.xhtml</from-view-id>
<navigation-case>
<from-outcome>itemDeleted</from-outcome>
<to-view-id>/products/Success.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>itemNotExist</from-outcome>
<to-view-id>/products/Failure.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
但是如何使用隐式导航实现相同的功能,我尝试了以下内容:
<h:link value="Delete a Product" outcome="Success" />
只提到了一个案例,但我想转发到Success.xhtml或Failure.xhtml,具体取决于结果。
这里有一些隐式导航的附加信息。
托管bean:
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class DeletionBean {
@EJB
private app.session.ProductFacade ejbProductFacade;
private int id=0;
public DeletionBean() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String deleteProduct(){
String result;
result=ejbProductFacade.deleteItem(id);
if(result.equals("success"))
{
status="Successfully performed"; //msg to be shown
return "product/DeleteItem";
}
else return "product/Failure";
}
}
表格:
<h:form>
<table border="1" width="5" cellspacing="1" cellpadding="1">
<tr>
<td> Product ID </td>
<td>
<h:inputText id="pid" size="10" value="#{deletionBean.id}" title="Product ID" required="true" requiredMessage="Product ID required"/>
</td>
</tr>
<tr>
<td colspan="2">
<h:commandLink value="Delete" action="#{deletionBean.deleteProduct}" />
</td>
</tr>
</table>
</h:form>
当前错误消息:
无法找到与from-view-id'/product/DeleteItem.xhtml'匹配的导航案例,以获取结果'product / Failure'的行动'#{deletionBean.deleteProduct}'
答案 0 :(得分:2)
假设您将执行action
方法来删除您的产品,您应该让您的方法返回所需的结果。使用JSF 2,不再需要使用结果ID,即使您可以在 faces-config.xml 文件中声明它们,JSF也会将提供的结果与特定页面联系起来:
<h:commandLink action="#{bean.deleteProduct(product)}"
value="Delete product" />
public String deleteProduct(Product p){
//Try to delete the product and return "products/xxx",
//which will be converted to "/contextname/products/xxx.xhtml"
try{
daoService.delete(p);
return "/products/Success";
catch(Exception e){
return "/products/Failure";
}
}
这将 POST 服务器,其行为类似于HTML表单提交按钮(这就是为什么它被称为commandLink
)。然而,如果您只想对特定视图执行 GET ,您可以在结果中使用其视图ID:
<h:link value="Go to success doing nothing"
outcome="/products/Success" />
另见: