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

SE_labs

.pdf
Скачиваний:
23
Добавлен:
01.03.2016
Размер:
3.17 Mб
Скачать

Инженерия программного обеспечения

Выберите архетип под номером 15 (internal -> maven-archetype- quickstart (), тип packaging для проекта — jar). Укажите groupId=se.lab03, artifactId=business-logic, version=1.0

Теперь создадим заготовку проекта для модуля веб-интерфейса нашего приложения (в каталоге проекта). Для этого используем плагин archetype, указав соответствующий тип шаблона проекта (maven- archetype-webapp):

mvn archetype:generate

Выберите архетип под номером 18 (18: internal -> maven- archetype-webapp (A simple Java web application). Укажите groupId=se.lab03, artifactId=hotelweb, version=1.0.

Полученная структура проекта приведена на рисунке 3.1.

Рисунок 3.1 — Структура многомодульного проекта

4.Плагин eclipse позволяет выполнить генерацию проекта для среды разработки eclipse. Настройки плагина можно добавить

в главный pom.xml файл проекта.

<plugin>

<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <configuration>

<dowloadSources>true</dowloadSources>

31

Методические указания к выполнению лабораторных работ

<dependenciesAsLibraries>true</dependenciesAsLibra

ries>

<useFullNames>false</useFullNames>

</configuration>

</plugin>

После выполнения команды mvn eclipse:eclipse, maven сгенерирует файлы проекта, которые необходимы для работы в среде разработки eclipse. Для полной поддержки maven в Eclipse необходимо загрузить соответствующий плагин, но для выполнения данной лабораторной работы это необязательно.

5.Редактируем главный pom.xml файл, который находится в корне каталога с нашим проектом. Содержимое родительского

pom.xml файла:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion> <groupId>${app.groupid}</groupId> <artifactId>hotelproject</artifactId> <version>${app.version}</version> <packaging>pom</packaging> <name>Hotel Project</name>

<modules> <module>business-logic</module> <module>hotelweb</module>

</modules>

<build>

<pluginManagement>

<plugins>

<plugin>

<groupId> org.apache.maven.plugins

</groupId>

<artifactId> maven-compiler-plugin

</artifactId>

<configuration>

<source>1.6</source>

<target>1.6</target>

</configuration>

</plugin>

</plugins>

</pluginManagement>

</build>

<properties>

<app.groupid>se.lab03</app.groupid>

<app.version>1.0</app.version>

32

Инженерия программного обеспечения

<app.finalname>${artifactId}- ${app.version}</app.finalname>

</properties>

</project>

Поскольку название проекта и его версия будет повторяться во всех трех (одном родительском и двух дочерних) проектах, то создадим специальные переменные placeholder-ы, на которые можно из любого pom-файла. Внутри секции “properties” создаем три переменные

“app.groupid”, “app.version” и “app.finalname”. На эти имена переменные будем ссылаться при объявлении maven-координат проекта. Значение элемента packaging равно pom, а не jar или war. Считается, что сам многомодульный проект не производит никакого конечного продукта, а всего лишь служит для агрегации в единое целое других модулей. Поскольку настройки, определенные в родительском pom-файле, распространяются и на дочерние файлы, то в родительском pom.xml настроим параметры компиляции. Создаем элемент build, внутри которого определяем параметры для плагина “maven-compiler-plugin”, в частности версию используемого компилятора.

Самое главное в файле проекта это перечисление списка модулей, которые его образуют, и делается это с помощью элемента modules. В нашем случае два дочерних модуля: business-logic и модуль hotelweb. Порядок размещения не важен, т.к. внутри файлов pom, описывающих дочерние модули, мы будем явно декларировать список нужных для них зависимостей.

6. Редактируем pom.xml для модуля business-logic

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<parent>

<artifactId>hotelproject</artifactId> <groupId>${app.groupid}</groupId> <version>${app.version}</version>

</parent>

<groupId>${app.groupid}</groupId> <artifactId>business-logic</artifactId> <packaging>jar</packaging> <version>${app.version}</version> <name>Hotel business-logic application</name>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.7</version>

33

Методические указания к выполнению лабораторных работ

<scope>test</scope>

</dependency>

</dependencies>

</project>

Поскольку данный модуль является дочерним по отношению к другому проекту, то в самом начале pom-файла размещаем ссылку на родительский модуль внутри элемента parent. При описании группы артефакта модуля и его версии используем объявленные в родительском pom-файле переменные ${myapp.groupid} и ${myapp.version}. В списке зависимостей модуля от внешних библиотек определена библиотека junit, так как она понадобится для написания тестов. Причем область действия (scope) этой зависимости установлена «test», т.е. библиотека будет подключена только на этапе тестирования проекта.

7. Pom.xml файл web-модуля приложения

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<parent>

<artifactId>hotelproject</artifactId> <groupId>${app.groupid}</groupId> <version>${app.version}</version>

</parent>

<groupId>${app.groupid}</groupId> <artifactId>hotelweb</artifactId> <packaging>war</packaging> <version>${app.version}</version>

<name>Hotel webapp tutorial application</name>

<dependencies>

<dependency> <groupId>${app.groupid}</groupId> <artifactId>business-logic</artifactId> <version>${app.version}</version>

</dependency>

<dependency>

<groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope>

</dependency>

</dependencies>

</project>

34

Инженерия программного обеспечения

Для веб-модуля определили две зависимости – зависимость от модуля business-logic и библиотеки servlet-api.

Однако для зависимости business-logic мы не указали область действия scope. А значит, maven будет подключать к веб-модулю и business-logic и нужные для business-logic ресурсы всегда (и при компиляции проекта и при упаковке модуля в war-файл). Для того чтобы сообщить maven о том, что какой-то артефакт не нужно упаковывать в war-файл, нужно установить для этого артефакта область scope равной “provided” (будет предоставлен кем-то еще). Добавьте к элементу зависимости (dependency) для артефакта business-logic новый тег

<scope>provided</scope>.

8. Перейдем к реализации модуля бизнес-логики приложения. Создадим пакет domain для хранения классов бизнес-логики, и

services — для хранения сервисов нашего приложения. Класс объекта гостиница Hotel.java:

package se.lab03.domain;

public class Hotel { private String name; private String address; private String city; private int stars;

/**

*Default constructor;

*/

public Hotel() { super();

//TODO Auto-generated constructor stub

}

/**

*Bean Constructor using field values.

*@param name

*@param address

*@param city

*@param stars

*/

public Hotel(String name, String address, String city,

int stars) { super();

// TODO Auto-generated constructor stub this.name = name;

this.address = address; this.city = city; this.stars = stars;

}

/**

* @return Returns the address. */

35

Методические указания к выполнению лабораторных работ

public String getAddress() { return address;

}

/**

*@param address The address to set.

*/

public void setAddress(String address) { this.address = address;

}

/**

*@return Returns the city.

*/

public String getCity() { return city;

}

/**

*@param city The city to set.

*/

public void setCity(String city) { this.city = city;

}

/**

*@return Returns the name.

*/

public String getName() { return name;

}

/**

*@param name The name to set.

*/

public void setName(String name) { this.name = name;

}

/**

*@return Returns the stars.

*/

public int getStars() { return stars;

}

/**

* @param stars The stars to set. */

public void setStars(int stars) { this.stars = stars;

}

}

Класс сервисов HotelService.java реализует два метода: findAvailableCities() method, который предоставляет список доступных городов, и findHotelsByCity() method, который возвращает перечень гостиниц для заданного города.

36

Инженерия программного обеспечения

package se.lab03.services;

import java.util.ArrayList; import java.util.List;

import se.lab03.domain.Hotel;

public class HotelService {

private static String[] cities =

{

"Chernigov",

"Kiev",

};

private static Hotel[] hotels = {

new Hotel("Ukraine","pr. Mira, 18","Chernigov",2), new Hotel("Bryansk","Shevchenko str.,

17","Chernigov",2),

new Hotel("Gradetskiy","pr. Mira, 19","Chernigov",3),

new Hotel("Verhovina","Krechatik str., 135","Kiev",4),

new Hotel("Krechatik","Krechatik str., 14","Kiev",5),

};

public List<Hotel> findHotelsByCity(String city){ List<Hotel> hotelsFound = new ArrayList<Hotel>(); for(Hotel hotel : hotels) {

if (hotel.getCity().equalsIgnoreCase(city)) { hotelsFound.add(hotel);

}

}

return hotelsFound;

}

public String[] findAvailableCities() { return cities;

}

}

Создадим тесты для классов Hotel.java и HotelService.java. package se.lab03.domain;

import java.util.List;

import org.junit.*;

import static org.junit.Assert.*;

public class HotelTest { protected Hotel hotel;

@Before

37

Методические указания к выполнению лабораторных работ

public void prepareTest() { hotel = new Hotel(); assertNotNull(hotel);

}

@Test

public void testHotelNullFields() { assertNull(hotel.getName()); assertNull(hotel.getAddress()); assertNull(hotel.getCity()); assertEquals(0,hotel.getStars());

}

}

Добавьте тесты для методов установки и получения (getters и setters) характеристик объекта Hotel. Аналогично добавьте тесты мето-

дов класса HotelService.java.

9.При выполнении команды mvn compile откомпилированые классы приложения будут помещены в каталог /target.

Для Fedora:

Если появилось сообщение, что переменная JAVA_HOME не установлена, то в случае, если jdk установлена, необходимо просто задать переменную окружения JAVA_HOME. Для этого добавьте в

/etc/profile.d/java.sh следующие строки: export JAVA_HOME=/path/to/jdk export PATH=$JAVA_HOME/bin:$PATH

Выполните команду

$> source /etc/profile.d/java.sh

Если jdk не установлена, то выполните следующие действия для установки Sun JDK.

а) установите библиотеки, требуемые для Sun Java:

$> yum install compat-libstdc++-33 compat-libstdc++-296

б) скопируйте пакет jdk-6u7-linux-i586.bin в домашнюю директорию и выполните следующие команды:

$> chmod a+x jdk-6u7-linux-i586.bin $> ./jdk-6u7-linux-i586.bin

в) установите значение для JAVA_HOME; г) проверьте установку командой

$> java -version

Должны получить что-то наподобие: java version "1.6.0_17"

Java(TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode,

sharing)

38

Инженерия программного обеспечения

10. Команда mvn package автоматически скомпилирует, запустит тесты и создаст модуль business-logic-1.0.jar в каталоге /target модуля бизнес-логики.

root@laptop:~/WORK/SE/LABs/Lab3/HotelProject/businesslogic# mvn package

[INFO] Scanning for projects...

[INFO] ------------------------------------------------

----------------

[INFO] Building Hotel business-logic application [INFO] task-segment: [package]

[INFO] ------------------------------------------------

----------------

[INFO] [resources:resources]

[INFO] Using default encoding to copy filtered resources.

[INFO] [compiler:compile]

[INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources]

[INFO] Using default encoding to copy filtered resources.

[INFO] [compiler:testCompile]

[INFO] Nothing to compile - all classes are up to date [INFO] [surefire:test]

[INFO] Surefire report directory: /home/olga/WORK/SE/LABs/Lab3/HotelProject/business- logic/target/surefire-reports

T E S T S

-------------------------------------------------------

Running se.lab03.services.HotelServiceTest

Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 sec

Running se.lab03.AppTest

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.01 sec

Running se.lab03.domain.HotelTest

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec

Results :

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

[INFO] [jar:jar]

[INFO] ------------------------------------------------

----------------

[INFO] BUILD SUCCESSFUL

[INFO] ------------------------------------------------

----------------

[INFO] Total time: 5 seconds

39

Методические указания к выполнению лабораторных работ

[INFO] Finished at: Sat Dec 12 16:10:49 EET 2009 [INFO] Final Memory: 8M/112M

[INFO] ------------------------------------------------

----------------

Команда mvn install установит модуль бизнес-логики в локальный репозиторий maven, что позволит использовать его в других модулях или проектах.

11. Перейдем к реализации веб-модуля приложения. Он представляет собой единственую jsp-страницу, на которой выводим перечень городов, и если выбран город, то перечень гостиниц этого города.

<html>

<body>

<h2>SELab3-Hotel application</h2> <%@ page import="

java.util.List,

se.lab03.domain.Hotel,

se.lab03.services.HotelService"

%>

<%

HotelService service = new HotelService(); String[] cityList = service.findAvailableCities();

String selectedCity = request.getParameter("city");

List<Hotel> hotelList = service.findHotelsByCity(selectedCity);

%>

<h3>Choose a destination</h3>

<form action="index.jsp" method="get"> Please choose a city:

<SELECT name="city">

<OPTION value="">---No city---</OPTION> <%

for(String cityName : cityList){

%>

<OPTION

value="<%=cityName%>"><%=cityName%></OPTION>

<%

}

%>

</SELECT>

<BUTTON type="submit">GO</BUTTON> </form>

<% if (hotelList.size() > 0) { %> <h3>Available hotels in <%=selectedCity%> </h3> <table border="1">

<tr>

<th>Name</th>

40

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