Ресурс не найден с помощью jsf 2.2.12 [duplicate]

Локализация и запятые

Вы должны рассмотреть возможность запятых в строчном представлении числа, для случаев, подобных float("545,545.2222"), который выдает исключение. Вместо этого используйте методы в locale для преобразования строк в числа и правильной интерпретации запятых. Метод locale.atof преобразуется в float за один шаг после того, как языковой стандарт был установлен для обозначения желаемого номера.

Пример 1 - Соглашения о числах в Соединенных Штатах

В Соединенных Штатах и в Великобритании запятые могут использоваться как разделитель тысяч. В этом примере с американской локалью запятая обрабатывается должным образом в качестве разделителя:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Пример 2 - Европейские условные обозначения

В большинстве стран world , запятые используются для десятичных знаков вместо периодов. В этом примере с французским языком, запятая корректно обрабатывается как десятичная метка:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

Также доступен метод locale.atoi, но аргумент должен быть целым числом.

211
задан BalusC 2 June 2014 в 16:14
поделиться

1 ответ

Фактически, все эти примеры в Интернете, где общий тип содержимого / файла типа «js», «css», «img» и т. д. используются в качестве имени библиотеки, вводят в заблуждение.

Real world examples

Для начала рассмотрим, как существующие реализации JSF, такие как библиотеки Mojarra и MyFaces и JSF, такие как PrimeFaces и OmniFaces используют его. Ни один из них не использует библиотеки ресурсов таким образом. Они используют его (под крышками, @ResourceDependency или UIViewRoot#addComponentResource() ) следующим образом:

<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />

Должно стать ясно, что он в основном представляет общее имя библиотеки / модуля / темы, в котором все эти ресурсы обычно принадлежат.

Легче идентифицировать

Таким образом, гораздо проще указать и отличить, где эти ресурсы принадлежат к и / или приходят. Представьте, что у вас есть ресурс primefaces.css в вашем собственном webapp, в котором вы переопределяете / завершаете некоторые CSS CSS по умолчанию; если PrimeFaces не использовал имя библиотеки для своего собственного primefaces.css, тогда собственный PrimeFaces не был бы загружен, а вместо этого был бы установленным webapp, который нарушил бы look'n'feel.

Кроме того, когда вы используете пользовательский ResourceHandler , вы также можете применять более мелкозернистый контроль над ресурсами, поступающими из определенной библиотеки, когда library используется правильно. Если бы все библиотеки компонентов использовали «js» для всех своих JS-файлов, как бы ResourceHandler когда-либо отличался, если он поступает из конкретной библиотеки компонентов? Примерами являются OmniFaces CombinedResourceHandler и GraphicResourceHandler ; проверьте метод createResource(), в котором библиотека проверяется перед передачей следующему обработчику ресурсов в цепочке. Таким образом, они знают, когда создавать CombinedResource или GraphicResource для этой цели.

Отмечено, что RichFaces сделал это неправильно. Он вообще не использовал никаких library и запустил другой слой обработки ресурсов поверх него, и поэтому невозможно программно идентифицировать ресурсы RichFaces. Именно поэтому OmniFaces CombinedResourceHander должен был ввести взлома на основе отражения , чтобы заставить его работать в любом случае с ресурсами RichFaces.

Ваш собственный webapp

Ваш собственный webapp не обязательно нуждается в библиотеке ресурсов. Лучше всего просто опустить это.

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

Или, если вам действительно нужно это, вы можете просто дать ему более разумное общее имя, например «default» или какое-то название компании.

<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />

Или, когда ресурсы специфичны для какого-либо шаблона мастера Facelets, вы также можете указать ему имя шаблона, чтобы было легче связать друг друга. Другими словами, это больше для самодокументированных целей. Например. в файле шаблона /WEB-INF/templates/layout.xhtml:

<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />

И файл шаблона /WEB-INF/templates/admin.xhtml:

<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />

Для примера с реальным миром проверьте источник показаний OmniFaces code .

Или, если вы хотите разделить одни и те же ресурсы по нескольким веб-папкам и создали для них общий проект, основанный на том же примере, что и в , этот ответ , который, в свою очередь, встроен в JAR в webapp /WEB-INF/lib, затем также ссылается на него как на библиотеку (имя свободно по вашему выбору, такие библиотеки компонентов, как OmniFaces и PrimeFaces):

<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />

Редактирование библиотеки

Еще одно главное преимущество заключается в том, что вы можете правильно использовать правильную версию библиотеки ресурсов на ресурсах, предоставляемых вашим собственным webapp (это не работает для ресурсов, встроенных в JAR). Вы можете создать прямую дочернюю подпапку в папке библиотеки с именем в шаблоне \d+(_\d+)*, чтобы обозначить версию библиотеки ресурсов.

WebContent
 |-- resources
 |    `-- default
 |         `-- 1_0
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

При использовании этой разметки:

<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />

Это приведет к созданию следующего HTML с версией библиотеки как параметр v:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_0" alt="" />

Итак, если вы отредактировали / обновили какой-то ресурс, тогда все, что вам нужно сделать, это скопировать или переименовать папке версии в новое значение. Если у вас несколько папок с версиями, то JSF ResourceHandler будет автоматически обслуживать ресурс с наивысшего номера версии в соответствии с правилами численного заказа.

Итак, когда копирование / переименование папки resources/default/1_0/* в resources/default/1_1/* выглядит следующим образом:

WebContent
 |-- resources
 |    `-- default
 |         |-- 1_0
 |         |    :
 |         |
 |         `-- 1_1
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

Затем в последнем примере разметки будет создан следующий HTML:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_1" alt="" />

Это заставит веб-браузер запрашивать ресурс прямо с сервера вместо того, чтобы показывать тот же имя из кеша, когда URL-адрес с измененным параметром был запрошен в первый раз. Таким образом, конечным пользователям не требуется выполнять жесткое обновление (Ctrl + F5 и т. Д.), Когда им нужно получить обновленный ресурс CSS / JS.

Обратите внимание, что управление версиями библиотеки невозможно для ресурсов заключенный в файл JAR. Вам понадобится обычай ResourceHandler. См. Также Как использовать управление версиями JSF для ресурсов в jar .

См. Также:

237
ответ дан Community 24 August 2018 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: