Смешивание JSP и XHTML (Facelets) в проекте JSF2 - возможно? - PullRequest
9 голосов
/ 14 октября 2010

У меня есть клиент, который хочет использовать JSF2, и им нравится, что XHTML теперь используется по умолчанию (Facelets).

Тем не менее, они имеют огромное количество "устаревших" JSP из своей кодовой базы JSF1.x.

Я знаю, что это, вероятно, нежелательно, но можно ли будет поддерживать сочетание обоих в JSF2, по крайней мере, в течение переходного периода, пока они переносятся?

Я знаю, что было возможно смешать их в JSF1.x, но я не могу найти информацию об этом в JSF2.

Я много гуглил, но, естественно, все внимание JSF2 сосредоточено на Facelets. Также моя короткая попытка микширования (я не эксперт в JSF!) Привела к провалу.

Ответы [ 3 ]

12 голосов
/ 15 октября 2010

Ответ на этот вопрос в FAQ о Facelets : используйте префиксное сопоставление на FacesServlet. Затем вы можете получить доступ к страницам JSP по http://example.com/faces/page.jsp и по страницам Facelets по http://example.com/faces/page.xhtml. Вот пример релевантности:

Как использовать Facelets и JSP в одном приложении?

Чтобы это работало, вы должны использовать префиксное сопоставление для страниц Facelets. Оставьте DEFAULT_SUFFIX с JSF по умолчанию .jsp. Настройте параметр VIEW_MAPPINGS Facelet:

<web-app>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jsp</param-value>
    </context-param>

    <!-- Facelets pages will use the .xhtml extension -->
    <context-param>
        <param-name>facelets.VIEW_MAPPINGS</param-name>
        <param-value>*.xhtml</param-value>
    </context-param>     

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>

    <!-- Use prefix mapping for Facelets pages, e.g. http://localhost:8080/webapp/faces/mypage.xhtml -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
</web-app>
3 голосов
/ 12 апреля 2013

Раздел вики, цитируемый BalusC, действительно устарел.В моей настройке сопоставления расширений (* .faces) у меня была проблема с предложенным javax.faces.DEFAULT_SUFFIX, установленным на .jsp, из-за которого сгенерированные URL-адреса действий внутри тегов формы страниц * .xhtml получили расширение .jsp вместо расширения .faces (ипоэтому не может быть отображен).

После того, как я вошел в соответствующие классы реализации Apache MyFaces 2.x (см. org.apache.myfaces.shared.application.DefaultViewHandlerSupport.calculateActionURL (контекст FacesContext,String viewId) ) следующие настройки оказались работающими при параллельном использовании JSP и Facelet View Handling.

Как использовать Facelets и JSP в одном приложении?

Кроме тогоПрефиксное сопоставление Вы можете использовать расширение сопоставления (например, * .faces) для страниц Facelets, чтобы это работало.Оставьте DEFAULT_SUFFIX с JSF по умолчанию .jsp .xhtml.Настройте параметр VIEW_MAPPINGS Facelet:

<web-app>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jsp .xhtml</param-value>
    </context-param>

    <!-- Facelets pages will use the .xhtml extension -->
    <context-param>
        <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
        <param-value>*.xhtml</param-value>
    </context-param>     

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>

    <!-- use extension mapping in this sample -->
    <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
</web-app>

Для тех, кто интересуется деталями обработки URL-адресов действий внутри org.apache.myfaces.shared.application.DefaultViewHandlerSupport.calculateActionURL (контекст FacesContext, String viewId):

        if ( mapping.isExtensionMapping() ) {
            // See JSF 2.0 section 7.5.2
            String[] contextSuffixes = _initialized ? _contextSuffixes : getContextSuffix( context );
            boolean founded = false;
            for ( String contextSuffix : contextSuffixes ) {
                if ( viewId.endsWith( contextSuffix ) ) {
                    builder.append( viewId.substring( 0, viewId.indexOf( contextSuffix ) ) );
                    builder.append( mapping.getExtension() );
                    founded = true;
                    break;
                }
            }
            if ( !founded ) {
                // See JSF 2.0 section 7.5.2
                // - If the argument viewId has an extension, and this extension is mapping,
                // the result is contextPath + viewId
                //
                // -= Leonardo Uribe =- It is evident that when the page is generated, the
                // derived
                // viewId will end with the
                // right contextSuffix, and a navigation entry on faces-config.xml should use
                // such id,
                // this is just a workaroud
                // for usability. There is a potential risk that change the mapping in a webapp
                // make
                // the same application fail,
                // so use viewIds ending with mapping extensions is not a good practice.
                if ( viewId.endsWith( mapping.getExtension() ) ) {
                    builder.append( viewId );
                } else if ( viewId.lastIndexOf( "." ) != -1 ) {
                    builder.append( viewId.substring( 0, viewId.lastIndexOf( "." ) ) );
                    builder.append( contextSuffixes[0] );
                } else {
                    builder.append( viewId );
                    builder.append( contextSuffixes[0] );
                }
            }
        } else {
            builder.append( mapping.getPrefix() );
            builder.append( viewId );
        }
1 голос
/ 30 ноября 2011

Вышеуказанное предложение не сработало для меня.Страница вики, вероятно, устарела.Из спецификации JSF2 я получил следующий работающий параметр:

  <!-- Facelets pages will use the .xhtml extension -->
  <context-param>
    <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
    <param-value>*.xhtml</param-value>
  </context-param> 

вместо:

<context-param>
    <param-name>facelets.VIEW_MAPPINGS</param-name>
    <param-value>*.xhtml</param-value>
</context-param>
...