JSF redirect to other page

后端 未结 3 1651
醉话见心
醉话见心 2020-12-01 09:47

I have three XHTML pages;

  1. index.xhtml
  2. page_1.xhtml
  3. page_2.xhtml

In the index.xhtml page, I have a commandBu

相关标签:
3条回答
  • 2020-12-01 10:28

    You can also do this, in any part of your code to be redirected to "example.xhtml"

    ExternalContext ec = FacesContext.getCurrentInstance()
            .getExternalContext();
    try {
        ec.redirect(ec.getRequestContextPath()
                + "/faces/jsf/example.xhtml");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    0 讨论(0)
  • 2020-12-01 10:38

    Add two navigation cases as shown below. In the action methods, return outcomes corresponding to the buttons.

                <navigation-rule>
                    <from-view-id>index.html</from-view-id>
                    <navigation-case>
                        <from-outcome>page1</from-outcome>
                        <to-view-id>page_1.xhtml</to-view-id>
                    </navigation-case>
                    <navigation-case>
                        <from-outcome>page2</from-outcome>
                        <to-view-id>page_2.xhtml</to-view-id>
                    </navigation-case>
                </navigation-rule>
    
    0 讨论(0)
  • 2020-12-01 10:46

    Just bind the buttons to different action methods which each return a different outcome.

    <h:commandButton value="Go to page 1" action="#{bean.goToPage1}" />
    <h:commandButton value="Go to page 2" action="#{bean.goToPage2}" />
    

    with

    public String goToPage1() {
        // ...
        return "page_1";
    }
    
    public String goToPage2() {
        // ...
        return "page_2";
    }
    

    Navigation cases are not necessary. JSF 2.0 supports implicit navigation. The navigation outcome can just be the path/filename of the desired target view. The file extension in the outcome is optional.

    If you don't necessarily need to perform any business action on navigation, or you can do it in the (post)constructor of the backing bean of the target page instead, then you can also just put the outcome value in the action directly.

    <h:commandButton value="Go to page 1" action="page_1" />
    <h:commandButton value="Go to page 2" action="page_2" />
    

    A <h:commandButton> will however not perform a redirect, but a forward. The enduser won't see the URL being changed in the browser address bar. The target page isn't bookmarkable. If you can, I'd suggest to use <h:button> instead.

    <h:button value="Go to page 1" outcome="page_1" />
    <h:button value="Go to page 2" outcome="page_2" />
    

    Or if you really need to invoke a business action, but would like to perform a real redirect, then append faces-redirect=true as query string to the outcome value.

    public String goToPage1() {
        // ...
        return "page_1?faces-redirect=true";
    }
    
    public String goToPage2() {
        // ...
        return "page_2?faces-redirect=true";
    }
    

    See also:

    • Communication in JSF 2.0 - Implicit navigation
    • When should I use h:outputLink instead of h:commandLink?
    0 讨论(0)
提交回复
热议问题