需求,在一个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
更多信息参考官方文档:
但是仅仅使用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