开发工具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这个虚拟目录