Разработка Web-приложения

Анализ деятельности подразделения разработки программных продуктов, использующих Web-технологии, в компании ИООО "ЭПАМ Системз". Разработка систем с использованием Web-технологий с помощью программного продукта Oracle Database и технологий Spring, Struts.

Рубрика Программирование, компьютеры и кибернетика
Вид отчет по практике
Язык русский
Дата добавления 14.04.2014
Размер файла 1,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

  • Введение
  • 1. Структура и задачи предприятия
  • 1.1 Разработка систем с использованием WEB-технологий
  • 2. Краткое теоретическиое обоснование применяемых для решения поставленной задачи технологий
  • 2.1 WEB-технологии. Spring framework
  • 2.1.1 Архитектура Spring
  • 2.1.2 IoC - инверсия контроля
  • 2.2 Struts
  • 2.3 Hibernate
  • 3. Практическая реализация поставленной задачи
  • Заключение
  • Список использованной литературы

Введение

Производственная практика является составной частью учебного процесса подготовки квалифицированных специалистов. Во время практики происходит закрепление и конкретизация результатов теоретического обучения, приобретение студентами умения и навыков практической работы по присваиваемой квалификации и избранной специальности.

Основной целью производственной практики является систематизация и закрепление знаний, полученных в период обучения.

К задачам практики можно отнести расширение теоретических знаний, развитие умений и навыков в ходе выполнения конкретной работы.

Место прохождения производственной практики - подразделение разработки программных продуктов использующих веб-технологии. Компания ИООО "ЭПАМ Системз".

Были поставлены следующие задачи:

· изучить структуру предприятия и подразделения,

· изучить технику безопасности и охраны труда,

· ознакомиться с WEB-технологиями,

· закрепить полученные знания на практике, построив WEB-приложение с помощью программного продукта Oracle Database и технологий Spring, Struts.

· подобрать и систематизировать материалы для написания данного отчёта.

Отчёт о производственной практике состоит из трёх разделов.

Первый раздел посвящён описанию структуры и задач предприятия.

Во втором разделе приведены краткие теоретические сведения, необходимые для понимания и последующего решения поставленной задачи.

Третий раздел представляет собой подробное описание хода практической реализации поставленной производственной задачи.

1. Структура и задачи предприятия

Компания-резидент Парка высоких технологий "ЭПАМ Системз" (EPAM Systems) является на сегодняшний день крупнейшим поставщиком услуг в области разработки проектного (заказного) программного обеспечения и решений в Центральной и Восточной Европе. Созданная в 1993 году, Компания имеет представительства в 11 странах мира, более 7300 высококвалифицированных специалистов в штате, и продолжает активно расти. Реализовав тысячи сложных и масштабных решений для своих заказчиков по всему миру, EPAM Systems неизменно остаётся признанным лидером в таких областях как: разработка, тестирование, сопровождение и поддержка заказного программного обеспечения и бизнес-приложений; интеграция приложений на базе продуктов SAP, Oracle, IBM, Microsoft; миграция приложений на новую интеграционную платформу; создание выделенных центров разработки (центров компетенции), центров тестирования и контроля качества программного обеспечения.

1.1 Разработка систем с использованием WEB-технологий

В наше время тяжело представить себе жизнь без различных электронных устройств и приспособлений. Они в значительной степени помогают нам облегчить выполнение каких-либо действий. WEB-технологии позволяют использовать один ресурс несколькими людьми или системами. WEB-технологии дают возможность изменять данный ресурс для удобного, удаленного доступа пользователей.

На базе WEB-технологий можно построить эффективную систему, связанную с электронной бизнес-коммерцией.

приложение web технология программный

2. Краткое теоретическиое обоснование применяемых для решения поставленной задачи технологий

Для создания WEB-приложения, основываясь на MVC (model, view, controller), будем использовать:

· для работы с данными - Hibernate

· в качестве контейнера объектов - Spring

· в качестве представления - Struts

2.1 WEB-технологии. Spring framework

Веб-приложение - клиент-серверное приложение, в котором клиентом выступает браузер, а сервером - веб-сервер. Логика веб-приложения распределена между сервером и клиентом, хранение данных осуществляется, преимущественно, на сервере, обмен информацией происходит по сети. Одним из преимуществ такого подхода является тот факт, что клиенты не зависят от конкретной операционной системы пользователя, поэтому веб-приложения являются межплатформенными сервисами.

Spring - это легковесный открытый фреймворк, упрощающий разработку корпоративных (J2EE) приложений и нацеленный на использование простых JavaBean объектов.

· Легковесный. 2.5 мегабайт и приложение не зависит от классов Spring-а, т.е. есть мы нигде не делаем наследования от Spring и никак от него не зависим, максимум мы можем реализовывать какой-нибудь интерфейс. Получается, что наше приложение реализует логику, а за дополнительными сервисами мы просто обращаемся к Spring, вызывая его методы. Причем вызов делается таким образом, что мы в основном вызываем тоже интерфейсы, а реализация у этих интерфейсов может быть разная, то есть Spring предлагает несколько реализаций для разных платформ, например, различная реализация доступа к данным и т.д. Также Spring можно использовать в маленьких приложениях.

· Инверсия контроля (или инъекция зависимостей). Классы не создают своих зависимостей, они их получают (через метод setter можно получить любой сервис). Зависимость? То есть один класс зависит от другого класса. Например, наш какой-нибудь сервис выполняет отправку почты. Получается, что наш сервис зависит от сервиса отправки почты. В IoC суть заключается в том, что мы не создаем сервис отправки почты (new MailService и далее вызов методов), а мы его получаем. По сути мы получаем на вход, например, через setter или как угодно, но мы получаем Service и дальше делаем с ним всё что угодно. Интересно здесь то, что мы можем получить любой MailService.

· Аспектно-ориентированный. Используется AspectJ. В Spring есть своя реализация АОП, но все же лучше использовать AspectJ. Если коротко, то АОП - это выделение сквозной функциональности в отдельные модули. Например, функциональность, которая занимается управлением транзакцией, то есть эта функциональность выносится в отдельный модуль и дополнение к функциональности тоже выносится в отдельный модуль. Потом определяем, что такой-то и такой-то метод будут участвовать в транзакции. То есть это позволяет локализовать все, что связано со сквозной функциональностью в одном месте.

· Spring - это контейнер объектов. Это означает, что Spring хранит в себе объекты, он их создает и управляет их жизненным циклом. По сути это означает, что мы нигде не вызываем оператор new (через Spring не вызываем конструктор, то есть не используем new). Если нам понадобился какой-нибудь объект, то нужно обращаться к контейнеру Spring и он его выдает. Как он его выдает - это все можно настроить. Например, либо через new, либо будет выдавать Singleton, либо будет выдавать из пула объектов. IoC работает благодаря тому, что все объекты находятся в одном контейнере.

· Фреймворк. Значит, что есть возможность, компоновать сложные приложения из простых компонент, настраиваемых в конфигурационных файлах. Также фреймворк упрощает выполнение и управление J2EE функциями в приложении (транзакции, сообщения, веб).

2.1.1 Архитектура Spring

Рис. 1 - Архитектура Spring

· IoC - главный модуль

· AOP - Spring может подключиться к программе в любой точке и выполнить там нужный код

· Service Abstraction - абстрагируем благодаря тому, что мы вызываем интерфейсы Spring-а и вызываем его методы для работы. За счет этого он абстрагирует от всего остального (Web remoting, EJB, JMS, Scheduling итп).

· DAO - для работы с БД

· ORM - JPA, hibername

· WEB - классы, которые помогают упростить разработку Web (авторизация, доступ к бинам Spring-а из web)

· MVC - создает web

2.1.2 IoC - инверсия контроля

Как это обычно делают люди. Менеджер: он зависит от какого-то сервиса или продукта. Сейчас менеджер просто создает этот сервис или продукт самостоятельно, то есть, менеджер делает new service и вызывает его методы. Представим, что у нас есть какая-либо фабрика и мы говорим фабрике, что нужно создавать продукты и она их производит. Но в этом случае мы зависим от фабрики. Так делают многие и это правильно.

Но как можно сделать лучше? Нужно сделать, чтобы менеджер получал, что-то извне, а не создавал. По сути это и называется инъекция зависимости (инверсия контроля). Теперь получается, что не менеджер уже контролирует объекты, а кто-то их контролирует, а менеджеру предоставляет. Мы, как бы, меняем направление движения.

2.2 Struts

В паттерне MVC поток выполнения приложения всегда проходит через центральный контроллер. Контроллер перенаправляет запросы - в нашем случае, это HTTP запросы - к соответствующему обработчику. Обработчики привязаны к Модели, и каждый разработчик действует как адаптер между запросом и Моделью. Модель представляет, или инкапсулирует, бизнес-логику или состояние приложения. Управление обычно передается обратно через Контроллер соответствующему Представлению (View). Перенаправление осуществляется путем обращения к набору соответствий (mappings) между Моделью и представлением; причем этот набор обычно загружается из базы данных или из конфигурационного файла. Такая схема обеспечивает слабое связывание между Представлением и Моделью, что может сделать разработку и сопровождение приложения значительно проще.

Согласно паттерну Model-View-Controller, Struts имеет 3 основных компонента: сервлет контроллер, который входит в Struts, JSP страницы (это "представление”) и бизнес-логику приложения ("модель”). Давайте рассмотрим, как это все взаимодействует.

Struts'овский сервлет-контроллер связывает и перенаправляет HTTP запросы к другим объектам среды, включая JavaServer Pages и наследники класса org. apache. struts. action. Action, которые поставляются разработчиком приложения. Во время инициализации контроллер разбирает (parses) конфигурационный файл struts-config. xml. Конфигурационный файл определяет (помимо других вещей) соответствия org. apache. struts. action. ActionMappings для данного приложения. Контроллер использует эти соответствия для превращения HTTP-запросов в действия приложения.

Обычно ActionMapping определяет:

· путь запроса (или "URI”)

· тип объекта (наследника класса Action) для обработки запроса

и другие необходимые свойства

Объект Action может обработать запрос и ответить клиенту (обычно Web-браузеру), или указать, что управление должно быть передано куда-то дальше. Например, если проверка имени и пароля пользователя прошла успешно, Action для обработки этого события может пожелать перенаправить запрос на главное меню.

Объекты Action имеют доступ сервлету-контроллеру приложения, и таким образом имеют доступ к методам сервлета. Во время перенаправления запроса, объект Action может неявно перенаправить один или более совместно используемых (shared) объектов, включая JavaBeans, помещая их в одну из стандартных коллекций, которые совместно используются Java-сервлетами.

Объект Action может создать Bean, представляющий корзину покупателя, поместить этот bean в коллекцию сессии, и затем передать управление на другой mapping. Mapping'у может быть сопоставлен (mapping может использовать) JavaServer Page, отображающей содержимое корзины. Так как каждый клиент имеет собственную сессию, каждый из них будет иметь свою собственную корзину. В приложении Struts большинство элементов бизнес-логики может быть представлено с использованием JavaBeans. Объект Action может обращаться к свойствам JavaBean без углубления в детали реализации. Это инкапсулирует бизнес логику и таким образом Action может сфокусироваться на обработке ошибок и перенаправлении потока управления.

JavaBeans так же могут быть использованы для управления html-формами ввода (input forms). Ключевой проблемой при проектировании web-приложений является хранение и проверка того, что ввел пользователь, в промежутках между запросами. Используя Struts, вы можете определить свой собственный набор классов form bean, унаследовав их от org. apache. struts. action. ActionForm, и легко сохранять данные для форм ввода в этих form bean. Эти beans сохраняются в одной из стандартных совместно используемых сервлетами коллекций, и могут быть использованы другими объектами, особенно объектами Action.

Form bean могут быть использованы в JSP для сбора данных, вводимых пользователем; объектами Action для проверки введенных пользователями данных; и опять в JSP для заполнения полей html-форм. В случае обработки ошибок, Struts имеет совместно используемый механизм для возбуждения и отображения сообщений об ошибках.

Struts form bean объявляются в конфигурационном файле, определяются в исходных Java-кодах, и привязываются к ActionMapping, используя общее имя свойства. Когда запрос вызывает Action, которое использует form bean, сервлет-контроллер либо извлекает, либо создает вновь form bean, и передает его объекту Action. Объект Action может затем проверить содержимое form bean перед тем, как форма ввода для данного form bean будет показана, а также поставить в очередь те сообщения, которые будут обработаны формой. Когда дело сделано, объект Action может вернуть управление, перенаправив его на форму ввода, обычно JSP. После этого контроллер может ответить на HTTP-запрос и направить клиента на JavaServer Page.

Среда Struts включает библиотеки специальных тэгов, которые могут автоматически поместить значения свойств form bean в поля html-форм. Единственная вещь, которую большинство JSP должны знать об остальной части среды это соответствующие имена полей и где надо сделать submit. Компоненты вроде сообщений, которые ставятся в очередь объектами Action могут быть отображены с помощью одного лишь тэга. Могут определяться другие тэги, зависящие от конкретного приложения, для того, чтобы скрыть детали реализации от JSP.

Специальные тэги среды Struts спроектированы для использования свойств интернационализации, которые встроены в платформу Java. Все метки, поля и сообщения могут извлекаться из ресурса сообщений (message resource), и Java может автоматически использовать правильный ресурс в зависимости от страны и языка клиента. Чтобы обеспечить сообщения на дополнительном языке, просто добавьте еще один файл ресурсов.

Помимо интернационализации, другими преимуществами такого подхода являются единое именование меток на различных формах, а также возможность просматривать и изменять все метки и сообщения в централизованном виде.

Для простейших приложений, объект Action иногда может обрабатывать бизнес-логику, связанную с запросом. Однако в большинстве случаев объект Action должен вызывать другой объект, обычно JavaBean, для выполнения операций реальной бизнес-логики. Это позволяет объектам Action сфокусироваться на обработке ошибок и управлении приложением, а не реализацией бизнес-логики. Чтобы быть легко переносимыми на другие платформы, JavaBean не должны ссылаться ни на какие объекты web-приложений. Объект Action должен извлекать/переводить необходимые детали из HTTP-запросов и передавать их объектам классов бизнес-логики в виде обычных Java-переменных.

В приложениях баз данных, например:

Bean бизнес-логики соединяется с базой данных и посылает запросы.

Bean бизнес-логики возвратит результат объекту Action

Объект Action сохранит результат в form bean в запросе (т.е. поместит form bean в context collection - прим. перев.)

JavaServer Page отобразит результат в виде HTML-формы

Никогда ни Action, ни JSP не нужно беспокоиться (или заботиться) о том, откуда пришел результат. Они должны знать как упаковать и показать его.

Несколько лет назад разработчики приложений могли рассчитывать на распространение своих приложений только среди жителей собственной страны, которые используют один (иногда два) языка и единственный способ представления таких вещей, как даты, числовые и денежные значения. Однако взрывной рост разработки приложений с использованием web-технологий, также как и распространение этих приложений через Интернет, частично сделал национальные границы невидимыми. Это привело к необходимости разрабатывать приложения с поддержкой интернационализации (i18n) и локализации (localization).

Struts строится на основе платформы Java, чтобы обеспечить возможности построения интернационализованных и локализованных приложений. Ниже приведены ключевые концепции, с которыми нужно познакомиться:

Locale - основной Java класс, который поддерживает интернационализацию - java. util. Locale. Каждая Locale представляет собой конкретный выбор страны и языка (плюс возможный вариант языка), а также набор способов форматирования таких вещей как числа и даты.

ResourceBundle - Класс java. util. ResourceBundle обеспечивает основные инструменты для поддержки сообщений на многих языках. Подробнее смотрите Javadocs - класс ResourceBundle, а также информацию об интернационализации в документации к вашему релизу JDK.

PropertyResourceBundle - Одна из стандартных реализаций ResourceBundle позволяет вам определять ресурсы, используя тот же синтаксис "имя=значение” ("name=value"), что используется при инициализации файлов свойств. Это очень удобно для подготовки пакетов ресурсов (resource bundles) с сообщениями, которые используются в web-приложении, потому что обычно такие сообщения представлены в виде текста.

MessageFormat - Класс java. text. MessageFormat позволяет заменять части строки сообщения (в этом случае они извлекаются из пакета ресурсов) аргументами, определяемыми во время выполнения. Это полезно в случае, когда вы создаете предложение, но слова в нем будут появляться в различном порядке на различных языках. Строка-заменитель {0} в сообщении заменяется первым аргументом, {1} заменяется вторым аргументом и так далее.

MessageResources - Класс Struts org. apache. struts. util. MessageResources позволяет обращаться с пакетами ресурсов как с базой данных, и позволяет запрашивать конкретную строку сообщения для конкретной Locale (обычно Locale для текущего пользователя) вместо Locale, используемой по умолчанию на сервере, где запущено данное приложение.

Обратите внимание, что поддержка i18n в средах вроде Struts ограничена представлением интернационализованного текста и изображений для пользователя. Поддержка для Locale соответствующих методов ввода (используемых в таких языках как японский, китайский и корейский) возлагается на клиентское устройство - обычно web-браузер.

Чтобы получить интернационализованное приложение, следуйте рекомендациям, описанным в документе по интернационализации в документации JDK на вашей платформе, для того чтобы создать файл свойств (properties file), содержащий сообщения для каждого языка. Пример рассмотрен чуть ниже

В обычном Java EE веб-приложении клиент, как правило, отправляет информацию на сервер из формы. Введённые данные передаются сервлету, который обрабатывает её, при необходимости взаимодействуя с базой данных, и формирует HTMLответ. Для больших проектов (например, для портала с сотнями страниц), такой подход является неадекватным, так как объединяет бизнес логику и логику отображения, что делает поддержку чрезвычайно сложной.

Struts был создан для того, чтобы чётко разделить модель (бизнес-логику), представление (JSP-страницы) и контроллер (отвечающий за передачу данных от модели к представлению и обратно). Struts предоставляет стандартный контроллер - сервлет под именем ActionServlet и различные средства для создания страниц представления. Разработчик веб-приложения отвечает за написание кода модели и создание конфигурационного файла struts-config. xml, который связывает воедино модель, представление и контроллер.

Запросы от клиента передаются контроллеру в виде "Actions" (действий), определённых в конфигурационном файле. Когда контроллер получает такой запрос, он передаёт его соответствующему Action классу. Последний взаимодействует с кодом Модели и возвращает контроллеру "ActionForward", строку, определяющую страницу для отправления клиенту. Информация передаётся между моделью и представлением в виде особых JavaBeans. Богатая библиотека тегов позволяет получать данные из бинов и записывать их без Java кода.

Struts также поддерживает i18n (интернационализацию), облегчает валидацию данных полученных из веб-формы и предоставляет механизм создания шаблонов под названием "Tiles", который кроме всего прочего позволяет наследовать веб-страницы.

2.3 Hibernate

Hibernate - фреймворк, предназначенная для решения задач объектно-реляционного отображения (object-relational mapping - ORM).

Целью Hibernate является освобождение разработчика от значительного объёма сравнительно низкоуровневого программирования по обеспечению хранения объектов в реляционной базе данных. Разработчик может использовать Hibernate как в процессе проектирования системы классов и таблиц "с нуля", так и для работы с уже существующей базой данных.

Hibernate не только решает задачу связи классов Java с таблицами базы данных (и типов данных Java с типами данных SQL), но также предоставляет средства для автоматической генерации и обновления набора таблиц, построения запросов и обработки полученных данных и может значительно уменьшить время разработки, которое обычно тратится на ручное написание SQL - и JDBC-кода. Hibernate автоматизирует генерацию SQL-запросов и освобождает разработчика от ручной обработки результирующего набора данных и преобразования объектов, максимально облегчая перенос (портирование) приложения на любые базы данных SQL.

Hibernate обеспечивает прозрачную поддержку сохранности данных (persistence) для "POJO" (то есть для стандартных Java-объектов); единственное строгое требование для сохраняемого класса - наличие конструктора по умолчанию (без параметров).

Mapping (сопоставление, буквально - картирование) Java классов с таблицами базы данных осуществляется с помощью конфигурационных XML файлов или Java-аннотаций. При использовании файла XML, Hibernate может генерировать скелет исходного кода для классов длительного хранения (persistent). В этом нет необходимости, если используется аннотация. Hibernate может использовать файл XML или аннотации для поддержки схемы базы данных.

Обеспечиваются возможности по организации отношения между классами "один-ко-многим" и "многие-ко-многим". В дополнение к управлению связями между объектами, Hibernate также может управлять рефлексивными отношениями, где объект имеет связь "один-ко-многим" с другими экземплярами своего собственного типа данных.

Hibernate поддерживает отображение пользовательских типов значений. Это делает возможным такие сценарии:

· Переопределение типа по умолчанию SQL, Hibernate выбирает при отображении столбца свойства.

· Картирование перечисляемого типа Java до колонок БД, будто они являются обычными свойствами.

· Картирование одного свойства в несколько колонок.

3. Практическая реализация поставленной задачи

Покажем практическую реализацию интеграции Spring+Struts+Hibernate на примере новостного портала. Данный web - проект будет включать в себя просмотр всех новостей, просмотр, редактирование и удаление выбранной новости, добавление новой новости и удаление выбранного количества новостей. Будет присутствовать интернационализация и локализация.

Стартовая страница будет иметь вид:

Рис. 2 - Список всех новостей

На Рис.3 можно увидеть форму для добавления новой новости. После нажатия на кнопку СОХРАНИТЬ происходит валидация, и если есть ошибки, то они подсвечиваются и не корректная информация не сохраняется.

Рис.3 - Форма для добавления новости

На Рис.4 можно увидеть форму для редактирования новости. Форма имеет такой же вид как и на Рис.3, только с уже заполненной информацией.

Рис.4 - Форма для редактирования новости

Далее представим немного основных кусков кода с небольшими комментариями:

Листинг 1. Конфигурация Spring.

<? xml version="1.0" encoding="Utf-8"? >

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi: schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5 xsd">

<bean id="configProperties" class="org. springframework. beans. factory. config. PropertyPlaceholderConfigurer">

<property name="location">

<value>classpath: /resources/config. properties</value>

</property>

</bean>

<bean id="pool" class="com. epam. news. pool. ConnectionPool" scope="" destroy-method="dispose">

<constructor-arg value="${database. driver}"/>

<constructor-arg value="${database. url}"/>

<constructor-arg value="${connectionPool. poolSize}"/>

</bean>

<bean id="jdbcNewsDAO" class="com. epam. news. database. JdbcNewsDAO">

<property name="pool" ref="pool"/>

</bean>

<bean id="hibernateNewsDAO" class="com. epam. news. database. HibernateNewsDAO"/>

<bean id="jpaNewsDAO" class="com. epam. news. database. JpaNewsDAO"/>

<bean name="/setEnglishLocale /setRussianLocale" class="com. epam. news. presentation. action. LocaleAction"/>

<bean name="newsAction" class="com. epam. news. presentation. action. NewsAction">

<property name="newsDAO" ref="hibernateNewsDAO"/>

</bean>

<alias name="newsAction" alias="/saveNews"/>

<alias name="newsAction" alias="/newsList"/>

<alias name="newsAction" alias="/cancel"/>

<alias name="newsAction" alias="/viewNews"/>

<alias name="newsAction" alias="/addNews"/>

<alias name="newsAction" alias="/editNews"/>

<alias name="newsAction" alias="/deleteNews"/>

</beans>

Листинг 2. Класс, который обрабатывает запросы, пришедшие от пользователя.

public class NewsAction extends MappingDispatchAction {

private static final Logger log = Logger. getLogger (NewsAction. class);

private static final String SUCCESS = "success";

private INewsDAO newsDAO;

public void setNewsDAO (INewsDAO newsDAO) {

this. newsDAO = newsDAO;

}

public ActionForward list (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

log. info (NEWS_LIST);

NewsForm newsForm = (NewsForm) form;

newsForm. setNewsList (newsDAO. getList ());

return mapping. findForward (SUCCESS);

}

public ActionForward view (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

NewsForm newsForm = (NewsForm) form;

int newsId = newsForm. getId ();

log. info (NEWS_VIEW + newsId);

newsForm. setNewsMessage (newsDAO. fetchById (newsId));

return mapping. findForward (SUCCESS);

}

public ActionForward edit (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

NewsForm newsForm = (NewsForm) form;

int newsId = newsForm. getId ();

log. info (NEWS_EDIT + newsId);

newsForm. setNewsMessage (newsDAO. fetchById (newsId));

return mapping. findForward (SUCCESS);

}

public ActionForward delete (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

NewsForm newsForm = (NewsForm) form;

String [] selected = newsForm. getSelected ();

log. info (NEWS_DELETE + selected);

List<Integer> deletedList = new ArrayList<Integer> ();

for (int index = 0; index < selected. length; index++) {

deletedList. add (Integer. parseInt (selected [index]));

}

newsDAO. remove (deletedList);

return mapping. findForward (SUCCESS);

}

public ActionForward cancel (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

TraceDeque traceDeque = (TraceDeque) request. getSession (). getAttribute (TRACE_DEQUE);

String back;

if (traceDeque. peekLast (). equals (ADD_NEWS_DO)) {

back = NEWS_LIST_DO;

} else {

back = traceDeque. peek ();

}

log. info (NEWS_CANCEL + back);

ActionForward refererForward = new ActionForward (back, true);

return refererForward;

}

public ActionForward save (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

NewsForm newsForm = (NewsForm) form;

News news = newsForm. getNewsMessage ();

newsDAO. save (news);

log. info (NEWS_SAVE + news);

String path = mapping. findForward (SUCCESS). getPath ();

ActionForward modifiedForward = new ActionForward (path + "?" + ID +"="

+ news. getId (), true);

return modifiedForward;

}

public ActionForward add (ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

log. info (NEWS_ADD);

NewsForm newsForm = (NewsForm) form;

newsForm. setNewsMessage (new News ());

return mapping. findForward (SUCCESS);

}

}

Листинг 3. Пример пулла соединений:

public class ConnectionPool {

private static final Logger log = Logger. getLogger (ConnectionPool. class);

private static final String POOL_CREATED = "Connection pool created, pool size: ";

private static final String POOL_DESTROYED = "Connection pool destroyed";

private String driver;

private String url;

private int poolSize;

private BlockingQueue<Connection> queue;

private ConnectionPool (String driver, String url, int poolSize) {

this. driver = driver;

this. url = url;

this. poolSize = poolSize;

initialize ();

}

private void initialize () {

try {

Class. forName (driver). newInstance ();

queue = new ArrayBlockingQueue<Connection> (poolSize);

for (int i = 0; i < poolSize; i++) {

queue. offer (DriverManager. getConnection (url));

}

} catch (SQLException e) {

throw new RuntimeException (e);

} catch (InstantiationException e) {

throw new RuntimeException (e);

} catch (IllegalAccessException e) {

throw new RuntimeException (e);

} catch (ClassNotFoundException e) {

throw new RuntimeException (e);

}

log. info (POOL_CREATED + poolSize);

}

public Connection getConnection () {

Connection connection = null;

try {

connection = queue. take ();

} catch (InterruptedException e) {

throw new RuntimeException (e);

}

return connection;

}

public void returnConnection (Connection connection) {

boolean closed = true;

try {

connection. setAutoCommit (true);

closed = connection. isClosed ();

} catch (SQLException e) {

throw new RuntimeException (e);

}

if (! closed) {

queue. offer (connection);

}

}

public void dispose () {

Connection connection;

if (queue == null) {

return;

}

while ( (connection = queue. poll ())! = null) {

try {

if (! connection. getAutoCommit ()) {

connection.commit ();

}

connection. close ();

} catch (SQLException e) {

throw new RuntimeException (e);

}

}

log. info (POOL_DESTROYED);

}

}

Листинг 4. Пример маппинга для Hibernate

<? xml version="1.0"? >

<! DOCTYPE hibernate-mapping PUBLIC

"- // Hibernate/Hibernate Mapping DTD 3.0 // EN"

"http://hibernate. sourceforge.net/hibernate-mapping-3.0. dtd">

<hibernate-mapping>

<class name="com. epam. news. model. News" table="news">

<id column="newsId" name="id" type="integer">

<generator class="sequence">

<param name="sequence">NEWS_SEQ</param>

</generator>

</id>

<property column="title" name="title" type="string" />

<property column="c_date" name="date" type="date" />

<property column="brief" name="brief" type="string" />

<property column="content" name="content" type="string" />

</class>

<query name="findAllNews">

<! [CDATA [FROM News ORDER BY date DESC]] >

</query>

<query name="deleteSelectedNews">

<! [CDATA [DELETE FROM News WHERE id IN (: newsIdList)]] >

</query>

</hibernate-mapping>

Заключение

В результате производственной практики были приобретены новые теоретические и практические знания, навыки и умения. Выполненная работа имела отношение к реальной задаче, результат решения которой необходим конкретным людям.

Итогом практики явилось:

· закрепление полученных в университете теоретических знаний о реляционных БД, СУБД;

· получение новых знаний о web-технологиях;

· работа с новым программными продуктами и системами;

· получение навыков анализа документации;

· приобретение опыта принятия самостоятельных решений;

· приобретение опыта работы в команде;

· приобретение опыта участия в долгосрочных, масштабных проектах.

Список использованной литературы

1 Интернет-сайт Предприятия места практики http://www.epam. by/. Дата доступа 20.06.2012.

2 Spring http://www.spring-source.ru/docs_simple. php

3 Struts http://www.struts.ru/userGuide/

4 Hibernate http://ru. wikipedia.org/wiki/Hibernate_ (%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0)

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.