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
# Максимальный размер данных формы
...
You can comment after Login
Inappropriate content may be displayed here and will not be shown on the page. You can check and modify it through the relevant editing function
If you confirm that the content does not involve inappropriate language/advertisement redirection/violence/vulgar pornography/infringement/piracy/false/insignificant or illegal content related to national laws and regulations, you can click submit to make an appeal, and we will handle it as soon as possible.
Comments ( 0 )