Как поддержка аннотаций в jsp реализована в sitebricks? - PullRequest
0 голосов
/ 17 июля 2011

Вот пример из SiteBricks руководства пользователя :

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

Мне интересно, как это реализовано?(Я имею в виду, как и в какой точке входа создателям sitebricks удалось улучшить преобразование jsp в сервлет?)

Спасибо за любые идеи!

Ответы [ 3 ]

2 голосов
/ 17 июля 2011

Вероятно, это не JSP, а собственный язык шаблонов.Каркас должен анализировать шаблон как структурированные аннотации xml +;затем он переводится в код Java, который компилируется на лету.

1 голос
/ 03 января 2013

Нет фильтра, делающего это.У нас есть своя собственная шаблонная логика, которая использует так называемый синтаксический анализатор рекурсивного спуска.

Это фактически нетривиальная задача для выполнения такого анализа аннотаций.Что мы делаем в первую очередь - это используем HTML-код в виде DOM-подобного дерева с помощью Jsoup.Jsoup заботится о нормализации HTML в XML-подобную структуру (хотя не совсем).

Затем мы спускаемся по этому дереву и строим параллельное дерево «Renderers» как объекты Java.Каждый рендерер имеет возможность делать что-то конкретное, например, выдавать HTML, показывать, если значение равно true и т. Д. Учитывая, что дерево рендеринга соответствует дереву HTML, если ShowIf возвращает false, мы также исключаем всю ветвь под ним.

Есть несколько более сложных вещей для встраивания страниц и так далее, но это суть этого.Спасибо за добрые слова!

Данджи, создатель Sitebricks & Guice Servlet.

1 голос
/ 17 июля 2011

Можно перехватить то, что было записано в теле ответа, а затем соответствующим образом декорировать его и изменить тело окончательного ответа с помощью Filter и HttpServletResponseWrapper где, по крайней мере, getWriter() был переопределен, чтобы он возвращал пользовательскую реализацию.

1010 * Е.Г. *

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 и т. Д., И затем предпринимать соответствующие действия для следующих строк.

...