Оптимизация web-сервера

Особенности, отличительные черты и назначение фреймворка Spring. Разработка проекта с использованием среды программирования IntelliJ IDEA на языке JVM Kotlin. Создание web-сервера на основе платформы Java, тестирование системой сборки Maven и JUnit.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.02.2019
Размер файла 285,8 K

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

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

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

Федеральное агентство железнодорожного транспорта

Омский государственный университет путей сообщения

Кафедра "Автоматика и системы управления"

Пояснительная записка к курсовой работе

Оптимизация web-сервера

по дисциплине «Прикладное программирование»

Выполнил: Студентка Е.В. Васильева

Руководитель: Е.А. Альтман

доцент кафедры АиСУ

Омск 2017

Реферат

УДК 681.51

Рассмотрено назначение фреймворка Spring, его особенности и отличительные черты. Выполнена разработка проекта с использованием этого фреймворка и его модулей. Изучен современный язык JVM Kotlin.

Результатом курсовой работы является рабочий веб-сервер с базой данных.

Веб-сервер разработан с использованием среды программирования IntelliJ IDEA Communiy Edition 2016.2.4. Исходный код программы написан на языке Java v.8 и Kotlin v.1.1.0. Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2016.

Ключевые слова: Spring, JUnit, Mock-объект, Spring Boot, Maven, Kotlin, веб-сервер.

Содержание

Введение

1. Spring Framework

1.1 Spring MVC

1.2 Maven

1.3 Модули Spring

2. JPA

3. Kotlin

4. Запуск и тестирование веб-сервера

4.1 Запуск веб-сервера

4.2 Тестирование веб-сервера

Заключение

Библиографический список

Приложения

Введение

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

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

Целью данной работы является создание REST-сервера с JPA, который бы выполнял набор CRUD команд. Сервер должен создаваться с помощью фреймворка Spring, включать в себя класс на языке Kotlin и компоноваться системой сборки Maven. Сервер должен быть протестирован с помощью mock-объектов JUnit тестами.

Задание: разработать web-сервер с JPA (Java Persistence API) с помощью фреймворка Spring. Для сборки приложения необходимо будет скомпилировать несколько файлов исходных кодов и добавить объектные файлы библиотек. Требуется выполнить несколько вариантов сборки - для тестирования, для локального выполнения и для запуска на сервере.

1. Spring Framework

Spring Framework обеспечивает комплексную модель разработки и конфигурации для современных бизнес-приложений на Java - на любых платформах. Spring можно описать как совокупность нескольких независимых фреймворков, так и более сложных конструкций (фреймворк в фреймворке). программирование фреймворк spring java kotlin

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

Spring, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности.

Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java.

1.1 Spring MVC

Один из самых главных разделов фреймворка Spring -- Spring MVC. Фреймворк Spring Web model-view-controller (MVC) работает вокруг DispatcherServlet, который распределяет запросы по обработчикам. Обработчик по умолчанию строится на аннотациях @Controller и @RequestMapping, которые предоставляют широкий набор гибких методов для обработки запросов.

После версии Spring 3.0. механизм @Controller так же позволяет создавать RESTful веб сайты и приложения, используя аннотацию @PathVariable и другие возможности.

В Spring Web MVC есть возможность использовать любой объект в качестве команды или объекта с обратной связью; нет необходимости реализовывать какой-либо специальный интерфейс фреймворка или базовый класс.

1.2 Maven

Maven - это фреймворк для автоматизации сборки проектов специфицированных на XML-языке. Сборка происходит по установленным зависимостям в файле pom.xml.

Чтобы добавить или исключить какие-либо библиотеки или плагины в сборке проекта, достаточно просто указать зависимость в файле pom.xml и Maven автоматически его подключит и встроит в проект. Также в .xml файле указываются зависимости Spring Boot.

В Spring Boot уже включена Spring-платформа и сторонние библиотеки, для более простого запуска приложений. Пример файла pom.xml из проекта веб-сервера можно увидеть в приложении А.

1.3 Модули Spring

Фреймворк имеет модульную архитектуру, состоящую из ядра и отдельных проектов (модулей).

Spring Core - предназначен для конфигурирования приложения, состоящего из различных объектов различных классов.

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

Spring Boot - предлагает шаблоны конфигурации для приложения. Отдельные настройки шаблона можно переопределить.

Spring Data - обеспечивает хранение данных в базах данных.

Spring Security - обеспечивает авторизацию и аудентификацию пользователей и разграничение доступа к объектам.

2. JPA

JPA - это технология, обеспечивающая объектно-реляционное отображение простых JAVA объектов и предоставляющая API для сохранения, получения и управления такими объектами.

Сам JPA не умеет ни сохранять, ни управлять объектами, JPA только определяет правила: как что-то будет действовать. JPA также определяет интерфейсы, которые должны будут быть реализованы провайдерами. Плюс к этому JPA определяет правила о том, как должны описываться метаданные отображения и о том, как должны работать провайдеры. Дальше, каждый провайдер, реализуя JPA определяет получение, сохранение и управление объектами.

В самом проекте объекты для JPA помечаются аннотациями. Класс, который будет являться сущностью в базе данных, отмечается аннотацией @Entity. Так как этот класс является сущностью для базы данных, в нем должен быть указан ключ, в нашем случае это ID. Интерфейс репозитория - @Repository. Этот интерфейс наследуется от интерфейса JpaRepository<T,F>, где T - объект нашей сущности (класс с пометкой @Entity), а F - должен быть того же типа, что и ID из класса-сущности. При правильном наследовании Spring предоставит реализованные методы, указанные в интерфейсе. Пример реализации сущности и репозитория представлен в приложении Б.

3. Kotlin

Kotlin - язык программирования, разработанный компанией JetBrains, работающий на платформе Java. Он использует JDK, как и сама Java, но имеет другой синтаксис.

Появились они, в основном, из-за проблем с самой Java в плане синтаксиса. То есть, Java - язык надежный, хороший, добротный, на нём можно писать серверные приложения, но синтаксис у него, скажем так, излишне многословный.

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

Это значительно облегчает написание кода - делает его короче и выразительнее.

Чем меньше кода мы пишем, тем меньше кода нужно поддерживать, писать меньше тестов.

Собственно, большинство языков появилось по этой самой причине - поменять синтаксис Java, сделать его более удобным, более прагматичным.

В реализованном проекте используется такая возможность языка как data-class (синтаксис представлен на рисунке 1).

Рисунок 1 - Создание data-class на языке Kotlin

Это класс с единственным назначением - хранение данных. Функционал этого класса, зависит от самих данных, которые в нем хранятся.

Data-class позволяет избавиться от большого количества шаблонного кода, который используется при создании аналогичного класса на языке Java.

Для автоматической генерации конструктора со всеми аргументами нужно задать начальные значения всех полей. А перед тем как добавить объект на постоянное хранение, его также нужно создать в памяти, для этого создается вторичный конструктор с двумя параметрами.

Пример выполнения данных действий представлен в приложении Б.

4. Запуск и тестирование веб-сервера

4.1 Запуск веб-сервера

Для запуска веб-сервера необходимо создать контроллер, который будет реагировать на определенные действия пользователя. Так как реализуется REST-сервер, то необходимо создать основные команды сервера: GET, POST, DELETE, PUT.

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

Например, при введении в строку веб-браузера значения «/expenses», то контроллер среди всех своих команд, найдет именно его, увидит, что здесь присутствует реализация запроса GET и данные находятся в формате json. Затем выполнит метод указанный для этого запроса, в нашем случае это метод getExpenses(), который в своем теле вызывает функцию из JpaRepository (рисунок 2). Результат выполнения можно увидеть на рисунке 3.

Рисунок 2 - Реализация реакции контроллера на запрос GET

Рисунок 3 - Ответ на запрос GET

4.2 Тестирование веб-сервера

Spring test позволяет писать JUnit тесты для сервера. Для этого создается mock-объект (объект-имитация), который будет симулировать действия клиента.

Объекты этого класса умеют делать запросы к серверу, получать и анализировать ответы.

Для создания mock-объекта в Spring требуется объект типа WebApplicationContext, который создается при запуске сервера. Аннотация @Autowired указывает Spring инициализировать ссылку на соответствующий объект. Аннотация @Before, указывает на метод, который будет запускаться перед всеми тестами и создавать Mock-объект (рисунок 4).

Рисунок 4 - Создание Mock-объекта для тестирования сервера

Функции тестирования помечаются аннотацией @Test и выглядят следующим образом. Создается объект класса ResultActions, который может проверить правильность ответа, полученного запросом от Mock-объекта.

Например, на рисунке 5, показана функция тестирования запроса DELETE.

С помощью Mock-объекта отправляется запрос на сервер и результат сохраняется в объекте perform типа ResultActions.

С помощью функции andExpect(status().isOk) проходит проверка правильно ли выполнился запрос и какой статус вернул сервер. Затем создается новый объект типа ResultActions, чтобы проверить метод DELETE, путем просмотра данных с сервера.

Если элементов стало на единицу меньше чем было, проверка происходит с помощью jsonPath, значит тест пройден успешно (рисунок 6). Листинг класса тестирования находится в приложении Г.

Рисунок 5 - Пример функции тестирования

Рисунок 6 - Результаты тестирования веб-сервера

Заключение

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

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

Изменяя используемые классы и объекты можно легко настроить работу программы.

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

Библиографический список

1. Е.А. Альтман, Введение в фреймворк Spring / Е.А. Альтман / Омский гос. ун-т путей сообщения. Омск, 2017. 47 с.

2. СТП ОмГУПС-1.2-2005. Работы студенческие учебные и выпускные квалификационные: общие требования и правила оформления текстовых документов. - Омский Государственный Университет Путей Сообщения. Омск, 2005. 28 с.

3. Е.А. Альтман, Оптимизация Web сервера / Е.А. Альтман / Омский гос. ун-т путей сообщения. Омск, 2017. 17 с.

4. Справочник по IntelliJ IDEA. [Электронный ресурс] - Режим доступа: http://jetbrains.ru/products/idea/.

Приложение А

Содержимое файла pom.xml

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

<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/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>

<artifactId>Jpa</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>Jpa</name>

<description>Demo project for Spring Boot</description>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.2.RELEASE</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<kotlin.version>1.1.0</kotlin.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>com.h2database</groupId>

<artifactId>h2</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.jetbrains.kotlin</groupId>

<artifactId>kotlin-stdlib-jre8</artifactId>

<version>${kotlin.version}</version>

</dependency>

<dependency>

<groupId>org.jetbrains.kotlin</groupId>

<artifactId>kotlin-test</artifactId>

<version>${kotlin.version}</version>

<scope>test</scope>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

<plugin>

<groupId>org.jetbrains.kotlin</groupId>

<artifactId>kotlin-maven-plugin</artifactId>

<version>${kotlin.version}</version>

<executions>

<execution>

<id>compile</id>

<phase>compile</phase>

<goals>

<goal>compile</goal>

</goals>

</execution>

<execution>

<id>test-compile</id>

<phase>test-compile</phase>

<goals>

<goal>test-compile</goal>

</goals>

</execution>

</executions>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<executions>

<execution>

<id>compile</id>

<phase>compile</phase>

<goals>

<goal>compile</goal>

</goals>

</execution>

<execution>

<id>testCompile</id>

<phase>test-compile</phase>

<goals>

<goal>testCompile</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

</project>

Приложение Б

Листинги класса и интерфейса для JPA

@Entity

data class Expense (

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

val Id:Long? = null,

val name: String = "Апельсины",

var cost:Float = (-1.0).toFloat(),

val category:String = "Фрукты"){

constructor(_name:String, _cost:Float, _category:String) : this(

name = _name,

cost = _cost,

category = _category

) {}

}

@Repository

public interface ExpenseRepository extends JpaRepository<Expense, Long>{

Expense findByName(String name);

}

Приложение В

Листинги класса контроллера и точки запуска сервера

@RestController

public class ExpenseController {

private ExpenseRepository expenseRepository;

@Autowired

public ExpenseController (ExpenseRepository expenseRepository) {

this.expenseRepository = expenseRepository;

expenseRepository.save(new Expense("Хлеб", 25, "Выпечка"));

expenseRepository.save(new Expense("Вода", 50, "Напитки"));

expenseRepository.save(new Expense("Томаты", 120, "Овощи"));

}

@RequestMapping(value = "/expenses", method = RequestMethod.GET, headers = "Accept=application/json")

public List<Expense> getExpenses(){

return expenseRepository.findAll();

}

@RequestMapping(value = "/expenses/{id}", method = RequestMethod.GET, headers = "Accept=application/json")

public Expense getExpensesId(@PathVariable Long id){

return expenseRepository.findOne(id);

}

@RequestMapping(value = "/expenses/{id}", method = RequestMethod.DELETE, headers = "Accept=application/json")

public void deleteExpense (@PathVariable Long id){

expenseRepository.delete(id);

}

@RequestMapping(value = "/expenses", method = RequestMethod.POST, headers = "Accept=application/json")

public void postExpense(@RequestBody Expense expense){

expenseRepository.save(expense);

}

@RequestMapping(value = "/expenses", method = RequestMethod.PUT, headers = "Accept=application/json")

public void updateExpense (@RequestBody Expense expense){ expenseRepository.findByName(expense.getName()).setCost(expense.getCost());

Expense exp = expenseRepository.findByName(expense.getName());

expenseRepository.save(exp);

System.out.println(exp);

}

}

@SpringBootApplication

public class JpaApplication {

public static void main(String[] args) {

SpringApplication.run(JpaApplication.class, args);

}

}

Приложение Г

Листинг класса тестирования

@RunWith(SpringRunner.class)

@SpringBootTest

public class JpaApplicationTests {

private MockMvc mockMvc;

private ExpenseController expenseController;

private ExpenseRepository expenseRepository;

@Autowired

private WebApplicationContext webApplicationContext;

@Before

public void setup() throws Exception {

mockMvc = webAppContextSetup(webApplicationContext).build();

}

@Test

public void contextLoads() {

}

@Test

public void getExpenses() throws Exception {

ResultActions perform = mockMvc.perform(get("/expenses"));

perform .andExpect(status().isOk())

.andExpect(jsonPath("$.[1].name", is("Вода")))

.andExpect(jsonPath("$.[1].cost", is(50.)))

.andExpect(jsonPath("$.[1].category", is("Напитки")));

}

@Test

public void addExpense() throws Exception {

String expens = new ObjectMapper().writeValueAsString(new Expense("Рис", 80, "Крупы"));

ResultActions perform = mockMvc.perform(post("/expenses").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON).content(expens));

perform .andExpect(status().isOk());

ResultActions performm = mockMvc.perform(get("/expenses/4"));

performm.andExpect(status().isOk())

.andExpect(jsonPath("$.name", is("Рис")))

.andExpect(jsonPath("$.cost", is(80.)))

.andExpect(jsonPath("$.category", is("Крупы")));

}

@Test

public void update() throws Exception {

String expens = new ObjectMapper().writeValueAsString(new Expense("Хлеб",40, "Выпечка"));

ResultActions perform = mockMvc.perform(put("/expenses").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON).content(expens));

perform .andExpect(status().isOk());

ResultActions performm = mockMvc.perform(get("/expenses/1"));

performm.andExpect(status().isOk())

.andExpect(jsonPath("$.name", is("Хлеб")))

.andExpect(jsonPath("$.cost", is(40.)))

.andExpect(jsonPath("$.category", is("Выпечка")));

}

@Test

public void getExpensebyId() throws Exception {

ResultActions perform = mockMvc.perform(get("/expenses/2"));

perform.andExpect(status().isOk())

.andExpect(jsonPath("$.name", is("Вода")))

.andExpect(jsonPath("$.cost", is(50.)))

.andExpect(jsonPath("$.category", is("Напитки")));}

@Test

public void deleteExpenses() throws Exception {

ResultActions perform = mockMvc.perform(delete("/expenses/1"));

perform.andExpect(status().isOk());

ResultActions performm = mockMvc.perform(get("/expenses"));

performm.andExpect(jsonPath("$.length()", is(2)));

}

}

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


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

  • Изучение объектно-ориентированного языка программирования Java, его функциональные возможности. Создание программного кода. Описание классов и методов, использованных в программе. Руководство пользователя, запуск сервера и клиентского приложения.

    курсовая работа [1,8 M], добавлен 16.09.2015

  • Организация корпоративного файлового сервера, выполняющего функции прокси-сервера на базе ОС Linux. Процесс его реализации. Выбор оптимальной аппаратно-программной платформы. Расчёт сметы затрат на выполнение объёма работ по созданию FTP-сервера.

    дипломная работа [2,0 M], добавлен 06.07.2012

  • Описание и установка интегрированной среды разработки Eclipse. Описание языка Java. Описание классов и методов, пакетов, использованных в программе, сервера и клиента. Разработка руководства пользователя для клиента и сервера. Пример работы чата.

    курсовая работа [443,5 K], добавлен 18.05.2015

  • История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.

    курсовая работа [168,1 K], добавлен 27.09.2013

  • Анализ информационной системы "Бурятия.INFO". Построение функциональной модели "Как надо", диаграммы прецедентов, диаграммы последовательности действий, диаграммы классов. Разработка программного приложения в интегрированной среде Intellij IDEA.

    дипломная работа [1,3 M], добавлен 13.04.2014

  • Анализ решений и выбор платформы виртуализации. Обоснование выбора VMwareESXi в качестве платформы для создания учебного класса. Системные требования к аппаратной части для выбранной платформы. Создание макета на основе сервера виртуализации VMwareESXi.

    дипломная работа [4,1 M], добавлен 12.04.2017

  • Обзор технологической платформы для разработки клиентского веб-интерфейса. Выбор платформы базы данных, языка разработки, фреймворка на стороне сервера и клиента. Создание схемы данных MySQL. Работа пользователя и оператора с программным продуктом.

    курсовая работа [4,1 M], добавлен 17.07.2012

  • История и основные сведения о сервере. Классификация и ресурсы серверов. Важность системы охлаждения для сервера. Выбор компонентов для сборки сервера. Основные неисправности и способы их устранения. Проведение технического обслуживания и ремонта сервера.

    дипломная работа [2,1 M], добавлен 24.06.2015

  • Спецификация организации службы Short Message Service. Алгоритм работы сервера и возможность расширения функциональных возможностей. Реализация проекта на языке высокого уровня С++ на платформе Linux. Расчет себестоимости и цены программного продукта.

    дипломная работа [168,6 K], добавлен 19.01.2014

  • Исследование симметричных алгоритмов блочного шифрования. Минусы и плюсы алгоритма IDEA. Разработка программы аутентификации пользователя и сообщений на основе алгоритма IDEA. Выбор языка программирования. Тестирование и реализация программного средства.

    курсовая работа [314,2 K], добавлен 27.01.2015

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