Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

web-programmirovanie_metodicheskie_ukazania

.pdf
Скачиваний:
68
Добавлен:
09.02.2015
Размер:
606.97 Кб
Скачать

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

использовать локализацию по умолчанию.

<c:if test="${empty sessionScope.locale}"> <fmt:setLocale value="ru_RU"/>

</c:if>

<c:if test="${sessionScope.locale eq 'ru_RU'}"> <fmt:setLocale value="ru_RU"/>

</c:if>

<c:if test="${sessionScope.locale eq 'en_GB'}"> <fmt:setLocale value="en_GB"/>

</c:if>

3.3.2. Установка заголовка страницы с учётом локализации

Если файл локализации по умолчанию называется locale.properties и есть две вариации для английского и русского языка.

<fmt:setBundle basename="locale"/> <title><fmt:message key="titleCart" /></title>

3.4. Задание

Необходимо создать JSP-страницу, реализующую страницу корзины интернетмагазина. Основные требования:

1.Корзина реализована с использованием JSTL и EL.

2.В корзине не используются стандартные элементы JSP, такие как скриплеты, JSPвыражения, определения.

3.Корзина открывается при нажатии пользователем кнопки «Корзина» или копки «Заказ» (из карточки или списка продуктов).

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

5.Корзина поддерживает локализацию (аналогично карточке и списку).

6.Пользователь может заказать несколько экземпляров одного и того же продукта. Информация о выбранных продуктах должна храниться в сессии.

7.Если пользователь не авторизован, то ему выдаётся приглашение авторизоваться для заказа. Если авторизован, то ему доступна кнопка «Заказ».

8.В «шапке» страницы выводится та же информация, что и в списке продуктов.

Лабораторная работа №4. Авторизация пользователя

Цель: научить студентов использовать декларативную авторизацию пользователей.

- 21 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

4.1.Понятие авторизации

Авторизация — предоставление определённому лицу прав на выполнение определённых действий, а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий.

В web-приложениях пользователю для авторизации предлагается ввести имя и пароль.

4.2.Основные элементы авторизации

4.2.1.Конфигурация сервера

При этом роль «tomcat» должна быть записана в конфигурационном файле Apache Tomcat («conf/tomcat-users.xml»):

<user username="myname" password="mypassword" roles="user"/>

Важно! При изменении параметров сервера его необходимо перезапустить!

4.2.2. Дескриптор развёртывания web.xml

Дескриптор развертывания должен содержать информацию о защищаемых страницах.

<security-constraint> <web-resource-collection>

<url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint>

<role-name>user</role-name> </auth-constraint>

</security-constraint> <security-role>

<role-name>user</role-name> </security-role>

В данном примере будут защищаться все страницы.

Кроме того в дескрипторе развертывания должен быть определён способ авторизации.

<login-config> <auth-method>FORM</auth-method> <form-login-config>

<form-login-page>/auth/auth.jsp</form-login-page> <form-error-page>/auth/auth-error.jsp</form-error-page>

- 22 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

</form-login-config> </login-config>

В данном примере приведена авторизация с использованием формы и указаны страницы авторизации и ошибки ввода имени или пароля.

4.2.3. Страница авторизации

Страница авторизации имеет стандартизованные действие на форме и имена для имени и пароля.

<form action="j_security_check" method="post" name="loginForm"> <input type="text" name="j_username" placeholder="имя" size="20"/><br>

<label><fmt:message key="txtPassword" /></label><br> <input type="password" name="j_password" size="20"/><br> <input type="submit" value="Ввод"/>

</form>

4.3. Решение задач лабораторной работы

4.3.1. Авторизация с использованием SSL соединения

Защищённое соединение потребует дополнительных действий для настройки как сервера, так и в дескрипторе развёртывания web.xml.

В качестве руководства по настройке можно воспользоваться учебным пособием или любым источником в сети Интернет, например, http://habrahabr.ru/post/134453/

4.3.2. Сброс состояния сессии

Информация о сессии доступна на JSP странице с помощью переменной session. У сесси есть возможность сбросить её состояние в начальное, когда будет сброшено значение всех переменных, сохранённых в сессии. Для этого можно воспользоваться методом session.invalidate().

4.4. Задание

Необходимо реализовать авторизацию пользователя. Основные требования:

1.Страницы авторизации реализованы с использованием JSTL и EL (без скриплетов и EL-выражений).

2.Страница авторизации открывается при нажатии кнопки «Вход» или «Заказ».

3.Если пользователь авторизован, то у него есть возможность выполнить «Выход».

4.Информация о пользователе должна храниться в сессии и отображаться в «шапке» всех страниц интернет-магазина.

-23 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

5.Авторизация используется декларативная (на базе Apache Tomcat).

6.После авторизации у пользователя появляется возможность перехода в «Личный кабинет» (в результате данной работы в личном кабинете пользователю для просмотра доступно своё имя и информация о закладке по умолчанию, отображаемой в карточке продукта).

Дополнительно (не обязательно): в «Личном кабинете» есть возможность загрузить и просмотреть свою аватарку (фотографию).

7.Все страницы поддерживают локализацию.

Лабораторная работа №5. Работа с базой данных

Цель: научить студентов работать с базой данных из web-приложения с использованием Hibernate.

5.1.Понятие Hibernate

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

Докуменацию по Hibernate можно найти по адресу: http://www.hibernate.org/docs

Язык запросов Hibernate называется Hibernate Query Language (HQL).

Краткое руководство по выполнению запросов находится по адресу: http://www.tutorialspoint.com/hibernate/hibernate_quick_guide.htm

5.2.Основные этапы по работе с Hibernate

5.2.1.Создание таблиц БД

Прежде всего необходимо создать таблицы в БД. Например, была создана таблица HISTORY с целочисленным идентификатором ID и двумя строковыми полями PRODUCT и

MARKET.

5.2.2. Создание классов Hibernate и описания сопоставления

Средствами утилит Hibernate (например, встроенными в NetBeans) можно создать классы, соответствующие таблицам БД.

В результате будут сгенерированы классы (JavaBean) для каждой из таблиц.

import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity;

- 24 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

import javax.persistence.Id;

import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table;

import javax.xml.bind.annotation.XmlRootElement; @Entity

@Table(name = "HISTORY") @XmlRootElement @NamedQueries({

@NamedQuery(name = "History.findAll", query = "SELECT h FROM History h"),

@NamedQuery(name = "History.findById", query = "SELECT h FROM History h WHERE h.id = :id"),

@NamedQuery(name = "History.findByProduct", query = "SELECT h FROM History h WHERE h.product = :product"),

@NamedQuery(name = "History.findByMarket", query = "SELECT h FROM History h WHERE h.market = :market")})

public class History implements Serializable { private static final long serialVersionUID = 1L; @Id

@Basic(optional = false) @Column(name = "ID") private Integer id; @Column(name = "PRODUCT") private String product; @Column(name = "MARKET") private String market; public History() {

}

public History(String market, String product) { this.market = market;

this.product = product;

}

public History(Integer id) { this.id = id;

}

public Integer getId() { return id;

}

public void setId(Integer id) { this.id = id;

}

public String getProduct() { return product;

- 25 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

}

public void setProduct(String product) { this.product = product;

}

public String getMarket() { return market;

}

public void setMarket(String market) { this.market = market;

}

@Override

public int hashCode() { int hash = 0;

hash += (id != null ? id.hashCode() : 0); return hash;

}

@Override

public boolean equals(Object object) { if (!(object instanceof History)) {

return false;

}

History other = (History) object;

if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {

return false;

}

return true;

}

@Override

public String toString() {

return "src.History[ id=" + id + " ][ market=" + market + " ][ product=" + product + " ]";

}

}

А в описании сопоставления persistence.xml появится блок persistence-unit, который хранит информацию о соединении с БД. Содержимое может отличаться в зависимости от используемой функции генерации этого описания и базы данных, с которой будет работать приложение.

<persistence-unit name="onlineshop" transactiontype="RESOURCE_LOCAL">

<provider>

org.eclipse.persistence.jpa.PersistenceProvider</provider>

- 26 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

<class>src.History</class> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties>

<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:marketdb/db"/>

<property name="javax.persistence.jdbc.password" value=""/> <property name="javax.persistence.jdbc.driver"

value="org.hsqldb.jdbcDriver"/>

<property name="javax.persistence.jdbc.user" value="SA"/> </properties>

</persistence-unit>

При этом в описании сопоставления классов таблицам hibernate.hbm.xml необходимо «вручную» указать соответствие полей таблицы и свойств сгенерированного класса.

<hibernate-mapping>

<class name="src.History" table="HISTORY"> <id name="id" type="int" column="ID">

<generator class="increment"/> </id>

<property name="product" column="PRODUCT" type="string"/> <property name="market" column="MARKET" type="string"/>

</class> </hibernate-mapping>

В конфигурации hibernate.cfg.xml должна быть указана строчка про использование hibernate.hbm.xml, иначе всё его содержимое нужно будет перенести в этот файл конфигурации.

<hibernate-configuration> <session-factory> <property

name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</proper

ty>

<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</pr operty>

<property

name="hibernate.connection.url">jdbc:hsqldb:file:marketdb/db

</property>

<property name="hibernate.connection.username">SA</property> <mapping resource="hibernate.hbm.xml"/>

</session-factory> </hibernate-configuration>

- 27 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

Для упрощения взаимодействия с БД NetBeans предлагает создавать HibernateUtil, который возвращает SessionFactory. Конечно, можно вручную написать эти несколько строчек и использовать как Вам удобнее.

public class HibernateUtil {

private static final SessionFactory sessionFactory; static {

try {

/* Create the SessionFactory from standard (hibernate.cfg.xml) config file. */

sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

} catch (Throwable ex) {

System.err.println("Initial SessionFactory creation failed." + ex);

throw new ExceptionInInitializerError(ex);

}

}

public static SessionFactory getSessionFactory() { return sessionFactory;

}

}

5.3. Решение задач лабораторной работы

5.3.1. Чтение данных из БД с использованием Hibernate

Session session = null; Transaction tx = null;

StringBuilder sb = new StringBuilder(); try {

session = HibernateUtil.getSessionFactory().openSession(); tx = session.beginTransaction();

List list = session.createQuery("FROM History").list();

// Запрос к БД

sb.append("Всего куплено товаров:

").append(list.size()).append("<br><br>");

for (Iterator iterator = list.iterator(); iterator.hasNext();)

{

History cur = (History) iterator.next(); sb.append("<b>Название товара:

</b>").append(cur.getProduct());

sb.append("<b>Магазин: </b>").append(cur.getMarket());

- 28 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

sb.append("<br>");

}

tx.commit();

}catch (HibernateException e) { if (tx != null)

tx.rollback();

e.printStackTrace();

}finally {

session.close();

}

5.3.2. Запись данных в БД с использованием Hibernate

Session session = NewHibernateUtil.getSessionFactory().openSession(); Transaction tx = null;

StringBuilder sb = new StringBuilder(); Integer resId = null;

try {

tx = session.beginTransaction();

History h = new History(marketM,productQ); resId = (Integer) session.save(h);

//Сохранение нового объекта tx.commit();

sb.append("<br>Название товара: ").append(h.getProduct()); sb.append(";");

sb.append("Магазин: ").append(h.getMarket()).append(";<br>");

}catch (HibernateException e) {

if (tx != null) tx.rollback();

e.printStackTrace(); } finally {

session.close();

}

5.3.3. Выбор магазина с использованием интернет-карт

Интерфейсы взаимодействия с интернет-картами постоянно обновляются, поэтому описывать текущее состояние не имеет смысла. Студентам предлагается самостоятельно выбрать наиболее удобный API карт и разместить объекты на карте.

Яндекс-карты (maps.yandex.ru): http://api.yandex.ru/maps/ Google-карты (maps.google.com): https://developers.google.com/maps/

OpenStreetMap (openstreetmap.org): http://wiki.openstreetmap.org/wiki/RU:API_v0.6

- 29 -

Методические указания по выполнению лабораторных работ по разработке web-приложений (2014)

5.4. Задание

Необходимо реализовать страницу заказа. Основные требования:

1.Страница заказа реализована с использованием JSTL и EL (без скриплетов и ELвыражений).

2.Страница заказа открывается при нажатии кнопки «Заказ» на странице «Корзина» или кнопки «Оформить заказ» в «шапке» всех страниц приложения (кнопка должна появляться после авторизации при наличии товаров в корзине).

3.При выполнении заказа у пользователя должна быть возможность выбрать магазин на карте (рекомендуется реализовать двусторонне управление: как с карты на страницу, так и

вобратную сторону), а также вариант — с курьером с указанием адреса.

4.Результат заказа должен сохраняться в базу данных с использованием Hibernate (интересует: кто заказал, что заказал, когда заказал, из какого магазина планирует забирать).

5.После сохранения заказа корзина должна стать пустой.

6.В «Личном кабинете» появляется возможность просмотра всех покупок данного пользователя.

7.Все страницы поддерживают локализацию.

Лабораторная работа №6. Журналирование и AJAX-запросы

Цель: научить студентов работать с фильтрами и журналами, а также выполнять простейшие AJAX-запросы.

6.1.Ключевые понятия в лабораторной работе

Журналирование — ведение журналов работы приложения. Наиболее распространённый вид журналов на java — Log4j.

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

AJAX (Asynchronous Javascript and XML — «асинхронный JavaScript и XML») —

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

6.2.Основные этапы

6.2.1.Отличие журналирования от System.out

System.out и System.err очень удобные потоки, но они не обеспечивают программиста необходимыми инструментами по управлению результатами вывода. Сервлеты и JSPстраницы имеют возможность работать с журналами напрямую.

Класс javax.servlet.GenericServlet предоставляет методы записи информации в

- 30 -

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]