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