当前位置: 首页 > 知识库问答 >
问题:

在Jetty Serverlet doGet方法中显示来自资源文件夹的静态HTML文件

危晨
2023-03-14
public static void main(String[] args){
    Server server = new Server(8080);

    ResourceHandler resource_handler = new ResourceHandler();
    resource_handler.setDirectoriesListed(true);
    resource_handler.setWelcomeFiles(new String[]{"index.html"});
    resource_handler.setResourceBase("./target/classes/webapp");

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");

    ServletHolder indexHolder = new ServletHolder(new IndexServlet());
    context.addServlet(indexHolder, "/index");

    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[]{resource_handler, context, new DefaultHandler()});
    server.setHandler(handlers);

    try {
        server.start();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

这是我当前的doget方法。print staement目前是index.html文件的字符串值,我希望servlet返回该文件。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.getWriter().print(
            "<!doctype html>\n" +
            "<html>\n" +
            "<head>\n" +
            "<meta charset=\"utf-8\">\n" +
            "<title>Form Page</title>\n" +
            "</head>\n" +
            "<body>\n" +
            "    <form id=\"jetty-form\" name=\"user-form\" method=\"post\">\n" +
            "        <label for=\"username\">Username:</label>\n" +
            "        <input type=\"text\" name=\"username\" id=\"username\">\n" +
                            "<input type=\"submit\">" +
            "    </form>\n" +
            "</body>\n" +
            "</html>");

}

共有1个答案

许琛
2023-03-14

不要同时使用ResourceHandler和ServletContextHandler。(事先回答)

完全删除ResourceHandler。

删除IndexServlet(您不需要它)。

当您从IDE运行/debug/test时,您没有使用JAR打包的静态资源,因此您的资源库确定应该足够明智,可以根据执行方式使用备用位置。(maven命令行、html" target="_blank">gradle命令行、IDE特定快速运行、IDE maven运行、IDE gradle运行等)

您的ServletContextHandler应该在其servlet树中添加DefaultServlet(这实际上是为静态资源服务的)

示例:DefaultServletFileServer.java(来自embedded-jetty-cookbook项目)

import java.net.URI;
import java.net.URL;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource;

public class DefaultServletFileServer
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8080);
        server.addConnector(connector);

        // Figure out what path to serve content from
        ClassLoader cl = DefaultServletFileServer.class.getClassLoader();
        // We look for a file, as ClassLoader.getResource() is not
        // designed to look for directories (we resolve the directory later)
        URL f = cl.getResource("static-root/hello.html");
        if (f == null)
        {
            throw new RuntimeException("Unable to find resource directory");
        }

        // Resolve file to directory
        URI webRootUri = f.toURI().resolve("./").normalize();
        System.err.println("WebRoot is " + webRootUri);

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        context.setBaseResource(Resource.newResource(webRootUri));
        server.setHandler(context);

        ServletHolder holderPwd = new ServletHolder("default",DefaultServlet.class);
        holderPwd.setInitParameter("dirAllowed","true");
        context.addServlet(holderPwd,"/");

        server.start();
        server.join();
    }
}
 类似资料:
  • 出于某种原因,我一直在GradleJavaFX项目中获得NPE。 我的文件夹结构非常基本。我在文件夹中有一个包含java文件的包。我的资源也在文件夹中。当我尝试加载它给了我一个NPE。 这是一个助手类。 从我调用:

  • 更新:我想让媒体播放器是静态的,但是如果我设置为静态的,它就不工作了。请注意,我想要mediaPlayer static的原因是我想从其他类访问它。(台词评论。)这是我的代码: 我的代码的任何其他修复将不胜感激。顺便说一下,这些是我得到的错误: 线程“Thread-0”中出现异常Java . lang . illegalstateexception:Toolkit未在com . sun . Jav

  • 资源(Asset)代表 source 文件夹中除了文章以外的所有文件,例如图片、CSS、JS 文件等。比方说,如果你的Hexo项目中只有少量图片,那最简单的方法就是将它们放在 source/images 文件夹中。然后通过类似于 ![](/images/image.jpg) 的方法访问它们。 对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组

  • 我正在使用android studio和“三星tab 2”作为我的测试设备。我想查看我的应用程序的文件。所以我点击了“监视器”按钮。然后,我从设备列表中选择了我的设备,并选择了我的应用程序包。文件资源管理器中有一个数据文件夹。但当我点击数据文件夹时,它什么也没有显示。当我使用emulator运行此应用程序时,文件资源管理器会显示数据文件夹,我可以看到应用程序中的每个文件。使用设备时,如何查看数据文

  • 我正在将图像上传到一个文件夹productImages,该文件夹不在Spring启动项目的src文件夹中。我正在存储每个图像的路径。我如何使用th: src=@{product.image}显示图像,其中product.image是数据库的路径(例如productImages/photo.jpg)。我的问题是获取文件夹的位置。

  • 我正在从主类访问资源文件夹中的文件 我收到了这个错误: 我甚至打开了jar文件,remoteUnitsIdsInOldServer.txt文件就在那里,在类内部