1. Интернационализация
Подготовьте файлы ресурсов. Формат имен файлов ресурсов следующий:
baseName_language_country.properties
baseName_language.properties
baseName.properties
Среди них baseName — это базовое имя файла ресурсов. Мы можем настроить его, но язык и страна должны совпадать с языком и страной, поддерживаемыми Java. нравиться:
Материковый Китай: baseName_zh_CN.properties
США: baseName_en_US.properties
Теперь добавьте в приложение два файла ресурсов:
В первом хранится китайский: csdn_zh_CN.properties
Содержимое: Welcome=Добро пожаловать в подкаст Chuanzhi. Второй депозитарий — английский (США): csdn_en_US.properties.
Содержимое: Welcome=добро пожаловать в csdn.
Для файлов свойств на китайском языке после их записи мы должны использовать команду Native2ascii, предоставляемую jdk, для преобразования файлов в файлы с кодировкой Unicode. Команда используется следующим образом:
исходный файл own2ascii.properties целевой файл.properties
2. Настройка глобальных ресурсов и вывод международной информации.
После подготовки файла ресурсов мы можем определить файл ресурсов как глобальный файл ресурсов с помощью константы struts.custom.i18n.resources в struts.xml следующим образом:
<constant name="struts.custom.i18n.resources" value="csdn" />
csdn — это базовое имя файла ресурсов.
Позже мы сможем получить доступ к информации о интернационализации на странице или в действии:
Используйте тег <s:text name=""/> на странице JSP для вывода информации о интернационализации:
<s:text name="user"/>, имя — это ключ в файле ресурсов.
В классе Action вы можете наследовать ActionSupport и использовать метод getText() для получения информации о интернационализации. Первый параметр этого метода используется для указания ключа в файле ресурсов.
В теге формы укажите ключ в файле ресурсов через атрибут ключа, например:
<s:textfield name="realname" key="user"/>
3. Интернационализация. Вывод информации о интернационализации с заполнителями.
Содержимое файла ресурсов следующее:
Welcome= {0}, добро пожаловать в подкаст Chuanzhi {1}
Вывод информации о интернационализации с заполнителями на странице jsp
<s:text name="добро пожаловать">
<s:param><s:property value="realname"/></s:param>
<s:param>Обучение</s:param>
</s:текст>
Чтобы получить информацию о интернационализации с помощью заполнителей в классе Action, вы можете использовать метод getText(String key, String[] args) или getText(String aTextName, List args).
4. Интернационализация – файлы ресурсов области применения
В большом приложении все приложение содержит большой объем контента, который необходимо интернационализировать. Если мы поместим весь интернационализированный контент в файл атрибутов глобального ресурса, это, очевидно, приведет к тому, что файл ресурсов станет слишком большим, раздутым и неудобным. для поддержки. Иногда мы можем использовать область пакета для организации файлов интернационализации для различных модулей.
Вот как:
Поместите файл ресурса package_language_country.properties в пакет Java. Пакет — это фиксированный метод записи в этом пакете, и его подпакеты могут получить доступ к этому ресурсу. При поиске сообщений с указанным ключом система сначала будет искать в файле ресурсов пакета. Если соответствующий ключ не может быть найден, она будет искать в файле ресурсов, указанном константой struts.custom.i18n.resources.
5. Файл ресурсов области интернационализации-Action.
Мы также можем указать файл ресурсов отдельно для действия следующим образом:
В путь, по которому расположен класс действия, поместите файл ресурса ActionClassName_language_country.properties. ActionClassName — это простое имя класса действия.
При поиске сообщений с указанным ключом система сначала будет искать в файле ресурсов ActionClassName_language_country.properties. Если соответствующий ключ не найден, то она будет искать файл ресурсов с базовым пакетом имен вдоль текущего пакета, пока не найдет. пакет высшего уровня. Если соответствующий ключ не найден, в конечном итоге он будет найден в файле ресурсов, указанном константой struts.custom.i18n.resources.
6. Интернационализация — прямой доступ к файлу ресурсов в JSP.
Struts2 предоставляет нам тег <s:i18n>. Используя тег <s:i18n>, мы можем получать интернационализированные данные непосредственно из файла ресурсов в пути к классам без какой-либо настройки:
<s:i18n name="csdn">
<s:text name="добро пожаловать"/>
</s:i18n>
csdn — это базовое имя файла ресурсов в пути к классам.
Если файл ресурсов, к которому вы хотите получить доступ, находится в определенном пакете в пути к классам, вы можете получить к нему доступ следующим образом:
<s:i18n name="cn/csdn/action/package">
<s:text name="добро пожаловать">
<s:param>Сяо Чжан</s:param>
</s:текст>
</s:i18n>
Вышеуказанное обращается к файлу ресурсов, который в основном называется package в пакете cn.csdn.action.
7. Язык выражений OGNL
OGNL — это аббревиатура языка объектной графической навигации, который представляет собой проект с открытым исходным кодом. Платформа Struts 2 использует OGNL в качестве языка выражений по умолчанию.
По сравнению с выражениями EL он предоставляет некоторые функции, которые нам обычно нужны, например:
Поддержка вызовов методов объекта, таких как xxx.sayHello();
Поддерживает вызов статических методов класса и доступ к значениям. Формат выражения: @[полное имя класса (включая путь к пакету)]@[имя метода | имя значения], например: @java.lang.String@format('foo %s' , 'bar') или @cn.csdn.Constant@APP_NAME;
Манипулировать объектами коллекции.
В Ognl есть концепция контекста. Проще говоря, контекст — это структура MAP, которая реализует интерфейс java.utils.Map. В Struts2 реализация контекста — это ActionContext. Ниже приведена структурная диаграмма контекста.
Для доступа к объектам в контексте вам необходимо использовать символ # для обозначения пространства имен, например #application, #session.
Кроме того, OGNL установит корневой объект (корневой объект). В Struts2 корневым объектом является ValueStack (стек значений). Если вы хотите получить доступ к свойствам объекта в корневом объекте (т. е. ValueStack), вы можете опустить пространство имен # и напрямую получить доступ к свойствам объекта.
В struts2 класс реализации корневого объекта ValueStack — OgnlValueStack. Этот объект хранит не только одно значение, как мы предполагали, но и группу объектов. В классе OgnlValueStack есть корневая переменная типа List, которая используется для хранения группы объектов.
|--запрос
|--приложение
контекст ------|--Корневая переменная OgnlValueStack [действие, OgnlUtil, ... ]
|--сессия
|--аттр
|--параметры
Первый объект в корневой переменной называется верхним объектом стека. Обычно мы можем получить доступ к свойствам объекта в корневой переменной, непосредственно записав имя свойства в выражение OGNL. Последовательность поиска начинается с объекта в вершине стека, если свойство не существует для объекта. вершину стека, он будет искаться со второго объекта, если не найден, искать с третьего объекта и последовательно обращаться к нему, пока он не будет найден.
Внимание: в Struts2 выражения OGNL необходимо использовать с тегами Struts. Например: <s:property value="name"/>
Поскольку ValueStack является корневым объектом OGNL в Struts 2, если пользователю необходимо получить доступ к объектам в стеке значений, страница JSP может напрямую получить доступ к свойствам объектов в ValueStack через следующее выражение EL:
${foo} //Получаем атрибут foo объекта в стеке значений
Если вы получаете доступ к объектам в других контекстах, поскольку они не являются корневыми объектами, вам необходимо добавить префикс # при доступе.
объект приложения: используется для доступа к ServletContext, например #application.userName или #application['userName'], что эквивалентно вызову getAttribute("username") ServletContext.
объект сеанса: используется для доступа к HttpSession, например #session.userName или #session['userName'], что эквивалентно вызову session.getAttribute("userName").
объект запроса: карта, используемая для доступа к атрибутам HttpServletRequest, таким как #request.userName или #request['userName'], что эквивалентно вызову request.getAttribute("userName").
Объект параметров: используется для доступа к параметрам HTTP-запроса, таким как #parameters.userName или #parameters['userName'], что эквивалентно вызову request.getParameter("username").
Объект attr: используется для доступа к его атрибутам в порядке страница->запрос->сессия->приложение.
8. Почему вы можете использовать выражения EL для доступа к свойствам объектов в valueStack?
Причина в том, что Struts2 дополнительно инкапсулирует HttpServletRequest. Упрощенный код выглядит следующим образом:
публичный класс StrutsRequestWrapper расширяет HttpServletRequestWrapper {
public StrutsRequestWrapper (HttpServletRequest req) {
супер (требуется);
}
общедоступный объект getAttribute (String s) {
...
ActionContext ctx = ActionContext.getContext();
Атрибут объекта = super.getAttribute(s);//Сначала получаем значение атрибута из области запроса
если (ctx != ноль) {
if (attribute == null) {//Если значение атрибута не найдено в диапазоне запроса, найдите значение атрибута объекта из ValueStack.
...
Стек ValueStack = ctx.getValueStack();
атрибут = stack.findValue(s);
...
}
}
возвращаемый атрибут;
}
}
9. Создание объектов коллекции List/Map с использованием выражений OGNL.
Если вам нужен элемент коллекции (например, объект List или объект Map), вы можете использовать выражения, связанные с коллекцией, в OGNL.
Используйте следующий код для прямой генерации объекта List:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:property value="n"/><br>
</s:итератор>
Создайте объект карты:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:property value="key"/>=<s:property value="value"/><br>
</s:итератор>
Тег Set используется для помещения значения в указанный диапазон.
Область: определяет область, в которой находится переменная. Этот атрибут может принимать приложение, сеанс, запрос, страницу или действие. Если этот атрибут не установлен, он по умолчанию будет помещен в контекст OGNL.
значение: значение, присвоенное переменной. Если этот атрибут не установлен, переменной присваивается значение в верхней части стека ValueStack.