2011-07-31 48 views
3

當我在我的代碼中引用一個DTD文件時,我不知道如何在我的項目文件夾中引用它。例如:如果我的項目名稱是Moo,我想參考DTD /Moo/WEB-INF/courses.dtd在Servlet中引用一個文件

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文件讀取,這是不好的。我該怎麼辦?

+1

作爲一個方面說明,永遠不要吞下異常。如果您在示例中這樣做,請僅爲了簡潔起見而標記該方法。 –

+1

它只是爲例子寫的,將在實際代碼中更改... – Nayish

回答

2

首先,不要包含「Moo」。對於servlet根來說,它是WEB-INF的一個級別。 不確定OutputKeys.DOCTYPE_SYSTEM是否需要相對路徑。絕對路徑爲:

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

如果你的容器不擴展war文件,不要依賴'getRealPath()'將會失敗。始終使用['getResourceAsStream()'](http://download.oracle.com/docs/cd/E17802_01/products/products/servlet/2.3/javadoc/javax/servlet/ServletContext.html#getResourceAsStream%28java.lang。字符串%29)。 –

+0

閱讀[this](http://download.oracle.com/docs/cd/E17802_01/products/products/servlet/2.3/javadoc/javax/servlet/ServletContext.html#getRealPath%28java.lang.String%29)和[this](http://stackoverflow.com/questions/3137565/how-do-i-access-file-in-web-inf-in-jsp/3137691#3137691)。 –

+0

但我不想要一個InputStream我想要一個字符串,我如何從這個字符串? – Nayish

0

向提供URIResolver

+0

你能詳細說明嗎? – Nayish

+0

實現接口並查看Transformer在運行時將傳遞給您的內容。他會向你傳遞'SYSTEM' URL,請求你解決它。然後您可以返回包含DTD的源對象。 將此視爲代理。 –

1

因此,您正在使用XSLT生成XML文檔。您希望文檔縮進(OutputKeys.INDENT, "yes"),並且您希望它包含帶有SYSTEM引用(OutputKeys.DOCTYPE_SYSTEM, "...")的DOCTYPE。

現在,您不希望將$WebAppRoot/Moo/WEB-INF/courses.dtd的實際路徑作爲SYSTEM參考。難道它不是一個URL,就像http://www.example.com/some/dir/courses.dtd?當然,DTD應該可以從該URL獲得。無法通過HTTP訪問WEB-INF中的內容,至少不能通過Servlet容器訪問。

另一方面,如果您想讓文檔和DTD僅在構建文檔的服務器上可用,請按照Nulldevice的建議繼續操作,並在註釋中添加警告。

+0

我不明白,我需要做什麼才能鏈接到它?我不介意在'Webcontent'文件夾中移動文件並將其公開,那麼我該怎麼做呢? – Nayish

+0

首先,您應該知道您想讓哪些XML文檔可用,以及如何進行操作。如果你想通過你的應用服務器的HTTP公開提供它,那麼應該以相同的方式提供DTD。如果文檔可從'http:// bla.de/xy/doc.xml'獲得,並且來自'http:// bla.de/xy/doc.dtd'的DTD可用,那麼您可以使用相對URL只是'doc.dtd'。 – Lumi

相關問題