Spark是一个可以让你以最小的代价快速创建Web应用的轻量级Java web框架,它的灵感来自于Sinatra。
开始使用Spark
下载spark和spark依赖的类库(或者让maven来为你做这些事情),把它们放在工程classpath下,开始动手:
import static spark.Spark.*;
import spark.*;
public class HelloWorld {
public static void main(String[] args) {
get(new Route("/hello") {
@Override
public Object handle(Request request, Response response) {
return "Hello World!";
}
});
}
}
打开下面的链接查看效果:
http://localhost:4567/hello
Routes
Spark程序主要是由一组routes构成。一个route由三个部分组成:
- 动词 (get, post, put, delete, head, trace, connect, options)
- 路径 (/hello, /users/:name)
- 回调函数 ( handle(Request request, Response response) )
注意!Spark是根据Routes定义的顺序来匹配的。Spark会调用第一个和请求匹配的Routes。
....
get(new Route("/") {
@Override
public Object handle(Request request, Response response) {
// .. Show something ..
}
});
post(new Route("/") {
@Override
public Object handle(Request request, Response response) {
// .. Create something ..
}
});
put(new Route("/") {
@Override
public Object handle(Request request, Response response) {
// .. Update something ..
}
});
delete(new Route("/") {
@Override
public Object handle(Request request, Response response) {
// .. annihilate something ..
}
});
options(new Route("/") {
@Override
public Object handle(Request request, Response response) {
// .. appease something ..
}
});
....
可以在Route的路径中指定参数,然后通过调用request对象的params方法来获得:
// matches "GET /hello/foo" and "GET /hello/bar"
// request.params(":name") is 'foo' or 'bar'
get(new Route("/hello/:name") {
@Override
public Object handle(Request request, Response response) {
return "Hello: " + request.params(":name");
}
});
Request
handle方法的request参数提供了和请求相关的信息和功能:
....
request.body(); // request body sent by the client
request.contentLength(); // length of request body
request.contentType(); // content type of request.body
request.headers(); // the HTTP header list
request.headers("BAR"); // value of BAR header
request.host(); // "example.com"
request.ip(); // client IP address
request.pathInfo(); // the path info
request.port(); // the server port
request.queryParams("FOO"); // value of FOO query param
request.queryParams(); // the query param list
request.raw(); // raw request handed in by Jetty
request.requestMethod(); // The HTTP method (GET, ..etc)
request.scheme(); // "http"
request.url(); // "http://example.com/foo"
request.userAgent(); // user agent
....
Response
handle方法的response参数提供了和响应相关的信息和功能:
....
response.body("Hello"); // sets content to Hello
response.header("FOO", "bar"); // sets header FOO with value bar
response.raw(); // raw response handed in by Jetty
response.redirect("/example"); // browser redirect to /example
response.status(401); // set status code to 401
response.type("text/xml"); // set content type to text/xml
....
终止一个请求
如果想要在一个filter或者route中马上终止一个请求,那么就使用:
halt();
当然在halt的时候你也可以指定返回的状态:
halt(401);
或者是返回的信息:
halt("This is the body");
或者都指定:
halt(401, "Go Away!");
Filters
Before filter在request之前执行,它们可以读取request,也可以读取/修改response。 如果想要停止执行filter,那么就调用halt方法:
before(new Filter() { // matches all routes
@Override
public void handle(Request request, Response response) {
boolean authenticated;
// ... check if authenticated
if (!authenticated) {
halt(401, "You are not welcome here");
}
}
});
After filter在每一个request之后执行,它们可以读取request,也可以读取/修改response:
after(new Filter() {
@Override
public void handle(Request request, Response response) {
response.header("foo", "set by after filter");
}
});
你可以为filter指定pattern,这样它们就只过滤符合pattern的请求:
before(new Filter("/protected/*") {
@Override
public void handle(Request request, Response response) {
// ... check if authenticated
halt(401, "Go Away!");
}
});
请求重定向
你可以通过redirect方法使一个请求重定向:
response.redirect("/bar");
指定端口
默认情况下,Spark监听的端口是4567。如果你想要指定别的端口,那么就在routes或者filters里面调用下面的方法:
setPort(9090); // Spark will run on port 9090