【问题标题】:How to implement a custom ViewProcessor<T> (jax-rs)?如何实现自定义 ViewProcessor<T> (jax-rs)?
【发布时间】:2011-10-28 15:33:18
【问题描述】:

查看文章here,有一个示例,说明如何使用 TemplateProcessor 使用 Jersey 解析 JSP 视图。显然这个类现在已经被弃用,取而代之的是 ViewProcessor。我对如何实现其中任何一个都有些困惑(最好是较新的,因为它没有被弃用);模板参数是什么?如何实现一个简单地解析 /WebContent/WEB-INF/views/* 中的 jsps 并评估返回视图的表达式语言?

另一个ViewProcessor article is here.

谢谢。

【问题讨论】:

    标签: java jakarta-ee jersey el jax-rs


    【解决方案1】:

    如果您想插入对新型模板的支持,则应该实现 ViewProcessor。如果您只需要 JSP 模板,那么这已经内置在 Jersey 中,您无需实现自己的 ViewProcessor。

    如果您的 JSP 文件位于 WEB-INF/views 下,那么您可以将 JSP_TEMPLATES_BASE_PATH init 参数设置为 WEB-INF/views。然后,您只需要从您的资源方法中返回一个新的 Viewable 实例(如您所指的 Paul 的博客所示)并将模板名称作为第一个参数和数据(模型)作为第二个参数传递给构造函数。然后在 JSP 中,您可以使用名为“it”的属性访问数据。

    更新:如果您的 url 模式是“/*”,它会更复杂一些。 Jersey 在委派给容器时无法解析模板,因为 Jersey servlet 屏蔽了 JSP。为了让容器能够看到 JSP,您还需要做两件事:

    1. 将 Jersey 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_REGEXinit参数添加到过滤器,并将其设置为jsp模板匹配的正则表达式(例如“/WEB-INF/views/.*”)

    如果您仍然认为出于某种原因必须实现自定义 ViewProcessor,您可以查看 freemarker 视图处理器的实现方式并从中获得启发 - 请参阅 http://java.net/projects/jersey/sources/svn/content/trunk/jersey/contribs/jersey-freemarker/src/main/java/com/sun/jersey/freemarker/FreemarkerViewProcessor.java?rev=5453

    【讨论】:

    • 我尝试添加 init 参数和调用以返回可查看的内容,但仍无法解析视图:&lt;init-param&gt; &lt;param-name&gt;com.sun.jersey.config.property.JSPTemplatesBasePath&lt;/param-name&gt; &lt;param-value&gt;WEB-INF/views&lt;/param-value&gt; &lt;/init-param&gt;return new Viewable("welcome",changeList); 以及 WEB-INF/ 中的welcome.jsp 文件意见/welcome.jsp
    • 好的。这是因为,正如文章所述,Jersey 正在以下目录中寻找模板://。即,如果返回 Viewable 的资源类是 com.acme.myproject.FooResource 并且您正在寻找“欢迎”,那么 Jersey 将尝试将其定位为 WEB-INF/views/com/acme/myproject/FooResource/welcome。 jsp。如果您的模板位于模板基本路径的根目录中,则需要在模板名称前加上斜杠 - 即 return new Viewable("/welcome", changeList);
    • 这是有道理的,不幸的是这对我也不起作用 - 我没有得到未解决的异常,但我也没有看到视图(HTTP 404)。我的 servlet url-pattern 是 /* 有关系吗?你有什么额外的想法吗?我真的很难过/沮丧。
    • 调试时我注意到的一件事是可视对象的解析类为空 - 这听起来不正确,对吧?
    • 好的,问题出在网址格式上。如果您的 url 模式是“/*”,我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2013-03-15
    • 2011-06-27
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多