微型的Java Web框架 Spark

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
它是一个开源(Apache许可证)微型Java Web框架,拥有最少的依赖,以及快速的学习曲线。 该项目的目标是创建一个微型Web框架Java中这应该是易于使用和破解。 其概念是不是新的 (灵感来自于 Sinatra, Express JS, Play Framework),但目的是提供一个清晰,简单易用的模块化解决方案。 pippo可用于中小型应用,并应用在基于微服务架构的应用程序中。 示例代码:  publicclassSimpleDemo {       publicstaticvoidmain(String[] args) { //        new Pippo().start(); // run the default web server with the default web server settings           Pippo pippo =newPippo(newSimpleApplication());         pippo.getServer().getSettings().staticFilesLocation("/public");         pippo.start();     }   }   publicclassSimpleApplicationextendsApplication {       @Override     publicvoidinit() {         super.init();           GET("/",newRouteHandler() {               @Override             publicvoidhandle(Request request, Response response) {                 response.send("Hello World");             }           });           GET("/file",newRouteHandler() {               @Override             publicvoidhandle(Request request, Response response) {                 response.file(newFile("pom.xml"));             }           });           GET("/json",newRouteHandler() {               @Override             publicvoidhandle(Request request, Response response) {                 Contact contact =newContact()                         .setName("John")                         .setPhone("0733434435")                         .setAddress("Sunflower Street, No. 6");                 // you can use variant 1 or 2 //                response.contentType(HttpConstants.ContentType.APPLICATION_JSON); // 1 //                response.send(new Gson().toJson(contact)); // 1                 response.json(contact);// 2             }           });           GET("/template",newRouteHandler() {               @Override             publicvoidhandle(Request request, Response response) {                 Map<String, Object> model =newHashMap<String, Object>();                 model.put("greeting","Hello my friend");                 response.render("hello.ftl", model);             }           });           GET("/error",newRouteHandler() {               @Override             publicvoidhandle(Request request, Response response) {                 thrownewRuntimeException("Errorrrrrrrr...");             }           });       }   } 标签:pippo
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值