将Jetty做为内嵌的服务器使用

wangjianme 12年前

jetty做为内嵌的服务器使用

       Jetty的优良特点在于,它可以嵌入到任意的java程序中。并且使用jetty可以快速的开发自己的应用服务器。

1、准备开发嵌入式的jetty服务器jar

//以下这些包,在jetty_home\lib目录下都可以找到:

jetty-continuation-7.6.2.v20120308.jar

jetty-http-7.6.2.v20120308.jar

jetty-io-7.6.2.v20120308.jar

jetty-security-7.6.2.v20120308.jar

jetty-server-7.6.2.v20120308.jar

jetty-servlet-7.6.2.v20120308.jar

jetty-util-7.6.2.v20120308.jar

jetty-webapp-7.6.2.v20120308.jar

jetty-xml-7.6.2.v20120308.jar

//以下是Servlet项目所需要的包,在tomcat_home\lib的安装目录下都可以找到

servlet-api-2.5.jar

jsp-api.jar

jasper.jar

jasper-el.jar

el-api.jar

ecj-3.7.1.jar   (此包非常重要是在Eclipse环境下编译JSP文件、Servlet文件用的)

//以下在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();

    }