【问题标题】:Referencing a file within Servlet在 Servlet 中引用文件
【发布时间】:2011-10-16 21:53:41
【问题描述】:

当我在我的代码中引用 DTD 文件时,我不知道如何在我的项目文件夹中引用它。例如:如果我的项目名称是Moo,我想在/Moo/WEB-INF/courses.dtd 引用DTD。

TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = null;  

try { trans = transfac.newTransformer();   }
catch (TransformerConfigurationException e) { }

trans.setOutputProperty(OutputKeys.INDENT, "yes");  
trans.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "/Moo/WEB-INF/courses.dtd");

但它没有找到它。如何参考?

我得到了一个使用getRealPath 的解决方案,问题是因为我的项目将被读取为 .war 文件,这不好。我该怎么办?

【问题讨论】:

  • 附带说明,永远不要吞下异常。如果您在示例中这样做,请仅出于简洁目的标记该方法。
  • 只是为了例子写的,实际代码中会改...

标签: java xml servlets path


【解决方案1】:

因此,您正在使用 XSLT 生成 XML 文档。您希望文档缩进 (OutputKeys.INDENT, "yes"),并且希望它包含带有 SYSTEM 引用的 DOCTYPE (OutputKeys.DOCTYPE_SYSTEM, "...")。

现在您不太可能希望将 $WebAppRoot/Moo/WEB-INF/courses.dtd 的真实路径作为 SYSTEM 引用。它不是像http://www.example.com/some/dir/courses.dtd 这样的URL 吗?当然,DTD 应该可以从那个 URL 获得。 WEB-INF 中的内容不能通过 HTTP 访问,至少不能通过 Servlet 容器。

另一方面,如果您想让文档和 DTD 仅在构建文档的服务器上可用,则按照 Nulldevice 的建议进行操作,并在 cmets 中添加警告。

【讨论】:

  • 我不明白,我究竟需要做什么才能链接到它?我不介意在Webcontent 文件夹中移动文件并将其公开,那么我该怎么做呢?
  • 首先,您应该知道要让谁可以使用 XML 文档,以及如何使用。如果您想通过 HTTP 从您的应用服务器公开提供它,那么 DTD 应该以相同的方式提供。如果文档可从 http://bla.de/xy/doc.xml 获得,DTD 可从 http://bla.de/xy/doc.dtd 获得,那么您可以使用相对 URL,因此只需 doc.dtd
【解决方案2】:

首先,不要包含“Moo”。因为 servlet 根是 WEB-INF 的上一级。 不确定 OutputKeys.DOCTYPE_SYSTEM 是否需要相对路径。绝对路径是:

String path = getServletContext().getRealPath("/WEB-INF/courses.dtd");

【讨论】:

  • 如果你的容器没有展开war文件,不要依赖getRealPath()会失败。始终使用getResourceAsStream()
  • 阅读thisthis
  • 但我不想要 InputStream 我想要一个字符串,我如何从中获取字符串?
  • @nayish:如果您需要字符串表示,请使用getRsource()download.oracle.com/javase/1,5.0/docs/api/java/lang/…。使用 CLassloader 获取文件需要您将 DTD 放在 WEB-INF/classes 下方的某个位置。
  • 这已经很老了,但是最好的课程是什么?就我而言,我有一个密钥文件(如 SSH pem 密钥),我想与我的 servlet 应用程序一起提供,我需要路径的完整字符串表示......所以我面临着类似的问题做了
【解决方案3】:

Transformer 提供URIResolver

【讨论】:

  • 实现接口,看看 Transformer 在运行时会传递给你什么。他会将SYSTEM URL 传递给您,请求您解决它。然后,您可以返回包含 DTD 的源对象。将此视为代理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2011-07-17
相关资源
最近更新 更多