我们是否会有这样的烦恼,在PC应用中需要开放HTTP接口供浏览器访问,自己实现HTTP协议很麻烦,使用如Tomcat的Web容器又感觉小题大做,那么jetty就是一个不错的选择,jetty既可以独立作为Web容器运行,又可以直接嵌入我们的应用,可以快速的构建出应用内的服务。
Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
使用jetty,我们需要添加相关的包,使用maven可以方便我们组织包,我们只需要在maven中添加:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>7.6.11.v20130520</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>7.6.11.v20130520</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>7.6.11.v20130520</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
上面的配置我们可以按需配置,如果我们需要使用Servlet,则需要添加jetty-servlet,如果需要使用war程序,则需要添加jetty-webapp,需要注意的是,如果war中包含jsp,我们还需要jsp相关的包,详情可访问:http://www.eclipse.org/jetty/documentation/current/framework-jetty-osgi.html#_using_jsps。
添加完所需包后,直接上测试代码:
package com.jianggujin.jetty;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.IPAccessHandler;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.Test;
public class JettyServer
{
private final int SERVER_PORT = 80;
public Handler initResourceHandler()
{
ResourceHandler handler = new ResourceHandler();
handler.setResourceBase("web");
handler.setWelcomeFiles(new String[] { "welcom.html" });
return handler;
}
public Handler initIPAccessHandler()
{
IPAccessHandler handler = new IPAccessHandler();
handler.addBlack("127.0.0.1");
handler.setHandler(initResourceHandler());
return handler;
}
public Handler initRequestLogHandler()
{
RequestLogHandler handler = new RequestLogHandler();
NCSARequestLog requestLog = new NCSARequestLog("web/log.txt");
handler.setRequestLog(requestLog);
handler.setHandler(initResourceHandler());
return handler;
}
public Handler initContextHandler()
{
ContextHandler handler = new ContextHandler("/context");
handler.setHandler(initResourceHandler());
return handler;
}
public Handler initServletHandler()
{
ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(new ServletHolder(new MyServlet()), "/*");
return handler;
}
public Handler initServletContextHandler()
{
ServletContextHandler handler = new ServletContextHandler();
handler.addServlet(new ServletHolder(new MyServlet()), "/*");
return handler;
}
public Handler initWebAppContext()
{
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar("web/test.war");
return webapp;
}
@Test
public void server()
{
Server server = new Server(SERVER_PORT);
try
{
server.setHandler(initWebAppContext());
server.start();
server.join();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public class MyServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>MyServlet</h1>");
}
}
}
测试的时候,我们可以更换server()测试方法中使用的handler来查看不同handler的效果。