使用JSF 2.0进行隐式导航的多个结果

时间:2013-12-19 07:10:08

标签: jsf-2

我在这里错过了一点。如何使用隐式导航处理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}'

1 个答案:

答案 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" />

另见:

Implicit navigation in JSF 2