• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

oxygen: 一个轻量级Java框架,包含ioc、aop、config、cache、job、Jdbc、web等 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

oxygen

开源软件地址:

https://gitee.com/justlive1/oxygen

开源软件介绍:

oxygen

Maven CentralLicense

轻量级Java框架

介绍

一个轻量级Java框架

  • oxygen-core

    • 配置管理,支持${attrs.key:defaultValue}表达式获取配置
    • 加解密管理,提供加解密服务内置基础加密实现,例如SHA-1、SHA-256、MD5
    • 异常管理,提供异常包装,统一异常编码,便于国际化
    • i18n国际化
    • 资源文件加载,提供file,jar,classpath等文件加载
    • 类扫描器
    • 基于构造器的轻量级依赖注入
    • 缓存
    • 提供基于注解Scheduled的定时任务
    • 可使用注解Aspect或直接实现Interceptor编写切面
    • 部分工具类
  • oxygen-jdbc

    • 小巧简单的jdbc实现,纯jdk实现,无第三方jar
    • 支持多数据源
    • 基于sql进行crud,不提供类似Hibernate的链式方法(原因:sql作为数据库领域的DSL,已经很自然优雅,Less is more)
  • oxygen-web

    • 轻量级web框架支持注解声明和函数式编程
    • 支持Servlet3.0 ServletContainerInitializer 自动加载,省略web.xml
    • 支持i18n动态切换
    • 提供WebHook进行请求拦截处理
    • 支持自定义全局异常处理
    • 内置aio服务器

特性

  • 轻量级,使用简单
  • 支持插件扩展
  • 函数式编程
  • 流式风格

快速开始

创建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 了!

内容详解

注册路由

硬编码方式

Router.router().path("/").handler(ctx -> ctx.response().write("hello world"));Router.router().path("/get").method(HttpMethod.GET).handler(get);Router.router().path("/post").method(HttpMethod.POST).handler(post);

注解方式

@Router("/book")public class BookRouter {    // 视图  @Mapping("/")  public ViewResult index() {    return Result.view("/book.html");  }    // json  @Mapping(value = "/ajax", method = {HttpMethod.POST})  public Book find(RoutingContext ctx) {    // ...    return new Book();  }}

获取请求参数

表单参数或json请求参数

项目将json请求参数与表单参数合并,使用相同的方法或注解获取

使用RoutingContext获取

Router.router().path("/").handler(ctx -> {  String id = ctx.request().getParam("id");  ctx.response().write(id);});

使用注解获取

@Mapping(value = "/ajax", method = {HttpMethod.POST})public Book find(@Param Long id, @Param("tp") String type) {  // ...  return new Book();}

restful参数

使用RoutingContext获取

Router.router().path("/{id}").handler(ctx -> {  String id = ctx.request().getPathVariable("id");  ctx.response().write(id);});

使用注解获取

@Mapping(value = "/{id}", method = {HttpMethod.POST})public void ajax(@PathParam("id") Long id) {  // ...}

header参数

使用RoutingContext获取

Router.router().path("/").handler(ctx -> {  String id = ctx.request().getHeader("id");  ctx.response().write(id);});

使用注解获取

@Mapping(value = "/", method = {HttpMethod.POST})public void ajax(@HeaderParam("id") Long id) {  // ...}

cookie参数

使用RoutingContext获取

Router.router().path("/").handler(ctx -> {  String id = ctx.request().getCookie("id");  ctx.response().write(id);});

使用注解获取

@Mapping(value = "/", method = {HttpMethod.POST})public void ajax(@CookieParam("id") Long id) {  // ...}

参数转对象

实体类

@Datapublic 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);  // header参数绑定  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) {  // ...}

静态资源

内置默认将classpath/public,/static作为静态资源目录,支持webjars,映射到/public

自定义静态资源可使用下面代码

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

也可以通过配置文件指定

web.static.prefix=/publicweb.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>");});

渲染模板

内置支持了jspthymeleaf模板,默认对应resources下的WEB-INFtemplates目录

# 可通过下面配置进行更改模板目录web.view.jsp.prefix=WEB-INFweb.view.thymeleaf.prefix=/templates

模板使用

// 使用RoutingContextRouter.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);}

添加header

@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@Beanpublic 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");  }}

异常处理

框架默认提供了一个异常处理器,如需自定义处理异常,可以像下面这样使用

@Beanpublic class CustomExceptionHandler extends ExceptionHandlerImpl {  @Override  public void handle(RoutingContext ctx, Exception e, int status) {    if (e instanceof CustomException) {      // do something    } else {      super.handle(ctx, e, status);    }  }}

部署项目

修改端口

编码指定

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 attribute is required --><properties>  <failOnMissingWebXml>false</failOnMissingWebXml></properties>

外部化配置

框架可以通过使用配置文件进行修改默认属性

##### 基础配置# 配置覆盖地址,用户外部配置覆盖项目配置 例 file:/config/*.properties,classpath*:/config/*.properties,xx.propertiesoxygen.config.override.path=# 类扫描路径属性oxygen.class.scan=vip.justlive# 临时文件根目录oxygen.temp.dir=.oxygen# 缓存实现类,自定义缓存时使用oxygen.cache.class=##### web # embedded 启动端口oxygen.server.port=8080# context pathoxygen.server.contextPath=# session失效时间,单位秒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# job线程名称格式oxygen.job.threadNameFormat=jobs-%d# job核心线程池大小oxygen.job.corePoolSize=10##### i18n国际化# i18n配置文件地址oxygen.i18n.path=classpath:message/*.properties 
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap