【问题标题】:How is annotations support in jsp implemented in sitebricks?jsp中的注释支持如何在sitebricks中实现?
【发布时间】:2011-07-17 08:26:53
【问题描述】:

这是来自SiteBricks user guide 的示例:

<html>
<body>
    @ShowIf(true)     <----- I'm impressed with this line
    <p>${message} from Sitebricks!</p>
</body>
</html>

我很好奇它是如何实现的? (我的意思是,sitebricks 创建者如何以及在哪个入口点设法增强了将 jsp 转换为 servlet 的能力?)

感谢您的任何想法!

【问题讨论】:

    标签: java jsp servlets sitebricks


    【解决方案1】:

    它可能不是 JSP,而是它自己的模板语言。框架必须将模板解析为结构化的xml+注解;然后将其翻译成 java 代码,并即时编译。

    【讨论】:

      【解决方案2】:

      没有过滤器这样做。我们有自己的模板逻辑,使用所谓的递归下降解析器。

      要完成这种注解解析,其实是个不小的问题。我们首先要做的是使用 Jsoup 将整个 HTML 转换为类似 DOM 的树。 Jsoup 负责将 HTML 规范化为类似 XML 的结构(虽然不完全如此)。

      然后我们沿着这棵树下降并构建一个并行的“渲染器”树作为 Java 对象。每个渲染器都有能力做一些特定的事情,即吐出 HTML、Show If value is true 等。鉴于渲染器树与 HTML 树匹配,如果 ShowIf 返回 false,我们也会删除它下面的整个分支。

      对于页面嵌入等,有一些更复杂的事情在幕后发生,但这就是它的要点。谢谢你的好话!

      Dhanji,Sitebricks 和 Guice Servlet 的创建者。

      【讨论】:

        【解决方案3】:

        可以拦截写入响应正文的内容,然后对其进行相应的装饰,并借助FilterHttpServletResponseWrapper 修改最终响应正文,其中至少getWriter() 被覆盖,以便它返回一个自定义实现。

        例如

        chain.doFilter(request, new FooResponse((HttpServletResponse) response));
        

        public class FooResponse extends HttpServletResponseWrapper {
        
            public FooResponse(HttpServletResponse response) {
                super(response);
            }
        
            public Writer getWriter() throws IOException {
                // ... Here a custom one is returned.
            }
        
        }
        

        例如,该作者将逐行缓冲响应,解析写入的字符,扫描包含字符 @Foo 的行等,然后对下一行采取相应的措施。

        【讨论】:

        • 谢谢!这是个好主意(尽管实现可能有点复杂)。
        猜你喜欢
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        相关资源
        最近更新 更多