您可以,但您需要一些手动编码,因为默认的 servlet(容器 /tomcat/ 的一部分,提供静态资源)对您的 jar 一无所知。你需要
- 实现您自己的可从类路径读取数据的 servlet
- 将其映射到某个 URL
- 在 JSP 中使用带有一些参数/路径来标识请求文件的 URL
我实现了简单的原型,它只处理 CSS 文件,并且不涵盖任何极端情况。但它有效,您可以根据需要对其进行扩展:
Servlet 很简单,它只是在其映射后面加入部分或 URL,并从类路径(例如 jar)加载资源:
package cz.literak.demo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
public class JarServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String path = request.getPathInfo();
setContentType(path, response);
InputStream streamIn = null;
try {
streamIn = getClass().getResourceAsStream(path);
PrintWriter writer = response.getWriter();
int c;
while ((c = streamIn.read()) != -1) {
writer.write(c);
}
} catch (IOException e) {
streamIn.close();
}
}
private void setContentType(String path, HttpServletResponse response) {
if (path.toLowerCase().endsWith(".css")) {
response.setContentType("text/css");
}
// TODO other mime types
}
}
您需要注册 servlet 及其映射:
<servlet>
<servlet-name>JarDefault</servlet-name>
<servlet-class>cz.literak.demo.JarServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JarDefault</servlet-name>
<url-pattern>/jar/*</url-pattern>
</servlet-mapping>
你可以这样使用它:
<link rel="stylesheet" type="text/css" href="jar/styles/layout.css"/>
我在一个 jar 中的目录样式下复制了文件 layout.css,这是我的战争的一部分。很简单,不是吗?