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