oxygen
Лёгкий Java фреймворк
Лёгкий Java фреймворк.
oxygen-core
Scheduled
.Aspect
или напрямую реализовать Interceptor
для написания аспектов.oxygen-jdbc
oxygen-web
ServletContainerInitializer
для автоматической загрузки, без web.xml.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) {
// Если не используется аннотация, используйте имя метода в качестве имени параметра запроса.
// Используйте аннотацию, чтобы указать имя параметра запроса.
}
// Использование 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");
});
// Используя 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");
}
@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");
}
@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
:
<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 )