将Jetty做为内嵌的服务器使用
将jetty做为内嵌的服务器使用
Jetty的优良特点在于,它可以嵌入到任意的java程序中。并且使用jetty可以快速的开发自己的应用服务器。
1、准备开发嵌入式的jetty服务器jar包
//以下这些包,在jetty_home\lib目录下都可以找到:
jetty-continuation-
jetty-http-
jetty-io-
jetty-security-
jetty-server-
jetty-servlet-
jetty-util-
jetty-webapp-
jetty-xml-
//以下是Servlet项目所需要的包,在tomcat_home\lib的安装目录下都可以找到
servlet-api-2.5.jar
jsp-api.jar
jasper.jar
jasper-el.jar
el-api.jar
ecj-
//以下在tomcat_home\bin目录下可以找到,虽然它是以tomcat命名,但它是一个公共包,主要是用于服务器的日志输出
tomcat-juli.jar
2、书写第一个jetty服务器
以下代码,创建了一个jetty服务器,并发布了一两个Servlet。且设置支持Session。
import org.eclipse.jetty.server.Server; //此类是jetty的服务器类,用于指定绑定的服务器和端口。
import org.eclipse.jetty.server.SessionManager; //此类用于管理服务器的Session
import org.eclipse.jetty.server.session.HashSessionManager; //此类是SessionManager的子类,用hash算法生成Session
import org.eclipse.jetty.server.session.SessionHandler; //此类用于将SessionManager注册到服务器
import org.eclipse.jetty.servlet.ServletContextHandler; //此类用于管理Servlet,可以管理多个Servlet.
import org.eclipse.jetty.servlet.ServletHolder; //此类用于将Servlet注册到服务器
import org.eclipse.jetty.webapp.WebAppContext; //此类,可以用于加载任意一个JavaEE项目。后面会用到
以下是访问内部的代码,类名请你自己添加:
@Test
public void jettyServer2() throws Exception{
Server server = new Server(9090);//声明服务器
ServletContextHandler hand = new ServletContextHandler();//声明ServletContextHandler
hand.addServlet(new ServletHolder(new HttpServlet() { //分别添加两个Servlet
public void doGet(HttpServletRequest req,
HttpServletResponse response) throws ServletException,
IOException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>Hello World第二个</h1>");
HttpSession s = req.getSession();
String name = (String) s.getAttribute("name");
response.getWriter().println("<h1>Session is:</h1>"+s+","+name);
response.getWriter().print("<br/>"+this.getServletContext().getRealPath("/"));
}
}), "/a");
hand.addServlet(new ServletHolder(new HttpServlet() {
public void doGet(HttpServletRequest req,
HttpServletResponse response) throws ServletException,
IOException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>Hello World第一个</h1>");
HttpSession s = req.getSession();
s.setAttribute("name", "Jack");
response.getWriter().print("<br/><a href='a'>去第二个</a>");
}
}), "/");
//设置内嵌的jetty支持session.默认情况下不支持session
SessionManager sm = new HashSessionManager();
hand.setSessionHandler(new SessionHandler(sm));
server.setHandler(hand);//设置
server.start();//启动
server.join();
}
3、使用jetty的管理器管理一个完整的JavaEE应用
Jetty可以非常方便的管理一个JavaEE应用程序。关键点就在于使用WebAppContext来发布一个JavaEE应用:
/**
* 指定一个现有的项目发布,方式一。
* 以下情况下,默认支持容器的所有对象如:
* request,session,application,等
*/
public static void main(String[] args) throws Exception {
String webapp = "D:\\programfiles\\MyEclipse10\\wk3\\day04\\WebRoot";//声明项目所在的目录
Server server = new Server(80); //声明端口
WebAppContext context = new WebAppContext(); //声明上下文对象
context.setDescriptor(webapp + "/WEB-INF/web.xml"); //指定web.xml文件,可选
context.setResourceBase(webapp); //设置项目路径
context.setContextPath("/"); //设置上下文根,可以任意的值
server.setHandler(context); //设置句柄
server.start(); //启动
server.join();
}
也可以使用以下方式发布:
/**
* 指定一个现有的项目发布,方式二
* @throws Exception
*/
@Test
public void jettyServer() throws Exception{
String webapp = "D:\\programfiles\\MyEclipse10\\wk3\\day04\\WebRoot";
Server server = new Server(80);
WebAppContext context = new WebAppContext(webapp,"/abc");
server.setHandler(context);
server.start();
server.join();
}