2014-02-06 1 views
3

JSF спецификации 2.2 (2013-03-20) говорит, что в пункте 10.3.3.1 (Декларирование составной библиотеки компонентов для использования на странице Facelet):Составной компонент структуры папок

Если facelet библиотеку тегов объявлен в страница с XHTML с пространством имен, начиная со строкой «http://java.sun.com/jsf/composite/» (без кавычек), остальная часть декларации пространства имен берутся как название библиотеки ресурсов [...]

Если подстрока следующая « http://java.sun.com/jsf/composite/ "содержит символ"/"или любые символы, не являющиеся законными для имени библиотеки fo должны быть приняты меры. Если application.getProjectStage() - Разработка, информационное сообщение об ошибке должно быть размещено на странице и также занесено в журнал. В противном случае сообщение должно быть зарегистрировано только.

Так это означает, что это незаконно, чтобы иметь следующую структуру папок:

resources 
    components 
     system 
     something_specific 
     something_even_more_specific 

и относятся к библиотеке имени «http://java.sun.com/jsf/composite/components/something_specific»? Это верно?

Это похоже на странное ограничение. Я хочу, чтобы мои источники были структурированы, а не собраны вместе в огромном куске.

Такая иерархическая библиотека фактически работает в Wildfly 8.0.0.CR1, но я не уверен, насколько разумно полагаться на это поведение.

Ответы на «лучшие практики» приветствуются.

+0

Нашел следующее в файле 'javax.faces.application.ResourceHandler.createResource (String)' javadoc: 'По историческим причинам этот метод работает корректно, когда аргумент resourceName имеет вид libraryName/resourceName, даже если resourceName содержит '/' characters.' –

+0

https://stackoverflow.com/q/39537911/1341535 –

ответ

1

Я обобщу свои выводы.

Источники: JSF spec issue 740, discussion preceding issue 740, another discussion, JSF spec issue 1141, discussion preceding issue 1141.

Слэш в имени библиотеки запрещен. Разрешено разрезать имя ресурса.

На практике на Mojarra 2.2.5 библиотека составных компонентов работает как в объявлении пространства имен XHTML, так и в <composite-library-name>components/system</composite-library-name> taglib. Я ожидаю, что в будущем Моджарра и/или версии спецификации JSF могут по-прежнему ломаться. Если вы используете это, вы находитесь в милости разработчиков JSF spec/impl. Связанные проблемы и дискуссии показали, что они готовы сохранять обратную совместимость даже для непреднамеренных функций.

В MyFaces имеется специальная настройка, org.apache.myfaces.STRICT_JSF_2_ALLOW_SLASH_LIBRARY_NAME (MyFaces issue 3454). Я полагаю, что использование библиотеки ресурсов со слэшами в названии с использованием этого параметра может привести к нарушению некоторых функций, таких как управление версиями ресурсов JSF (как узнать, какая часть является именем библиотеки и какая часть принадлежит имени ресурса?).

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

<tag> 
    <tag-name>test</tag-name> 
    <component> 
     <resource-id> 
      components/system/test.xhtml 
     </resource-id> 
    </component> 
</tag> 

Таким образом, имя библиотеки фактически становится «компоненты» и имя ресурса становится «система/test.xhtml ».

+0

'Я думаю, что иерархия составных компонентов библиотеки может быть реализована путем импорта компонентов в taglib один за другим' - я это проверил? Не работает с Mojarra 2.2.12 - для имени библиотеки и 'system' требуется имя' test.xhtlm', чтобы быть именем библиотеки, полностью отбрасывая «компоненты». См. 'Com.sun.faces.facelets.tag.AbstractTagLibrary.CompositeComponentTagFactory.createHandler (TagConfig)'. Это может быть исправлено с помощью специальной TagLibrary или ResourceHandler. –

0

после некоторого опыта, я думаю, что эти заявления следует читать:

  • остальная часть декларации пространства имен принимаются как имя библиотеки ресурсов http://java.sun.com/jsf/composite/components/system должен соответствовать /resources/components/system

  • любые символы, не являющиеся юридическими для имени библиотеки

    если объявить http://java.sun.com/jsf/composite/components/system2 и /resources/components/system2 не существует, принимать меры

    Warning: This page calls for XML namespace http://java.sun.com/jsf/composite/components/system2 declared with prefix y but no taglibrary exists for that namespace.

так это абсолютно легально объявить

xmlns:x="http://java.sun.com/jsf/composite/components/system" 

и любую другую структуру папок, которая существует в рамках/ресурсов

+0

Хм, я не понимаю суть вашего ответа. Во-первых, вы предлагаете разложить структуру папок? Это именно то, чего я не хочу делать. В папке «resources» также есть статические ресурсы, такие как изображения, стили, скрипты. Поэтому я хочу, чтобы папки на первом уровне под «ресурсами» были «компонентами» и «статическими». И, конечно же, в «ресурсах» будет более двух уровней папок. Например, «компоненты/система/диалоги». Я не хочу разлагать эту структуру и создавать все папки на одном уровне, например, «components-system-dialogs». –

+0

Во-вторых, я не понимаю, какие изменения импортируются в taglib. Имя библиотеки составных компонентов с косой чертой по-прежнему является незаконным, независимо от того, используется ли оно на странице XHTML или в определении taglib. –

+0

см. Обновленный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^