410013796724260
• Webmoney
R335386147728
Z369087728698
Представление OGNLБез понимания того, как данные хранятся внутри Struts2, невозможно построить качественное приложение, в котором между действиями необходимо передавать не только отдельные параметры, но и целые масивы. В этой статье рассмотрим использование OGNL для вывода данных и ValueStack для их хранения. Так что же означает аббревиатура OGNL (Object-Graph Navigation Language)?. В переводе на русский означает "Язык навигации по объектам-графам". Проще говоря, OGNL - это язык выражений, определяющий, как представлять данные в Struts2. На странице Действия actions приведен пример приветствия пользователя, в котором необходимо ввести свое имя, чтобы попасть на страницу Wellcome.jsp. В данном примере имя пользователя определяется на странице Entry.jsp, а на странице приветствия отображается в теге <s:property value="name" /> Это и есть простейшее OGNL выражение. Struts2 позволяет строить намного более сложные OGNL выражения. Данный фреймворк прекрасно понимает, что Вы передаете на вход тегу - строку или OGNL выражение. В случаях, когда строка более уместна, но Вам по каким-либо причинам надо передать выражение, то нет проблем. Используйте конструкции вида %{выражение}, и Struts2 будет их сначала определять, а уже потом передавать как текст. На странице Интернационализации рассмотрен пример работы с выражениями OGNL при выборе языка локализации. Хранилище ValueStackНо как Struts2 хранит и извлекает данные? Чтобы понять это, необходимо рассмотреть объект ValueStack, которое представляет собой хранилище. Т.е., если в action-классе определить отдельное свойство и массив объектов, то все эти данные будут сохранены в ValueStack, из которого можно их извлекать с использованием OGNL. Представление данныхТаким образом, OGNL - это мощный язык выражений, который используется для обращения к ValueStack для извлечения и обработки данных. Рассмотрим несложный пример представления списка пользователей на странице. Листинг action-класса UserShow.java package examples.ognl; public class UserShow extends ActionSupport { private String caption; private List <User> userList; public String execute() throws Exception { caption = "Список пользователей"; return Action.SUCCESS; } // ... get/set методы } В данном классе в качестве свойств определен строковой заголовок caption и список пользователей userList. Для упрощения методы get/set, а также импортируемые пакеты (import ...) в листинге не представлены. Допустим объект User включает свойства name, login, email. Описание класса User представлено на странице Использование сессий. Отобразим список пользователей на странице UserShow.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Список пользователей</title> </head> <body> <h1><s:property value="caption"/></h1> <table border="1" width="100%"> <tr><tn>Имя пользователя/><tn>Login</tn><tn>Email</tn></tr> <s:iterator value="userList" status="stat"> <tr> <td><s:property value="userList [#stat.index].name" /></td> <td><s:property value="userList [#stat.index].login" /></td> <td><s:property value="userList [#stat.index].email" /></td> </tr> </s:iterator> </body> </html> Смысл тегов <s:property/> и <s:iterator> достаточно очевиден - это вывод значения и итерация по массиву данных. Для того, чтобы это все сработало, необходимо в файле конфигурации struts.xml описать действие UserShow: <package name="Default" namespace="/" extends="struts-default"> ... <action name="UserShow" class="examples.ognl.UserShow"> <result name="success">/UserShow.jsp</result> </action> ... </package> Таким образом, при вызове действия UserShow фреймворк выполняет action-класс с одноименным названием и открывает страницу UserShow.jsp, на которой отображает значение свойства caption и в табличном виде параметры пользователей. Доступ к свойствам объектов OGNLДля доступа к внутренним свойствам объектов в OGNL используется синтаксис идентичный JSP EL. Если, например у нас есть объект OrderItem со свойством product типа Product, у которого есть свойства name, manufacturer и т.д., то получить значения свойств объекта можно, используя выражения либо orderItem.product.name, либо orderItem.product.manufacturer. Элементы массивов и списковДля последовательного доступа к отдельным элементам списка необходимо использовать тег <s:iterate/>. Чтобы вывести отдельный элемент из списка необходимо использовать синтаксис object[index]. Например, если необходимо вывести только второй элемент заказа, то можно использовать следующие выражения : <h2>Второй элемент заказа:</h2> Производитель <s:property value="order.items[1].product.manufacturer"/> Товар <s:property value="order.items[1].product.name"/> Цена <s:property value="order.items[1].price"/> Количество <s:property value="order.items[1].amount"/> Сумма <s:property value="order.items[1].total"/> |