java - 在 servlet 响应中正确写入 HTML 页面

标签 java html servlets jetty embedded-jetty

我在 http://ip:8080/simple 下部署了一个 servlet
该 servlet 在 a.b.c
包下 我在 a.b.resources 中有一个名为 Test.html 的 html 页面。

html 有一个用于图像的 img 标签。

在我做的servlet中:

htmlFile = MyServlet.class.getResourceAsStream("/a/b/resources/Test.html");
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
byte[] bytes=new byte[htmlFile.available()];
htmlFile.read(bytes);
resp.setContentLength(bytes.length);
writer.print(new String(bytes));
writer.flush();
writer.close();

html 页面出现在浏览器上,但在图像的位置我看到了它的 alt 描述。
我试过:

<img alt="Company A" src="./CompanyLogo.jpg">

<img alt="Company A" src="/a/b/resources/CompanyLogo.jpg">

<img alt="Company A" src="CompanyLogo.jpg">

但这些都不起作用。
jpg 图像在/a/b/c/resources 下,即与 HTML 页面在同一目录中。
我正在使用嵌入式 Jetty。

我在这里搞砸了什么?

最佳答案

浏览器正在尝试解析那些与当前请求 URI 相关的资源(如您在浏览器地址栏中所见)。这些资源当然不存在于您的公共(public) Web 内容中,因为您似乎已将它们放在类路径中。

为了解决这个问题,您确实需要解析 HTML 并更改所有域相关的src和/或 href <a> 的属性, <img> , <base> , <link> , <script> , <iframe>等元素,让它们指向一个 servlet,该 servlet 将这些资源从类路径流式传输到 HTTP 响应。

这有点工作,但是Jsoup让它变得容易。这是一个示例,假设您的 servlet 映射到 /proxy/* 的 URL 模式上.

String proxyURL = request.getContextPath() + "/proxy/";
InputStream input = MyServlet.class.getResourceAsStream("/a/b/resources" + request.getPathInfo());

if (request.getRequestURI().endsWith(".html")) { // A HTML page is been requested.
    Document document = Jsoup.parse(input, "UTF-8", null);

    for (Element element : document.select("[href]")) {
        element.attr("href", proxyURL + element.attr("href"));
    }

    for (Element element : document.select("[src]")) {
        element.attr("src", proxyURL + element.attr("src"));
    }

    response.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(document.html());
}
else { // Other resources like images, etc which have been proxied to this servlet.
    response.setContentType(getServletContext().getMimeType(request.getPathInfo()));
    OutputStream output = response.getOutputStream();
    byte[] buffer = new byte[8192];

    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
}

input.close();

通过 http://yourdomain:yourport/contextname/proxy/test.html 打开它.

关于java - 在 servlet 响应中正确写入 HTML 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7380468/

相关文章:

javascript - 我可以在表单提交时调用 php 文件,并从中调用或回显 JS 函数吗?

java - 无效的流 header : 2C6D0005 - StreamCorruptedException

java - session 超时后如何重定向到指定页面

java - 是否有用于应用程序级(而非数据库)事务(例如回滚)的框架

java - 暴力破解的排列

java - JVM 堆栈、堆和线程如何映射到物理内存或操作系统

javascript - jQuery 正则表达式检查用户输入的数字

javascript - 如何在左侧制作垂直滚动条,水平滚动条应该从底部的左侧开始

java - 将图像从 Android 应用程序存储到数据存储/谷歌云存储的最佳方式是什么?

java - 使用父类(super class)作为参数的类反射查找方法