0

以下是SiteBricks 用户指南中的示例:

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

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

感谢您的任何想法!

4

3 回答 3

2

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

于 2011-07-17T08:59:28.377 回答
1

可以拦截写入响应正文的内容,然后对其进行相应的装饰,并在 aFilter和 a 的帮助下修改最终的响应正文,HttpServletResponseWrapper其中至少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等,然后对下一行采取相应的措施。

于 2011-07-17T08:35:08.550 回答
1

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

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

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

对于页面嵌入等,还有一些更复杂的事情正在发生,但这就是它的要点。感谢您的客气话!

Dhanji,Sitebricks 和 Guice Servlet 的创建者。

于 2013-01-03T03:41:49.643 回答