<h4>qiuJETTY嵌入式Web容器的開發(一)---基礎開發</h4> <p>JETTY嵌入式Web容器體積小,啓動速度快,性能好,免費開源,是一款很適合開發調試和簡單演示的輕量級Web容器.</p> <p>並且它的嵌入式的特色,使得開發者能夠直接將容器的操做包含在程序邏輯裏,得以擺脫TOMCAT,JBOSS等獨立容器帶來的安裝,維護,部署等一系列使人頭疼的問題.</p> <h5>JETTY嵌入式開發步驟</h5> <ul> <li><b>下載</b> </li> </ul> <p>本文采用的是2012年最新版本的JETTY8 (8.1.4版)</p> <p>jetty-hightide-8.1.4.v20120524.zip</p> <ul> <li><b>ECLIPSE</b><b>創建一個普通JAVA</b><b>項目testjetty</b> </li> </ul> <p>注意:</p> <p>是JAVA  APPLICATION項目,不是WAR項目.</p> <p>JDK要1.6</p> <p>在項目裏創建jetty目錄</p> <p>目錄下再創建etc目錄</p> <p>將jetty-hightide-8.1.4.v20120524.zip包中etc目錄下的jetty.xml和webdefault.xml文件拷貝入新建的 /jetty/etc目錄下</p> <p>將jetty-hightide-8.1.4.v20120524.zip文件中lib/目錄下的全部jar文件和lib/jsp子目錄下的全部jar文件都加入項目的buildPath</p> <p><i>(</i><i>不少討論JETTY</i><i>開發的文章老是在最小JAR</i><i>包數上作文章,</i><i>我以爲初學者仍是應該將全部JAR</i><i>包都加入,</i><i>由於做爲一款Web</i> <i>容器,JETTY</i><i>的JAR</i><i>容納了大量的細節功能.</i> <b><i>有的JAR</i></b><b><i>包你沒有加入,</i></b><b><i>也許測HELLOWORLD</i></b><b><i>這類功能可以經過,</i></b><b><i>但在真正的商用頁面裏,</i></b><b><i>就會針對各類HTTP</i></b><b><i>元素出問題</i></b><i>)</i></p> <p>在項目裏建webRoot目錄</p> <p>webRoot目錄下創建WEB-INF目錄,之後web.xml就放在這裏</p> <p>建成的項目的結構以下:</p> <p><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=6151984a01014zjz&url=http://s1.sinaimg.cn/orignal/6151984agc40d513abd10"><img title="JETTY嵌入式Web容器的開發(一)---基礎開發" alt="JETTY嵌入式Web容器的開發(一)---基礎開發" src="http://s1.sinaimg.cn/middle/6151984agc40d513abd10&690" width="346" height="239" /></a></p> <ul> <li><b>修改/jetty/etc/jetty.xml</b> </li> </ul> <p>我作了下面兩處修改(粗體),以利於測試</p> <p><?xml version=<i>"1.0"</i>?></p> <p><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"></p> <p><Configure id=<i>"Server"</i> class=<i>"org.eclipse.jetty.server.Server"</i>></p> <p><Set name=<i>"ThreadPool"</i>></p> <p><!-- Default queued blocking threadpool --></p> <p><New class=<i>"org.eclipse.jetty.util.thread.QueuedThreadPool"</i>></p> <p><Set name=<i>"minThreads"</i>><b>30</b></Set></p> <p><Set name=<i>"maxThreads"</i>>200</Set></p> <p><Set name=<i>"detailedDump"</i>>false</Set></p> <p></New></p> <p></Set></p> <p><Call name=<i>"addConnector"</i>></p> <p><Arg></p> <p><New class=<i>"org.eclipse.jetty.server.nio.SelectChannelConnector"</i>></p> <p><Set name=<i>"host"</i>><Property name=<i>"jetty.host"</i> /></Set></p> <p><Set name=<i>"port"</i>><Property name=<i>"jetty.port"</i> default=<i>"<b>8088</b>"</i>/></Set></p> <p><Set name=<i>"maxIdleTime"</i>>300000</Set></p> <p><Set name=<i>"Acceptors"</i>>2</Set></p> <p><Set name=<i>"statsOn"</i>>false</Set></p> <p><Set name=<i>"confidentialPort"</i>>8443</Set></p> <p><Set name=<i>"lowResourcesConnections"</i>>20000</Set></p> <p><Set name=<i>"lowResourcesMaxIdleTime"</i>>5000</Set></p> <p></New></p> <p></Arg></p> <p></Call></p> <ul> <li><b>JETTY  Service</b><b>類</b> </li> </ul> <p>package org.jetty.demo;</p> <p>import java.io.FileInputStream;</p> <p>import java.io.FileNotFoundException;</p> <p>import java.io.IOException;</p> <p>import org.apache.commons.lang.StringUtils;</p> <p>import org.eclipse.jetty.server.Server;</p> <p>import org.eclipse.jetty.server.handler.ContextHandlerCollection;</p> <p>import org.eclipse.jetty.webapp.WebAppContext;</p> <p>import org.eclipse.jetty.xml.XmlConfiguration;</p> <p>import org.xml.sax.SAXException;</p> <p>public class JettyCustomServer extends Server {</p> <p>private String xmlConfigPath;</p> <p>private String contextPath;</p> <p>private String warPath;</p> <p>private String resourceBase = "<b>./webRoot</b>";</p> <p>private String webXmlPath = <b>"./webRoot/WEB-INF/web.xml</b>";</p> <p>public JettyCustomServer(String xmlConfigPath,String contextPath,String resourceBase,String webXmlPath) {</p> <p>this(xmlConfigPath,contextPath,resourceBase,webXmlPath,null);</p> <p>}</p> <p>public JettyCustomServer(String xmlConfigPath,String contextPath) {</p> <p>this(xmlConfigPath,contextPath,null,null,null);</p> <p>}</p> <p>public JettyCustomServer(String xmlConfigPath,String contextPath,String warPath) {</p> <p>this(xmlConfigPath,contextPath,null,null,warPath);</p> <p>}</p> <p>public JettyCustomServer(String xmlConfigPath,String contextPath,String resourceBase,String webXmlPath,String warPath) {</p> <p>super();</p> <p>if(StringUtils.isNotBlank(xmlConfigPath)){</p> <p>this.xmlConfigPath = xmlConfigPath;</p> <p><b>readXmlConfig();</b></p> <p>}</p> <p>if(StringUtils.isNotBlank(warPath)){</p> <p>this.warPath = warPath;</p> <p>if(StringUtils.isNotBlank(contextPath)){</p> <p>this.contextPath = contextPath;</p> <p><b>applyHandle(true);</b></p> <p>}</p> <p>}else{</p> <p>if(StringUtils.isNotBlank(resourceBase))</p> <p>this.resourceBase = resourceBase;</p> <p>if(StringUtils.isNotBlank(webXmlPath))</p> <p>this.webXmlPath = webXmlPath;</p> <p>if(StringUtils.isNotBlank(contextPath)){</p> <p>this.contextPath = contextPath;</p> <p><b>applyHandle(false);</b></p> <p>}</p> <p>}</p> <p>}</p> <p>private void readXmlConfig(){</p> <p>try {</p> <p><b>XmlConfiguration configuration =  new XmlConfiguration(new FileInputStream(this.xmlConfigPath));</b></p> <p><b>configuration.configure(this);</b></p> <p>} catch (FileNotFoundException e1) {</p> <p>e1.printStackTrace();</p> <p>} catch (SAXException e1) {</p> <p>e1.printStackTrace();</p> <p>} catch (IOException e1) {</p> <p>e1.printStackTrace();</p> <p>} catch (Exception e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>public void applyHandle(Boolean warDeployFlag){</p> <p>ContextHandlerCollection handler = new ContextHandlerCollection(); </p> <p>WebAppContext webapp = new WebAppContext(); </p> <p><b>webapp.setContextPath(contextPath);</b></p> <p>webapp.setDefaultsDescriptor("./jetty/etc/webdefault.xml");</p> <p>if(!warDeployFlag){</p> <p><b>webapp.setResourceBase(resourceBase);</b></p> <p><b>webapp.setDescriptor(webXmlPath);  </b></p> <p>}else{</p> <p>webapp.setWar(warPath);</p> <p>}</p> <p>handler.addHandler(webapp); </p> <p>super.setHandler(handler);</p> <p>}</p> <p>public void startServer(){</p> <p>try {</p> <p>super.start();</p> <p>System.out.println("current thread:"+super.getThreadPool().getThreads()+"| idle thread:"+super.getThreadPool().getIdleThreads());</p> <p>super.join();</p> <p>} catch (Exception e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>public String getXmlConfigPath() {</p> <p>return xmlConfigPath;</p> <p>}</p> <p>public void setXmlConfigPath(String xmlConfigPath) {</p> <p>this.xmlConfigPath = xmlConfigPath;</p> <p>}</p> <p>public String getContextPath() {</p> <p>return contextPath;</p> <p>}</p> <p>public void setContextPath(String contextPath) {</p> <p>this.contextPath = contextPath;</p> <p>}</p> <p>public String getResourceBase() {</p> <p>return resourceBase;</p> <p>}</p> <p>public void setResourceBase(String resourceBase) {</p> <p>this.resourceBase = resourceBase;</p> <p>}</p> <p>public String getWebXmlPath() {</p> <p>return webXmlPath;</p> <p>}</p> <p>public void setWebXmlPath(String webXmlPath) {</p> <p>this.webXmlPath = webXmlPath;</p> <p>}</p> <p>public String getWarPath() {</p> <p>return warPath;</p> <p>}</p> <p>public void setWarPath(String warPath) {</p> <p>this.warPath = warPath;</p> <p>}</p> <p>}</p> <ul> <li><b>作一個簡單的可執行的服務啓動類</b> </li> </ul> <p><b>package</b> org.jetty.demo; </p> <p><b>public</b> <b>class</b> JettyServerStart { </p> <p><b>public</b> <b>static</b> <b>void</b> main(String[] args) {</p> <p>JettyCustomServer server = <b>new</b>JettyCustomServer("<b>.</b>/jetty/etc/jetty.xml","/testContext");</p> <p>server.startServer();</p> <p>}</p> <p>} </p> <ul> <li><b>/webRoot/</b><b>目錄下作一個JSP</b><b>測試頁面</b> </li> </ul> <p><%@ page language=<i>"java"</i> contentType=<i>"text/html; charset=GBK"</i></p> <p>pageEncoding=<i>"GBK"</i>%></p> <p><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"></p> <p><html></p> <p><head></p> <p><meta http-equiv=<i>"Content-Type"</i> content=<i>"text/html; charset=GBK"</i>></p> <p><title>Insert title here</title></p> <p></head></p> <p><body></p> <p>hello jetty! 中國!</p> <p></body></p> <p></html></p> <ul> <li><b>作一個測試Servlet</b> </li> </ul> <p><b>package</b> org.jetty.demo; </p> <p><b>import</b> java.io.IOException; </p> <p><b>import</b> javax.servlet.ServletException; </p> <p><b>import</b> javax.servlet.http.HttpServlet; </p> <p><b>import</b> javax.servlet.http.HttpServletRequest; </p> <p><b>import</b> javax.servlet.http.HttpServletResponse;</p> <p><b></b></p> <p><b>public</b> <b>class</b> HelloWorldServlet <b>extends</b> HttpServlet{ </p> <p>@Override </p> <p><b>protected</b> <b>void</b> doGet(HttpServletRequest req, HttpServletResponse resp) </p> <p><b>throws</b> ServletException, IOException { </p> <p>System.<i>out</i>.println("doGet"); </p> <p>resp.getWriter().write("hello world!"); </p> <p>resp.getWriter().close(); </p> <p>} </p> <p>@Override </p> <p><b>protected</b> <b>void</b> doPost(HttpServletRequest req, HttpServletResponse resp) </p> <p><b>throws</b> ServletException, IOException { </p> <p>System.<i>out</i>.println("doPost"); </p> <p><b>super</b>.doPost(req, resp); </p> <p>} </p> <p>}</p> <ul> <li><b>/webRoot/WEB-INF</b><b>目錄下創建一個web.xml</b> </li> </ul> <p><?xml version=<i>"1.0"</i> encoding=<i>"UTF-8"</i>?></p> <p><web-app xmlns:xsi=<i>"http://www.w3.org/2001/XMLSchema-instance"</i>xmlns=<i>"http://java.sun.com/xml/ns/javaee"</i>xmlns:web=<i>"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</i>xsi:schemaLocation=<i>"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"</i> version=<i>"3.0"</i>></p> <p><display-name></display-name></p> <p><servlet></p> <p><description>This is the description of my J2EE component</description></p> <p><display-name>This is the display name of my J2EE component</display-name></p> <p><servlet-name>HelloWorldServlet</servlet-name></p> <p><servlet-class>org.jetty.demo.HelloWorldServlet</servlet-class></p> <p></servlet></p> <p><servlet-mapping></p> <p><servlet-name>HelloWorldServlet</servlet-name></p> <p><url-pattern>/servlet/HelloWorldServlet</url-pattern></p> <p></servlet-mapping></p> <p><welcome-file-list></p> <p><welcome-file>index.jsp</welcome-file></p> <p></welcome-file-list></p> <p></web-app></p> <p><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=6151984a01014zjz&url=http://s8.sinaimg.cn/orignal/6151984agc40d54265d77"><img title="JETTY嵌入式Web容器的開發(一)---基礎開發" alt="JETTY嵌入式Web容器的開發(一)---基礎開發" src="http://s8.sinaimg.cn/middle/6151984agc40d54265d77&690" width="346" height="239" /></a></p> <ul> <li><b>啓動服務</b> </li> </ul> <p>執行JettyServerStart</p> <p>CONSOLE日誌:</p> <p>2012-06-27 15:49:35.250:INFO:oejs.Server:jetty-8.1.4.v20120524</p> <p>2012-06-27 15:49:35.484:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/testContext,file:/D:/RND/javaathome/eclipsehelio/testjetty/webRoot/}</p> <p>2012-06-27 15:49:35.484:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/testContext,file:/D:/RND/javaathome/eclipsehelio/testjetty/webRoot/}</p> <p>2012-06-27 15:49:35.703:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:<b>8088</b></p> <p>current thread:<b>30</b>| idle thread:26</p> <p><b>看紅字部分,</b><b>記得咱們在./jetty/etc/jetty.xml</b><b>文件中作的修改麼?</b></p> <p><b>測試</b></p> <p>測試訪問JSP頁面</p> <p><a href="http://localhost:8088/testContext/index.jsp">http://localhost:8088/testContext/index.jsp</a></p> <p><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=6151984a01014zjz&url=http://s8.sinaimg.cn/orignal/6151984ag7a015563df77"><img title="JETTY嵌入式Web容器的開發(一)---基礎開發" alt="JETTY嵌入式Web容器的開發(一)---基礎開發" src="http://s8.sinaimg.cn/middle/6151984ag7a015563df77&690" width="357" height="225" /></a></p> <p>測試訪問SERVLET</p> <p><a href="http://localhost:8088/testContext/servlet/HelloWorldServlet">http://localhost:8088/testContext/servlet/HelloWorldServlet</a></p> <p><a href="http://photo.blog.sina.com.cn/showpic.html#blogid=6151984a01014zjz&url=http://s8.sinaimg.cn/orignal/6151984ag7a015583e6a7"><img title="JETTY嵌入式Web容器的開發(一)---基礎開發" alt="JETTY嵌入式Web容器的開發(一)---基礎開發" src="http://s8.sinaimg.cn/middle/6151984ag7a015583e6a7&690" width="395" height="170" /></a></p>html