2011-10-28 31 views
1

查看文章here,有一個如何使用TemplateProcessor來使用Jersey解析JSP視圖的示例。顯然這個類已經被棄用了,並被ViewProcessor <T>取代。我對於如何實現(最好是較新的,因爲它不被棄用)有些困惑;作爲模板參數的內容是什麼?我如何實現一個簡單的解析/ WebContent/WEB-INF/views/*中的jsps,並評估返回視圖的表達式語言?如何實現自定義ViewProcessor <T>(jax-rs)?

其他ViewProcessor article is here.

感謝。

回答

3

如果您想插入對新類型模板的支持,則應該實現ViewProcessor。如果您只需要JSP模板,那麼這已經內置到Jersey中,並且您不需要實現自己的ViewProcessor。

如果您的JSP文件位於WEB-INF/views下,那麼您可以將JSP_TEMPLATES_BASE_PATH init參數設置爲WEB-INF/views。然後你只需要從你的資源方法返回一個新的Viewable實例(如你所指的Paul的博客所示),並將模板名稱作爲第一個參數並將數據(模型)作爲第二個參數傳遞給構造函數。然後在JSP中,您可以使用名爲「it」的屬性訪問數據。

更新:如果你的url-pattern是「/ *」,它會更復雜一點。 Jersey委託給容器時無法解析模板,因爲Jersey servlet正在屏蔽JSP。爲了能夠爲容器看到JSP時,您需要做兩兩件事:

  1. 註冊澤西servlet作爲一個過濾器,而不是一個servlet(簡單地通過過濾器在web.xml取代的servlet的出現) - 看到這樣的javadoc頁面的底部:http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/spi/container/servlet/package-summary.html
  2. 添加PROPERTY_WEB_PAGE_CONTENT_REGEX初始參數的過濾器,並將其設置爲正則表達式的JSP模板匹配(例如,「/WEB-INF/views/.*」)

如果您仍然相信您由於某種原因必須實現自定義ViewProcessor,那麼您可以查看自由標記視圖的過程SSOR實現並獲得通過的啓發 - 看到http://java.net/projects/jersey/sources/svn/content/trunk/jersey/contribs/jersey-freemarker/src/main/java/com/sun/jersey/freemarker/FreemarkerViewProcessor.java?rev=5453

+0

我嘗試添加的初始參數和調用返回一個可見的,但認爲仍不能得到解決: ' ​​com.sun.jersey.config .property.JSPTemplatesBasePath WEB-INF /觀點 ' 和 '返回新可見( 「歡迎」,變更);' 並且以文件的welcome.jsp WEB- INF/views/welcome.jsp – Blaskovicz

+0

好的。這是因爲,正如文章所述,Jersey正在尋找以下目錄中的模板:/ /。也就是說,如果返回Viewable的資源類是com.acme.myproject.FooResource,並且您正在尋找「welcome」,那麼Jersey將嘗試將其定位爲WEB-INF/views/com/acme/myproject/FooResource/welcome。 JSP。如果您的模板位於模板基本路徑的根目錄中,則需要在模板名稱前加斜槓 - 即'return new Viewable(「/ welcome」,changeList);' –

+0

這很有道理,不幸的是,它不適用於我要麼 - 我沒有得到一個無法解析的異常,但我沒有看到任何視圖(HTTP 404)。我的servlet url-pattern是/ *是否重要?你有什麼額外的想法嗎?我真的很難過/沮喪。 – Blaskovicz