造個輪子— 從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,但是完成了自己的想法,我感到很開心。目前框架實現了一下的功能。
- 輕量級MVC框架,不依賴任何web容器
- 可以直接運行jar包啓動一個web服務
- 支持cookie
- 支持session
- 使用jdk原生的nio api實現http server
- Restful風格路由
- 支持模板引擎
- 支持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😊