| |
|
||||||
Quick Links |
3. Разработка View-компонентов |
|||||
---|---|---|---|---|---|---|
3.1 Обзор |
||||||
Эта глава посвящена задаче построения View-компонентов приложения, которые в основном создаются с использованием технологии JavaServer Pages (JSP). В частности, Struts обеспечивает поддержку интернационализованных приложений, так же как и взаимодействие с формами ввода. Также здесь коротко рассматриваются несколько других разделов, связанных с View-компонентами. |
||||||
3.2 Интернационализация |
||||||
Несколько лет назад разработчики приложений могли рассчитывать на распространение своих приложений только среди жителей собственной страны, которые используют один (иногда два) языка и единственный способ представления таких вещей, как даты, числовые и денежные значения. Однако взрывной рост разработки приложений с использованием web-технологий, также как и распространение этих приложений через Интернет, частично сделал национальные границы невидимыми. Это привело к необходимости разрабатывать приложения с поддержкой интернационализации (часто интернационализацию по-английски называют i18n (ай-эйтин), потому что в слове internationalization 18 букв между i и n) и локализации (localization). Struts строится на основе платформы Java, чтобы обеспечить возможности построения интернационализованных и локализованных приложений. Ниже приведены ключевые концепции, с которыми нужно познакомиться:
Обратите внимание, что поддержка i18n в средах вроде Struts ограничена представлением интернационализованного текста и изображений для пользователя. Поддержка для Locale соответствующих методов ввода (используемых в таких языках как японский, китайский и корейский) возлагается на клиентское устройство – обычно web-браузер. Что получить интернационализованное приложение, следуйте рекомендациям, описанным в документе по интернационализации в документации JDK на вашей платформе, для того чтобы создать файл свойств (properties file), содержащий сообщения для каждого языка. Пример рассмотрен чуть ниже. Предположим, что ваш исходный код создается в package
Когда вы конфигурируете сервлет-контроллер в
дескрипторе для распространения web-приложения (web application
deployment descriptor), одна из тех вещей, которые вы должны
определить в параметрах инициализации – основное имя пакета
ресурсов для вашего приложения. В случае, описанном выше, это
должен быть
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>com.mycompany.mypackage.MyResources</param-value> </init-param> <.../> </servlet>
Важно отметить, что пакет ресурсов должен находиться в class path
для вашего приложения. Другой подход – сохранять
Если вы пользуетесь таким методом, вот Ant task,
который нужно запустить во время компиляции вашего приложения,
который скопирует содержимое каталога
<!-- Copy any configuration files --> <copy todir="classes"> <fileset dir="src/conf"/> </copy> |
||||||
3.3 Взаимодействие Forms и FormBean |
|
|||||
Так или иначе, большинство разработчиков веб-приложений должны создавать формы, используя стандартные возможности HTML, такие как тэг <input>. Пользователи ожидают, что интерактивные приложения должны иметь определенное поведение, и одно из этих ожиданий связано с обработкой ошибок – если пользователь делает ошибку, приложение должно позволить ему исправить лишь то, что нужно – без необходимости вводить заново остальную (правильную) часть информации на текущей странице или форме. Выполнение этого требования пользователей является
скучным и громоздким делом, когда мы кодируем лишь с помощью
стандартного HTML и JSP. Например, элемент ввода для поля
<input type="text" name="username" value="<%= loginBean.getUsername() %>"/> это трудно правильно напечатать, смущает HTML разработчиков, которые не опытны в концепциях программирования , и могут привести к проблемам с редакторами HTML. Вместо этого Struts обеспечивает исчерпывающий набор средств для создания форм, основываясь на средствах специальной библиотеки тэгов (Custom Tag Library) в JSP 1.1. Пример, показанный раньше, может быть представлен средствами Struts следующим образом: <html:text property="username"/> без всякой необходимости явно ссылаться на JavaBean, из которого извлекается первоначально значение. Это автоматически обрабатывается средой. HTML-формы иногда используются для загрузки других файлов (upload other files). Большинство браузеров поддерживают это с помощью элемента <input type="file">, который генерирует кнопку поиска файлов (file browse button), но на совести разработчика остается то, как обработать вхлдящие файлы. Struts обрабатывает такие "multipart"-формы таким же способом, как и обычные формы. В следующем разделе мы рассмотрим использование Struts для создания простой формы входа (login form), а также простую mulitpart-форму. |
||||||
3.3.1 Разработка Forms в Struts |
||||||
Полный пример login-формы иллюстрирует то, что Struts взаимодействует с формами гораздо менее болезненно, чем при прямом использовании HTML и стандартных средств JSP. Рассмотрим следующую страницу logon.jsp (основанную на примере приложения, включенном в поставку Struts): <%@ page language="java" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html:html> <head> <title> <bean:message key="logon.title"/> </title> <body bgcolor="white"> <html:errors/> <html:form action="/logon" focus="username"> <table border="0" width="100%"> <tr> <th align="right"> <html:message key="prompt.username"/> </th> <td align="left"> <html:text property="username" size="16"/> </td> </tr> <tr> <th align="right"> <html:message key="prompt.password"/> </th> <td align="left"> <html:password property="password" size="16"/> </td> </tr> <tr> <td align="right"> <html:submit> <bean:message key="button.submit"/> </html:submit> </td> <td align="right"> <html:reset> <bean:message key="button.reset"/> </html:reset> </td> </tr> </table> </html:form> </body> </html:html> Следующие пункты проясняют ключевые свойства обработки форм в Struts, основываясь на приведенном примере:
Обработка multipart-формы также очень проста. Очевидно, когда вы создаете multipart-форму, вы создаете форму, в которой есть хоть один элемент типа “file” (<input type=”file”>). Первым шагом в создании multipart-формы является использование на JSP-странице библиотеки тэгов Struts struts-html: <%@page language="java"> <%@taglib uri="/WEB-INF/struts-html.tld" prefix="html"> <html:form action="uploadAction.do"> Please Input Text: <html:text property="myText"><br/> Please Input The File You Wish to Upload:<br/> <html:file property="myFile"><br /> <html:submit /> </html:form> Следующим шагом будет создание вашего ActionForm bean: import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; import org.apache.struts.upload.FormFile; public class UploadForm extends ActionForm { protected String myText; protected FormFile myFile; public void setMyText(String text) { myText = text; } public String getMyText() { return myText; } public void setMyFile(FormFile file) { myFile = file; } public FormFile getMyFile() { return myFile; } } Взгляните на Javadocs
для FormFile, чтобы ознакомиться с методами, которые он
представляет для манипуляции файлами при их загрузке (file
uploading). Также взгляните на Javadocs для ActionServlet и
ActionMapping, чтобы ознакомиться с различными параметрами,
которые можно задавать, чтобы изменить процесс загрузки файлов.
Обычно в методе perform() в вашем Action-классе вы должны вызвать
|
||||||
3.3.2 Поддерживаемые типы Input-полей |
||||||
Struts определяет HTML-тэги для следующих типов input-полей (ссылки ведут на соответствующую справочную информацию):
В любом случае, тэг для поля должен быть вложен в тэг формы, так, чтобы поле знало, какой bean надо использовать для инициализации отображаемых значений. |
||||||
3.3.3 Другие полезные тэги для представления данных |
||||||
Есть еще несколько полезных тэгов для создания представлений. Обращайтесь к документации по каждой конкретной библиотеке тэгов вместе с изучением Tag Developers Guides.
|
||||||
3.3.4 Автоматическая проверка Form |
||||||
Помимо взаимодействия форм и beans, описанного выше, Struts предлагает дополнительные средства для проверки значений полей ввода, которые были получены от пользователя. Чтобы использовать данные средства, переопределите (override) следующий метод в вашем классе-наследнике ActionForm: public ActionErrors validate(ActionMapping mapping, HttpServletRequest request);
Метод validate() вызывается сервлетом-контроллером после того, как
свойства bean были заполнены и с помощью submit были посланы на
сервер, но перед тем, как будет вызван соответствующий метод
The validate() method is called by the controller servlet after the bean properties have been populated, but before the corresponding action class's
Как было указано выше, эта автоматическая проверка полей ввода является полностью опциональной. Реализация метода validate() по умолчанию возвращает null, и сервлет-контроллер предполагает, что вся требуемая проверка будет производится в action-классе. Обычный подход – это выполнять первичные, простейшие проверки с использованием метода ActionForm validate(), а затем производить проверку с точки зрения бизнес-логики в action-классе. Дополнительный пакет для выполнения проверок в ActionForm доступен в Nightly Build (но не забудьте проверить и текущий релиз!) и с сайта David Winterfeldt's Web site. |
||||||
3.4 Другие методы представления данных |
||||||
Хотя стиль вашего приложения (look and feel) может быть полностью построен на основании стандартных возможностей JSP и специфических библиотек тэгов Struts, вы можете рассмотреть возможность использования других методов, которые улучшат повторное использование компонентов, облегчат эксплуатацию приложения, и/или уменьшат количество ошибок. Несколько возможных вариантов рассмотрены ниже в этом разделе. |
||||||
3.4.1 Тэги для конкретного приложения |
||||||
Помимо использования библиотек тэгов, поставляемых вместе со Struts, легко создавать тэги, которые нужны для приложения, которое вы строите, чтобы облегчить создание пользовательского интерфейса. Пример приложения, включенный в Struts, иллюстрирует принципы создания таких тэгов, на базе следующих примеров тэгов:
Исходный код для этих тэгов находится в каталоге
|
||||||
3.4.2 Сборка страниц с помощью директивы Includes |
||||||
Создание целого представления страницы в одном JSP-файле (c использованием тэгов и beans для доступа к требуемым динамическим данным) является очень распространенным подходом к проектированию, и используется в приложении-примере, включенном в поставку Struts. Однако, многие приложения требуют отображать множество логически отличающихся частей вашего приложения вместе на одной странице. Например, приложение-портал должно иметь несколько (или даже все) следующие функциональные возможности на “домашней” странице портала:
Разработка различных сегментов сайта становится проще, если вы разделите свою работу, и назначите различных разработчиков на различные сегменты. Затем можно будет использовать возможность include в технологии JavaServer Pages для того чтобы объединить результаты в единую результирующую страницу, или использовать тэг include, поставляемый вместе со Struts. Есть три возможных типа include, зависящих от того, когда нужно получить комбинацию результатов:
Другим подходом может быть использование библиотеки тэгов шаблонов Struts (Struts Template Tag library). Подробнее смотрите Руководство Разработчика. Использование Tiles является альтернативой первоначальной библиотеки Template Tag. Tiles предлагают несколько расширений и новых возможностей. Tiles доступны в Nightly Build (но не забудьте проверить и текущий релиз!) и с сайта Cedric Dumoulin's Web site. |
||||||
3.4.3 Компоненты обработки изображений |
||||||
Некоторые приложения требуют наличия динамически создаваемых изображений, вроде графиков цен. Два различных подхода обычно используются для удовлетворения этих требований:
|
||||||
3.4.4 Представление текста |
||||||
Некоторые приложения требуют использование динамически сгенерированного текста или разметки, например XML. Если целая страница представляется таким образом, и есть возможность использовать PrintWriter для получения вывода, то очень просто сделать это из Action: response.setContentType("text/plain"); // or text/xml PrintWriter writer = response.getWriter(); // use writer to render text return(null); Далееt: Разработка Controller- компонентов |
||||||
|
||||||
Copyright (c) 2000-2002, Apache Software Foundation |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |