jetty启动时自动创建虚拟目录

开发工具eclipse,jetty版本8.1.8

项目启动方式:JFinal.start("src/main/webapp", port, "/", 5);

主要背景是上传的文件和图片跟webroot不在一个目录下,这样在访问这些文件时必须通过虚拟目录来实现,网上很多文章都是通过修改xml配置文件放到jetty的webapps目录下,但由于是嵌入式的jetty,不知道jetty的安装目录到底在哪

我是通过修改JFinal的com.jfinal.server.JettyServer来实现的

主要修改doStart()方法,修改之前:

    private void doStart() {
        if (!available(port)) {
            throw new IllegalStateException("port: " + port + " already in use!");
        }
        
        deleteSessionData();
        
        System.out.println("Starting JFinal " + Const.JFINAL_VERSION);
        server = new Server();
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setPort(port);
        server.addConnector(connector);
        webApp = new WebAppContext();
        webApp.setThrowUnavailableOnStartupException(true);    // 在启动过程中允许抛出异常终止启动并退出 JVM
        webApp.setContextPath(context);
        webApp.setResourceBase(webAppDir);    // webApp.setWar(webAppDir);
        webApp.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
        webApp.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");    // webApp.setInitParams(Collections.singletonMap("org.mortbay.jetty.servlet.Default.useFileMappedBuffer", "false"));
        persistSession(webApp);
        
        server.setHandler(webApp);
        changeClassLoader(webApp);
        ...

修改之后(MyJettyServer.java):

    private void doStart() throws IOException {
        if (!available(port)) {
            throw new IllegalStateException("port: " + port + " already in use!");
        }
        
        deleteSessionData();
        
        System.out.println("Starting JFinal " + Const.JFINAL_VERSION);
        server = new Server();
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setPort(port);
        server.addConnector(connector);
        webApp = new WebAppContext();
        webApp.setThrowUnavailableOnStartupException(true);    // 在启动过程中允许抛出异常终止启动并退出 JVM
        webApp.setContextPath(context);
        webApp.setResourceBase(webAppDir);    // webApp.setWar(webAppDir);
        webApp.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
        webApp.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");    // webApp.setInitParams(Collections.singletonMap("org.mortbay.jetty.servlet.Default.useFileMappedBuffer", "false"));
        persistSession(webApp);
        
        //创建虚拟目录
        ResourceHandler handle = new ResourceHandler();
        handle.setResourceBase("D:\\MySpace\\uploadfiles");
        handle.setDirectoriesListed(true);
        ContextHandler context = new ContextHandler();
        context.setContextPath("/uploadfiles");
        context.setHandler(handle);
        
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { context, webApp });
        server.setHandler(handlers);
        changeClassLoader(webApp);
        ...


在项目启动的main方法中:

IServer server = new MyJettyServer("src/main/webapp", port, "/", 5);
server.start();


这样在程序调试时,每次启动Jetty,就会自动创建/uploadfiles这个虚拟目录

评论区

rirai

2018-02-05 10:38

直接修改程序吗?还是重载了原来的程序?能否写的详细些,我也碰到这个问题了。谢谢

netwild

2018-02-05 13:46

@rirai JFinal自带的JettyServer是受保护的,没办法覆盖,只能自己建个新类,实现IServer接口即可,关键代码可以参考JettyServer

kevin3061

2019-08-18 17:53

@netwild undertow服务器有没有虚拟目录映射的功能

netwild

2019-09-16 10:55

@kevin3061 没用过undertow

热门分享

扫码入社