gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:56:40 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com