Jetty是一個提供HHTP服務器、HTTP客戶端和javax.servlet容器的開源項目,Jetty 目前的是一個比較被看好的 Servlet 引擎,它的架構比較簡單,也是一個可擴展性和很是靈活的應用服務器,它有一個基本數據模型,這個數據模型就是 Handler,全部能夠被擴展的組件均可以做爲一個 Handler,添加到 Server 中,Jetty 就是幫你管理這些 Handler。css
最近工做中須要在項目中集成jetty,因爲以前歷來沒有用過jeety,因此耗費了我多半天的時間去學習,基本實現了jetty嵌入集成,我本身搭建了一個簡單的springMvc框架,簡單實現了controller請求跳轉jsp頁面的小功能,這裏springMvc的建立就不在這裏敘述了。不會的能夠去網上上查找資料。項目結構以下:java
首先在項目中導入相應的jar包,以下:web
jetty-all-8.1.17.v20150415.jar
servlet-api.jar
ant-1.6.5.jar
core-3.1.1.jar
jsp-2.1.jar
jsp-api-2.1.jar
ant-xmltask.jar
jetty-util-6.1.9.jarspring
其次建立一個入口方法用於啓動 jetty,代碼以下:api
/** * 之內置Jetty模式啓動Web應用 * 提示:請以debug as java application的方式啓動 */ public class AOS { /** * 啓動內置服務器 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { AOSServer aosServer = new AOSServer(); aosServer.setWebContext("/testjetty"); //項目啓動的上下文名稱 aosServer.setPort(10010); //服務的端口號 aosServer.start(); //啓動服務 } }
最後編寫具體的jetty啓動方法,代碼以下:瀏覽器
/** * <b>基於Jetty的嵌入式Servlet容器</b> * * @author atom.wu * @date 2008-06-06 * @since 1.0 */ public class AOSServer { private static Logger log = LoggerFactory.getLogger(AOSServer.class); /** * 監聽端口, 缺省爲80 */ private int port = 80; /** * 應用上下文, 缺省爲/(無上下文) */ private String webContext = "/"; public AOSServer() { } /** * 構造Server實例 * * @param pWebContext * @param pPort */ public AOSServer(String pWebContext, int pPort) { setWebContext(pWebContext); setPort(pPort); } public int getPort() { return port; } /** * 監聽端口, 缺省爲80 * * @param port */ public void setPort(int port) { this.port = port; } public String getWebContext() { return webContext; } /** * 應用上下文, 缺省爲/(無上下文) * * @param webContext */ public void setWebContext(String webContext) { this.webContext = webContext; } /** * 啓動Jetty容器 */ public void start() throws Exception { long start = System.currentTimeMillis(); final String webRoot = System.getProperty("user.dir") + "/WebContent"; //工程路徑 Server server = new Server(); // 設置在JVM退出時關閉Jetty的鉤子。 server.setStopAtShutdown(true); SelectChannelConnector connector = new SelectChannelConnector(); //disable nio cache to unlock the css and js file when running connector.setUseDirectBuffers(false); // 解決Windows下重複啓動Jetty竟然不報告端口衝突的問題. connector.setReuseAddress(false); connector.setPort(port); server.setConnectors(new Connector[]{connector}); WebAppContext context = new WebAppContext(); context.setResourceBase("WebContent"); context.setContextPath(webContext); //設置表單提交大小 (缺省值:200000) context.setMaxFormContentSize(10000000); context.setParentLoaderPriority(true); //針對jetty使用jstl的特殊設置,掃描tld文件。指定哪些jar中可能含有tld。 context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/.*jsp-api-[^/]*\\.jar$|.*/.*jsp-[^/]*\\.jar$|.*/.*taglibs[^/]*\\.jar$|.*/.*jstl[^/]*\\.jar$"); server.setHandler(context); boolean isSuccess = true; try { server.start(); } catch (BindException e) { isSuccess = false; } catch (Exception e) { isSuccess = false; } finally{ String msg = "sa-web啓動成功"; String supportMsg = " "; if ( !isSuccess) { msg = "sa-web啓動失敗"; log.error(msg); msg = msg + supportMsg; System.out.println(msg); System.exit(0); }else { Toolkit toolkit = Toolkit.getDefaultToolkit(); Clipboard clipboard = toolkit.getSystemClipboard(); webContext = webContext.equals("/") ? "" : webContext; String webUrl = "http://localhost"; if (port == 80) { webUrl = webUrl + webContext; }else { webUrl = webUrl + ":" + port + webContext; } StringSelection stringSel = new StringSelection(webUrl); clipboard.setContents(stringSel, null); long alltime = System.currentTimeMillis() - start; msg = msg + "[" + alltime + "毫秒]" + " >> " + webUrl + supportMsg; System.out.println(msg); server.join(); //線程阻塞 } } }
啓動jetty 服務。服務器
瀏覽器打開地址:架構