MyFaces Core
  1. MyFaces Core
  2. MYFACES-3313

Calculation of redirect URL does not preserve the extension used in Faces Servlet mapping

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 2.1.2, 2.1.3
    • Fix Version/s: 2.0.10, 2.1.4
    • Component/s: None
    • Labels:
      None

      Description

      I have a simple navigation test case that does a navigation between two pages. Both pages have the same simple markup:

      <h:body>
      <h2>Page 01</h2>
      <h:form>
      <h:commandButton id="navButton"
      value="Nav"
      action="#

      {testBean.lastPage}

      " />
      </h:form>
      </h:body>

      The backing bean methods simply return the appropriate action outcome:

      public String lastPage()

      { return "lastPage"; }

      And the faces-config file has the following navigation rules:

      <navigation-rule>
      <from-view-id>*</from-view-id>
      <navigation-case>
      <from-outcome>lastPage</from-outcome>
      <to-view-id>/page02.jsf</to-view-id>
      <redirect/>
      </navigation-case>

      <navigation-case>
      <from-outcome>firstPage</from-outcome>
      <to-view-id>/page01.jsf</to-view-id>
      <redirect/>
      </navigation-case>
      </navigation-rule>

      The web.xml has a servlet mapping for .jsf files:

      <servlet-mapping>
      <servlet-name>Faces Servlet</servlet-name>
      <url-pattern>*.jsf</url-pattern>
      </servlet-mapping>

      If I go to the page01.jsf, the page loads fine. When I click the "Nav" button, the navigation occurs but the URL is page02.xhtml rather than page02.jsf. Because the extension is not preserved and there is no mapping for .xhtml in this case, the page doesn't get handled by the Faces Servlet. The current version of Mojarra (2.1.3) does preserve the extension when the redirect URL is encoded.

        Activity

        Hide
        Leonardo Uribe added a comment -

        I checked the spec finally I found this on section JSF 2.0 section 7.5.2 Default ViewHandler Implementation:

        "... The getActionURL() method must fulfill the following responsibilities: ...
        .... If the argument viewId has an extension, and this extension is mapping, the result is contextPath + viewId. For example “/cardemo/chooseLocale.faces" ..."

        So the example proposed is on the spec. I agree use /page01.jsf is bad practice because the effective viewId when the view is created is /page01.xhtml . It is a long story, but at the end a change was introduced in JSF 2.1 to differentiate between physical and logical view ids (ViewHandler.deriveLogicalViewId).

        Anyway, since this is described on the spec we should fix our implementation of getActionURL() method.

        Show
        Leonardo Uribe added a comment - I checked the spec finally I found this on section JSF 2.0 section 7.5.2 Default ViewHandler Implementation: "... The getActionURL() method must fulfill the following responsibilities: ... .... If the argument viewId has an extension, and this extension is mapping, the result is contextPath + viewId. For example “/cardemo/chooseLocale.faces" ..." So the example proposed is on the spec. I agree use /page01.jsf is bad practice because the effective viewId when the view is created is /page01.xhtml . It is a long story, but at the end a change was introduced in JSF 2.1 to differentiate between physical and logical view ids (ViewHandler.deriveLogicalViewId). Anyway, since this is described on the spec we should fix our implementation of getActionURL() method.
        Hide
        Michael Kurz added a comment -

        I would say this is not a MyFaces bug. The problem here is, that you use /page01.jsf and /page02.jsf in <to-view-id>. But those values are NOT the view IDs of your views but the mapped url in the browser. The view IDs are /page01.xhtml and /page02.xhtml.

        IMO, this issue can be closed as invalid.

        Show
        Michael Kurz added a comment - I would say this is not a MyFaces bug. The problem here is, that you use /page01.jsf and /page02.jsf in <to-view-id>. But those values are NOT the view IDs of your views but the mapped url in the browser. The view IDs are /page01.xhtml and /page02.xhtml. IMO, this issue can be closed as invalid.
        Hide
        Deryk Sinotte added a comment -

        The issue is consistent when using partial page rendering as well. The update that returns from:

        MyFaces: <?xml version="1.0" encoding="utf-8"?><partial-response><redirect url="/my/page.xhtml"></redirect></partial-response>

        Mojarra: <?xml version='1.0' encoding='UTF-8'?><partial-response><redirect url="/mo/page.jsf"></redirect></partial-response>

        Show
        Deryk Sinotte added a comment - The issue is consistent when using partial page rendering as well. The update that returns from: MyFaces: <?xml version="1.0" encoding="utf-8"?><partial-response><redirect url="/my/page.xhtml"></redirect></partial-response> Mojarra: <?xml version='1.0' encoding='UTF-8'?><partial-response><redirect url="/mo/page.jsf"></redirect></partial-response>

          People

          • Assignee:
            Leonardo Uribe
            Reporter:
            Deryk Sinotte
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development