@author stormma @date 2017/09/15
Использование storm-server
storm-server — это Java-веб-фреймворк, использующий Jetty в качестве контейнера сервлетов, предназначенный для предоставления API-сервисов для фронтенда. Он обладает преимуществом быстрой разработки. В будущем storm-server будет предоставлять инструменты для работы с MySQL и Redis. Целью storm-server является быстрое создание небольших веб-приложений и использование для повседневного обучения. GitHub-адрес storm-server: https://github.com/stormmaybin/storm-server.git, присоединяйтесь к проекту и помогите в его развитии.
<?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.github.stormmaybin</groupId>
<artifactId>storm-server-test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<storm-server.version>1.0</storm-server.version>
</properties>
<dependencies>
<dependency>
<groupId>me.stormma</groupId>
<artifactId>storm-server</artifactId>
<version>${storm-server.version}</version>
</dependency>
</dependencies>
</project>
```###### Добавление конфигурационного файла storm.properties
```properties
storm.server.port=8057 # порт по умолчанию 8057
storm.server.module=storm_server_test # имя модуля
storm.ansi.output.enabled=true # включение цветного вывода для различных уровней логов
По умолчанию storm-server читает конфигурационный файл storm.properties из classpath. Конечно, вы можете указать путь и имя конфигурационного файла. Если вы выберете это, вам нужно передать полный путь конфигурационного файла при запуске запускающего класса. Например, если имя моего конфигурационного файла application.properties, и он находится в папке resources/config/, вам нужно передать параметр 'resources/config/application.properties' при запуске запускающего класса (об этом будет сказано ниже).###### Добавление файла конфигурации logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="logback/base.xml" />
</configuration>
storm-server использует систему логирования Logback, и уже предоставляет файл конфигурации base.xml. Вам нужно только создать файл logback.xml и добавить в него base.xml. Конечно, вы можете добавить свои собственные настройки.
package com.github.stormmaybin.controller;
import me.stormma.StormApplication;
import me.stormma.annotation.Application;
import me.stormma.annotation.ComponentScan;
/**
* @description Запуск приложения
* @author stormma
* @date 2017/09/15
*/
@ComponentScan
@Application(StormServerTestApplication.class)
public class StormServerTestApplication {
public static void main(String[] args) {
StormApplication.run(args);
}
}
package com.github.stormmaybin.controller.service.impl;
import com.github.stormmaybin.controller.model.User;
import com.github.stormmaybin.controller.service.ITestService;
import me.stormma.ioc.annotation.Service;
/**
* @description
* @author stormma
* @date 2017/09/15
*/
@Service
public class TestService implements ITestService {
@Override
public User getUserById(int uid) {
// Моделирование операций слоев DAO
User user = new User();
user.setUsername("stormma");
user.setPassword("stormma");
return user;
}
}
Аннотация @Service указывает, что этот класс является сервисом, что соответствует стандартам Spring MVC/Boot
package com.github.stormmaybin.controller.controller;
``````java
import com.github.stormmaybin.controller.model.User;
import com.github.stormmaybin.controller.service.ITestService;
import me.stormma.core.http.annotation.Api;
import me.stormma.core.http.annotation.JsonParam;
import me.stormma.core.http.annotation.RequestParam;
import me.stormma.core.http.enums.RequestMethod;
import me.stormma.core.http.model.HttpContext;
import me.stormma.core.http.response.Response;
import me.stormma.core.http.response.builder.ResponseBuilder;
import me.stormma.ioc.annotation.AutoWired;
import me.stormma.ioc.annotation.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
``````java
import java.util.Date;
/**
* @author stormma
* @date 2017/09/15
*/
@Controller("/api")
public class TestController {
@Autowired
private ITestService testService;
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
/**
* Тестирование ответа без параметров
* @return
*/
@Api(url = "/hello", method = RequestMethod.GET)
public Response<String> hello() {
return ResponseBuilder.success("hello storm-server");
}
/**
* Тестирование привязки HttpContext
* @param context
* @return
*/
@Api(url = "/date", method = RequestMethod.GET)
public Response<Date> getCurrentDate(HttpContext context) {
logger.info("Путь запроса:{}", context.requestPath);
return ResponseBuilder.success(new Date());
}
@Api(url = "/array/int", method = RequestMethod.GET)
public Response<String> testIntArray(@RequestParam(name = "id") int[] ids) {
for (int id : ids) {
logger.info("{}", id);
}
return ResponseBuilder.success();
}
@Api(url = "/array/Integer", method = RequestMethod.GET)
public Response<String> testIntegerArray(@RequestParam(name = "id") Integer[] ids) {
for (Integer id : ids) {
logger.info("{}", id);
}
return ResponseBuilder.success();
}
@Api(url = "/array/float", method = RequestMethod.GET)
public Response<String> testFloatArray(@RequestParam(name = "id") float[] ids) {
for (float id : ids) {
logger.info("{}", id);
}
return ResponseBuilder.success();
}
@Api(url = "/array/Float", method = RequestMethod.GET)
public Response<String> testFloatArray(@RequestParam(name = "id") Float[] ids) {
for (Float id : ids) {
logger.info("{}", id);
}
return ResponseBuilder.success();
}
@Api(url = "/array/Double", method = RequestMethod.GET)
public Response<String> testDoubleArray(@RequestParam(name = "id") Double[] ids) {
for (Double id : ids) {
logger.info("{}", id);
}
return ResponseBuilder.success();
}
}
``` @Api(url = "array/double", method = RequestMethod.GET)
public Response<String> testDoubleArray(@RequestParam(name = "id") double[] ids) {
for (double id : ids) {
logger.info("{}", id);
}
return ResponseBuilder.success();
}```java
public class Response<T> {
/**
* Код ошибки: ошибка — 1, успех — 0
*/
private Integer code;
/**
* Статус текущего запроса
*/
private Integer status;
/**
* Данные для возврата
*/
private T data;
}
```markdown
/**
* Тестирование типа параметров строки запроса и типа параметров JSON в сочетании с привязкой
* @param id
* @param user
* @return
*/
@Api(url = "/get/user", method = RequestMethod.POST)
public Response<User> test(@RequestParam(name = "id") int id, @JsonParam User user) {
System.out.println(user);
User result = testService.getUserById(id);
logger.info("json параметр: {}", user);
logger.info("{}", result);
return ResponseBuilder.success(result);
}
}
storm-server рекомендует унифицированные данные ответа, методы контроллеров возвращают значения типа Response, где Response — это класс, предоставленный storm-server для упаковки данных ответа.
* Description of the current request
*/
private String msg;
The usage of controllers in storm-server is similar to spring boot/mvc, storm-server provides automatic parameter binding, including internal converters such as String2Boolean, String2Date, and String2Number. If these converters are insufficient for your needs, you can create your own converter by implementing the Converter<String, T> interface. The process of creating a converter is as follows:``` public class DefaultStringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) throws StormServerException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = simpleDateFormat.parse(source);
} catch (ParseException e) {
throw new StormServerException("не удалось преобразовать строку в дату, так как параметр недействителен.");
}
return date;
}
}
> Также storm-server предоставляет автоматическую привязку параметров JSON к объектам, аннотация @JsonParam помогает выполнить эту рутинную задачу.
###### Запуск storm-server

###### Создание исполняемого jar с помощью maven- Добавление плагина для сборки
``````xml
<!-- Упаковка исполняемого jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.github.stormmaybin.controller.StormServerTestApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- Включение внешних jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Вам нужно изменить
MainClass
на ваш стартовый класс, то есть на тот класс, который вызываетStormApplication.run(args)
.java mvn clean package
> После завершения сборки появится файл xxx.jar, который можно запустить с помощью командыjava -jar xxx.jar
.
Работа над storm-server началась месяц назад, и сегодня был выпущен версия 1.0. В течение этого месяца две недели были потрачены на решение других вопросов, поэтому код не был написан. Поэтому я немного стесняюсь, зная, что storm-server пока недостаточно совершенен, но как учебный материал он вполне подходит. Я уверен, что дальнейшее развитие и поддержка storm-server невозможны без вашей поддержки, участия и предложений. Если вас интересует storm-server, присоединяйтесь к обсуждению, мой QQ: 1325338799, email: stormmaybin@gmail.com.
storm-server помогает вам? Поддержите проект с помощью пожертвований. Али-pay: 18292817803
Исправления:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )