Изменить /javax.faces.resource префикс URL ресурсов - PullRequest
2 голосов
/ 09 сентября 2011

Когда я использую

<h:outputStylesheet library="css" name="styles.css"> 

или

<h:graphicImage library="images" name="image.jpg">

тогда в html я получаю что-то вроде этого

<link type="text/css" rel="stylesheet" href="/appName/javax.faces.resource/styles.css.xhtml?ln=css" />

чтобы пользователь мог видеть, какая структура использовалась для написания этого приложения. Как я могу избежать показа javax.faces.resource/styles.css.xhtml?ln=css пользователю, но также все еще использовать лицевые панели (не html, как <link rel=...>)? Будет хорошо, когда пользователь просто увидит путь к файлу css как resources/css/styles.css

Ответы [ 2 ]

7 голосов
/ 09 сентября 2011

Это невозможно напрямую без переопределения всего ResourceHandler с помощью ResourceHandlerWrapper как , на который ответил lu4242 на этот вопрос , что не является точно тривиальная работа. Это жестко закодированная public static final константа поля в классе ResourceHandler, ResourceHandler#RESOURCE_IDENTIFIER. Возможно, вы захотите опубликовать запрос функции, чтобы сделать это внешне настраиваемым, как это было для символа-разделителя NamingContainer на этапе JSF 1.2 - JSF 2.0.

Но зачем ты это делаешь? Есть много других вещей, которые дают достаточно подсказок об используемой платформе. В случае JSF это может быть шаблон URL запроса (/faces/*, *.jsf или *.xhtml), заголовки ответа (X-Powered-By), определенные скрытые поля формы (javax.faces.ViewState), автоматически сгенерированные идентификаторы клиента (по по умолчанию), используемые библиотеки JS (jsf.js) и т. д.

5 голосов
/ 10 сентября 2011

Это возможно.Код в FacesServlet выглядит следующим образом:

    ResourceHandler resourceHandler = facesContext.getApplication().getResourceHandler();

    // Call ResourceHandler.isResourceRequest(javax.faces.context.FacesContext).
    if (resourceHandler.isResourceRequest(facesContext))
    {
        // If this returns true call ResourceHandler.handleResourceRequest(javax.faces.context.FacesContext).
        resourceHandler.handleResourceRequest(facesContext);
    }

Реализация по умолчанию использует константу ResourceHandler # RESOURCE_IDENTIFIER по умолчанию, но технически возможно написать ResourceHandlerWrapper, который использует другую структуру.Единственная проблема заключается в том, что оболочка должна реализовывать все, и вы не можете делегировать что-либо алгоритму по умолчанию.Вы можете повторно использовать код на MyFaces Shared , но помните, что это внутренние компоненты, поэтому используйте что-то вроде плагина maven shade или печатную копию для перемещения имени пакета.

Что невозможно, это изменить егодля существующих реализаций ResourceHandler (например, компонентов, которые используют собственную реализацию ResourceHandler, такую ​​как t: captcha или другие варианты), потому что все они связаны с константой.

В любом случае я создал MFCOMMONS-36 чтобы добавить это в расширенную реализацию ResourceHandler, которая добавляется в MyFaces Commons.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...