我有一个包含图像,css等的jar库。 这个罐子基于maven项目。所有文件都放在src / main / resources / web目录中。
将jar放在Tomcat 5.5的shared / lib中,以便与所有Web应用程序共享。
现在,在标准的Web应用程序中,如何访问css(例如)到JSP页面的样式表链接?
谢谢。
nota:使用Zk框架,我们可以使用简单的linke访问,即"〜。/ web / css / header.css"但它不适用于JSP:(
答案 0 :(得分:3)
您可以但需要一些手动编码,因为默认的servlet(容器/ tomcat /提供静态资源的一部分)对您的jar知之甚少。你需要
我实现了简单的原型,它只处理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,这是我的战争的一部分。容易,不是吗?
答案 1 :(得分:0)
问题是我在调用XMLReader的parse方法方面走得太远了。 parse方法接受一个InputSource,因此没有理由使用FileReader。将上面代码的最后一行更改为
xr.parse( new InputSource( filename ));
另一个示例代码:有时通过Java Web Start或任何其他方式将应用程序分发到jar文件中很有用。因此,您可能必须从jar中读取一些资源(图像或属性文件)。你怎么能这样做 ?这很简单,这是一个检索图像的例子:
ImageIcon image = (new ImageIcon(getClass().getResource("yourpackage/mypackage/image.gif")));
通常,您可以通过以下方式检索InputStream:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml");