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