servlet作为一个web规范,其本身就算做一个web开发框架,但是其web action (响应某个URI的实现)的实现都是基于类的,不是很方便,并且3.0之前的版本还必须通过web.xml配置来增加新的action。servlet中有一个filter的功能,可以配置所有URI的功能都经过filter。我们可以基于filter的功能来实现一个简单的web框架。在这个框架中,主要改进URI action的映射,就像play framework中route的配置:
GET /hello com.codemacro.webdemo.test.TestController.helloGET /route com.codemacro.webdemo.test.TestController.routePOST /hello com.codemacro.webdemo.test.TestController.sayHello
即把某个URI映射到类接口级别。基于servlet实现web框架的好处不仅实现简单,还能运行在所有支持servlet容器规范的web server上,例如Tomcat、Jetty。
本文提到的web framework demo可以从我的github 上取得:servlet-web-framework-demo
功能
这个web framework URI action部分(或者说URI routing)如同前面描述,action的编写如:
public class TestController extends BaseController { // 返回字符串 public Result index() { return ok("hello world"); } // HTTP 404 public Result code404() { return status(404, "not found"); } // 使用JSP模板渲染 public Result template() { String[] langs = new String[] {
"c++", "java", "python"}; return ok(jsp("index.jsp") .put("name", "kevin") .put("langs", langs) ); }}
有了action之后,配置route
文件映射URI即可:
GET /index com.codemacro.webdemo.test.TestController.indexGET /404 com.codemacro.webdemo.test.TestController.code404GET /index.jsp com.codemacro.webdemo.test.TestController.template
然后配置web.xml
,增加一个filter:
<filter> <filter-name>MyWebFilter</filter-name> <filter-class>com.codemacro.webdemo.MyServletFilter</filter-class></filter><filter-mapping> <filter-name>MyWebFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
最后以war的形式部署到Jetty webapps
下即可运行。想想下次要再找个什么lightweight Java web framework,直接用这个demo就够了。接下来讲讲一些关键部分的实现。
servlet basic
基于servlet开发的话,引入servlet api是必须的:
<dependency> <groupId>javax.servlet</groupId> <artifac