從零開始實現mvc框架

造個輪子— 從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. 支持模板引擎
  8. 支持JSON輸出

可以像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,一起共同學習討論Boomvc😊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章