eclipse 项目中嵌入jetty

Jetty是一个提供HHTP服务器、HTTP客户端和javax.servlet容器的开源项目,Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler。

  最近工作中需要在项目中集成jetty,由于之前从来没有用过jeety,所以耗费了我多半天的时间去学习,基本实现了jetty嵌入集成,我自己搭建了一个简单的springMvc框架,简单实现了controller请求跳转jsp页面的小功能,这里springMvc的创建就不在这里叙述了。不会的可以去网上上查找资料。项目结构如下:

  

 

  首先在项目中导入相应的jar包,如下:

     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.jar

  其次创建一个入口方法用于启动 jetty,代码如下:

复制代码
/**
 * 以内置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 服务。

 

 浏览器打开地址: