Имеют атрибут library . Что это и как это следует использовать? В Интернете есть много примеров, которые используют его как общий тип содержимого/файла css , js и img (или image) в качестве имени библиотеки в зависимости от используемого тега:
Как это полезно? Значение library в этих примерах, похоже, просто повторяет то, что уже было представлено именем тега. Для он основан на имени тега, уже очевидном, что он представляет собой "библиотеку CSS". Какая разница со следующим, который также работает так же?
Кроме того, сгенерированный вывод HTML немного отличается. Учитывая путь контекста отображения /contextname и FacesServlet в шаблоне URL-адреса *.xhtml , первый генерирует следующий HTML-код с именем библиотеки в качестве параметра запроса:
Пока последний генерирует следующий HTML-код с именем библиотеки только по пути URI:
Последний подход делает задним числом также более ощутимым, чем прежний подход. Как же полезен атрибут library ?
1 ответ
Фактически, все эти примеры в Интернете, где общий тип содержимого/файла типа "js", "css", "img" и т.д. используется как имя библиотеки вводящий в заблуждение .
Примеры реального мираДля начала рассмотрим, как существующие реализации JSF, такие как Mojarra и MyFaces и библиотеки компонентов JSF, такие как PrimeFaces и OmniFaces использовать его. Ни один из них не использует библиотеки ресурсов таким образом. Они используют его (под обложками или ) следующим образом:
Понятно, что в основном это имя общей библиотеки/модуля/темы , где все эти ресурсы обычно принадлежат.
Легче идентифицироватьТаким образом, гораздо проще указывать и различать, где эти ресурсы принадлежат и/или происходят. Представьте, что у вас есть ресурс primefaces.css в вашем собственном webapp, в котором вы переопределяете/завершаете некоторые CSS CSS по умолчанию; если PrimeFaces не использует имя библиотеки для своего собственного primefaces.css , тогда собственный PrimeFaces не будет загружен, а вместо него будет поставляться с помощью webapp, что сломает look"n"feel.
Кроме того, когда вы используете пользовательский , вы также можете применять более мелкозернистый контроль над ресурсами, поступающими из определенной библиотеки когда library используется правильно. Если бы все библиотеки компонентов использовали "js" для всех своих JS файлов, как бы ResourceHandler когда-либо отличалось, если бы оно исходило из конкретной библиотеки компонентов? Примерами являются OmniFaces и ; проверьте метод createResource() , в котором библиотека проверена перед передачей следующему обработчику ресурсов в цепочке. Таким образом, они знают, когда создавать CombinedResource или GraphicResource для этой цели.
Отмечено, что RichFaces сделал это неправильно. Он вообще не использовал никаких library и запустил другой слой обработки ресурсов поверх него, и поэтому невозможно программно идентифицировать ресурсы RichFaces. Именно по этой причине OmniFaces имел ввести хакерство на основе отражения , чтобы заставить его работать в любом случае с ресурсами RichFaces.
Ваш собственный webappВаш собственный webapp не обязательно нуждается в библиотеке ресурсов. Лучше всего просто опустить это.
Или, если вам действительно нужно иметь его, вы можете просто дать ему более разумное общее имя, например "default" или какое-то название компании.
Или, когда ресурсы специфичны для какого-либо шаблона Masterlets, вы также можете указать ему имя шаблона, чтобы было легче связать друг друга. Другими словами, это больше для самодокументированных целей. Например. в файле шаблона /WEB-INF/templates/layout.xhtml:
И файл шаблона /WEB-INF/templates/admin.xhtml:
Для примера в реальном мире проверьте исходный код витрины OmniFaces .
Или, если вы хотите разделить одни и те же ресурсы по нескольким веб-папкам и создали для них общий проект, основанный на том же примере, что и в этом ответе , который, в свою очередь, встроен в JAR в webapp /WEB-INF/lib , а затем ссылается на него как на библиотеку (имя по своему выбору, так что такие библиотеки компонентов, как OmniFaces и PrimeFaces):
Управление версиями библиотеки
Другим основным преимуществом является то, что вы можете правильно использовать правильную версию библиотеки ресурсов на ресурсах, предоставляемых вашим собственным webapp (это не работает для ресурсов, встроенных в JAR). Вы можете создать прямую дочернюю подпапку в папке библиотеки с именем в шаблоне \d+(_\d+)* , чтобы обозначить версию библиотеки ресурсов.
WebContent |-- resources | `-- default | `-- 1_0 | |-- css | | `-- style.css | |-- img | | `-- logo.png | `-- js | `-- script.js:
При использовании этой разметки:
Это приведет к созданию следующего HTML с версией библиотеки как v:
Итак, если вы отредактировали/обновили какой-то ресурс, все, что вам нужно сделать, это скопировать или переименовать папку версии в новое значение. Если у вас несколько папок с версиями, то 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-код:
Это заставит веб-браузер запрашивать ресурс прямо с сервера вместо того, чтобы показывать тот же имя из кеша, когда URL-адрес с измененным параметром был запрошен в первый раз. Таким образом, конечным пользователям не требуется выполнять жесткое обновление (Ctrl + F5 и т.д.), Когда им нужно получить обновленный ресурс CSS/JS.
Ресурсы локализованных приложений
Ресурсы, подобные изображениям и строковым таблицам, могут помещаться в файлы ресурсов или подчиненные сборки. Эти ресурсы могут быть очень полезны при локализации приложений, и в.NET предлагается встроенная поддержка для поиска локализованных ресурсов.
Прежде чем посмотреть, как применять ресурсы для локализации приложений, сначала ознакомимся с методами создания и чтения ресурсов без принятия во внимание языковых аспектов.
Создание файлов ресурсовВ файлах ресурсов могут храниться элементы, подобные изображениям и таблицам строк. В качестве ресурсного файла может быть обычный текстовый файл или файл с расширением.resX, в котором используется XML. В этой статье сначала рассматривается вариант простого текстового файла.
Ресурс, включающий в себя таблицу строк, может создаваться в обычном текстовом файле. В этом файле просто производится назначение строк ключам. Под ключом понимается имя, которое может использоваться в программе для получения соответствующего значения. В ключах и значениях допускается использовать пробелы.
Ниже показан пример создания простой таблицы строк:
Title = Professional C# Site = сайт Author = Alex Erohin
Утилита Resgen.exeДля создания из ***.txt файла ресурсов можно воспользоваться специальной утилитой генерации файлов ресурсов Resgen.exe. Например, ввод следующей команды:
Resgen MyResources.txt
приведет к созданию файла MyResources.resources. Сгенерированный этой утилитой файл ресурсов далее можно либо добавить в сборку как внешний файл, либо вставить в сборку DLL или ЕХЕ. Утилита Resgen также поддерживает возможность создания файлов ресурсов в формате XML с расширением.resX. Применяется она очень просто:
Resgen MyResources.txt MyResources.resX
Выполнение этой команды приведет к созданию XML-файла ресурсов по имени MyResources.resX.
Утилита Resgen поддерживает строго типизированные ресурсы. Строго типизированный ресурс представляется в виде класса, который получает доступ к ресурсам. Для создания такого класса в утилите Resgen предусмотрена опция /str:
Resgen /str:C#,MyResources.cs MyResources.resX
После опции /str должен быть указан язык, пространство имен, имя класса и имя файла исходного кода, причем именно в таком порядке.
Возможность добавления изображений утилита Resgen не поддерживает. Среди примеров.NET Framework SDK есть и пример ResXGen с обучающими руководствами. В ResXGen можно ссылаться на изображения в файле.resX. Добавлять изображения можно также программно с применением классов ResourceWriter или ResXResourceWriter, как будет показано далее.
Класс ResourceWriterВместо использования для создания файлов ресурсов утилиты Resgen можно написать специальную, позволяющую это делать программу. Класс ResourceWriter из пространства имен System.Resources служит для создания бинарных файлов ресурсов, а класс ResXResourceWriter - для создания файлов ресурсов на базе XML. Оба эти класса поддерживают возможность добавления изображений и любых других сериализуемых объектов. В случае применения класса ResXResourceWriter потребуется сослаться на сборку System.Windows.Forms.
В следующем примере кода демонстрируется создание объекта ResXResourceWriter по имени rw в файле Demo.resx. После создания экземпляра с помощью метода AddResource() класса ResXResourceWriter можно приступать к добавлению набора ресурсов общим объемом до 2 Гбайт. Первый аргумент в AddResource() позволяет указывать имя ресурса, а второй - значение. Ресурс изображения можно добавлять за счет применения экземпляра класса Image. Чтобы можно было использовать класс Image, необходимо сослаться на сборку System.Drawing, а также добавить директиву using для открытия пространства имен System.Drawing.
Здесь объект Image создается за счет открытия файла logo.gif, поэтому потребуется либо скопировать этот файл изображения в каталог исполняемой программы, либо указать полный путь к нему в аргументе метода ImageToFile(). Оператор using указывает, что ресурс изображения должен автоматически уничтожаться в конце блока using.
Далее в объект ResXResourceWriter добавляются простые строковые ресурсы. В конце метод Close() класса ResXResourceWriter автоматически вызывает ResXResourceWriter.Generate() для осуществления записи ресурсов в файл Demo.resx:
Using System.Drawing; using System.Resources; namespace ProCSharp.Localization { class Program { static void Main() { var rw = new ResXResourceWriter("Demo.resx"); using (Image image = Image.FromFile("logo.gif")) { rw.AddResource("MyLogo", image); rw.AddResource("Title", "Professional C#"); rw..AddResource("Author", "Alex Erohin"); rw.Close(); } } } }
Запуск этой небольшой программы приведет к созданию файла ресурсов Demo.resx с изображением logo.gif внутри.
Использование файлов ресурсовДобавлять файлы ресурсов в сборки можно либо с помощью работающего из командной строки C#-компилятора csc.exe с опцией /resource, либо прямо в Visual Studio 2010. Чтобы посмотреть, как работать с файлами ресурсов в Visual Studio 2010, создайте проект консольного приложения по имени ResourceDemo.
Добавьте в этот проект созданный ранее файл ресурсов Demo.resx, открыв в окне Solution Explorer контекстное меню и выбрав в нем пункт Add --> Add Existing Item (Добавить --> Добавить существующий элемент). По умолчанию для свойства Build Action (Действие при компоновке) этого ресурса будет установлено значение Embedded Resource (Встраиваемый ресурс), указывающее, что этот ресурс должен встраиваться в выходную сборку.
Далее в параметрах проекта (за счет выбора Application --> Assembly information (Приложение --> Информация о сборке)) следует установить в качестве значения параметра Neutral Language (Нейтральный язык) основной язык:
Изменение значения этого параметра приведет к добавлению в файл assemblyinfо.cs атрибута , как показано ниже:
Установка значения для данного атрибута улучшит производительность ResourceManager, поскольку позволит ему быстрее отыскивать ресурсы для en-US, а также использовать их в качестве варианта по умолчанию. В этом атрибуте можно также указать место размещения используемого по умолчанию ресурса за счет применения второго параметра в конструкторе. С помощью перечисления UltimateResourceFallbackLocation можно указать, что он должен размещаться в главной сборке (значение MainAssembly) или же в подчиненной (значение Satellite).
После компоновки проекта можно просмотреть сгенерированную сборку утилитой ildasm и увидеть в манифесте атрибут, .mresource. Атрибут.mresource объявляет имя для ресурса в сборке. Если.mresource объявлен public (как в данном примере), это означает, что ресурс может экспортироваться из сборки и использоваться в классах других сборок. Если же.mresource объявлен private, это значит, что ресурс экспортироваться не может и доступен только в пределах данной сборки.
Для получения доступа к встроенному ресурсу используется класс ResourceManager, который находится в пространстве имен System.Resources. Конструктору этого класса в качестве аргумента можно передать имя сборки, в которой содержатся ресурсы.
В рассматриваемом примере ресурсы встроены в исполняемую сборку, поэтому во втором аргументе конструктору должен быть передан результат выполнения метода Assembly.GetExecutingAssembly() . В первом аргументе передается корневое имя ресурсов, состоящее из названия пространства имен и имени файла ресурсов, но без расширения resources. Как было показано ранее, это имя можно отобразить с помощью утилиты ildasm и просто удалить из него расширение resources. Имя можно также получить и программно с применением метода GetManifestResourceNames() класса System.Reflection.Assembly:
Using System; using System.Drawing; using System.Reflection; using System.Resources; namespace Wrox.ProCSharp.Localization { class Program { static void Main() { var rm = new ResourceManager("Wrox.ProCSharp.Localization.Demo", Assembly.GetExecutingAssembly()); Console.WriteLine(rm.GetString("Title")); Console.WriteLine(rm.GetString("Site")); Console.WriteLine(rm.GetString("Author")); using (Image logo = (Image)rm.GetObject("MyLogo")) { logo.Save("logo.bmp"); } StronglyTypedResources(); } private static void StronglyTypedResources() { Console.WriteLine(Demo.Title); Console.WriteLine(Demo.Site); Console.WriteLine(Demo.Author); using (Bitmap logo = Demo.MyLogo) { logo.Save("logo.bmp"); } } } }
Для создания строго типизированного ресурса в редакторе управляемых ресурсов (Managed Resources Editor) можно изменить значение параметра Access Modifier (Модификатор доступа) с No Code Generation (Не генерировать никакой код) на Public (Общедоступный) или Internal (Внутренний). В случае установки значения Public генерируемый класс снабжается модификатором доступа public и тогда к нему возможен доступ из других сборок. При установке значения Internal генерируемый класс получает модификатор доступа internal и доступ к нему может осуществляться только изнутри сборки, в которой он находится.
Пространство имен System.ResourcesДавайте кратко пройдемся по всем классам, которые содержатся в пространстве имен System.Resources и позволяют работать с ресурсами.
Класс ResourceManagerМожет использоваться для получения ресурсов, относящихся к текущей культуре, из сборок или файлов ресурсов. С помощью ResourceManager можно получать сразу целый набор ресурсов для определенной культуры в виде экземпляра ResourceSet.
Класс ResourceSetПозволяет представлять набор ресурсов для определенной культуры. При создании экземпляр ResourceSet он производит перечисление по классу, реализуя интерфейс IResourceReader, и сохраняет все ресурсы в HashTable.
Интерфейс IResourceReaderИспользуется в ResourceSet для перечисления ресурсов. Класс ResourceReader реализует этот интерфейс.
Класс ResourceWriterПрименяется для создания файла ресурсов и реализует интерфейс IResourceWriter.
Классы ResXResourceSet, ResXResourceReader и ResXResourceWriterПохожи на классы ResourceSet, ResourceReader и ResourceWriter, но служат для создания не бинарного файла ресурсов, а не XML-файла.resx. Вместо того чтобы встраивать ресурс в XML-файл, они позволяют добавлять на него ссылку с помощью ResXFileRef.
Пространство имен System.Resources.ToolsСодержит класс StronglyTypedResourceBuilder, который можно использовать для создания класса из ресурса.
Последнее обновление: 27.01.2016
В WPF важное место занимают ресурсы . В данном случае под ресурсами подразумеваются не дополнительные файлы (или физические ресурсы ), как, например, аудиофайлы, файлы с изображениями, которые добавляются в проект. Здесь речь идет о логических ресурсах , которые могут представлять различные объекты - элементы управления, кисти, коллекции объектов и т.д. Логические ресурсы можно установить в коде XAML или в коде C# с помощью свойства Resources . Данное свойство опредлено в базовом классе FrameworkElement , поэтому его имеют большинство классов WPF.
В чем смысл использования ресурсов? Они повышают эффективность: мы можем определить один раз какой-либо ресурс и затем многократно использовать его в различных местах приложения. В связи с этим улучшается поддержка - если возникнет необходимость изменить ресурс, достаточно это сделать в одном месте, и изменения произойдут глобально в приложении.
Свойство Resources представляет объект ResourceDictionary или словарь ресурсов, где каждый хранящийся ресурс имеет определенный ключ.
Определение ресурсовОпределим ресурс окна и ресурс кнопки:
Здесь у окна определяются два ресурса: redStyle, который представляет объект SolidColorBrush, и gradientStyle, который представляет кисть с линейным градиентом. У кнопки определен один ресурс darkStyle, представляющий кисть SolidColorBrush. Причем каждый ресурс обязательно имеет свойство x:Key , которое и определяе ключ в словаре.
А в свойствах Background соответственно у грида и кнопки мы можем применить эти ресурсы: Background="{StaticResource gradientStyle}" - здесь после выражения StaticResource идет ключ применяемого ресурса.
Управление ресурсами в коде C#Добавим в словарь ресурсов окна градиентную кисть и установим ее для кнопки:
// определение объекта-ресурса LinearGradientBrush gradientBrush = new LinearGradientBrush(); gradientBrush.GradientStops.Add(new GradientStop(Colors.LightGray, 0)); gradientBrush.GradientStops.Add(new GradientStop(Colors.White, 1)); // добавление ресурса в словарь ресурсов окна this.Resources.Add("buttonGradientBrush", gradientBrush); // установка ресурса у кнопки button1.Background = (Brush)this.TryFindResource("buttonGradientBrush"); // или так //button1.Background = (Brush)this.Resources["buttonGradientBrush"];
С помощью свойства Add() объект кисти и его произвольный ключ добавляются в словарь. Далее с помощью метода TryFindResource() мы пытаемся найти ресурс в словаре и установить его в качестве фона. Причем, так как этот метод возвращает object, необходимо выполнить приведение типов.
Всего у ResourceDictionary можно выделить следующие методы и свойства:
Метод Add(string key, object resource) добавляет объект с ключом key в словарь, причем в словарь можно добавить любой объект, главное ему сопоставить ключ
Метод Remove(string key) удаляет из словаря ресурс с ключом key
Свойство Uri устанавливает источник словаря
Свойство Keys возвращает все имеющиеся в словаре ключи
Свойство Values возвращает все имеющиеся в словаре объекты
Для поиска нужного ресурса в коллекции ресурсов у каждого элемента определены методы FindResource() и TryFindResource() . Она оба возвращают ресурс, соответствующий определенному ключу. Единственное различие между ними состоит в том, что FindResource() генерирует исключение, если ресурс с нужным ключом не был найден. А метод TryFindResource() в этом случае просто возвращает null.
Разделяемые ресурсыКогда один и тот же ресурс используется в разных местах, то фактически мы используем один и тот же объект. Однако это не всегда желательно. Иногда необходимо, чтобы примение ресурса к разным объектам различалось. То есть нам необходимо, чтобы при каждом применении создавался отдельный объект ресурса. В этом случае мы можем изспользовать выражение x:Shared="False" :
Примеры использования ресурсов
Рассмотрим еще пару примеров применения ресурсов. К примеру, если мы хотим, чтобы ряд кнопок обладал одинаковыми свойствами, то мы можем определить одну общую кнопку в качестве ресурса:
Другой пример - определение списка объектов для списковых элементов:
iPhone 6S Nexus 6P Lumia 950 Xiaomi MI5
Валидация является одним из самых важных аспектов хорошего веб-дизайна. Давайте рассмотрим, что это такое и как проверить HTML код на валидность. В качестве примера возьмем самую распространенную систему управления контентом (CMS) – WordPress. После чего мы поделимся перечнем ошибок, с которыми столкнулись на практике и, самое главное, предложим свои, проверенные, методы по их устранению.
Зачем необходима проверка на валидность сайтаПроще говоря, проверка веб-страницы позволит определить, соответствует ли она стандартам, разработанным Консорциумом Всемирной паутины (W3C). Обычно это делается путем проверки отдельных страниц на валидность с помощью онлайн-сервиса проверки от W3C .
Подобно правилам грамматики на разных языках, есть также правила в программировании. Проверка позволяет увидеть, соответствует ли страница этим правилам, а в случае наличия ошибок и предупреждений будут предоставлены рекомендации по их устранению. Подробнее о необходимости такой проверки рассмотрим ниже.
На что влияет валидность сайтаВы когда-нибудь задумывались о том, как браузеры “читают” веб-страницу? У них есть “двигатели” для анализа кода и преобразования его в визуальный вид для людей. К сожалению, у каждого браузера есть собственный механизм обработки кода, и это может привести к отображению ваших страниц по-разному.
Некорректная веб-страница может быть прочитана браузерами по-разному. Это приведет к тому, что ваши посетители, возможно, даже не смогут правильно увидеть контент страницы в своих браузерах. Валидация в дальнейшем позволит исправить почти все основные различия и делает вашу веб-страницу доступной для чтения почти всеми веб-браузерами (чаще всего исключением становится Internet Explorer старых версий). Отсюда и появился термин “кроссбраузерная верстка” – т.е. верстка, которая одинаково хороша (совместима) для всех популярных браузеров.
А как же это повлияет на SEO? Важно понимать, что роботы поисковых систем любят семантические веб-страницы. Семантическая верстка, согласно данным Википедии, – это подход к созданию веб-страниц на языке HTML, основанный на использовании HTML тегов в соответствии с их семантикой (предназначением). Кроме того, структурная семантическая веб-страница позволяет поисковым роботам более точно определять значимость, как отдельных элементов веб-страницы, так и всего текста в целом. По заверению Google, валидный код никак не влияет на ранжирование страниц. Но при этом наличие ошибок в коде способно негативно повлиять на сканирование микроразметки и адаптированностью под мобильные устройства.
Инструменты проверки для вашего сайтаПонимая необходимость отсутствия ошибок валидации на страницах сайта, давайте рассмотрим, как осуществить поиск данных ошибок.
Существует множество бесплатных сервисов для проверки сайта, такие как Markup Validation Service W3C , Web Page Analyzer , Browsershots и другие.
В классе ResourceBundle.Control существует набор внешних методов, вызываемых методом ResourceBundle.getBundle() во время поиска и загрузки наборов. Создав свой класс Control , вы можете изменить поведение по-умолчанию для загрузки и кеширования.
В данном случае вам необходимо создать реализацию двух методов класса Control: getFormats() и newBundle() . Метод getFormats() отвечает за поддержку формата XML, а newBundle() работает с набором ресурсов. В базовом классе Control существуют вспомогательные методы, предназначенные для преобразования основных имен наборов в действительные имена ресурсов.
В данную реализацию класса ResourceBundle.Control включен подкласс XMLResourceBundle . Данный подкласс используется для загрузки данных из XML файла и использовании их в методе ResourceBundle .
Ниже приводится описание класса Control и реализация метода ResourceBundle:
import
java.io.*;
import
java.net.*;
import
java.util.*;
Public class
XMLResourceBundleControl
extends
ResourceBundle.Control
{
private static
String XML =
"xml"
;
Public
List getFormats
(String baseName
) {
return
Collections.singletonList
(XML
)
;
}
Public
ResourceBundle newBundle
(String baseName, Locale locale,
String format, ClassLoader loader,
boolean
reload
)
throws
IllegalAccessException, InstantiationException, IOException
{
if
((baseName ==
null
)
||
(locale ==
null
)
||
(format ==
null
)
||
(loader ==
null
)) {
throw new
NullPointerException
()
;
}
ResourceBundle bundle =
null
;
if
(format.equals
(XML
)) {
String bundleName = toBundleName
(baseName, locale
)
;
String resourceName = toResourceName
(bundleName, format
)
;
URL url = loader.getResource
(resourceName
)
;
if
(url !=
null
) {
URLConnection connection = url.openConnection
()
;
if
(connection !=
null
) {
if
(reload
) {
connection.setUseCaches
(false
)
;
}
InputStream stream = connection.getInputStream
()
;
if
(stream !=
null
) {
BufferedInputStream bis =
new
BufferedInputStream
(
stream
)
;
bundle =
new
XMLResourceBundle
(bis
)
;
bis.close
()
;
}
}
}
}
return
bundle;
}
Private static class
XMLResourceBundle
extends
ResourceBundle
{
private
Properties props;
XMLResourceBundle
(InputStream stream
)
throws
IOException
{
props =
new
Properties
()
;
props.loadFromXML
(stream
)
;
}
Protected
Object handleGetObject
(String key
) {
return
props.getProperty
(key
)
;
}
Public
Enumeration getKeys
() {
Set handleKeys = props.stringPropertyNames
()
;
return
Collections.enumeration
(handleKeys
)
;
}
}
Public static
void
main
(String args
) {
("Test2"
,
new
XMLResourceBundleControl
())
;
String string = bundle.getString
("HelpKey"
)
;
System.out.println
("HelpKey: "
+ string
)
;
}
}
В данную реализацию включена тестовая программа из трех строчек:
ResourceBundle bundle = ResourceBundle.getBundle
("Test2"
,
new
XMLResourceBundleControl
())
;
String string = bundle.getString
("HelpKey"
)
;
System.out.println
("HelpKey: "
+ string
)
;
Наибольший интерес здесь представляет первая строка. Вам необходимо передать ваш элемент Control методу getBundle() . После этого вы можете использовать набор, как и в любом другом случае.
Ниже преводится пример XML файла Test2.xml:
OK Cancel Help Yes No
Результатом выполнения программы XMLResourceBundleControl будет:
> java XMLResourceBundleControl HelpKey: Help
В приведенной реализации не используются методы getTimeToLive() и needsReload() :
public long getTimeToLive (String baseName, Locale locale )
Public
boolean
needsReload
(String baseName,
Locale locale,
String format,
ClassLoader loader,
ResourceBundle bundle,
long
loadTime
)
Метод getTimeToLive() возвращает время жизни для наборов ресурсов, созданных при помощи ResourceBundle.Control . Наборы ресурсов сохраняются в кеше для убыстрения процесса повторной загрузки. Таким образом, при повторной загрузке набора, он будет находиться в кеше. Положительное значение времени жизни затает в милисекундах продолжительность сохранения набора в кеше без повторной проверки. По-умолчанию значением, возвращаемым методом getTimeToLive() является TTL_NO_EXPIRATION_CONTROL , отключающее проверку истечения времени хранения в кеше. Если вы не хотите кешировать набор, то верните значение TTL_DONT_CACHE . Если возвращается значение 0, то набор кешируется, но при каждом вызове метода getBundle() происходит его проверка. Для очистки кеша вызовите статичный метод clearCache() класса ResourceBundle . В нем есть не обязательный аргумент ClassLoader , позволяющий очищать кеши, созданные определенным загрузчиком.
Метод needsReload() определяет необходимость перезагрузки кешированного набора. Значение true означает, что набор необходимо перезагрузить, а false , что не его перезагружать не надо. Вы можете контролировать необходимость перезагрузки набора ресурсов при помощи перегрузки метода needsReload() . Например, если вы хотите, чтобы набор ресурсов всегда перезагружался, метод needsReload() должен всегда возвращать значние true . В этом случае метод getTimeToLive() должен возвращать всегда значение 0. Иначе набор будет сохраняться дольше, чем положено.
Для получения дополнительной информации об улучшениях, связанных с процессами интернационализации в Mustang, вы можете обратиться к блогу Джона Оконера, разработчика програмнного обеспечения фирмы Sun, по адресу
Значение слова неудачный
Обзор Samsung Galaxy A7 (2017): не боится воды и экономии Стоит ли покупать samsung a7
Делаем бэкап прошивки на андроиде
Как настроить файл подкачки?
Установка режима совместимости в Windows