springboot netty实现socket_从零开始实现mvc框架

5f282566ae44606d9b82ece753137fe1.png

造个轮子— 从socket到mvc框架

1. 缘起

为什么要造这个轮子?现在Java领域的mvc框架层出不穷,springmvc,struts2,jfinal;容器方面有tomcat,jetty,undertow。为什么要造这个不成熟的东西出来?我想起我在大二刚接触java web是学的struts2,一大堆xml配置让我看到吐,感觉这掩盖了网络编程的本来面目,为什么不从底层的socket写起,解析http协议,封装请求和响应,我觉得这样更能理解本质。于是我造了第一个轮子作为这个想法的验证MineServer, 这个轮子现在放在github上,但这只是一个玩具项目,我想造的是一个完整的轮子,于是我开了这个坑Boomvc。

2. 我想要什么?

我想要一个类似spring boot这种开发体验的web框架,可以用一行代码开启一个http server,没有xml配置,使用注解和简单的properties配置文件,最简的依赖,可以不用遵守servlet规范的web mvc框架。框架要包括3个部分:底层的http server和上层的mvc框架,以及ioc容器。http server可以自己从socket实现,也可以使用netty这样的网络框架实现。

3. 实现

目前框架已经基本实现完成,还有很多bug,但是完成了自己的想法,我感到很开心。目前框架实现了一下的功能。

  1. 轻量级MVC框架,不依赖任何web容器
  2. 可以直接运行jar包启动一个web服务
  3. 支持cookie
  4. 支持session
  5. 使用jdk原生的nio api实现http server
  6. Restful风格路由
  7. 支持模板引擎

可以像spring boot 那样一行代码启动 :)

public static void main(String[] args) {
    Boom.me().start(Main.class, args);
}

写一个controller

@RestPath
public class TestController {

    @GetRoute("/")
    public String hello(){
        return "hello world";
    }
}

同时还有过滤器和拦截器

public interface Filter {

    void init(FilterConfig config);

    void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) throws Exception;

    void destroy();

}
public interface Interceptor {

    boolean preHandle(HttpRequest request, HttpResponse response);

    void postHandle(HttpRequest request, HttpResponse response, ModelAndView modelAndView);

    void afterCompletion(HttpRequest request, HttpResponse response, Exception e);

}

然后像spring boot那样注册,写一个配置类继承WebMvcConfigurerAdapter

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter{
    @Override
    public void addInterceptors(WebMvcRegistry registry) {
        Interceptor interceptor = new MyInterceptor();
        registry.addInterceptor(interceptor)
                .order(1)
                .patternUrl("/*");
    }

    @Override
    public void addFilters(WebMvcRegistry registry) {
        Filter filter = new MyFilter();
        registry.addFilter(filter)
                .addFilterInitParameter("hello", "world")
                .addFilterInitParameter("ni", "hao")
                .addFilterPathPattern("/*")
                .order(1);
    }
}

做为一个开源的新手,我写了这个项目,有很多不足和bug,希望有大牛可以多多指教。如果你有兴趣,欢迎star,fork,提issues,一起共同学习讨论

StevenKin/MineServer​github.com
ed874c6538d2cecb1cd5ec110b565fe1.png
StevenKin/Boomvc​github.com
ed874c6538d2cecb1cd5ec110b565fe1.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值