博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JOxygen 2.0 发布,支持函数式编程、web 编程更加简便
阅读量:5938 次
发布时间:2019-06-19

本文共 7895 字,大约阅读时间需要 26 分钟。

  hot3.png

虽然不提倡重复造轮子,但好处之一是轮子可以造成方的

2.0全新升级重构版,让web编程更简单

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

用浏览器打开  就可以看到 hello world 了!

  • 注册路由
    • 硬编码方式
    • 注解方式
  • 获取请求参数
    • 表单参数或json请求参数
    • restful参数
    • header参数
    • cookie参数
    • 参数转对象
  • 静态资源
  • 上传文件
  • 结果渲染
    • 渲染json
    • 渲染文本
    • 渲染html
    • 渲染模板
    • 重定向
    • 写入cookie
    • 添加header
  • 拦截器
  • 异常处理
  • 部署项目
    • 修改端口
    • 运行项目

注册路由

硬编码方式

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("hello world");});

渲染模板

内置支持了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
attrs = new HashMap<>(); // ... ctx.response().template("index.html", attrs);});// 注解式@Mapping("/")public Result index() { return Result.view("index.html");}@Mapping("/")public Result index() { Map
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");}

拦截器

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.server().listen(8080);

配置文件

server.port=8081

运行项目

使用内嵌容器启动

启动类

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

通用打包方式

  • ${mainClass}为上面的启动类
  • 会生成lib目录存放依赖jar
org.apache.maven.plugins
maven-compiler-plugin
${maven.compiler.source}
${maven.compiler.target}
UTF-8
org.apache.maven.plugins
maven-jar-plugin
true
lib/
${mainClass}
org.apache.maven.plugins
maven-dependency-plugin
copy
package
copy-dependencies
${project.build.directory}/lib

打成fat-jar:

  • 使用springboot打包插件
org.springframework.boot
spring-boot-maven-plugin
1.3.8.RELEASE
package
repackage

使用外部容器(jetty、tomcat等)

无需web.xml配置,打包成war放入容器即可,实现机制可查看WebContainerInitializer

false

外部化配置

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

##### 基础配置# 配置覆盖地址,用户外部配置覆盖项目配置 例 file:/config/*.properties,classpath*:/config/*.properties,xx.propertiesconfig.override.path=# 类扫描路径属性main.class.scan=vip.justlive# 临时文件根目录main.temp.dir=.oxygen# 缓存实现类,自定义缓存时使用cache.impl.class=##### web # embedded 启动端口server.port=8080# context pathserver.contextPath=# 默认静态资源请求前缀web.static.prefix=/public# 默认静态资源目录web.static.path=/public,/static,classpath:/META-INF/resources/webjars# 静态资源缓存时间web.static.cache=3600# jsp路径前缀web.view.jsp.prefix=WEB-INF# thymeleaf 路径前缀web.view.thymeleaf.prefix=/templates# 是否开启模板缓存web.view.cache.enabled=true##### 定时任务job# job线程名称格式job.thread.name.format=jobs-%d# job核心线程池大小job.core.pool.size=10##### i18n国际化# i18n配置文件地址i18n.path=classpath:message/*.properties# i18n默认语言i18n.default.language=zh# i18n默认国家i18n.default.country=CN# i18n参数keyi18n.param.key=locale# i18n Session keyi18n.session.key=I18N_SESSION_LOCALE

转载地址:http://mpttx.baihongyu.com/

你可能感兴趣的文章
MyCat部署运行(Windows环境)与使用步骤详解
查看>>
springMVC+mybatis用户登录实例
查看>>
node.js环境下写的vue项目
查看>>
一本通 1261:【例9.5】城市交通路网
查看>>
CodeForces 601B Lipshitz Sequence
查看>>
wp 常用messagebox
查看>>
为何没有asia/beijing时区?
查看>>
HttpServletRequestWrapper的使用
查看>>
Spring实战5-基于Spring构建Web应用
查看>>
AngularJs 基础(60分钟入门) (转)
查看>>
Codeforces Round #425 (Div. 2) - B
查看>>
Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) - D
查看>>
设计模式之(十八)策略模式Strategy
查看>>
codeforces 707E Garlands (离线、二维树状数组)
查看>>
改进的SQL Express LocalDBB
查看>>
[nodejs] nodejs开发个人博客(七)后台登陆
查看>>
[javaEE] EL表达式获取数据
查看>>
[android] post请求接口demo测试代码
查看>>
关于android中事件传递和分发的一些小理解
查看>>
利用 GNU autotools
查看>>