1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/justlive1-oxygen

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

oxygen

Maven Central License

Лёгкий Java фреймворк

Введение

Лёгкий Java фреймворк.

  • oxygen-core

    • Управление конфигурацией, поддержка выражения ${attrs.key:defaultValue} для получения конфигурации.
    • Шифрование и дешифрование, предоставление услуг шифрования и дешифрования с базовой реализацией, такой как SHA-1, SHA-256, MD5.
    • Обработка исключений, предоставление упаковки исключений, унифицированный код исключений для облегчения интернационализации.
    • Интернационализация i18n.
    • Загрузка ресурсов, предоставление функций загрузки файлов, jar-файлов и файлов из classpath.
    • Сканер классов.
    • Лёгкая зависимость на основе конструктора.
    • Кэш.
    • Предоставление запланированных задач на основе аннотации Scheduled.
    • Можно использовать аннотацию Aspect или напрямую реализовать Interceptor для написания аспектов.
    • Некоторые инструменты.
  • oxygen-jdbc

    • Простой JDBC, чистая реализация JDK без сторонних jar-файлов.
    • Поддержка нескольких источников данных.
    • CRUD на основе SQL, не предоставляет методы, подобные Hibernate (причина: SQL как DSL в области баз данных уже очень естественен и элегантен, Less is more).
  • oxygen-web

    • Лёгкий веб-фреймворк поддерживает объявления аннотаций и функциональное программирование.
    • Поддерживает Servlet3.0 ServletContainerInitializer для автоматической загрузки, без web.xml.
    • Поддерживает динамическое переключение i18n.
    • Предоставляет WebHook для перехвата запросов.
    • Поддерживает пользовательскую глобальную обработку исключений.
    • Встроенный асинхронный сервер.

Особенности

  • Лёгкий, простой в использовании.
  • Поддержка плагинов.
  • Функциональное программирование.
  • Потоковый стиль.

Быстрый старт

Создайте проект Maven.

<!-- tomcat,jetty,undertow -->
<properties>
  <oxygen.server>-tomcat</oxygen.server>
</properties>

<!-- Использование встроенного контейнера для запуска -->
<dependency>
    <groupId>vip.justlive</groupId>
    <artifactId>oxygen-web${oxygen.server}</artifactId>
    <version>${oxygen.version}</version>
</dependency>

Или Gradle.

compile 'vip.justlive:oxygen-web-tomcat:$oxygenVersion'

Не требуется проект webapp, поддерживается Servlet3.0.

Напишите функцию main, чтобы создать «Hello World».

public static void main(String[] args) {
  Router.router().path("/").handler(ctx -> ctx.response().write("hello world"));
  Server.listen(8080);
}

Откройте браузер и перейдите по адресу http://localhost:8080, чтобы увидеть «hello world»!

Подробное содержание

Класс сущности:

@Data
public class Book {
  private String name;
  private String author;
}

Использование RoutingContext для преобразования:

Router.router().path("/").handler(ctx -> {
  // Форма или параметры запроса JSON связаны
  Book book = ctx.bindParam(Book.class);
  // Связанный параметр cookie
  book = ctx.bindCookie(Book.class);
  // Связанное значение заголовка
  book = ctx.bindHeader(Book.class);
  // Связанные параметры RESTful
  book = ctx.bindPathVariables(Book.class);
});

Получение с помощью аннотаций:

@Mapping(value = "/", method = {HttpMethod.POST})
public void ajax(@Param Book b1, @CookieParam Book b2, @HeaderParam Book b3, @PathParam Book b4) {
  // ...
}

Статические ресурсы

По умолчанию встроенные ресурсы будут использовать каталоги /public и /static в classpath в качестве каталогов статических ресурсов. Они поддерживают webjars и сопоставляются с /public.

Пользовательские статические ресурсы можно использовать с помощью следующего кода:

Router.staticRoute().prefix("/lib").location("classpath:lib");

Или через файл конфигурации:

web.static.prefix=/public
web.static.path=/public,/static,classpath:/META-INF/resources/webjars

Загрузка файлов

С использованием RoutingContext:

Router.router().path("/").handler(ctx -> {
  MultipartItem file = ctx.request().getMultipartItem("file");
  // ...
});

Используя аннотации:

@Mapping("/")
public void upload(MultipartItem image, @MultipartParam("file1") MultipartItem file) {
  // Если не используется аннотация, используйте имя метода в качестве имени параметра запроса.
  // Используйте аннотацию, чтобы указать имя параметра запроса.
}

Отображение результатов

Отображение JSON

// Использование RoutingContext для возврата
Router.router().path("/").handler(ctx -> {
  ctx.response().json(new Book("Java", "xxx"));
});

// Аннотации
@Mapping("/")
public Book find() {
  // Возвращает объект напрямую, фреймворк по умолчанию обрабатывает его как JSON.
  return new Book("Java", "xxx");
}

Отображение текста

// С использованием RoutingContext для возврата
Router.router().path("/").handler(ctx -> {
  ctx.response().text("hello world");
});

Отображение HTML

// Используя RoutingContext для возврата
Router.router().path("/").handler(ctx -> {
  ctx.response().html("<html><body><span>hello world</span></body></html>");
});

Шаблоны отображения

Встроенные шаблоны поддерживают jsp и thymeleaf, которые по умолчанию соответствуют каталогам WEB-INF и templates в ресурсах.

# Можно изменить каталог шаблонов через следующую конфигурацию.
web.view.jsp.prefix=WEB-INF
web.view.thymeleaf.prefix=/templates

Использование шаблона:

// С помощью RoutingContext
Router.router().path("/").handler(ctx -> {
  ctx.response().template("index.html");
});

Router.router().path("/").handler(ctx -> {
  Map<String, Object> attrs = new HashMap<>();
  // ...
  ctx.response().template("index.html", attrs);
});

// Аннотация
@Mapping("/")
public Result index() {
  return Result.view("index.html");
}

@Mapping("/")
public Result index() {
  Map<String, Object> attrs = new HashMap<>();
  // ...
  return Result.view("index.html").addAttributes(attrs);
}

Перенаправление

Router.router().path("/").handler(ctx -> {
  ctx.response().redirect("https://github.com/justlive1");
});

@Mapping("/a")
public Result index() {
  // Внутренний адрес относительно корневого каталога: /b
  // return Result.redirect("/b"); 
  // Внутренний адрес относительно текущего пути: /a/b
  // return Result.redirect("b");
  // Протокол адреса
  return Result.redirect("https://github.com/justlive1");
}

Запись cookie

@Mapping("/")
public void index(RoutingContext ctx) {
  ctx.response().setCookie("hello", "world");
  ctx.response().setCookie("java", "script", 100);
  ctx.response().setCookie("uid", "xxx", ".justlive.vip", "/", 3600, true);
}

Добавление заголовка

@Mapping("/")
public void index(RoutingContext ctx) {
  ctx.response().setHeader("hello", "world");
}

Запись в session

@Mapping("/")
public void index(RoutingContext ctx) {
  ctx.request().getSession().put("key", "value");
}

Перехватчики

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

@Slf4j
@Bean
public class LogWebHook implements WebHook {
  @Override
  public boolean before(RoutingContext ctx) {
    log.info("before");
    return true;
  }
  @Override
  public void after(RoutingContext ctx) {
    log.info("after");
  }
  @Override
  public void finished(RoutingContext ctx) {
    log.info("finished");
  }
}

Обработка исключений

Фреймворк предоставляет обработчик исключений по умолчанию. Если требуется пользовательская обработка исключений, её можно реализовать следующим образом:

@Bean
public class CustomExceptionHandler extends ExceptionHandlerImpl {

  @Override
  public void handle(RoutingContext ctx, Exception e, int status) {
    if (e instanceof CustomException) { ### 部署项目

#### 修改端口

**Кодирование:**
```java
Server.listen(8080);

Конфигурационный файл:

oxygen.server.port=8081

Команда запуска:

java -jar -Doxygen.server.port=8090 app.jar

Запуск проекта

Использование встроенного контейнера для запуска

Класс запуска:

public class Application {
  public static void main(String[] args) {
    Server.listen();
  }
}

Общий способ упаковки:

  • ${mainClass} — это класс запуска, указанный выше.
  • Будет создана директория lib, в которой будут храниться зависимые jar-файлы.
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>${maven.compiler.source}</source>
        <target>${maven.compiler.target}</target>
        <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>${mainClass}</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
    <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>
  </plugins>
</build>

Создание fat-jar:

  • Использование плагина springboot для упаковки.
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>1.3.8.RELEASE</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Использование внешнего контейнера (jetty, tomcat и т. д.)

Не требуется файл web.xml для конфигурации. Упаковка в war и размещение в контейнере. Реализация механизма может быть найдена в WebContainerInitializer.

<!-- Решение проблемы с ошибкой по умолчанию при упаковке war-файла: атрибут webxml является обязательным -->
<properties>
  <failOnMissingWebXml>false</failOnMissingWebXml>
</properties>

Внешняя конфигурация

Фреймворк может изменять свойства по умолчанию с помощью конфигурационного файла.

##### Базовая конфигурация
# Конфигурация для переопределения адреса, пользовательская внешняя конфигурация переопределяет проект конфигурации, например file:/config/*.properties, classpath*:/config/*.properties, xx.properties
oxygen.config.override.path=
# Класс сканирования свойств
oxygen.class.scan=vip.justlive
# Корневой каталог временных файлов
oxygen.temp.dir=.oxygen
# Класс реализации кэша, используется при настройке собственного кэша
oxygen.cache.class=


##### Веб
# Встроенный порт запуска
oxygen.server.port=8080
# Путь контекста
oxygen.server.contextPath=
# Время истечения сеанса, в секундах
oxygen.web.session.expired=3600
# Префикс запроса статических ресурсов по умолчанию
oxygen.web.static.prefix=/public
# Каталог статических ресурсов по умолчанию
oxygen.web.static.path=/public,/static,classpath:/META-INF/resources/webjars
# Время кэширования статических ресурсов
oxygen.web.static.cache=3600
# Префикс пути jsp
oxygen.web.view.jsp.prefix=WEB-INF
# Префикс пути thymeleaf
oxygen.web.view.thymeleaf.prefix=/templates
# Суффикс пути thymeleaf
oxygen.web.view.thymeleaf.suffix=.html
# Префикс пути freemarker
oxygen.web.view.freemarker.prefix=/templates
# Простой вид обработки префикса
oxygen.web.view.simple.prefix=/templates
# Простой суффикс вида обработки
oxygen.web.view.simple.suffix=.htm
# Включить ли кэш шаблона
oxygen.web.view.cache.enabled=true


##### Задача по расписанию job
# Формат имени потока задания
oxygen.job.threadNameFormat=jobs-%d
# Размер основного пула потоков задания
oxygen.job.corePoolSize=10


##### i18n Интернационализация
# Адрес конфигурации i18n
oxygen.i18n.path=classpath:message/*.properties
# Язык i18n по умолчанию
oxygen.i18n.language=zh
# Страна i18n по умолчанию
oxygen.i18n.country=CN
# Параметр ключа i18n
oxygen.i18n.param.key=locale
# Ключ сеанса i18n
oxygen.i18n.session.key=I18N_SESSION_LOCALE


##### jetty
# Виртуальный хост
oxygen.server.jetty.virtualHosts=
# Тайм-аут простоя соединения в состоянии ожидания (в миллисекундах)
oxygen.server.jetty.idleTimeout=30000
# Ожидание перед остановкой соединения (в миллисекундах)
oxygen.server.jetty.stopTimeout=30000
# Размер очереди обрабатываемых соединений
oxygen.server.jetty.acceptQueueSize=
# Разрешить повторное использование Server socket, даже если он находится в состоянии TIME_WAIT
oxygen.server.jetty.reuseAddress=true
# Использовать ли функции servlet3.0
oxygen.server.jetty.configurationDiscovered=true
# Максимальный размер данных формы
...

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Это лёгкий Java-фреймворк, включающий в себя IoC, AOP, config, cache, job, JDBC, web. Расширить Свернуть
Apache-2.0
Отмена

Обновления (37)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/justlive1-oxygen.git
git@gitlife.ru:oschina-mirror/justlive1-oxygen.git
oschina-mirror
justlive1-oxygen
justlive1-oxygen
master