hi-nginx-java是一个独立于java官方的servlet规范,它有能力把NGINX直接编成servlet容器服务器。换言之,无需安装tomcat等容器服务器,也无需使用nginx的反向代理功能,只需安装jdk8+和hi-nginx,就能进行java web开发工作,而且性能更好。

先看NGINX的配置文件部分:

hi_java_classpath "-Djava.class.path=.:/usr/local/nginx/java:/usr/local/nginx/java/hi-nginx-java.jar:/usr/local/nginx/java/jdemo.jar"

location ~ \.java {
rewrite ^/(.*)\.java$ /$1 break;
hi_need_kvdb on;
hi_kvdb_size 50;
hi_kvdb_expires 5m;
hi_need_session on;
hi_need_headers on;
hi_need_cookies on;
hi_java_servlet hi/jdemo;
}

应用是jdemo.jar。hi-nginx需要调用的入口servlet是hi.jdemo,配置时用/斜杠代替.点。该类的实现如下:

package hi;

import hi.servlet;
import hi.route; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.regex.Matcher; public class jdemo implements hi.servlet { private static hi.route r = hi.route.get_instance(); public jdemo() {
jdemo.r.get("^/(hello|test)/?$", (hi.request req, hi.response res, Matcher m) -> {
this.do_hello(req, res);
});
jdemo.r.get("^/error/?$", (hi.request req, hi.response res, Matcher m) -> {
this.do_error(req, res);
});
jdemo.r.get("^/redirect/?$", (hi.request req, hi.response res, Matcher m) -> {
this.do_redirect(req, res);
});
jdemo.r.add(new ArrayList<String>(Arrays.asList("GET", "POST")), "^/form/?$",
(hi.request req, hi.response res, Matcher m) -> {
this.do_form(req, res);
});
jdemo.r.get("^/session/?$", (hi.request req, hi.response res, Matcher m) -> {
this.do_session(req, res);
});
jdemo.r.get("^/md5/?$", (hi.request req, hi.response res, Matcher m) -> {
this.do_md5(req, res);
});
} public void handler(hi.request req, hi.response res) {
jdemo.r.run(req, res);
} private void do_hello(hi.request req, hi.response res) {
res.headers.get("Content-Type").set(0, "text/plain;charset=UTF-8");
res.status = 200;
res.content = "hello,world";
} private void do_error(hi.request req, hi.response res) {
res.headers.get("Content-Type").set(0, "text/plain;charset=UTF-8");
res.status = 404;
res.content = "404 Not found";
} private void do_redirect(hi.request req, hi.response res) {
res.status = 302;
ArrayList<String> h = new ArrayList<String>();
h.add("/hello.java");
res.headers.put("Location", h);
} private void do_form(hi.request req, hi.response res) {
res.headers.get("Content-Type").set(0, "text/plain;charset=UTF-8");
res.status = 200;
StringBuilder buffer = new StringBuilder(); buffer.append("head data " + req.headers.size() + "\n");
buffer.append(this.do_foreach(req.headers)); buffer.append("\ncookie data " + req.cookies.size() + "\n");
buffer.append(this.do_foreach(req.cookies)); buffer.append("\nform data " + req.form.size() + "\n");
buffer.append(this.do_foreach(req.form)); buffer.append(String.format("\nclient= %s\nmethod= %s\nuser_agent= %s\nuri= %s\nparam= %s\n", req.client,
req.method, req.user_agent, req.uri, req.param)); res.content = buffer.toString();
} private void do_session(hi.request req, hi.response res) {
res.headers.get("Content-Type").set(0, "text/plain;charset=UTF-8");
res.status = 200;
String key = "test";
int value = 0;
if (req.session.containsKey(key)) {
value = Integer.parseInt(req.session.get(key)) + 1;
}
res.session.put(key, String.valueOf(value));
res.content = String.format("hello,%d", value);
res.status = 200;
} private void do_md5(hi.request req, hi.response res) {
res.headers.get("Content-Type").set(0, "text/plain;charset=UTF-8");
String plaintext = "hello,md5!";
res.status = 200;
res.content = String.format("%s\nmd5= %s", plaintext, this.md5(plaintext));
} private String md5(String str) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(str.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
} private String do_foreach(HashMap<String, String> m) {
StringBuffer buffer = new StringBuffer();
for (HashMap.Entry<String, String> item : m.entrySet()) {
buffer.append(String.format("%s\t=\t%s\n", item.getKey(), item.getValue()));
}
return buffer.toString();
}
}

将其用javac和jar编译组装为jdemo.jar文件后,安装至/usr/local/nginx/java目录中。编写好上述nginx配置,restart或者reload nginx即可通过访问http://localhost/*.java即可获得相应的服务。

hi.route的hi-nginx-java自带的一个路由器,可实现类似python Flask框架的功能。如此,可大幅度省去tomcat应用发布时繁琐的配置过程,而且能够获得更好的应用性能。如果通过hi_need_cache开启LRU缓存,无论多短的缓存时间,哪怕仅仅1秒,也能使得应用获得近乎nginx静态文件服务一样的性能表现,并且不会想tomcat等服务器那样大幅度消耗cpu和内存。

作为servlet容器的hi-nginx-java的更多相关文章

  1. 各种容器与服务器的区别与联系:Servlet容器、WEB容器、Java EE容器、应用服务器、WEB服务器、Java EE服务器

    1.容器与服务器的联系 如上图,我们先来看下容器与服务器的联系:容器是位于应用程序/组件和服务器平台之间的接口集合,使得应用程序/组件可以方便部署到服务器上运行. 2.各种容器的区别/联系 2-1.容 ...

  2. 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器

    转自:https://blog.csdn.net/tjiyu/article/details/53148174 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服 ...

  3. Java使用Jetty实现嵌入式Web服务器及Servlet容器

     Jetty是一个Java实现的开源的servlet容器,它既可以像Tomcat一样作为一个完整的Web服务器和Servlet容器,同时也可以嵌入在Java应用程序中,在Java程序中调用Jetty. ...

  4. java web分享ppt大纲 -- servlet容器简介

    今天在公司分享了java web的ppt,把ppt大纲放在这里,希望可以帮助需要的人 servlet容器简介 定义 狭义上的,servlet容器为java Web应用提供运行时环境,负责管理servl ...

  5. java框架之SpringBoot(8)-嵌入式Servlet容器

    前言 SpringBoot 默认使用的嵌入式 Servlet 容器为 Tomcat,通过依赖关系就可以看到: 问题: 如何定制和修改 Servlet 容器相关配置? SpringBoot 能否支持其它 ...

  6. JAVA网络编程基本功之Servlet与Servlet容器

    Servlet与Servlet容器关系 Servlet 比较这两个的区别, 就得先搞清楚Servlet 的含义, Servlet (/ˈsərvlit/ ) 翻译成中文就是小型应用程序或者小服务程序, ...

  7. Servlet容器请求处理

    红色部分为本章所述模块 所讲述的请求流程模块,大家已经很清楚了.那怎么给大家去讲的更清晰,大家理解的更容易呢?当然是,带着问题去学习,吸收或许会更快些啦.:) 开篇之前,给大家提以下几个问题,这些问题 ...

  8. 探秘Tomcat——一个简易的Servlet容器

    即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...

  9. 深入剖析tomcat之一个简单的servlet容器

    上一篇,我们讲解了如果开发一个简单的Http服务器,这一篇,我们扩展一下,让我们的服务器具备servlet的解析功能. 简单介绍下Servlet接口 如果我们想要自定义一个Servlet,那么我们必须 ...

随机推荐

  1. Power Designer建模之餐饮在线点评系统——需求模型实例

    总览 一级需求 二级需求 管理门户  会员门户 三级需求 系统管理  企业中心  会员中心  统计分析 四级需求

  2. Java知识系统回顾整理01基础03变量03字面值

    一.字面值定义 创建一个Hero对象会用到new关键字,但是给一个基本类型变量赋值却不是用new. 因为基本类型是Java语言里的一种内置的特殊数据类型,并不是某个类的对象.  给基本类型的变量赋值的 ...

  3. 【题解】NOIP2018 填数游戏

    题目戳我 \(\text{Solution:}\) 题目标签是\(dp,\)但是纯暴力打表找规律可以有\(65\)分. 首先是对于\(O(2^{nm}*nm)\)的暴力搜索,显然都会. 考虑几条性质: ...

  4. 【题解】[ZJOI2009]狼和羊的故事

    题目戳我 \(\text{Solution:}\) 显然思路,把所有羊看成一个源点,所有狼看成一个汇点,格子之间连容量为\(1\)的边,直接跑最小割. 技巧: 注意到篱笆不能把羊给割掉,狼同理.所以, ...

  5. 工信部今日向三大运营商和中国广电发放5G商用牌照

    央视快讯:工信部向中国电信.中国移动.中国联通.中国广电发放5G商用牌照. 2016年5月5日,工信部向中国广播电视网络有限公司颁发了<基础电信业务经营许可证>,批准中国广播电视网络有限公 ...

  6. TP5隐藏入口文件

    1,进入根目录,打开public文件夹,里面有个.htaccess文件 2,将这段代码改成?s= 3,不修改该文件,想要隐藏入口文件则会报错 4,改了文件之后是 5,改了入口文件为了隐藏  .php

  7. thinkphp6.0.x 反序列化详记(二)

    前言 接上文找第二条POP链. 环境配置 同上文 POP链构造 寻找__destruct方法 仍然是寻找__destruct,这次关注AbstractCache.php(/vendor/league/ ...

  8. Redis GEO 功能使用场景

    本文来源:https://www.dazhuanlan.com/2020/02/05/5e3a0a3110649/ 背景 前段时间自己在做附近直播相关业务,其中有一个核心的点就是检索用户附近的主播,也 ...

  9. 本溪6397.7539(薇)xiaojie:本溪哪里有xiaomei

    本溪哪里有小姐服务大保健[微信:6397.7539倩儿小妹[本溪叫小姐服务√o服务微信:6397.7539倩儿小妹[本溪叫小姐服务][十微信:6397.7539倩儿小妹][本溪叫小姐包夜服务][十微信 ...

  10. MeteoInfoLab脚本示例:MODIS Sinusoidal投影HDF数据

    MODIS卫星很多陆面数据都是Sinusoidal投影,数据被分为一个个10*10度(赤道地区)的瓦片(http://modis-land.gsfc.nasa.gov/MODLAND_grid.htm ...