WEDA Framework использует Tapestry версии 4.0 для создания web интерфейса
Перед тем как настраивать web приложение для работы с
Tapestry удалим файл index.jsp
из ветки
Web Pages
.
Для того чтобы создать Tapestry web приложение необходимо сделать следующее:
Редактируем web.xml. Вот так должен выглядеть данный конфигурационный файл
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Семейный бюджет</display-name> <description> Приложение для учета и котроля за денежными средствами семейного бюджета </description> <filter> <filter-name>redirect</filter-name> <filter-class>org.apache.tapestry.RedirectFilter</filter-class> </filter> <filter-mapping> <filter-name>redirect</filter-name> <url-pattern>/</url-pattern> </filter-mapping> <listener> <listener-class>org.weda.servlet.SessionListener</listener-class> </listener> <servlet> <servlet-name>budget</servlet-name> <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>budget</servlet-name> <url-pattern>/app</url-pattern> </servlet-mapping> <session-config> <session-timeout>5</session-timeout> </session-config> </web-app>
Настраиваем budget.application.
Данный конфигурационный файл должен находиться там же где
и web.xml
т.е. папке WEB-INF
ветки Web Pages
Вот так дожен выглядеть данный конфигурационный файл
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE application PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> <application> <library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/> <library id="weda" specification-path="/org/weda/tapestry/component/Weda.library"/> <meta key="org.apache.tapestry.home-page" value="MoneyOperationList"/> <meta key="org.apache.tapestry.template-encoding" value="Cp1251"/> <meta key="org.apache.tapestry.output-encoding" value="utf-8"/> </application>
Перед созданием страниц создадим два вспомогательных tapsetry компонента которые облегчат создание страниц.
Компонент Border
.
Для создания этого компонента необходимо создать
два файла:
web.xml
Border.html
<html> <span jwcid="$content$"> <span jwcid="@Shell" stylesheet="asset:stylesheet" title="Семейный бюджет" doctype="ognl:null" > <body jwcid="@Body"> <span jwcid="@RenderBody" /> </body> </span> </span> </html>
Border.jwc
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE component-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> <component-specification allow-informal-parameters="no"> <asset name="stylesheet" path="classpath:/META-INF/stylesheet.css"/> </component-specification>
По анологии создаем компонент Menu
Menu.html
<span jwcid="@Border"> <table class="tabs" cellspacing="0" border="0" cellpadding="10"> <th> <span jwcid="@PageLink" page="MoneyOperationList" disabled="ognl:page.pageName.equals('MoneyOperationList')" > Денежные операции </span> </th> <th> <span jwcid="@PageLink" page="OperationItemList" disabled="ognl:page.pageName.equals('OperationItemList')" > Статьи денежных операций </span> </th> </table> <br/> <span jwcid="@RenderBody" /> </span>
Menu.jwc
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE component-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> <component-specification allow-informal-parameters="no"/>
Для создания страницы необходимо создать файл MoneyOperationList.html
в ветке Web Pages
.
В результате должны получить следующее
<span jwcid="@Menu"> <span jwcid="@weda:ActionPanel" position="top" renderActionAsLink="ognl:true"> <span jwcid="@weda:Table" tableModel="weda.table-model:moneyOperation-view"> <tr> <span jwcid="@weda:EditorGroup" modelGroup="weda.editor-model-group:moneyOperation-filter" exceptionOnEditorError="ognl:true" > <td/> <td> <span jwcid="@weda:BaseEditor" modelName="id" style="width:100%"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="operationDate" style="width:100%"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="amount" style="width:100%"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="operationItem.operationType" style="width:100%"/> </td> <td> <span jwcid="@weda:ActionPanel" position="right" renderActionAsLink="ognl:true"> <span jwcid="@weda:BaseEditor" modelName="operationItem" valueEditorPageName="OperationItemList" style="width:100%"/> </span> </td> </span> </span> </span> </span>
Обратим внимание на некоторые детали.
List
не случайно. Дело в том что после выполнения действия,
например нажатие на кнопку Редактировать
WEDA Framework должен принять решение - на какую страницу перейти?
Так вот в случае рассматриваемого нами примера (нажатие на кнопку
"Редактировать") WEDA откроет страницу MoneyOperationEdit
т.е. заменит суфикс List
на Edit
.
Подробнее о WEDA Workflow можно узнать в руководстве пользователя
в разделе Workflow.
weda:ActionPanel
позволяет
собрать и отобразить в виде конопок все действия зарегистрированные
для компонентов находящихся внутри элемента
<span jwcid=@weda:ActionPanel ...
weda:Table
позволяет отобразить
содержимое табличной модели в виде таблицы. В этом
случае компонент работатет с табличной моделью
moneyOperation-view
которую мы создали
ранее.
weda:EditorGroup
является
группирующим элементом для редакторов (в нашем случае
это компоненты weda:BaseEditor
).
Компонент EditorGroup
должен прикрепляться
к группе моделей редактирования (в нашем случае это группа
моделей для редактирования элементов фильтра moneyOperation-filter
)
operationType
будет производиться на странице OperationItemList
.
Это задано при помощи атрибута valueEditorPageName
.
Редактор "обернут" в дополнительный компонент weda:ActionPanel
с целью появления действий (в виде кнопок) справа от поля редактирования
а не вверху вместе с остальными действиями.
Для создания страницы необходимо создать файл MoneyOperationEdit.html
в ветке Web Pages
.
В результате должны получить следующее
<body jwcid="@Border"> <h3 style="border-bottom: 1px solid black">Редактирование информации о денежной операции</h3> <span jwcid="@weda:ActionPanel" position="bottom" renderActionAsLink="ognl:true"> <br/> <span jwcid="@weda:EditorGroup" modelGroup="weda.editor-model-group:moneyOperation-edit" > <table border="0" cellpadding="3px"> <tr> <td> <span jwcid="@weda:EditorLabel" modelName="operationDate"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="operationDate" style="width:100%"/> </td> <td> <span jwcid="@weda:EditorError" modelName="operationDate"/> </td> </tr> <tr> <td> <span jwcid="@weda:EditorLabel" modelName="amount"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="amount" style="width:100%"/> </td> <td> <span jwcid="@weda:EditorError" modelName="amount"/> </td> </tr> <tr> <td> <span jwcid="@weda:EditorLabel" modelName="operationItem"/> </td> <td> <span jwcid="@weda:ActionPanel" position="right" style="width:100%" renderActionAsLink="ognl:true" > <span jwcid="@weda:BaseEditor" modelName="operationItem" valueEditorPageName="OperationItemList" style="width:100%"/> </span> </td> <td> <span jwcid="@weda:EditorError" modelName="operationItem"/> </td> </tr> <tr> <td> <span jwcid="@weda:EditorLabel" modelName="operationDescription"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="operationDescription" style="width:100%" cols="ognl:30" rows="ognl:5"/> </td> <td> <span jwcid="@weda:EditorError" modelName="operationDescription"/> </td> </tr> </table> </span> <br/> </span> </body>
Обратим внимание на некорые детали. Есть много схожего между этой страницей и предыдущей:
weda:ActionPanel
для отображения
доступных действий.
weda:EditorGroup
. Только в данном
случае компонент ссылается на группу моделей редактирования
с именем moneyOperation-edit
weda:EditorLabel
который показывает
название свойства (помните параметр displaName
в анотации @Description
)
weda:EditorError
который показывает ошибку
связанную с указанной в атрибуте modelName
моделью данных.
Для создания страницы необходимо создать файл OperationItemList.html
в ветке Web Pages
.
В результате должны получить следующее
<span jwcid="@Menu"> <span jwcid="@weda:ActionPanel" position="top" renderActionAsLink="ognl:true"> <span jwcid="@weda:Table" tableModel="weda.table-model:operationItem-view"> <tr> <span jwcid="@weda:EditorGroup" modelGroup="weda.editor-model-group:operationItem-filter" exceptionOnEditorError="ognl:true" > <td/> <td> <span jwcid="@weda:BaseEditor" modelName="id" style="width:100%"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="operationType" style="width:100%"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="itemName" style="width:100%"/> </td> </span> </span> </span> </span>
Для создания страницы необходимо создать файл OperationItemEdit.html
в ветке Web Pages
.
В результате должны получить следующее
<body jwcid="@Border"> <h3 style="border-bottom: 1px solid black">Редактирование информации о денежной статье</h3> <span jwcid="ap@weda:ActionPanel" position="bottom" renderActionAsLink="ognl:true"> <br/> <span jwcid="@weda:EditorGroup" modelGroup="weda.editor-model-group:operationItem-edit" > <table border="0" cellpadding="3px"> <tr> <td> <span jwcid="@weda:EditorLabel" modelName="itemName"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="itemName" cols="40"/> </td> <td> <span jwcid="@weda:EditorError" modelName="itemName"/> </td> </tr> <tr> <td> <span jwcid="@weda:EditorLabel" modelName="operationType"/> </td> <td> <span jwcid="@weda:BaseEditor" modelName="operationType" style="width:100%"/> </td> <td> <span jwcid="@weda:EditorError" modelName="operationType"/> </td> </tr> </table> </span> <br/> </span> </body>
Добавьте к ветке Source Packages
файл
log4j.properties со следующим содержимым:
log4j.rootCategory=WARN, A1 # A1 is set to be a ConsoleAppender. log4j.appender.A1=org.apache.log4j.ConsoleAppender # A1 uses PatternLayout. log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%c{1} [%p] %m%n log4j.category.org.weda=info