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"/>
 | 
