2010-05-28 46 views
0

我对servlet非常陌生。我想提供一些静态文件,一些CSS和一些JavaScript。这是我走到这一步:关于从Servlet中提供静态文件的问题

在web.xml:

<servlet> 
    <description></description> 
    <display-name>StaticServlet</display-name> 
    <servlet-name>StaticServlet</servlet-name> 
    <servlet-class>StaticServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>StaticServlet</servlet-name> 
    <url-pattern>/static/*</url-pattern> 
</servlet-mapping> 

我假设在StaticServlet我有request.getPathInfo工作,看是什么要求,得到一个MIME类型,阅读将文件&写入客户端。

如果这不是一种可行的做法,或者不是一种可行的做法,请建议一种更好的方法。 我不太确定在哪里放置static目录,因为如果我尝试打印new File(".")它会给我我的Eclipse安装目录。 有没有办法找出项目的目录?

回答

2

您不需要通过servlet提供静态内容,servlet容器可以直接从war文件提供这个服务。

您只需要一个servlet就可以做到这一点,如果您想将原始项目作为模板使用,那么您需要在将程序返回到客户端浏览器之前进行编程操作。

+0

在哪里可以找到战争文件?我目前正在从eclipse运行该项目,并且找不到它。 – Geo 2010-05-28 16:10:19

+1

通常,如果您直接从Eclipse运行项目,则不会创建实际的.war文件,但这并不重要,您的servlet容器仍应提供WebContent目录下的任何文件。这假定你没有一个servlet映射覆盖文件的路径。如果您从web.xml中删除所有servlet并直接在WebContent目录中放置test.html并重新启动服务器,则应该可以通过导航到http:// localhost:8080/{web-root}/test.html – 2010-05-28 16:24:23

+0

谢谢麦克!这就是诀窍! – Geo 2010-05-28 16:39:39

2

如果你想提供静态文件,你可以将它们包含在WAR中。无论什么不由Servlet处理,默认情况下都会在战争的根目录中查找。

5

你确实可以让servletcontainer的DefaultServlet来处理这个问题。

要回答你的实际问题,即使它只是为了学习的目的,你可以使用ServletContext#getRealPath()一个相对网络路径转换为绝对的本地磁盘文件系统。

String relativeWebPath = "/static/file.ext"; 
String absoluteFilePath = getServletContext().getRealPath(relativeWebPath); 
File file = new File (absoluteFilePath); 
// ...