JAVA裏使用Jetty作爲輕量級嵌入式的Web容器
有時候,我們可能使用一個SOA服務,傳遞一些數據,但是我們又不想使用一些WebService服務,或者EJB重量級的JAVA EE框架,包括部署一個簡單的Tomcat的Web服務,我們都不想去做,這時我們該用什麼? jetty作爲一個比tomcat還輕量級的servlet容器,可以以非常輕小的姿態,集成在我們的應用程序裏面,甚至可以作爲一個嵌入式的web容器來滿足我們的一些需求,非常的方便。
下面散仙模擬一個,在一個機器上起了一個jetty服務,然後再另一個機器上通過使用jsoup訪問http請求,得到測試數據,當然我們可以基於這個例子,改造出一些類似異構平臺通信的服務,通過json或xml格式的數據,就可以使PHP,Python,Ruby,C#來訪問JAVA處理完的數據,類似於輕量級的rest風格。
測試代碼如下:
package com.qin.test;
import java.util.concurrent.Executors;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.thread.ExecutorThreadPool;
import org.eclipse.jetty.util.thread.ThreadPool;
import com.qin.servlet.MyTestServlet;
/**
* @author qindongliang
*
* 啓動jetty測試服務
*
*
* **/
public class StartupServer {
public static void main(String[] args)throws Exception {
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirectoriesListed(true);
resourceHandler.setResourceBase("data");
resourceHandler.setStylesheet("");
ContextHandler staticContextHandler = new ContextHandler();
staticContextHandler.setContextPath("/data");
//staticContextHandler.setContextPath("/files");
staticContextHandler.setHandler(resourceHandler);
//添加servlet支持
ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
servletContextHandler.setContextPath("/");
/**可在下面依次添加多個servlet**/
servletContextHandler.addServlet(new ServletHolder(new MyTestServlet()), "/show");
//servletContextHandler.addServlet(new ServletHolder(new SpuSimilarityServlet()), "/spu");
//servletContextHandler.addServlet(new ServletHolder(new SpuResultServlet()), "/search");
// servletContextHandler.addServlet(new ServletHolder(new AdminServlet()), "/db");
HandlerList handlers = new HandlerList();
handlers.addHandler(servletContextHandler);
handlers.addHandler(staticContextHandler);
int hosts=9999;//端口號
Server server = new Server(hosts);
// 設置線程池
ThreadPool threadPool = new ExecutorThreadPool(Executors.newFixedThreadPool(5));
server.setThreadPool(threadPool);
// 設置連接參數
Connector connector = new SelectChannelConnector();
// 設置監聽端口
connector.setPort(hosts);
// 爲服務設置連接器
server.setConnectors(new Connector[] { connector });
server.setHandler(handlers);
server.start();
server.join();
}
}
Servlet處代碼
package com.qin.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;
@WebServlet("/show")
public class MyTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
List<String> list = new ArrayList<String>();
list.add("A");
list.add("中國");
list.add("外國");
Gson g = new Gson();
//resp.setContentType("charset=utf-8");
ServletOutputStream out = resp.getOutputStream();
String json = g.toJson(list);
out.write(json.getBytes());
out.flush();
out.close();
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doDelete(req, resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doPut(req, resp);
}
}
在另外一個機器上訪問請求的代碼:
package com.get.jetty;
import org.jsoup.Connection;
import org.jsoup.Connection.Method;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
/**
*
* @author qindongliang
* 獲取json數據
*
* **/
public class GetJettyData {
public static void main(String[] args)throws Exception {
//使用jsoup獲取jetty連接
Connection con=Jsoup.connect("http://localhost:9999/show").timeout(80000);
con.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0");
Document doc=con.post();
System.out.println(doc.text());
}
}
打印的結果如下:
["A","中國","外國"]
至此,一個關於jetty API使用的小例子就完成了,使用的jar包截圖如下:
最後,散仙把jar包打包上傳,用的到的朋友可以測一下!