需求,在一个JavaSE应用中对外暴露rest接口,提供给客户端调用

下载jetty的all in one包: jetty-all-9.1.5.v20140505.jar

最简单的做法就是直接使用servlet来做,下面是一个简单的内嵌jetty,解析使用的例子

首先先创建一个Servlet:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WebServiceServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public WebServiceServlet() {
    }
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get");
    }
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post");
    }
}

记得添加servlet-api-3.1.jar.

然后新建一个jetty服务的启动类.

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;

import com.novacloud.data.conf.service.servlet.WebServiceServlet;

public class MinimalServlets {

    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        ServletHandler handler = new ServletHandler();
        server.setHandler(handler);
        handler.addServletWithMapping(WebServiceServlet.class, "/web");
        server.start();
        server.join();
    }
}

启动之后,访问http://0.0.0.0:8080/web,后台输出get

更多信息参考官方文档:

http://www.eclipse.org/jetty/documentation/9.1.5.v20140505/advanced-embedding.html

但是仅仅使用Servlet,还需要自己处理参数校验,转换,返回结果定义等等问题.而且对于一个常用的服务来说,不是很灵活,需要自己写很多的东西,才能模拟一个完整的rest操作.我们可以使用jaxrs规范的实现resteasy-jaxrs来做rest服务.

首先添加依赖:

  • commons-codec-1.4.jar
  • commons-cli-1.1 .jar
  • commons-logging-1.1.1 .jar
  • jaxrs-api-3.0.8.Final.jar
  • jetty-all-9.1.5.v20140505.jar
  • resteasy-jaxrs-3.0.8.Final.jar
  • scannotation-1.0.3 .jar
  • servlet-api-3.0 .jar

然后编写一个rest服务的实现:

import java.util.Map;
import java.util.TreeMap;

import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;

@Path("orders")
public class OrdersService {
    // Stores state simply in a static collection class.
    private static Map<String, String> orders = new TreeMap<String, String>();

    @Path("/{order}")
    @PUT
    @Produces("text/html")
    public String create(@PathParam("order") String order,
            @QueryParam("customer_name") String customerName) {
        orders.put(order, customerName);
        return "Added order #" + order;
    }

    @Path("/{order}")
    @GET
    @Produces("text/html")
    public String find(@PathParam("order") String order) {
        if (orders.containsKey(order))
            return "<h2>Details on Order #" + order + "</h2><p>Customer name: "
                    + orders.get(order);

        throw new WebApplicationException(Response.Status.NOT_FOUND);
    }

    @Path("/list")
    @GET
    @Produces("text/html")
    public String list() {
        String header = "<h2>All Orders</h2>\n";

        header += "<ul>";
        for (Map.Entry<String, String> order : orders.entrySet())
            header += "\n<li>#" + order.getKey() + " for " + order.getValue()
                    + "</li>";

        header += "\n</ul>";

        return header;
    }
}

写一个服务类,统一管理所有的rest服务.把刚才写的OrdersService添加进去.

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class MyServices extends Application {
    private static Set<Object> services = new HashSet<Object>();

    public MyServices() {
        // initialize restful services
        services.add(new OrdersService());
    }

    @Override
    public Set<Object> getSingletons() {
        return services;
    }

    public static Set<Object> getServices() {
        return services;
    }
}

同样,写一个启动jetty服务和绑定服务处理的类.

import java.io.IOException;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;

public class MyRestServer {

    public static void main(String[] args) throws IOException {

        Server server = new Server(9091);
        ServletContextHandler context = new ServletContextHandler(
                ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        ServletHolder h = new ServletHolder(new HttpServletDispatcher());
        h.setInitParameter("javax.ws.rs.Application",
                MyServices.class.getName());
        context.addServlet(h, "/*");
        server.setHandler(context);
        try {
            server.start();
            server.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行之后,打开http://0.0.0.0:9091/orders/list 看看吧
之后可以通过put添加几个order,然后测试下get方法,enjoy it.

参考:http://news-anand.blogspot.com/2012/05/today-i-am-going-tell-you-how-to-create.html

Comments
Write a Comment