起步

优质
小牛编辑
135浏览
2023-12-01

默认控制器

hi-nginx-java内置一个默认的控制器hi.controller,hi-nginx配置为:

    location ~ \.java {
            rewrite ^/(.*)\.java$ /$1 break;
            hi_java_servlet hi/controller; 
    }

通过该控制器,访问http://localhost/hi/test.java,即可使用hi-nginx-java内置的测试服务hi.test:

package hi;

import hi.request;
import hi.response;
import hi.route;
import java.util.regex.Matcher;

public class test implements hi.route.run_t {
    public test() {
    }

    public void handler(hi.request req, hi.response res, Matcher m) {
        res.set_content_type("text/plain;charset=utf-8");
        res.content = "welcome to hi-nginx-java\n";
        res.status = 200;
    }
}

hi-nginx-java内置的路由保证,当URI是/a/b/c时,被映射调用的类将是a.b.c。因此,hi-nginx-java内部维护着一个URI与Class之间的默认映射关系,如果没有设置其他映射关联,hi-nginx-java就会假设所需调用的类由给定的URI元素构成——如果找不到这个类,hi-nginx-java就会返回404错误。

因此,所有的web服务开发都应该围绕着hi.route.run_t这个接口来实现。这个接口很简单,它的定义是:

    public interface run_t {
        public void handler(hi.request req, hi.response res, Matcher m);
    }

开发者需要实现handler方法。该方法包含三个参数,分别是http请求、http响应和一个Matcher。如果没有额外设置路由,这个Matcher其实没什么用,它并没有对URI的进一步处理。

自定义控制器

如果需要自定义路由配置,则应该自定义控制器。比如:


package mytest;

public class controller implements hi.servlet{
    public controller(){
        hi.route.get_instance().get("^/(example1)/?",this::do_example1));
        hi.route.get_instance().post("^/(example2)/?",this::do_example2));
    }

    public void handler(hi.request req, hi.response res){
         hi.route.get_instance().run(req, res);
    }

    private void do_example1(hi.request req, hi.response res,Matcher m){
        res.set_content_type("text/plain;charset=utf-8");
        res.content = "welcome to example1.\n";
        res.status = 200;
    }

    private void do_example2(hi.request req, hi.response res,Matcher m){
        res.set_content_type("text/plain;charset=utf-8");
        res.content = "welcome to example2.\n";
        res.status = 200;
    }


}

然后配置hi-nginx:

    location ~ \.java {
            rewrite ^/(.*)\.java$ /$1 break;
            hi_java_servlet mytest/controller; 
    }

通过GET方法访问http://localhost/example1.java,能使用do_example1服务;通过POST方法访问http://localhost/example2.java,则能使用do_example2服务。此时,Matcher参数是有意义的,它意味着正则匹配URI得到的group