<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1944741812972729020</id><updated>2011-09-28T20:15:59.628+04:00</updated><category term='mvc'/><category term='filters'/><category term='compressing'/><category term='hibernate'/><category term='beans'/><category term='reflection'/><category term='transactions'/><category term='css'/><category term='java'/><category term='ie6'/><category term='tiles'/><category term='spring'/><category term='contexts'/><category term='templating'/><category term='cdi'/><category term='верстка'/><title type='text'>Development logger</title><subtitle type='html'>О разработке в деталях и в общем...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.devlogg.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-8155697879182011428</id><published>2011-08-19T12:06:00.000+04:00</published><updated>2011-08-19T16:22:03.890+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='transactions'/><category scheme='http://www.blogger.com/atom/ns#' term='filters'/><category scheme='http://www.blogger.com/atom/ns#' term='contexts'/><category scheme='http://www.blogger.com/atom/ns#' term='beans'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Несколько особенностей контекстов Spring MVC или история о невнимательности</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Так уж получилось, что последний год я работаю на проектом, который построен с использованием фреймворка Spring MVC. Сейчас я совсем от этого не в восторге, год назад было еще терпимо, а два года назад я даже не видел достойных конкурентов для быстрой и архитектурно правильной разработки. С выходом третьей версии, конечно, стало гораздо&amp;nbsp;комфортнее&amp;nbsp;работать, конфигурировать, но сейчас существуют куда более эффективные и стандартизированные решения. Но сейчас не о них,будем считать эту статью очередной ретроспективой.&lt;br /&gt;&lt;br /&gt;Так получилось, что занимаясь конфигурацией (по старой привычке в основном на уровне xml) я не особо задумывался о том, как Spring MVC организует работу с контекстами, а оказалось, что это весьма интересно и понимание этой работы могло бы избавить меня от ряда нудных ошибок...&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Контекст задачи&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Исторически сложилось, что текущий проект целиком поднимался с разворачиванием самого обычного DispatcherServlet:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" style="font-family: monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Spring MVC Dispatcher Servlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.web.servlet.DispatcherServlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;init-param&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;param-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;contextConfigLocation&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/param-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;param-value&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/WEB-INF/spring/*.xml&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/param-value&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/init-param&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;load-on-startup&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/load-on-startup&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Spring MVC Dispatcher Servlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;*.do&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Все было очень просто, все наши репозитории, компоненты, контроллеры, сервисы (&lt;b&gt;@Repository, @Component, @Controller, @Service&lt;/b&gt;) поднимались в одном контексте. Из параметра contextConfigLocation также понятно, что каши не было и различные конфигурации были разнесены по разным файлам.&lt;br /&gt;&lt;br /&gt;Все было хорошо до тех пор пока неожиданно не понадобилось сделать самый обычный фильтр, который должен был иметь доступ к сессионному бину. Понятно, что сам бин находится под управлением Spring и чтобы получить к нему доступ из фильтра нужно получить контекст диспетчера, из этого контекста получить уже существующий Resolver, а уже из него получить конкретный бин.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Реальность&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;При оценке задачи все казалось очень просто, но на практике получить контекст диспетчера в обычном фильтре (который не находится под управлением Spring) можно только кривым путем через копание в сессии и обладая сакральными знаниями о имени диспетчера в web.xml. Этот кривой путь был сразу отвергнут. Как самый наивный я решил просто передать фильтр под управление Spring, сделать это очень легко через предоставляемый прокси фильтр:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" style="font-family: monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ExampleFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ExampleFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/*&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Что будет происходить за кулисами при разворачивании этого фильтра? Благодаря такому проксированию наш реальный фильтр будет находится прод управлением Spring, только теперь наш настоящий фильтр должен подниматься в контексте Spring, что я и сделал указав в фильтре аннотацию @Component("ExampleFilter"), собственно по имени компонента произойдет состыковка DelegatingFilterProxy с нашим реальным фильтром:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" style="font-family: monospace;"&gt;...&lt;br /&gt;@&lt;span style="color: #003399;"&gt;Component&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"ExampleFilter"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;class&lt;/span&gt; ExampleFilter &lt;span style="color: black; font-weight: bold;"&gt;implements&lt;/span&gt; Filter &lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;После таких простых манипуляций фильтр становиться полноценным spring-овым бином, в котором можно использовать инжектинг (&lt;b&gt;@Autowired&lt;/b&gt;), автоматическое чтение из файлов настроек и т.д. Но в моем случае такого не произошло и не могло произойти...&lt;br /&gt;&lt;br /&gt;Увлекшись самой идеей перенести фильтры под управление Spring я совершенно забыл учесть, что в тот момент, когда Spring связать мой новенький фильтр через прокси, то его попросту нет. Что это значит? Дело в том, что при выше приведенной конфигурации все компоненты поднимаются в контексте самого диспетчера. Напомню, что диспетчеры порождают свой дочерний контекст от корневого контекста приложения, который в данном случае пуст. Когда связывается сам фильтр, то необходимый компонент ищется, конечно, в корневом контексте, ведь о контексте диспетчера фильтр ничего не знает и не должен знать.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Решение&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Самым простым и идеологически правильным&amp;nbsp;решением&amp;nbsp;будет разбиение всей конфигурации на два контекста - корневой и контекст диспетчера. В корневом контексте будем разворачивать компоненты, репозитории, сервисы, которые важны для логики всего приложения, а в контексте диспетчера только сами контроллеры, как репрезентативную часть и компоненты и сервисы, которые могут использоваться, только на уровне контроллера (например, каптча). Организуется это примерно следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" style="font-family: monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;listener&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;listener-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.web.context.ContextLoaderListener&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/listener-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/listener&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;context-param&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;param-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;contextConfigLocation&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/param-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;param-value&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/WEB-INF/spring/root/*.xml&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/param-value&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/context-param&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ExampleFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ExampleFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/*&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/filter-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Spring MVC Dispatcher Servlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.web.servlet.DispatcherServlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-class&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;init-param&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;param-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;contextConfigLocation&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/param-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;         &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;param-value&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/WEB-INF/spring/dispatcher/*.xml&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/param-value&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/init-param&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;load-on-startup&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/load-on-startup&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Spring MVC Dispatcher Servlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-name&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;*.do&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/url-pattern&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/servlet-mapping&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;После такого разбиения все глобальные конфигурации будет браться из конфигов&lt;b&gt; /WEB-INF/spring/root/&lt;/b&gt;, а все конфигурации уровня диспетчера из конфигов&lt;b&gt; /WEB-INF/spring/dispatcher/&lt;/b&gt;. Стоит обратить внимание, что существует проблема двойной инициализации (вполне возможно, что это уже исправили, но когда-то эта проблема доставляла головной боли), которую нужно контролировать. Поэтому убираем разворачивание контроллеров из корневого контекста и переносим их в контекст диспетчера:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" style="font-family: monospace;"&gt;&lt;span style="color: grey; font-style: italic;"&gt;&amp;lt;!-- In ROOT context --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;context:component-scan&lt;/span&gt; &lt;span style="color: #000066;"&gt;base-package&lt;/span&gt;=&lt;span style="color: red;"&gt;"your.package.mvc"&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;context:exclude-filter&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: red;"&gt;"annotation"&lt;/span&gt; &lt;span style="color: #000066;"&gt;expression&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.stereotype.Controller"&lt;/span&gt;&lt;span style="color: black; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/context:component-scan&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span style="color: grey; font-style: italic;"&gt;&amp;lt;!-- In dispatcher context --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;context:component-scan&lt;/span&gt; &lt;span style="color: #000066;"&gt;base-package&lt;/span&gt;=&lt;span style="color: red;"&gt;"your.package.mvc"&lt;/span&gt; &lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;context:include-filter&lt;/span&gt; &lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: red;"&gt;"annotation"&lt;/span&gt; &lt;span style="color: #000066;"&gt;expression&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.stereotype.Controller"&lt;/span&gt;&lt;span style="color: black; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black; font-weight: bold;"&gt;&amp;lt;/context:component-scan&lt;span style="color: black; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;После таких манипуляций получится следующее:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Элементы приложения будут логически разбиты и отделены от репрезентативной части&lt;/li&gt;&lt;li&gt;Уровень контроллер будет иметь свой контекст для различных обвесов (например, каптча)&lt;/li&gt;&lt;li&gt;Под управление Spring-ом попадают фильтры со всеми отсюда вытекающими.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Необходимо так же помнить, что существует еще инструкция&amp;nbsp;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;b&gt;&amp;lt;mvc:annotation-driven/&amp;gt;, &lt;/b&gt;про которую не стоит забывать.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Тонкости решения&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В описанной истории опустилось, что в проекте так же использовался фреймворк Hibernate, с которым тоже произошел сюрприз...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Каково же было мое удивление, когда после все моих изменений и попытки обратиться к своему контроллеру я получил следующее исключение:&amp;nbsp;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional &amp;nbsp;one here at... &lt;/b&gt;Думаю любой разработчик рано или поздно сталкивался таким исключением&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Понятно, что дело оказалось в том, что по каким-то причинам перестала открываться транзакция в цепочке контроллер-репозиторий. В данном конкретном проекте управление транзакциями было организованно классически: &lt;b&gt;DataSource-SessionFactory-TransactionManager&lt;/b&gt;. И с помощью милой инструкции &lt;b&gt;&amp;lt;tx:annotation-driven mode="proxy" /&amp;gt;&lt;/b&gt; управление транзакциями происходило с помощью аннотации &lt;b&gt;@Transactional&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;.&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;Оказалось, что данная инструкция ограничивается одним контекстом (!!!). Это достаточно странно, так как контекст диспетчера является дочерним. Собственно, поэтому если вы хотите использовать аннотацию&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;b&gt;@Transactional&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&amp;nbsp;и в контроллерах и в компонентах, то данную инструкцию придется дублировать в обоих контекстах.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Заключение&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; line-height: 18px;"&gt;Будьте внимательны, друзья. Помните, что проблемы иногда могут появиться из нечего и превратиться в снежный ком...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br/&gt;&lt;a rev="vote-for" href="http://progg.ru/%D0%9D%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2-Spring-MVC-%D0%B8%D0%BB%D0%B8-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%8F-%D0%BE-%D0%BD%D0%B5%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fwww.devlogg.com%2F2011%2F08%2Fspring-mvc.html" style="border:0px"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-8155697879182011428?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/8155697879182011428/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2011/08/spring-mvc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/8155697879182011428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/8155697879182011428'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2011/08/spring-mvc.html' title='Несколько особенностей контекстов Spring MVC или история о невнимательности'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-163165257951039152</id><published>2010-12-01T19:18:00.001+03:00</published><updated>2010-12-02T11:42:33.578+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ie6'/><category scheme='http://www.blogger.com/atom/ns#' term='верстка'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Ретроспектива: СSS меню в IE6 без использования JavaScript</title><content type='html'>Как обычно - случилось, пришлось вспоминать использование различных шаманских бубнов для пожилого и по старчески вредного браузера Internet Explorer 6. И как обычно - вспомнилось, в отдаленных участках моего сознания все же были аккуратно сложены воспоминания о былых противостояниях молодых сознанием и уже не молодого браузера...&lt;br /&gt;&lt;br /&gt;Но ближе к сути... По причине необходимости вернулся к поиску рабочего варианта выпадающего меню на основе CSS - и такое решение было достаточно быстро найдено, что совершенно не удивительно учитывая многолетнюю историю &lt;strike&gt;противостояния&lt;/strike&gt; работы с данным браузером...&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Решения&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для начала возьмем совершенно обыкновенную разметку ниспадающего меню, на большинстве современных сайтов можно найти идентичные варианты:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"menu"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Main"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Main&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Services"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Services&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Products"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Products&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Job"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Job&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Portfolio"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Portfolio&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Projects"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Projects&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Styles"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Styles&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Private&amp;nbsp;clients"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Private&amp;nbsp;clients&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"FAQ"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;FAQ&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Q&amp;amp;A"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Q&lt;span style="color: #ddbb00;"&gt;&amp;amp;amp;&lt;/span&gt;A&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Wiki"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Wiki&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;И сотворим примерное работающее меню с помощью CSS:&lt;br /&gt;&lt;blockquote&gt;a&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;color&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#555&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;color&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;list-style&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;relative&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;float&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: black;"&gt;left&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;0.2em&amp;nbsp;1em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#CCC&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;ul&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;absolute&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;left&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;top&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;1.5em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;list-style&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#EEE&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;ul&amp;nbsp;li&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;float&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;ul&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;Решение стандартное и опять таки в тех или иных вариациях используется часто, но оно не работает в IE6... А справляются с этим следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Первое решение:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Идея состоит в том, что для всех современных брайзеров будут обрабатываться &lt;b&gt;hover&lt;/b&gt; события для &lt;b&gt;li&lt;/b&gt; элементов, что является естественным решением, а для IE6 будет привязываться специальный обработчик, который будет менять классы у li элементов. Таким образом в CSS придется одинаково описывать стиль представления для события наведение (&lt;b&gt;:hover&lt;/b&gt;) и для класса с аналогичным названием (&lt;b&gt;.hover&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;В этом случае верстка не изменяется, но расширяется СSS:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&lt;span style="color: #3333ff;"&gt;:hover&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li.hover&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#CCC&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;ul&lt;span style="color: #00aa00;"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&lt;span style="color: #6666ff;"&gt;.hover&lt;/span&gt;&amp;nbsp;ul&lt;span style="color: #00aa00;"&gt;,&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;И добавляется js-обработчик. А следовательно, и само решение становиться зависимым от JavaScript:&lt;br /&gt;&lt;blockquote&gt;menuEventer&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;document.&lt;span style="color: #660066;"&gt;all&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;document.&lt;span style="color: #660066;"&gt;getElementsByTagName&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;elements&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;document.&lt;span style="color: #660066;"&gt;getElementsByTagName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"LI"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;for&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;i&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #cc0000;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;elements.&lt;span style="color: #660066;"&gt;length&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&amp;nbsp;i&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elements&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;onmouseover&lt;/span&gt;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt;&lt;span style="color: #339933;"&gt;+=&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"&amp;nbsp;hover"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elements&lt;span style="color: #009900;"&gt;[&lt;/span&gt;i&lt;span style="color: #009900;"&gt;]&lt;/span&gt;.&lt;span style="color: #660066;"&gt;onmouseout&lt;/span&gt;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: #000066;"&gt;this&lt;/span&gt;.&lt;span style="color: #660066;"&gt;className&lt;/span&gt;.&lt;span style="color: #660066;"&gt;replace&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"&amp;nbsp;hover"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;""&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;window.&lt;span style="color: #000066;"&gt;onload&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;menuEventer&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Такой не сложный обработчик заставляет работать меню, но такое решение, найденное в свое время Патриком Гриффитс и Даном Уэбб, нельзя назвать красивым...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Второе решение:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Второе решение частично вытекает из первого и связно с тем, что возможно избавиться от ручного расширения css и добавления js-обработчиков, но по сути оно является аналогичным. Основывается оно на использование скриптов поведения подключаемых через css-свойство &lt;b&gt;behavior&lt;/b&gt;. Найти подобный скрипт &lt;a href="http://www.xs4all.nl/~peterned/csshover.html"&gt;не сложно&lt;/a&gt;, а разработчику достаточно только включить новое правило в css:&lt;br /&gt;&lt;blockquote&gt;body&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;behavior&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #993333;"&gt;url&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;(&lt;/span&gt;&lt;span style="color: red;"&gt;"csshover3.htc"&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;)&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Такое решение так же заставляет IE6 работать и является куда более элегантным, однако зависимость от JavaScript по-прежнему осталась...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Третье решение:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Третье решение основано на специфическом изменении верстки, которое позволило бы использовать &lt;b&gt;hover&lt;/b&gt; для элемента &lt;b&gt;a&lt;/b&gt;. При этом ясно, что зависимость от JavaScript уйдет и может получиться интересное решение.&lt;br /&gt;&lt;br /&gt;Идея верстки состоит в том, чтобы вложить в элемент &lt;b&gt;a&lt;/b&gt; все подменю (элемент &lt;b&gt;ul&lt;/b&gt;) с его ссылками:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"menu"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Main"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Main&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Services"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Services&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Products"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Products&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Job"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Job&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Portfolio"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Portfolio&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Projects"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Projects&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Styles"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Styles&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Private&amp;nbsp;clients"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Private&amp;nbsp;clients&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"FAQ"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;FAQ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Q&amp;amp;A"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Q&lt;span style="color: #ddbb00;"&gt;&amp;amp;amp;&lt;/span&gt;A&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Wiki"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Wiki&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;В таком случае изменив CSS следующим образом можно было бы ожидать нормальное решение:&lt;br /&gt;&lt;blockquote&gt;a&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;color&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#555&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;color&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;list-style&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;float&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: black;"&gt;left&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;relative&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;0.2em&amp;nbsp;1em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#CCC&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;ul&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;absolute&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;left&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;top&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;1.5em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;list-style&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#EEE&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;ul&amp;nbsp;li&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;float&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;ul&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Это решение во-первых, является не валидным решением, а во-вторых, ни один современный браузер подобного сделать не даст и будет исправлять верстку до первоначального варианта. Однако с некоторыми проблемами IE6 это проглотит, правда может вылетать через некоторое время после активного пользования "таким" меню. &lt;br /&gt;&lt;br /&gt;Обойти такую проблему можно еще более страшным изменением верстки, вложить все вложенное меню в таблицу, а уже таблицу вложить в ссылку первого уровня (^_^ знаю, &lt;b&gt;pepelsbey&lt;/b&gt; на меня нет):&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"menu"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Main"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Main&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;table&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;tr&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;td&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Services"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Services&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Products"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Products&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Job"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Job&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/td&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/tr&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/table&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Portfolio"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Portfolio&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;table&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;tr&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;td&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Projects"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Projects&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Styles"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Styles&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Private&amp;nbsp;clients"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Private&amp;nbsp;clients&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/td&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/tr&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/table&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"FAQ"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;FAQ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;table&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;tr&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;td&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Q&amp;amp;A"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Q&lt;span style="color: #ddbb00;"&gt;&amp;amp;amp;&lt;/span&gt;A&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Wiki"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Wiki&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/td&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/tr&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/table&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;А CSS подправив следующим образом:&lt;br /&gt;&lt;blockquote&gt;a&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;color&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#555&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;color&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#000&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;list-style&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;float&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: black;"&gt;left&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;height&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;%&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;relative&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;0.2em&amp;nbsp;1em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#CCC&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;table&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;absolute&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;left&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;top&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;1.5em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;table&amp;nbsp;ul&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;list-style&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;ul&amp;nbsp;li&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;float&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;margin&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;table&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#EEE&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Однако в результате получается, что такое "специфическое" решение нормальные браузеры и IE6 понимают и обрабатывают, а вот более IE7 и выше уже не понимают...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Последнее решение:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Идея этого решения, собственно на котором я и остановился, состоит в объединении естественного решения для нормальных браузеров и специфического решения для IE6. Такое объединение позволяет организовать механизм условных комментариев (conditional comments), поддерживаемый в браузерах Internet Explorer.&lt;br /&gt;&lt;br /&gt;Изменяем верстку с использованием условных комментариев:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"menu"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Main"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Main&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;gte&amp;nbsp;IE&amp;nbsp;7]&amp;gt;&amp;lt;!--&amp;gt;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;lte&amp;nbsp;IE&amp;nbsp;6]&amp;gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Services"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Services&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Products"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Products&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Job"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Job&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;lte&amp;nbsp;IE&amp;nbsp;6]&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Portfolio"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Portfolio&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;gte&amp;nbsp;IE&amp;nbsp;7]&amp;gt;&amp;lt;!--&amp;gt;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;lte&amp;nbsp;IE&amp;nbsp;6]&amp;gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Projects"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Projects&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Styles"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Styles&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Private&amp;nbsp;clients"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Private&lt;span style="color: #ddbb00;"&gt;&amp;amp;nbsp;&lt;/span&gt;clients&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;lte&amp;nbsp;IE&amp;nbsp;6]&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"FAQ"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;FAQ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;gte&amp;nbsp;IE&amp;nbsp;7]&amp;gt;&amp;lt;!--&amp;gt;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;lte&amp;nbsp;IE&amp;nbsp;6]&amp;gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Q&amp;amp;A"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Q&lt;span style="color: #ddbb00;"&gt;&amp;amp;amp;&lt;/span&gt;A&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"#"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Wiki"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Wiki&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--[if&amp;nbsp;lte&amp;nbsp;IE&amp;nbsp;6]&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Для современных браузеров оставляем изначальную верстку, а для IE6 переопределяем правила:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;position&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #993333;"&gt;relative&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;height&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;%&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&amp;nbsp;a&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;padding&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;0.2em&amp;nbsp;1em&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;li&amp;nbsp;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#CCC&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;ul&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;none&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&amp;nbsp;ul&amp;nbsp;li&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;inline&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #6666ff;"&gt;.menu&lt;/span&gt;&amp;nbsp;a&lt;span style="color: #3333ff;"&gt;:hover&amp;nbsp;&lt;/span&gt;ul&amp;nbsp;&lt;span style="color: #00aa00;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;display&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #993333;"&gt;block&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;background&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;:&lt;/span&gt;&lt;span style="color: #cc00cc;"&gt;#EEE&lt;/span&gt;&lt;span style="color: #00aa00;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00aa00;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;Замечу, что эти правила также подключаются к странице через условные комментарии, что избавить современные браузеры от загрузки не нужных правил.&lt;br /&gt;&lt;br /&gt;Таким образов, получаем кроссбраузерное решение, которое можно значительно усложнить, что продемонстрировал &lt;a href="http://www.cssplay.co.uk/menus/anywidth2.html"&gt;Stu Nicholls&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Конец ретроспективе, возвращаемся в будущее! ^_^&lt;br /&gt;&lt;br /&gt;&lt;a rev="vote-for" href="http://progg.ru/%D0%A0%D0%B5%D1%82%D1%80%D0%BE%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%B0-%D0%A1SS-%D0%BC%D0%B5%D0%BD%D1%8E-%D0%B2-IE6-%D0%B1%D0%B5%D0%B7-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-JavaScript"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Flive-scopes.blogspot.com%2F2010%2F12%2Fss-ie6-javascript.html" style="border:0px"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-163165257951039152?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/163165257951039152/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2010/12/ss-ie6-javascript.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/163165257951039152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/163165257951039152'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2010/12/ss-ie6-javascript.html' title='Ретроспектива: СSS меню в IE6 без использования JavaScript'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-8398248026167583878</id><published>2010-11-25T14:31:00.001+03:00</published><updated>2010-11-26T15:09:24.423+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tiles'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='templating'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Смешиваем, но не взбалтываем: Apache Tiles &amp; Spring MVC</title><content type='html'>По совершенно обычному стечению обстоятельств наткнулся на весьма легкий проект - &lt;a href="http://tiles.apache.org/"&gt;Apache Tiles&lt;/a&gt;, оказавшийся весьма популярным. Это простой и со своей второй версии весьма гибкий шаблонизатор пришедший из Struts. Собственно, мне не приходилось с ним сталкивался, тем более не слышал о том что в Spring уже есть поддержка этого легковесного шаблонизатора с совершенно незамысловатым устройством.&lt;br /&gt;&lt;br /&gt;Что же это за шаблонизатор и с чем его готовить?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Так вот ничего революционного этот проект собой не представляет, но как оказалось он весьма удобен. Концепция проста - зачем работать с различного рода "обвесами" на странице (headers, footers, sidebars), если в действительности в контексте логики приложения нас интересует только конкретный динамический блок (при этом, совершенно необязательно, что "обвесы" являются статическими блоками). Таким образом, основная выгода - это разделение логики представления по нескольким уровням (да, это тривиально).&lt;br /&gt;&lt;br /&gt;Что дает такое простое разбиение:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;больше нет необходимости постоянно передавать в представление множество повторяющихся значений&lt;/li&gt;&lt;li&gt;больше нет необходимости работать со всем шаблоном, теперь достаточно вернуть из контроллера идентификатор конкретного динамического блока&lt;/li&gt;&lt;/ul&gt;Очень простая вещь, которая в совокупности с некоторыми дополнительными удобствами становиться настолько естественной, что лично у меня возник вопрос: "Почему я раньше не слышал о таком простом фреймворке?"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;По полочкам...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Каким же образом использовать этот инструмент? Все достаточно просто, необходимо сделать следующее:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Сконфигурировать Tiles в контексте Spring контейнера. Spring уже включает поддержку Tiles, поэтому для этого достаточно лишь создать &lt;b&gt;Configurer&lt;/b&gt; и соответствующий &lt;b&gt;ViewResolver&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;nbsp;Configure&amp;nbsp;Apache&amp;nbsp;Tiles&amp;nbsp;for&amp;nbsp;the&amp;nbsp;view&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"tilesConfigurer"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.TilesConfigurer"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"definitions"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/tiles/tiles-templates.xml"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"preparerFactoryClass"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/bean&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"viewResolver"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.TilesViewResolver"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"viewClass"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.TilesView"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/bean&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Создать tiles-конфигурацию ("&lt;span class="Apple-style-span" style="color: red;"&gt;/WEB-INF/tiles/tiles-templates.xml&lt;/span&gt;" из spring-конфига), в которой описываются шаблоный, отдельные элементы шаблона. &lt;/li&gt;&lt;li&gt;Реализовать представление для описанных шаблонов &lt;/li&gt;&lt;/ol&gt;Как правило после этого (с учетом, что будет готов уровень контроллера) уже можно будет посмотреть на результат.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Начинаем разработку&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Прежде чем перейти к конфигурации Spring и Tiles в качестве примера определим структуру шаблона. В качестве примера возьмем следующую структуру:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_SXPVbpFLOms/TO4pvwGXTsI/AAAAAAAAAJQ/jFnkn0bJvPQ/s1600/template.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_SXPVbpFLOms/TO4pvwGXTsI/AAAAAAAAAJQ/jFnkn0bJvPQ/s320/template.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Исходя из такой структуры можно заметить, что фактическая работа приложения сводиться к работе блоком &lt;b&gt;CONTENT&lt;/b&gt;, все остальное либо не связанно с контентом, либо является статическими блоками (конечно, бывают исключения ^_^).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Конфигурируем Spring&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В конфигурации Spring MVC ничего особенного нет, кроме выше изложенного ничего специфического не добавляем.&lt;br /&gt;&lt;b&gt;/WEB-INF/web.xml:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"1.0"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: black;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;web-app&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"3.0"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/xml/ns/javaee"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/xml/ns/javaee&amp;nbsp;http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;servlet&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;servlet-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;dispatcher&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/servlet-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;servlet-class&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.web.servlet.DispatcherServlet&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/servlet-class&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;contextConfigLocation&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/WEB-INF/spring/*.xml&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;load-on-startup&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;0&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/load-on-startup&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/servlet&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;servlet-mapping&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;servlet-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;dispatcher&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/servlet-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;url-pattern&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;*.page&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/url-pattern&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/servlet-mapping&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;session-config&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;session-timeout&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/session-timeout&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/session-config&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;welcome-file-list&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;welcome-file&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;index.page&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/welcome-file&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/welcome-file-list&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/web-app&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;И &lt;b&gt;/WEB-INF/spring/mvc-config.xml:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"1.0"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: black;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;beans&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://www.springframework.org/schema/beans"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;xmlns:context&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://www.springframework.org/schema/context"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="color: red;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/beans&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/context&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;nbsp;Scan&amp;nbsp;for&amp;nbsp;annotation&amp;nbsp;based&amp;nbsp;controllers&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;context:component-scan&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;base-package&lt;/span&gt;=&lt;span style="color: red;"&gt;"ru.sultry.controllers"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;context:include-filter&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: red;"&gt;"annotation"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;expression&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.stereotype.Controller"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/context:component-scan&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;nbsp;Configure&amp;nbsp;Apache&amp;nbsp;Tiles&amp;nbsp;for&amp;nbsp;the&amp;nbsp;view&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"tilesConfigurer"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.TilesConfigurer"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"definitions"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/tiles/tiles-templates.xml"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"preparerFactoryClass"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/bean&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;bean&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"viewResolver"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;class&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.TilesViewResolver"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"requestContextAttribute"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"requestContext"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;property&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"viewClass"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"org.springframework.web.servlet.view.tiles2.TilesView"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/bean&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/beans&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Более тут добавить нечего, кроме того, что необходимо реализовать контроллер для нашего примера. Нужно заметить, что ничего принципиально не меняется и здесь, кроме того, что нас больше не интересуют данные для любых других блоков шаблона, кроме контентного:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: black;"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;ru.sultry.controllers&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.springframework.stereotype.Controller&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.springframework.ui.Model&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.springframework.web.bind.annotation.RequestMapping&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.springframework.web.servlet.ModelAndView&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;tsarev.oi@mail.ru&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;User:&amp;nbsp;Oleg&amp;nbsp;Tsarev&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Date:&amp;nbsp;10.11.2010&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Time:&amp;nbsp;14:17:42&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;@Controller&lt;br /&gt;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;MainController&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;INDEX_PAGE&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"/index.page"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;INDEX_VIEW&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"main"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;INFO_PAGE&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"/info.page"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;INFO_VIEW&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"info"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@RequestMapping&lt;span style="color: #009900;"&gt;(&lt;/span&gt;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;INDEX_PAGE&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;ModelAndView&amp;nbsp;index&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Model&amp;nbsp;model&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.&lt;span style="color: #006633;"&gt;addAttribute&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"message"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Message&amp;nbsp;from&amp;nbsp;main&amp;nbsp;controller&amp;nbsp;to&amp;nbsp;main&amp;nbsp;page!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;ModelAndView&lt;span style="color: #009900;"&gt;(&lt;/span&gt;INDEX_VIEW&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@RequestMapping&lt;span style="color: #009900;"&gt;(&lt;/span&gt;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;INFO_PAGE&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;ModelAndView&amp;nbsp;info&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Model&amp;nbsp;model&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model.&lt;span style="color: #006633;"&gt;addAttribute&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"message"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Message&amp;nbsp;from&amp;nbsp;main&amp;nbsp;controller&amp;nbsp;to&amp;nbsp;info&amp;nbsp;page!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;ModelAndView&lt;span style="color: #009900;"&gt;(&lt;/span&gt;INFO_VIEW&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Конфигурируем Tiles&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Конфигурация Tiles описывает шаблоны и элементы этих шаблонов. Конечно, конфигурацию можно разнести по нескольким файлам, например завести отдельные конфигурации для шаблонов и отдельных компонентов шаблонов или для шаблонов и всех наследников этого шаблона. В качестве применения шаблона используется привычное любому программисту наследование при котором можно переопределять отдельные элементы. В принципе, возможно полностью переопределить шаблон на n-ом уровне наследования, но как правило это не имеет никакого смысла.&lt;br /&gt;&lt;br /&gt;Все элементы конфигурации - &lt;b&gt;definitions&lt;/b&gt; являются дочерними к корневому элементу &lt;b&gt;tiles-definitions&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"1.0"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: black;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00bbdd;"&gt;&amp;lt;!DOCTYPE&amp;nbsp;tiles-definitions&amp;nbsp;PUBLIC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00bbdd;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"-//Apache&amp;nbsp;Software&amp;nbsp;Foundation//DTD&amp;nbsp;Tiles&amp;nbsp;Configuration&amp;nbsp;2.1//EN"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00bbdd;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"http://tiles.apache.org/dtds/tiles-config_2_1.dtd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;tiles-definitions&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/tiles-definitions&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Приступим к объявлению нового шаблона под выбранную выше структуру. На данном этапе предположим, что все блоки шаблона кроме контентного будут статическими:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;nbsp;Templates&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;definition&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"base-template"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;template&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/base-template.jsp"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"Default&amp;nbsp;title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/header.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"navigation"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/navigation.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;""&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"footer"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/footer.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/definition&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;В данном объявлении шаблон под именем &lt;b&gt;base-template&lt;/b&gt; связывается с представлением, расположенным в &lt;b&gt;"/WEB-INF/templates/base-template.jsp"&lt;/b&gt;. Кроме этого, в качестве атрибутов предаются ссылки на статические элементы - &lt;b&gt;header, navigation, content, footer&lt;/b&gt;, а также строковый атрибут со значением заголовка по умолчанию. К реализации представления и применению в шаблоне внедренных атрибутов мы перейдем позже, а сейчас необходимо отметить следующее - при попытке обращения к шаблону из контроллера (при обращении к представлению &lt;b&gt;base-template&lt;/b&gt;) получим (должны получить, так как представление еще не реализовано) страницу с заголовком по умолчанию, заполненными блоками &lt;b&gt;header, footer, navigation&lt;/b&gt;, но с отсутствующим контентным блоком.&lt;br /&gt;&lt;br /&gt;Приступим к наследованию этого шаблона для конкретных страниц, обрабатываемых нашим контроллером:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;definition&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"main"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;extends&lt;/span&gt;=&lt;span style="color: red;"&gt;"base-template"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"View:&amp;nbsp;main"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/layouts/main.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/definition&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;definition&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"info"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;extends&lt;/span&gt;=&lt;span style="color: red;"&gt;"base-template"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"View:&amp;nbsp;info"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/layouts/info.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/definition&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Объявлять представление для каждой новой страницы? Необязательно, в определениях tiles можно использовать регулярные выражения (причем допустимы два синтаксиса), поэтому предыдущее объявление можно заменить на следующее:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;definition&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"*"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;extends&lt;/span&gt;=&lt;span style="color: red;"&gt;"base-template"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"View:&amp;nbsp;{1}"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/layouts/{1}.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/definition&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;У подобного объявления есть недостатки, при обращении к несуществующей странице в браузер будет выкинуто сообщение об исключении при поиске соответствующего файла для контентного блока. Но эта ситуация обходится несколькими способами, кроме того никто не мешает переопределить поведение Tiles в этом случае, так как доступны исходники. ^_^&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Реализуем представление&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В представлении нет ничего особенного, кроме наличия специфичных для Tiles включения и использования атрибутов, но их использование достаточно тривиально, так как достаточно знать только имена внедренных атрибутов из конфигурации Tiles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;/WEB-INF/templates/base-template.jsp&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@page&amp;nbsp;&lt;span style="color: #000066;"&gt;contentType&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;pageEncoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"c"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/jsp/jstl/core"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"tiles"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://tiles.apache.org/tags-tiles"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #00bbdd;"&gt;&amp;lt;!DOCTYPE&amp;nbsp;HTML&amp;nbsp;PUBLIC&amp;nbsp;"-//W3C//DTD&amp;nbsp;HTML&amp;nbsp;4.01&amp;nbsp;Transitional//EN"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #00bbdd;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"http://www.w3.org/TR/html4/loose.dtd"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;html&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;head&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;meta&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;http-equiv&lt;/span&gt;=&lt;span style="color: red;"&gt;"Content-Type"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;content&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html;&amp;nbsp;charset=UTF-8"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;title&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;tiles:getAsString&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/title&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;link&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: red;"&gt;"stylesheet"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"/css/style.css"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;type&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/css"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/head&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;body&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;tiles:insertAttribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;tiles:insertAttribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"navigation"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;tiles:insertAttribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;tiles:insertAttribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"footer"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/body&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/html&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;b&gt;/WEB-INF/templates/header.jsp&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@page&amp;nbsp;&lt;span style="color: #000066;"&gt;contentType&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;pageEncoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"c"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/jsp/jstl/core"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Header&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/div&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;b&gt;/WEB-INF/templates/navigation.jsp&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@page&amp;nbsp;&lt;span style="color: #000066;"&gt;contentType&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;pageEncoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"c"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/jsp/jstl/core"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"navigation"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"/index.page"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Main&amp;nbsp;page"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Main&amp;nbsp;page&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;a&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: red;"&gt;"/info.page"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;title&lt;/span&gt;=&lt;span style="color: red;"&gt;"Information&amp;nbsp;page"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Information&amp;nbsp;page&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/a&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/li&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/ul&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/div&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;b&gt;/WEB-INF/templates/footer.jsp&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@page&amp;nbsp;&lt;span style="color: #000066;"&gt;contentType&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;pageEncoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"c"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/jsp/jstl/core"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"footer"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Footer&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/div&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Представления для самого шаблона реализованы, в &lt;b&gt;base-template.jsp&lt;/b&gt; происходит вызов вложенных представлений по ссылкам, которые уже были переданы через атрибуты.&lt;br /&gt;&lt;br /&gt;Теперь необходимо реализовать представление конкретных страниц, обрабатываемых контроллером.&lt;br /&gt;&lt;b&gt;/WEB-INF/templates/layouts/main.jsp&lt;/b&gt; и &lt;b&gt;/WEB-INF/templates/layouts/info.jsp&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@page&amp;nbsp;&lt;span style="color: #000066;"&gt;contentType&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;pageEncoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"c"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/jsp/jstl/core"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;c:if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;test&lt;/span&gt;=&lt;span style="color: red;"&gt;"${message&amp;nbsp;!=&amp;nbsp;null}"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;c:out&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"${message}"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/c:if&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/div&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Все представления описаны, поэтому уже можно увидеть результаты работы. Для такого простого примера все достаточно просто и в целом не вызывает вопросов, но, что если некоторые блоки шаблона также являются динамическими. Передача данных для такого блока через контроллер фактически вернет нас к объединению логики приложения и представления.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Независимые динамические блоки&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Было бы удобно, чтобы некоторые блоки шаблона можно было бы связать с некотором контроллером именно для этого блока, который будет вызываться независимо от других контроллеров. В Tiles до второй версии это реализовывалось расширением специального класса контроллера (который предоставлял Spring), но так как теперь разница между контроллерами в Spring нивелировалось, то нам достаточно использовать обычный контроллер, который необходимо будет привязать к конкретному блоку в конфигурации Tiles. Просто так взять контроллер и связать его с шаблоном право тоже не выйдет, но Tiles предоставляет интересную стратегию для предобработчиков, которые уже связываются с конкретным блоком.&lt;br /&gt;&lt;br /&gt;Предобработчики должны расширять класс &lt;b&gt;ViewPreparerSupport&lt;/b&gt;, предоставляемый Tiles. Так как других требований нет, то этот предобработчик может диспетчезироваться из Spring как обычный контроллер, что позволяет использовать автоприсвоение (autowiring) и т.д. и т.п.&lt;br /&gt;&lt;br /&gt;В качестве примера динамического блока возьмем статический на данный момент блок заголовка. НО начнем с написания контроллера:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: black;"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;ru.sultry.controllers&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.apache.tiles.AttributeContext&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.apache.tiles.context.TilesRequestContext&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.apache.tiles.preparer.ViewPreparerSupport&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.springframework.context.annotation.Scope&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;org.springframework.stereotype.Controller&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;tsarev.oi@mail.ru&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;User:&amp;nbsp;Oleg&amp;nbsp;Tsarev&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Date:&amp;nbsp;10.11.2010&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Time:&amp;nbsp;15:06:25&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;@Controller&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"headerController"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;@Scope&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"session"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;HeaderController&amp;nbsp;&lt;span style="color: black;"&gt;extends&lt;/span&gt;&amp;nbsp;ViewPreparerSupport&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;execute&lt;span style="color: #009900;"&gt;(&lt;/span&gt;TilesRequestContext&amp;nbsp;tilesContext,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AttributeContext&amp;nbsp;attributeContext&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Get&amp;nbsp;access&amp;nbsp;to&amp;nbsp;model&amp;nbsp;parameters&amp;nbsp;from&amp;nbsp;MainController&amp;nbsp;as&amp;nbsp;example&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;message&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;tilesContext.&lt;span style="color: #006633;"&gt;getRequestScope&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"message"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tilesContext.&lt;span style="color: #006633;"&gt;getRequestScope&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"headerMessage"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Message&amp;nbsp;from&amp;nbsp;header!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;Как видно из примера, в данном контроллере имеется доступ к данным передаваемым из основного контроллера, а также к атрибутам Tiles. При этом данный предобработчик находиться под управлением Spring, что позволяет связать его со всем приложением.&lt;br /&gt;&lt;br /&gt;Теперь необходимо изменить представление блока заголовка и связать definition с конкретным предобработчиком. Представление измениться следующим образом:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@page&amp;nbsp;&lt;span style="color: #000066;"&gt;contentType&lt;/span&gt;=&lt;span style="color: red;"&gt;"text/html"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;pageEncoding&lt;/span&gt;=&lt;span style="color: red;"&gt;"UTF-8"&lt;/span&gt;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;lt;%@&amp;nbsp;taglib&amp;nbsp;&lt;span style="color: #000066;"&gt;prefix&lt;/span&gt;=&lt;span style="color: red;"&gt;"c"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;uri&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://java.sun.com/jsp/jstl/core"&lt;/span&gt;&amp;nbsp;%&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;div&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;id&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Header&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;br&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;c:if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;test&lt;/span&gt;=&lt;span style="color: red;"&gt;"${headerMessage&amp;nbsp;!=&amp;nbsp;null}"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;c:out&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"${headerMessage}"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/c:if&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/div&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;А для того, чтобы связать заголовок с предобработчиком придется изменить и описание шаблона:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: grey;"&gt;&amp;lt;!--&amp;nbsp;Templates&amp;nbsp;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;definition&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"base-template"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;template&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/base-template.jsp"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"Default&amp;nbsp;title"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"navigation"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/navigation.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"content"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;""&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;put-attribute&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"footer"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;value&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/footer.jsp"&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/definition&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;definition&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;name&lt;/span&gt;=&lt;span style="color: red;"&gt;"header"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;preparer&lt;/span&gt;=&lt;span style="color: red;"&gt;"headerController"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;template&lt;/span&gt;=&lt;span style="color: red;"&gt;"/WEB-INF/templates/header.jsp"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/definition&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;Вот и все, теперь контроллер будет передавать собственное сообщение в представление.&lt;br /&gt;&lt;br /&gt;Важно обратить внимание, что предобработчики отрабатывают &lt;b&gt;после&lt;/b&gt; основного конроллера, поэтому при неосторожности можно переопределить те данные которые вернул главный контроллер.&lt;br /&gt;&lt;br /&gt;С таким функционалом и базовым наследованием, которые предоставляет Tiles можно организовывать очень гибкую шаблонизацию. А при некотором старании размер конфигурации Tiles может быть минимальным, что избавляет разработчика от бесконечных "портянок" в конфигурационных файлах.&lt;br /&gt;&lt;br /&gt;&lt;a rev="vote-for" href="http://progg.ru/Sultrys-live-scopes-%D0%A1%D0%BC%D0%B5%D1%88%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC-%D0%BD%D0%BE-%D0%BD%D0%B5-%D0%B2%D0%B7%D0%B1%D0%B0%D0%BB%D1%82%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC-Apache-Tiles-Spring-MVC"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Flive-scopes.blogspot.com%2F2010%2F11%2Fapache-tiles-spring-mvc.html" style="border:0px"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-8398248026167583878?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/8398248026167583878/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2010/11/apache-tiles-spring-mvc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/8398248026167583878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/8398248026167583878'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2010/11/apache-tiles-spring-mvc.html' title='Смешиваем, но не взбалтываем: Apache Tiles &amp; Spring MVC'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SXPVbpFLOms/TO4pvwGXTsI/AAAAAAAAAJQ/jFnkn0bJvPQ/s72-c/template.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-1640429015295584118</id><published>2010-11-13T19:47:00.001+03:00</published><updated>2010-11-14T12:38:59.192+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='filters'/><category scheme='http://www.blogger.com/atom/ns#' term='compressing'/><title type='text'>Пишем Compressing Filter для js и css ресурсов</title><content type='html'>Задумавшись об оптимизации своих web приложений через n-ое количество времени я заинтересовался различного рода сжатием статики, о котором написано невероятно много интересных и занимательных статей. Более всего меня заинтересовало сжатие css и js. Заинтересованность эта была связана с тем, что сам разработчик правит js и css достаточно часто и постоянное ручное сжатие  рано или поздно приводит либо к пересмотру всего процесса разработки и размещения, либо приводит к отказу от сжатия.&lt;br /&gt;&lt;br /&gt;Меня это не устраивало из-за того, что процесс размещения я модифицировать не мог, а отказываться от сжатия не хотел. Поэтому я решил реализовать далеко не новую идею сжимающего фильтра, использующего какой-либо компрессор.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Такое решение подразумевает, что все css и js ресурсы отдаются сервером приложения (знаю многим разработчикам может это не понравиться) и должны пропускаться через этот сжимающий фильтр. В таком случае схема работы будет следующая:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_SXPVbpFLOms/TJIM5nAIj4I/AAAAAAAAAIk/WoVH0-BlUBE/s1600/cf_scheme.gif" /&gt;&lt;/div&gt;&lt;br /&gt;В качестве достоинств такого подхода можно выделить следующее:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Разработчик не тратит свое время на сжатие&lt;/li&gt;&lt;li&gt;Не нужен специальный механизм размещения&lt;/li&gt;&lt;li&gt;Для подключения сжатия к проекту будет достаточно подключить фильтр&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Но у любого решения есть свои недостатки:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Статика отдается сервером приложения, а не оберткой в виде, например, nginx.&lt;/li&gt;&lt;li&gt;При простой реализации сжатия через фильтр повторное обращение к css  или js будет приводить к повторному сжатию, что будет только загружать сервер приложения.&lt;/li&gt;&lt;li&gt;Любая модификация отдаваемого контента через фильтра потенциально может привести к тому, что контент из-за некоторых сбоев в обработке может не дойти до конечного пользователя.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Исходя из этих особенностей можно выделить ряд ключевых моментов для сжимающего фильтра:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Необходима проверка на соответсвие отдаваемого контента формату css или js . Это необходимо в том случае если пользователь повесит фильтр не только на js и css .&lt;/li&gt;&lt;li&gt;При любой ошибке или даже намеке на то, что она может произойти необходимо отменить все модификации и просто пропустить несжатый контент.&lt;/li&gt;&lt;li&gt;Чтобы избавиться от лишней нагрузки на сервер приложений необходимо реализовать кэширование с возможностью сброса или обхода.&lt;/li&gt;&lt;li&gt;Так как фильтр может работать в цепочке фильтров необходимо предоставить response wrappers для того чтобы избежать работу нескольких фильтров с одним ответом (что будет вызывать исключение)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Инструментарий&amp;nbsp;и интерфейс фильтра&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В качестве компрессора я выбрал YUICompressor , ознакомиться с которым можно здесь: &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;http://developer.yahoo.com/yui/compressor/&lt;/a&gt;. Конечно, можно выбрать и другой компрессор, но тогда &amp;nbsp;придется реализовать другой интерфейс к вашему компрессору.&lt;br /&gt;&lt;br /&gt;Итак, нам необходимо скачать jar файл и поместить его в недры classpath, чтобы был доступ к следующим классам:&amp;nbsp;&lt;b&gt;com.yahoo.platform.yui.compressor.CssCompressor&lt;/b&gt; и&amp;nbsp;&lt;b&gt;com.yahoo.platform.yui.compressor.JavaScriptCompressor&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;YUICompressor имеет не так много параметров, поэтому их легко можно перенести в конфигурацию самого фильтра. Более того не все параметры реально нужны для функционирования фильтра, поэтому вполне логично оставить следующие:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;line-break  - перенос по строкам сжатого контента&lt;/li&gt;&lt;li&gt;nomunge  - минимизация без обфускации&lt;/li&gt;&lt;li&gt;preserve-semi  - сохранять ли необязательные ";"&lt;/li&gt;&lt;li&gt;disable-optimizations  - выключение микро-оптимизаций&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Конечно, вероятно понадобиться настройка кодировки, но я предпочел зафиксировать ее со значением UTF-8. Реализовать настройку кодировки ничего не стоит, можно будет легко это сделать.&lt;br /&gt;&lt;br /&gt;Собственно, интерфейс определен, что позволяет определить и подключение фильтра:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;CompressingFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter-class&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;com.sultry.web.filters.CompressingFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter-class&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;lineBreak&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;8000&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;noMunge&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;false&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;preserveSemi&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;false&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;disableOptimizations&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;false&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/param-value&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/init-param&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter-mapping&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;CompressingFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;url-pattern&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;*.css&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/url-pattern&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter-mapping&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter-mapping&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;filter-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;CompressingFilter&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter-name&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;url-pattern&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;*.js&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/url-pattern&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/filter-mapping&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;или с помощью аннотаций в самом коде&lt;br /&gt;&lt;blockquote&gt;@WebFilter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;filterName&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CompressingFilter"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initParams&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"lineBreak"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"8000"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"noMunge"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"preserveSemi"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"disableOptimizations"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlPatterns&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: blue;"&gt;"*.css"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"*.js"&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Теперь можно приступать к реализации фильтра. Создадим новый фильтр, в котором объявим константы имен параметров и используемую кодировку:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: black;"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;com.sultry.web.filters&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;@WebFilter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;filterName&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CompressingFilter"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initParams&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"lineBreak"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"8000"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"noMunge"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"preserveSemi"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"disableOptimizations"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlPatterns&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: blue;"&gt;"*.css"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"*.js"&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;CompressingFilter&amp;nbsp;&lt;span style="color: black;"&gt;implements&lt;/span&gt;&amp;nbsp;Filter&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;LINE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"lineBreak"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;MUNGE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"noMunge"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;PRESERVE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"preserveSemi"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;OPT_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"disableOptimizations"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CHARSET&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;//Filter&amp;nbsp;implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Инициализация фильтра&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Первое с чего необходимо начать непосредственную реализацию - это инициализация фильтра. Что необходимо сделать во время инициализации:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Инкапсулировать FilterConfig, передаваемый в качестве параметра метода инициализации&lt;/li&gt;&lt;li&gt;Проверить на неравенство null параметры самого фильтра&lt;/li&gt;&lt;li&gt;Привести к нижнему регистру и обрезать лишние пробелы вначале и конце значения этих параметров&lt;/li&gt;&lt;li&gt;Распарсить на числовые и логические значения&lt;/li&gt;&lt;li&gt;В случае какой-либо ошибки необходимо оставить значение&amp;nbsp;по умолчанию&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Ничего особенно в такой инициализации нет, поэтому достаточно быстро можно прийти к такому или аналогичному коду:&lt;/div&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;init&lt;span style="color: #009900;"&gt;(&lt;/span&gt;FilterConfig&amp;nbsp;config&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;ServletException&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;config&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;lineBreakParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;LINE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;noMungeParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;MUNGE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;preserveSemiParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;PRESERVE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;disableOptimizationsParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;OPT_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isNumber&lt;span style="color: #009900;"&gt;(&lt;/span&gt;lineBreakParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseInt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;lineBreakParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;noMunge&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;noMungeParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;noMungeParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;noMunge&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;preserveSemi&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;preserveSemiParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;preserveSemiParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;preserveSemi&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;disableOptimizations&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;disableOptimizationsParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;disableOptimizationsParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;disableOptimizations&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;И, соответственно, добавляем необходимые локальные переменные:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;FilterConfig&amp;nbsp;config&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;int&lt;/span&gt;&amp;nbsp;lineBreak&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;-&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;noMunge&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;preserveSemi&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;disableOptimizations&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;useCahce&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;При инициализации используются несколько вспомогательных функций для следующих целей:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Приведение к нижнему регистру и обрезание лишних пробельных символов&lt;/li&gt;&lt;li&gt;Проверка на&amp;nbsp;соответствие&amp;nbsp;значения параметра фильтра целому числу&lt;/li&gt;&lt;li&gt;Проверка на соответствие значения параметра фильтра логическому числу&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;Реализация функций очень простая, добавляем их к фильтру:&lt;/div&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;configValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;configValue&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;configValue.&lt;span style="color: #006633;"&gt;trim&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;toLowerCase&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isNumber&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;configValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;configValue&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;configValue.&lt;span style="color: #006633;"&gt;matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"[0-9]+"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;configValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;configValue&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;configValue.&lt;span style="color: #006633;"&gt;matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"true|false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Кроме этого добавим переопределение метода деструктора для избавления от ранее инкапсулированного FilterConfig:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;destroy&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;А что нужно?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Одной из задач, описанных ближе к началу, было определение отдаваемого контента. Зачем это нужно? Нужно это для тех ситуаций, когда фильтр настраивается на перехват не только js и css ресурсов, а некоторого множества возможных ресурсов. Ведь не всегда отдаваемый js контент храниться с расширением *.js, более того рассчитывать на расширение вообще не очень хорошо, хотя я для удобства это делаю.&lt;br /&gt;&lt;br /&gt;Кроме расширения ресурса, которое может нас и обмануть, возможно определить тип возвращаемого контента по заголовку "Content-Type", что в большинстве случаем вполне достаточно. Но для этого необходимо определиться какие именно значения этого заголовка нас интересуют и какие расширения бывают у css и js ресурсов.&lt;br /&gt;&lt;br /&gt;В качестве примера я выбрал следующие значения "Content-Type":&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;text/javascript&lt;/li&gt;&lt;li&gt;application/x-javascript&lt;/li&gt;&lt;li&gt;application/json&lt;/li&gt;&lt;li&gt;text/css&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;и следующие расширения:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;.js&lt;/li&gt;&lt;li&gt;.json&lt;/li&gt;&lt;li&gt;.css&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Получается, что для определения контента, которого необходимо сжимать, достаточно проверить на соответствие выбранным значениям заголовок "Content-Type" &lt;b&gt;или&lt;/b&gt; расширение отдаваемого ресурса.&lt;br /&gt;&lt;br /&gt;Определим константы необходимые нам для проверки:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JS_EXT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;".js"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JSON_EXT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;".json"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CSS_EXT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;".css"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JS_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JS_X_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"application/x-javascript"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JSON_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CSS_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"text/css"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;На основании данных констант определим функции проверки:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JSON_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isJSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;ServletResponse&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_X_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JSON_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CSS_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Основываясь на данной проверке возможно определить что за ресурс обрабатывается и какой компрессор нам необходим для сжатия.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Оборачиваем, упаковываем...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Так как фильтр предназначен для модификации, то нам необходимо захватить ответ и при этом находиться в потоке выполнения цепочки фильтров. Это организуется с помощью оборачивания приходящего в фильтр ответа и передачи этой обертки(wrapper) по цепочке фильтров. Такое решение позволяет и модифицировать контент и оставаться в режиме выполнения (более подробно &lt;a href="http://www.oracle.com/technetwork/java/filters-137243.html"&gt;здесь&lt;/a&gt;). Собственно, такое решение является примером паттерна Wrapper или Decorator.&lt;br /&gt;&lt;br /&gt;Для определения "обертки" необходимо перекрыть метод &lt;b&gt;getWriter&lt;/b&gt; или &lt;b&gt;getOutputStream&lt;/b&gt;, а в случае, когда в цепочке фильтров присутствуют другие модифицирующие фильтры, то желательно переопределить оба метода, так как неизвестно с каким методом будет работать другой фильтр. Чтобы определить "обертку" для модификации ответа, необходимо расширить &lt;b&gt;ServletResponseWrapper&lt;/b&gt; или &lt;b&gt;HttpServletResponseWrapper&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;CharResponseWrapper&amp;nbsp;&lt;span style="color: black;"&gt;extends&lt;/span&gt;&amp;nbsp;HttpServletResponseWrapper&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;toString&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;output.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;CharResponseWrapper&lt;span style="color: #009900;"&gt;(&lt;/span&gt;HttpServletResponse&amp;nbsp;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;super&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;ServletOutputStream&amp;nbsp;getOutputStream&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;IOException&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;CharOutputStream&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;output&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&amp;nbsp;getWriter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;output&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;CharOutputStream&amp;nbsp;&lt;span style="color: black;"&gt;extends&lt;/span&gt;&amp;nbsp;ServletOutputStream&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;CharOutputStream&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;output&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;write&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;int&lt;/span&gt;&amp;nbsp;b&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;IOException&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;b&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Для переопределения &lt;b&gt;getOutputStream&lt;/b&gt; достаточно сделать аналогичную "обертку" расширяющую &lt;b&gt;ServletOutputStream&lt;/b&gt;, в этом случае можно быть уверенным (ну почти...), что не возникнет конфликта с другими модифицирующими фильтрами из той же цепочки.&lt;br /&gt;&lt;br /&gt;Наличие такой обертки позволяет приступить к реализации основного метода &lt;b&gt;doFilter&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;doFilter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;ServletRequest&amp;nbsp;sRequest,&amp;nbsp;ServletResponse&amp;nbsp;sResponse,&amp;nbsp;FilterChain&amp;nbsp;next&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;IOException&lt;/span&gt;,&amp;nbsp;ServletException&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpServletRequest&amp;nbsp;request&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;HttpServletRequest&lt;span style="color: #009900;"&gt;)&lt;/span&gt;sRequest&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpServletResponse&amp;nbsp;response&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;HttpServletResponse&lt;span style="color: #009900;"&gt;)&lt;/span&gt;sResponse&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;request.&lt;span style="color: #006633;"&gt;getRequestURI&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;toLowerCase&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;config&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Оборачиваем&amp;nbsp;оригинальный&amp;nbsp;ответ&amp;nbsp;и&amp;nbsp;передаем&amp;nbsp;его&amp;nbsp;по&amp;nbsp;цепочке&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&amp;nbsp;writer&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;response.&lt;span style="color: #006633;"&gt;getWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CharResponseWrapper&amp;nbsp;wrapper&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;CharResponseWrapper&lt;span style="color: #009900;"&gt;(&lt;/span&gt;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next.&lt;span style="color: #006633;"&gt;doFilter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;request,&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Получаем&amp;nbsp;модифицированный&amp;nbsp;wrapper&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&amp;nbsp;temp&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&amp;nbsp;reader&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getBytes&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&amp;nbsp;CHARSET&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Проверяем&amp;nbsp;необходимость&amp;nbsp;сжатия&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;isJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;isJSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Сжимаем&amp;nbsp;js&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;isCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;isCSSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Сжимаем&amp;nbsp;css&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Возвращаем&amp;nbsp;без&amp;nbsp;сжатия&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;temp.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;flush&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;close&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Что-то&amp;nbsp;пошло&amp;nbsp;не&amp;nbsp;так...&amp;nbsp;Переходим&amp;nbsp;дальше&amp;nbsp;по&amp;nbsp;цепочке&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next.&lt;span style="color: #006633;"&gt;doFilter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;request,&amp;nbsp;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Сжимаем содержимое&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;YUICompressor предоставляет два необходимых нам класса, выполняющих непосредственное сжатие:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;JavaScriptCompressor&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;СsstCompressor&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Вызвав метод &lt;b&gt;compress&lt;/b&gt; этих классов получим сжатое содержимое. Собственно, больше нам ничего и не нужно. Только нужно заметить, что процесс компрессии может выбросить исключение, которое необходимо обработать.&lt;br /&gt;&lt;br /&gt;На основании этих классов реализуем методы, производящие компрессию:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;compressJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&amp;nbsp;temp,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&amp;nbsp;reader,&amp;nbsp;CharResponseWrapper&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JavaScriptCompressor&amp;nbsp;compressor&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;JavaScriptCompressor&lt;span style="color: #009900;"&gt;(&lt;/span&gt;reader,&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressor.&lt;span style="color: #006633;"&gt;compress&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;temp,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;noMunge&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;preserveSemi&lt;/span&gt;,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;disableOptimizations&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;catch&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;Exception&lt;/span&gt;&amp;nbsp;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;compressCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&amp;nbsp;temp,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&amp;nbsp;reader,&amp;nbsp;CharResponseWrapper&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CssCompressor&amp;nbsp;compressor&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;CssCompressor&lt;span style="color: #009900;"&gt;(&lt;/span&gt;reader&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressor.&lt;span style="color: #006633;"&gt;compress&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;temp,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;catch&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;Exception&lt;/span&gt;&amp;nbsp;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;Ничего сложного здесь нет и теперь можно дописать метод &lt;b&gt;doFilter&lt;/b&gt;:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;isJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;isJSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,temp,reader,wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;isCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;isCSSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,temp,reader,wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Первая версия фильтра готова, ее можно опробовать, но...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Обдумываем результат&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В таком виде использование фильтра чистое самоубийство, так как при каждом обращении к css- или js-ресурсу компрессия будет происходить постоянно, то есть если несколько разных пользователей запросили один и тот же статический ресурс, то сжатие этого ресурса для каждого пользователя будет повторяться. Кроме того, в случае если браузер клиента по каким-то причинам не закэшировал этот ресурс или уже сбросил свой кэш, то получается, что идентичное сжатие будут происходить по несколько раз даже для одного пользователя.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Добавляем кэширование&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Исходя из имеющихся проблем необходимо добавить следующий функционал:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Сохранение сжатого ресурса&lt;/li&gt;&lt;li&gt;Проверка на существование уже сжатой копии по запросу&lt;/li&gt;&lt;li&gt;Получение ресурса из кэша&lt;/li&gt;&lt;li&gt;Очистка кэша&lt;/li&gt;&lt;li&gt;Механизм обхода кэша&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Есть множество стратегий кэширования, для разных масштабов проектов следует использовать соответствующие стратегии. В качестве примера приведу простой вариант, рассчитанный на в целом малое количество статических ресурсов. В качестве основного хранилища будем использовать HashMap для получения ресурса по ключу - его имени:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;Map&lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt;String,&amp;nbsp;String&lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Collections&lt;/span&gt;.&lt;span style="color: #006633;"&gt;synchronizedMap&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;LinkedHashMap&lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt;String,&amp;nbsp;String&lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;Кроме этого необходимо добавить имена параметров запроса, которые будем использовать для управлением кэшем. Нам необходимо три таких параметра:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Для сброса кэша&lt;/li&gt;&lt;li&gt;Для пропуска процесса кэширования&lt;/li&gt;&lt;li&gt;Для отладки, когда кэширование так же не выполняется&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Естественно, в таком простом варианте поведение при втором и третьем варианте идентичное, но при усложнении фильтра в любом случае понадобиться эти ситуации разделять. Добавляем имена параметров:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CLEAR_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CF_CLEAR"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;SKIP_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CF_SKIP"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;DEBUG_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CF_DEBUG"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Первое что необходимо реализовать - это сброс кэша, так как это первое что необходимо сделать после того как мы становимся уверенными, что запрашивается ресурс, который необходимо сжимать:&lt;br /&gt;&lt;blockquote&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;config&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;isValidResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryToResetCache&lt;span style="color: #009900;"&gt;(&lt;/span&gt;request.&lt;span style="color: #006633;"&gt;getParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CLEAR_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;/blockquote&gt;Сам сброс кэша выглядит следующим образом:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;tryToResetCache&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;param&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;param&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;cache&lt;/span&gt;.&lt;span style="color: #006633;"&gt;clear&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;Таким образом, когда с клиентской стороны приходит параметр &lt;b&gt;CLEAR_PARAM&lt;/b&gt;, то кэш будет сбрасываться.&lt;br /&gt;&lt;br /&gt;Запись и чтение сжатого содержимого из кэша осуществляется следующим образом:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Получение&amp;nbsp;значения&amp;nbsp;по&amp;nbsp;имени&amp;nbsp;запрашиваемого&amp;nbsp;ресурса&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;cachedValue&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;cache.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Сохранение&amp;nbsp;сжатого&amp;nbsp;результата&amp;nbsp;с&amp;nbsp;именем&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Последний шаг - организация логики кэширования. В случае, если ресурс уже сжимался и мы можем использовать кэш(в зависимости от параметров), то необходимо использовать уже сжатый результат, в противном случае произвести сжатие и сохранить результат:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Узнаем,&amp;nbsp;можно&amp;nbsp;ли&amp;nbsp;использовать&amp;nbsp;кэш&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;useCache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;useCahce&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.&lt;span style="color: #006633;"&gt;getParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;SKIP_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.&lt;span style="color: #006633;"&gt;getParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;DEBUG_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Пытаемся&amp;nbsp;достать&amp;nbsp;сжатый&amp;nbsp;результат&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;cachedValue&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;cache.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Если&amp;nbsp;результат&amp;nbsp;есть&amp;nbsp;и&amp;nbsp;можно&amp;nbsp;использовать&amp;nbsp;кэш&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;useCache&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;cachedValue&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Отдаем&amp;nbsp;кэшированное&amp;nbsp;значение&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&amp;nbsp;writer&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;response.&lt;span style="color: #006633;"&gt;getWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;cachedValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;flush&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;close&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #666666;"&gt;//&amp;nbsp;Производим&amp;nbsp;сжатие&amp;nbsp;и&amp;nbsp;кэширование&amp;nbsp;резальтата&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Результат&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: black;"&gt;package&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;com.sultry.web.filters&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.io.CharArrayWriter&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.io.IOException&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.io.PrintWriter&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.io.StringReader&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.io.StringWriter&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.util.Collections&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.util.LinkedHashMap&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.util.Map&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.util.logging.Level&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;java.util.logging.Logger&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.Filter&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.FilterChain&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.FilterConfig&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.ServletException&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.ServletOutputStream&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.ServletRequest&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.ServletResponse&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.http.HttpServletRequest&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.http.HttpServletResponse&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.http.HttpServletResponseWrapper&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;com.yahoo.platform.yui.compressor.CssCompressor&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;com.yahoo.platform.yui.compressor.JavaScriptCompressor&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.annotation.WebFilter&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;import&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006699;"&gt;javax.servlet.annotation.WebInitParam&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: green;"&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;Oleg&amp;nbsp;Tsarev&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;* &amp;lt;b&amp;gt;mail:&amp;lt;/b&amp;gt;&amp;nbsp;tsarev.oi@mail.ru&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;/*&lt;br /&gt;&amp;nbsp;*&amp;nbsp; &amp;lt;filter&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;filter-name&amp;gt;CompressingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;filter-class&amp;gt;com.sultry.web.filters.CompressingFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-name&amp;gt;lineBreak&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-value&amp;gt;8000&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-name&amp;gt;noMunge&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-name&amp;gt;preserveSemi&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-name&amp;gt;disableOptimizations&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-name&amp;gt;useCache&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;   &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;  &amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp; &amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;filter-name&amp;gt;CompressingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;*.css&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;filter-name&amp;gt;CompressingFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;*.js&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;@WebFilter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;filterName&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CompressingFilter"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initParams&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"lineBreak"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"8000"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"noMunge"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"preserveSemi"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"disableOptimizations"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@WebInitParam&lt;span style="color: #009900;"&gt;(&lt;/span&gt;name&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"useCache"&lt;/span&gt;,&amp;nbsp;value&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"true"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlPatterns&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;span style="color: blue;"&gt;"*.css"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"*.js"&lt;/span&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;CompressingFilter&amp;nbsp;&lt;span style="color: black;"&gt;implements&lt;/span&gt;&amp;nbsp;Filter&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;Logger&amp;nbsp;LOGGER&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;Logger.&lt;span style="color: #006633;"&gt;getLogger&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CompressingFilter.&lt;span style="color: black;"&gt;class&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;LINE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"lineBreak"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;MUNGE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"noMunge"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;PRESERVE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"preserveSemi"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;OPT_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"disableOptimizations"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CACHE_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"useCache"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JS_EXT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;".js"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JSON_EXT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;".json"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CSS_EXT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;".css"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JS_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"text/javascript"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JS_X_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"application/x-javascript"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;JSON_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CSS_CONTENT&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"text/css"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CLEAR_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CF_CLEAR"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;SKIP_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CF_SKIP"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;DEBUG_PARAM&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"CF_DEBUG"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;CHARSET&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;FilterConfig&amp;nbsp;config&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;int&lt;/span&gt;&amp;nbsp;lineBreak&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;-&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;noMunge&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;preserveSemi&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;disableOptimizations&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;useCahce&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;Map&lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt;String,&amp;nbsp;String&lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Collections&lt;/span&gt;.&lt;span style="color: #006633;"&gt;synchronizedMap&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;LinkedHashMap&lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt;String,&amp;nbsp;String&lt;span style="color: #339933;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;init&lt;span style="color: #009900;"&gt;(&lt;/span&gt;FilterConfig&amp;nbsp;config&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;ServletException&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;config&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&lt;span style="color: blue;"&gt;"Init&amp;nbsp;CompressingFilter"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;lineBreakParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;LINE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;noMungeParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;MUNGE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;preserveSemiParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;PRESERVE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;disableOptimizationsParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;OPT_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;useCacheParam&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getInitParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CACHE_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isNumber&lt;span style="color: #009900;"&gt;(&lt;/span&gt;lineBreakParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseInt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;lineBreakParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;noMunge&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;noMungeParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;noMungeParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;noMunge&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;preserveSemi&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;preserveSemiParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;preserveSemiParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;preserveSemi&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;disableOptimizations&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;disableOptimizationsParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;disableOptimizationsParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;disableOptimizations&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;useCahce&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;useCacheParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;?&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color: #006633;"&gt;parseBoolean&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;useCacheParam&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;useCahce&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isNumber&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;configValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;configValue&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;configValue.&lt;span style="color: #006633;"&gt;matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"[0-9]+"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isBoolean&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;configValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;configValue&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;configValue.&lt;span style="color: #006633;"&gt;matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: blue;"&gt;"true|false"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;normalize&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;configValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;configValue&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;configValue.&lt;span style="color: #006633;"&gt;trim&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;toLowerCase&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isValidResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JSON_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CSS_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JSON_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isJSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;ServletResponse&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JS_X_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;JSON_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url.&lt;span style="color: #006633;"&gt;endsWith&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CSS_EXT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;isCSSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;ServletResponse&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;getContentType&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;equals&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CSS_CONTENT&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;doFilter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;ServletRequest&amp;nbsp;sRequest,&amp;nbsp;ServletResponse&amp;nbsp;sResponse,&amp;nbsp;FilterChain&amp;nbsp;next&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;IOException&lt;/span&gt;,&amp;nbsp;ServletException&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&lt;span style="color: blue;"&gt;"Start&amp;nbsp;CompressingFilter"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpServletRequest&amp;nbsp;request&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;HttpServletRequest&lt;span style="color: #009900;"&gt;)&lt;/span&gt;sRequest&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpServletResponse&amp;nbsp;response&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;HttpServletResponse&lt;span style="color: #009900;"&gt;)&lt;/span&gt;sResponse&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;request.&lt;span style="color: #006633;"&gt;getRequestURI&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;toLowerCase&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"CompressingFilter:{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;config&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;isValidResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryToResetCache&lt;span style="color: #009900;"&gt;(&lt;/span&gt;request.&lt;span style="color: #006633;"&gt;getParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;CLEAR_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000066;"&gt;boolean&lt;/span&gt;&amp;nbsp;useCache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;useCahce&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.&lt;span style="color: #006633;"&gt;getParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;SKIP_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.&lt;span style="color: #006633;"&gt;getParameter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;DEBUG_PARAM&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;==&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;cachedValue&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;cache.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;useCache&amp;nbsp;&lt;span style="color: #339933;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&amp;nbsp;cachedValue&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Get&amp;nbsp;resource&amp;nbsp;({0})&amp;nbsp;from&amp;nbsp;cache"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&amp;nbsp;writer&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;response.&lt;span style="color: #006633;"&gt;getWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;cachedValue&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;flush&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;close&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&amp;nbsp;writer&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;response.&lt;span style="color: #006633;"&gt;getWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CharResponseWrapper&amp;nbsp;wrapper&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;CharResponseWrapper&lt;span style="color: #009900;"&gt;(&lt;/span&gt;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next.&lt;span style="color: #006633;"&gt;doFilter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;request,&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&amp;nbsp;temp&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&amp;nbsp;reader&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getBytes&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;,&amp;nbsp;CHARSET&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;isJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;isJSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,temp,reader,wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;isCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;||&lt;/span&gt;&amp;nbsp;isCSSContentType&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,temp,reader,wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;WARNING&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Resource&amp;nbsp;skiping:&amp;nbsp;{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cache.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;url,&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Added&amp;nbsp;to&amp;nbsp;cache:&amp;nbsp;{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;temp.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;flush&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.&lt;span style="color: #006633;"&gt;close&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next.&lt;span style="color: #006633;"&gt;doFilter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;request,&amp;nbsp;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;tryToResetCache&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;param&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;param&amp;nbsp;&lt;span style="color: #339933;"&gt;!=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;cache&lt;/span&gt;.&lt;span style="color: #006633;"&gt;clear&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;compressJSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&amp;nbsp;temp,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&amp;nbsp;reader,&amp;nbsp;CharResponseWrapper&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JavaScriptCompressor&amp;nbsp;compressor&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;JavaScriptCompressor&lt;span style="color: #009900;"&gt;(&lt;/span&gt;reader,&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressor.&lt;span style="color: #006633;"&gt;compress&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;temp,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;noMunge&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #000066;"&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;preserveSemi&lt;/span&gt;,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;disableOptimizations&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Compress&amp;nbsp;js&amp;nbsp;resource:&amp;nbsp;{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;catch&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;Exception&lt;/span&gt;&amp;nbsp;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;WARNING&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Can&amp;nbsp;not&amp;nbsp;compress&amp;nbsp;resource:{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;compressCSSResource&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;url,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringWriter&lt;/span&gt;&amp;nbsp;temp,&amp;nbsp;&lt;span style="color: #003399;"&gt;StringReader&lt;/span&gt;&amp;nbsp;reader,&amp;nbsp;CharResponseWrapper&amp;nbsp;wrapper&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;try&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CssCompressor&amp;nbsp;compressor&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;CssCompressor&lt;span style="color: #009900;"&gt;(&lt;/span&gt;reader&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compressor.&lt;span style="color: #006633;"&gt;compress&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;temp,&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;lineBreak&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;INFO&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Compress&amp;nbsp;css&amp;nbsp;resource:&amp;nbsp;{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;catch&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;Exception&lt;/span&gt;&amp;nbsp;e&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LOGGER.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;WARNING&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;"Can&amp;nbsp;not&amp;nbsp;compress&amp;nbsp;resource:{0}"&lt;/span&gt;,&amp;nbsp;url&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;wrapper.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;destroy&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;config&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;CharResponseWrapper&amp;nbsp;&lt;span style="color: black;"&gt;extends&lt;/span&gt;&amp;nbsp;HttpServletResponseWrapper&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;String&lt;/span&gt;&amp;nbsp;toString&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;output.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;CharResponseWrapper&lt;span style="color: #009900;"&gt;(&lt;/span&gt;HttpServletResponse&amp;nbsp;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;super&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;response&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;output&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;ServletOutputStream&amp;nbsp;getOutputStream&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;IOException&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;CharOutputStream&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;output&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&amp;nbsp;getWriter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;PrintWriter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;output&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;class&lt;/span&gt;&amp;nbsp;CharOutputStream&amp;nbsp;&lt;span style="color: black;"&gt;extends&lt;/span&gt;&amp;nbsp;ServletOutputStream&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;CharOutputStream&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;CharArrayWriter&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black;"&gt;this&lt;/span&gt;.&lt;span style="color: #006633;"&gt;output&lt;/span&gt;&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;output&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;void&lt;/span&gt;&amp;nbsp;write&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000066;"&gt;int&lt;/span&gt;&amp;nbsp;b&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: black;"&gt;throws&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003399;"&gt;IOException&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output.&lt;span style="color: #006633;"&gt;write&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;b&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Вот и все, дальше экспериментируем сами! ^_^&lt;br /&gt;&lt;br /&gt;&lt;a rev="vote-for" href="http://progg.ru/Sultrys-live-scopes-%D0%9F%D0%B8%D1%88%D0%B5%D0%BC-Compressing-Filter-%D0%B4%D0%BB%D1%8F-js-%D0%B8-css-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Flive-scopes.blogspot.com%2F2010%2F11%2Fcompressing-filter-js-css.html" style="border:0px"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-1640429015295584118?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/1640429015295584118/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2010/11/compressing-filter-js-css.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/1640429015295584118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/1640429015295584118'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2010/11/compressing-filter-js-css.html' title='Пишем Compressing Filter для js и css ресурсов'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_SXPVbpFLOms/TJIM5nAIj4I/AAAAAAAAAIk/WoVH0-BlUBE/s72-c/cf_scheme.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-1905509010662723036</id><published>2010-11-13T13:51:00.002+03:00</published><updated>2010-11-13T13:53:07.543+03:00</updated><title type='text'>Google Developer Day 2010 Moscow</title><content type='html'>&lt;p&gt;Удалось посетить это замечательное мероприятие, прошедшее 12 ноября. В результате мозг переполнен множеством новых идей и приемов, в общем те кто хотели получили огромное количество информации этого добились. Организаторам удалось обеспечить действительно творческую обстановку.&lt;/p&gt;&lt;p&gt;К сожалению, я не&amp;nbsp;догадался&amp;nbsp;взять с собой хотя бы мыльницу, поэтому пришлось обходиться только камерой моего андройда:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_SXPVbpFLOms/TN5q4CmuKLI/AAAAAAAAAIo/BRZYoPxa9rI/s1600/2010-11-12+08.29.11.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_SXPVbpFLOms/TN5q4CmuKLI/AAAAAAAAAIo/BRZYoPxa9rI/s640/2010-11-12+08.29.11.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_SXPVbpFLOms/TN5q5nKJGgI/AAAAAAAAAIs/poJjnD5LM94/s1600/2010-11-12+08.45.30.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/_SXPVbpFLOms/TN5q5nKJGgI/AAAAAAAAAIs/poJjnD5LM94/s640/2010-11-12+08.45.30.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5q64bIYsI/AAAAAAAAAIw/nUUPuhl6G-E/s1600/2010-11-12+09.46.13.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5q64bIYsI/AAAAAAAAAIw/nUUPuhl6G-E/s640/2010-11-12+09.46.13.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5q8GWxkPI/AAAAAAAAAI0/V4Du8qpc1F0/s1600/2010-11-12+09.58.20.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5q8GWxkPI/AAAAAAAAAI0/V4Du8qpc1F0/s640/2010-11-12+09.58.20.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5q-b04mXI/AAAAAAAAAI8/onoXZYSErcQ/s1600/2010-11-12+13.40.24.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5q-b04mXI/AAAAAAAAAI8/onoXZYSErcQ/s640/2010-11-12+13.40.24.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_SXPVbpFLOms/TN5rCTUSk7I/AAAAAAAAAJA/VWkW4bUKVFA/s1600/2010-11-12+14.28.09.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/_SXPVbpFLOms/TN5rCTUSk7I/AAAAAAAAAJA/VWkW4bUKVFA/s640/2010-11-12+14.28.09.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_SXPVbpFLOms/TN5rDrhWXEI/AAAAAAAAAJE/mM82emr43F0/s1600/2010-11-12+16.37.46.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_SXPVbpFLOms/TN5rDrhWXEI/AAAAAAAAAJE/mM82emr43F0/s640/2010-11-12+16.37.46.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5rE1N7JxI/AAAAAAAAAJI/XFPuhiFJ8ZY/s1600/2010-11-12+17.38.59.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/_SXPVbpFLOms/TN5rE1N7JxI/AAAAAAAAAJI/XFPuhiFJ8ZY/s640/2010-11-12+17.38.59.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_SXPVbpFLOms/TN5rGL9lFUI/AAAAAAAAAJM/zBn2kWzOec8/s1600/2010-11-12+18.50.32.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/_SXPVbpFLOms/TN5rGL9lFUI/AAAAAAAAAJM/zBn2kWzOec8/s640/2010-11-12+18.50.32.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_SXPVbpFLOms/TN5q9S1atcI/AAAAAAAAAI4/C0k727Vilxw/s1600/2010-11-12+13.40.05.jpg" imageanchor="1" style="margin:0 6px 5px 6px;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/_SXPVbpFLOms/TN5q9S1atcI/AAAAAAAAAI4/C0k727Vilxw/s640/2010-11-12+13.40.05.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-1905509010662723036?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/1905509010662723036/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2010/11/googlr-developer-day-2010-moscow.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/1905509010662723036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/1905509010662723036'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2010/11/googlr-developer-day-2010-moscow.html' title='Google Developer Day 2010 Moscow'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_SXPVbpFLOms/TN5q4CmuKLI/AAAAAAAAAIo/BRZYoPxa9rI/s72-c/2010-11-12+08.29.11.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-1378266373097862605</id><published>2010-09-10T12:27:00.005+04:00</published><updated>2010-09-10T16:26:22.339+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cdi'/><title type='text'>Об опыте использования рефлексии...</title><content type='html'>Никогда не думал, что придется столкнуться с необходимостью писать код, анализирующий самого себя, но недавно это случилось. Нужно отметить, что многие разработчики вообще не используют такую методику ни при каких обстоятельствах... Но оказалось, что такой код становиться невероятно гибким. Почему?&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://live-scopes.blogspot.com/2010/09/blog-post.html" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://2.bp.blogspot.com/_SXPVbpFLOms/TInrz4boNwI/AAAAAAAAAIg/vIfNsIz9qG4/s320/reflection.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Написание такого кода привело меня к выделению следующих особенностей:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Самоанализ позволяет внедрить множественное конфигурирование на уровне самого кода, что делает систему гибкой и модульной.&lt;/li&gt;&lt;li&gt;Определившись с интерфесом (я не имею ввиду java интерфесы) анализируемых классов не нужно делать никаких(!) измений в коде. Возможно только вы захотите использовать аннотации, что все равно остается весьма гибким решением. ;)&lt;/li&gt;&lt;li&gt;Мы получаем независимость кода от существования и правильности CDI. Конечно, если вы правильно написали анализирующий код...&lt;/li&gt;&lt;li&gt;Из логики кода уходит огромное количество лишнего кода, проверяющего возможность использования зависимостей.&lt;/li&gt;&lt;li&gt;И самое привлекательное, что становиться возможным создать общий интерфейс обмена параметрами! Вам больше не нужно думать и беспокоиться о количестве параметров в вызываемом методе, вы просто создаете специальный объект, по свойствам которого и будет выбираться метод.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Достоинства весьма привлекательные для меня, но возможно они незначительны для других разработчиков из-за очевидных проблем:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Очень непросто определить правила анализа кода в конкретном проекте.&lt;/li&gt;&lt;li&gt;Сложно унифицировать данные правила для выделения универсального функционала.&lt;/li&gt;&lt;li&gt;Интерфейс обмена параметрами далеко не всегда можно унифицировать даже в каком-то одном модуле в проекте без излишнего усложнения архитектуры.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Решение этих проблем может привести к созданию весьма удобного фреймворка, но пока достойного решения лично мне в голову не приходит... Хотя отдельные задатки такого функционала уже существуют в узкоспециализированных библиотеках (Spring Forms, Hibernate).&lt;br /&gt;&lt;br /&gt;При всех прелестях, которые я для себя нашел в таком подходе нужно быть предельно осторожным с производительностью... Самоанализ сильно тормозит систему, поэтому использовать рефлексию необходимо только тогда, когда выигрыш от такого анализа (например, отсечение лишних вычислений), будет значительно больше чем потери от самоанализа.&lt;br /&gt;&lt;a rev="vote-for" href="http://progg.ru/%D0%9E%D0%B1-%D0%BE%D0%BF%D1%8B%D1%82%D0%B5-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8-%D1%80%D0%B5%D1%84%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D0%B8"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Flive-scopes.blogspot.com%2F2010%2F09%2Fblog-post.html" style="border:0px"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-1378266373097862605?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/1378266373097862605/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2010/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/1378266373097862605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/1378266373097862605'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2010/09/blog-post.html' title='Об опыте использования рефлексии...'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_SXPVbpFLOms/TInrz4boNwI/AAAAAAAAAIg/vIfNsIz9qG4/s72-c/reflection.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-6632029850346737893</id><published>2010-07-23T19:22:00.002+04:00</published><updated>2010-07-26T18:13:30.952+04:00</updated><title type='text'>XSLT Templater - шаблонизация на стороне клиента</title><content type='html'>В начале июля мне удалось съездить на &lt;a href="http://fotki.yandex.ru/users/ya-events/view/302024?page=2"&gt;Я.Субботник&lt;/a&gt;, на котором меня вдохновил Степан Резников своим докладом про &lt;a href="http://video.yandex.ru/users/ya-events/view/177/"&gt;клиентскую шаблонизацию&lt;/a&gt;... &lt;br /&gt;&lt;br /&gt;Настолько вдохновил, что захотелось написать собственное решение, чем я собственно и занялся. Сразу оговорюсь, что я не любитель изобретать велосипеды (хотя нет... на самом деле любитель), но варианты, которые существовали на тот момент меня не очень привлекали. И написаны они были хорошо, и работали быстро и надежно, но лично мне работать с ними было неудобно - неудобно вызывать, неудобно обращаться к результатам обработки и т.д. и т.п.&lt;br /&gt;&lt;br /&gt;В качестве технологической базы выбрал XSLT, хотя JS шаблонизация во многих случая предпочтительней, но уж больно давно мне полюбилась эта технология (благодаря, кстати, &lt;a href="http://www.mozartframework.ru"&gt;Mozart Framework&lt;/a&gt;). В результате этого моего увлечения появился плагин для jQuery:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.xslt-templater.com" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="68" src="http://3.bp.blogspot.com/_SXPVbpFLOms/TD2Snmb_WQI/AAAAAAAAAIM/cWbOUd7VpXQ/s320/XSLTTemplater.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;XSLT Templater&lt;/strong&gt;  - плагин для фреймворка jQuery, реализующий следующие задачи:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;XML/XSLT процессинг&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Плагин позволяет произвести XSLT преобразования для предаваемых в качестве аргументов xml и xsl. Причем xml и xsl могут предоставляться в трех формах:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Строковое представление&lt;/em&gt;&lt;br /&gt;В этом случае плагин самостоятельно распарсит строковое представление XML, и произведет необходимые вычисления. Такой вариант представления удобен прежде всего в тех ситуациях, когда необходим самостоятельный контроль за доставкой или генерацией исходного xml или xsl шаблона.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Ссылка на файл/ресурс&lt;/em&gt;&lt;br /&gt;Плагин с помощью AJAX загрузит необходимые данные из внешнего источника (в пределах домена) и произведит необходимые преобразования. Все просто - указываем путь к xml и xsl на сервере, а получаем результат преобразований.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;XMLDocument&lt;/em&gt;&lt;br /&gt;В такой ситуации плагин не будет производить каких-либо дополнительных операций, а будет сразу использовать аргумент в виде XMLDocument при XSLT процессинге. Этот вариант мне понадобился, когда я попробовал написать специфическую систему кэширования поверх плагина, после чего появился и один из нижеописанных уровней кэширования.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;В результате, три формы представления позволяются разработчику настроить свою систему кэширования, для организации специфической шаблонизации - мало ли чего разработчику придет в голову.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кэширование XML/XSLT на двух уровнях&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Кэширование позволяет организовать хранение xml/xsl для повторного использования, что и реализует базовые возможности для шаблонизации с вычислительными возможностями XSLT. Кэширование организуется на двух уровнях:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Пользовательский уровень&lt;/em&gt;&lt;br /&gt;Пользователь самостоятельно управляет кэшированием с доступом только к результатам последнего преобразования. Это очень удобно, когда при ручной обработке нужно повторно использовать предыдущие аргументы. А так как кэшируется сразу XMLDocument, то наглядно получаем некоторую прибавку в скорости... Хотя нужно отметить, что самой тяжелой операцией по-прежнему является сама трансформация. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Базовый уровень&lt;/em&gt;&lt;br /&gt;Внутреннее кэширование плагина, включенное по умолчанию на кэширование только xsl. Можно переключать внутренний кэш между четырьмя различными уровнями, но на практике из четырех режимов понадобятся всего 2-3.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Кэширование ведется, только для  аргументов со строковым типом – строковое представление xml  или ссылка на ресурс - это необходимость ассоциативных массивов. Оба уровня кэширования можно использовать совместно, но при этом они являются полностью независимыми.&lt;br /&gt;&lt;br /&gt;Внутренне кэширование предполагает, что пользователь контролирует порядок вызовов нескольких преобразований над одинаковыми входными данными. Иными словами, два идентичных последовательных вызова преобразования будут работать (в силу асинхронности JavaScript) с идентичным состоянием кэша, что означает, что одинаковые ресурсы могут быть загружены несколько раз. При этом, существует механизм позволяющий организовывать цепочки преобразований, на основе обратных вызовов. Этот механизм позволяет  установить четкую очередь обработки вызовов, что в свою очередь позволяет использовать актуальное состояние кэша при каждом отдельном преобразовании.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Плагин поддерживает следующие браузеры: &lt;em&gt;IE 6+, Firefox, Opera, Chrome, Safari&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Различные способы вызова&lt;/h3&gt;&lt;br /&gt;Преобразования осуществляются контекстно - относительно элемента контейнера для результирующего представления. И исходный xml и xsl могут представляться в трех различных формах.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Строковые представления&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Пусть существуют следующие строковые представления:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #3366cc;"&gt;"&amp;lt;xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;message&amp;gt;It&amp;nbsp;working&amp;nbsp;with&amp;nbsp;string&amp;nbsp;representation&amp;nbsp;of&amp;nbsp;xml&amp;lt;/message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366cc;"&gt;"&amp;lt;/xml-message&amp;gt;"&lt;/span&gt;&lt;/blockquote&gt;и&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #3366cc;"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:stylesheet&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;nbsp;version="1.0"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:template&amp;nbsp;match="xml-message"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;p&amp;gt;Result:&amp;nbsp;&amp;lt;xsl:value-of&amp;nbsp;select="message/text()"/&amp;gt;!&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:template&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:stylesheet&amp;gt;'&lt;/span&gt;&lt;/blockquote&gt;Тогда вызов xml/xsl трансформации будет выглядеть следующим образом:&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"&amp;lt;xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;message&amp;gt;It&amp;nbsp;working&amp;nbsp;with&amp;nbsp;string&amp;nbsp;representation&amp;nbsp;of&amp;nbsp;xml&amp;lt;/message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;/xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:stylesheet&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;nbsp;version="1.0"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:template&amp;nbsp;match="xml-message"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;p&amp;gt;Result:&amp;nbsp;&amp;lt;xsl:value-of&amp;nbsp;select="message/text()"/&amp;gt;!&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:template&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:stylesheet&amp;gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;или&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xmlString&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;message&amp;gt;It&amp;nbsp;working&amp;nbsp;with&amp;nbsp;string&amp;nbsp;representation&amp;nbsp;of&amp;nbsp;xml&amp;lt;/message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;/xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xslString&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:stylesheet&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;nbsp;version="1.0"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:template&amp;nbsp;match="xml-message"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;p&amp;gt;Result:&amp;nbsp;&amp;lt;xsl:value-of&amp;nbsp;select="message/text()"/&amp;gt;!&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:template&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:stylesheet&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ссылка на ресурс&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Пусть существует следующий файл или скрипт возвращающий следующую структуру:&lt;br /&gt;&lt;em&gt;/tests/data/message.xml&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"1.0"&lt;/span&gt;&lt;span style="color: black;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;xml-message&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;message&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;It&amp;nbsp;working&amp;nbsp;with&amp;nbsp;loading&amp;nbsp;xml&amp;nbsp;file&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/message&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/xml-message&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;и&lt;br /&gt;&lt;em&gt;/tests/xslt/message-template.xsl&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;?xml&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"1.0"&lt;/span&gt;&lt;span style="color: black;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;xsl:stylesheet&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;xmlns:xsl&lt;/span&gt;=&lt;span style="color: red;"&gt;"http://www.w3.org/1999/XSL/Transform"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;version&lt;/span&gt;=&lt;span style="color: red;"&gt;"1.0"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;xsl:template&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;match&lt;/span&gt;=&lt;span style="color: red;"&gt;"xml-message"&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;p&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Result:&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;xsl:value-of&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000066;"&gt;select&lt;/span&gt;=&lt;span style="color: red;"&gt;"message/text()"&lt;/span&gt;&lt;span style="color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;and&amp;nbsp;loading&amp;nbsp;xslt&amp;nbsp;file!&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/p&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/xsl:template&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: black;"&gt;&amp;lt;/xsl:stylesheet&lt;span style="color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;В этом случае вызов будет осуществляться следующим образом:&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test2'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;В виде XMLDocument&lt;/strong&gt; (см.  Работа с пользовательским кешем)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Комплексный пример:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xslString&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:stylesheet&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;nbsp;version="1.0"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:template&amp;nbsp;match="xml-message"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;p&amp;gt;Result:&amp;nbsp;&amp;lt;xsl:value-of&amp;nbsp;select="message/text()"/&amp;gt;!&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:template&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:stylesheet&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test2'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Обратные вызовы&lt;/h3&gt;&lt;br /&gt;Для синхронизации работы нескольких вызовов и организации работы с кэшом существует механизм обратных вызовов:&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test2'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.&lt;span style="color: #660066;"&gt;debug&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"Text&amp;nbsp;message&amp;nbsp;after&amp;nbsp;transformation!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;Этот механизм позволяет организовывать цепочки вызовов, причем каждый обратный вызов уже будет иметь доступ к состоянию кеша после предыдущего вызова:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xslString&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:stylesheet&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;nbsp;version="1.0"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:template&amp;nbsp;match="xml-message"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;p&amp;gt;Result:&amp;nbsp;&amp;lt;xsl:value-of&amp;nbsp;select="message/text()"/&amp;gt;!&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:template&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:stylesheet&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test2'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test3'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test4'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.&lt;span style="color: #660066;"&gt;debug&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"Text&amp;nbsp;message&amp;nbsp;after&amp;nbsp;all&amp;nbsp;transformations&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Работа с пользовательским кэшем&lt;/h3&gt;&lt;br /&gt;Пользовательский (локальный) кэш необходим для самостоятельного контроля кэширования внутри шаблонизатора. Локальный кэш передается непосредственно в функцию преобразования, поэтому с его помощью существует доступ только к результатам кэширования последнего выполненного преобразования. Если локальный кэш передается в качестве аргумента, то необходимо получить экземпляр локального кэша:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xsltCache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;$.&lt;span style="color: #660066;"&gt;getXSLTLocalCache&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onUnlock&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;state&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.&lt;span style="color: #660066;"&gt;debug&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'New&amp;nbsp;value&amp;nbsp;in&amp;nbsp;cache'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;Теперь этот экземпляр можно использовать в вызовах:&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test2'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test3'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xsltCache.&lt;span style="color: #660066;"&gt;getXmlDoc&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xsltCache&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #006600;"&gt;&lt;br /&gt;//&amp;nbsp;using&amp;nbsp;result&amp;nbsp;of&amp;nbsp;caching&amp;nbsp;xml&amp;nbsp;representation&amp;nbsp;in&amp;nbsp;callback&amp;nbsp;function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xsltCache&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;span style="color: #006600;"&gt;//&amp;nbsp;insert&amp;nbsp;local&amp;nbsp;cache&amp;nbsp;to&amp;nbsp;transformation&amp;nbsp;function&amp;nbsp;and&amp;nbsp;switch&amp;nbsp;off&amp;nbsp;base&amp;nbsp;cache&lt;/span&gt;&lt;/blockquote&gt;В приведенном примере стоит обратить внимание на следующие особенности:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;xsltCache.getXmlDoc()&lt;/strong&gt; – получение XMLDocument исходного xml из предыдущего вызова&lt;/li&gt;&lt;li&gt;&lt;strong&gt;…null,xsltCache,false… во внутреннем вызове&lt;/strong&gt; - null вместо функции обратного вызова, повторное использование локального кэша, полное отключение внутреннего (базового) кэширования плагина&lt;/li&gt;&lt;/ul&gt;Таким образом, после обработки первого вызова экземпляр кэша будет содержать XMLDocument для xml и xsl, которые можно использовать повторно.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Методы пользовательского кэша&lt;/h3&gt;&lt;br /&gt;&lt;table class="methods"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;th&gt;Методы&lt;/th&gt;       &lt;th&gt;Описание&lt;/th&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;checkXmlDoc()&lt;/td&gt;       &lt;td&gt;Проверяет наличие в xml кэше значения. Возвращает true, если значение установлено, false – в обратном случае&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;checkXslDoc()&lt;/td&gt;       &lt;td&gt;Проверяет наличие в xsl кэше значения. Возвращает true, если значение установлено, false – в обратном случае&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;getXmlDoc()&lt;/td&gt;       &lt;td&gt;Возвращает значение xml кэша. Если значение не было установлено, то возвращает false&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;getXslDoc()&lt;/td&gt;       &lt;td&gt;Возвращает значение xsl кэша. Если значение не было установлено, то возвращает false&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;lock()&lt;/td&gt;       &lt;td&gt;Сервисный метод для проверки возможности работы с кэшом. Имеет только информативный смысл.  &lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;setXmlDoc(xml)&lt;/td&gt;       &lt;td&gt;Устанавливает новое значение xml кэша. Используется внутри плагина.&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;setXslDoc(xml)&lt;/td&gt;       &lt;td&gt;Устанавливает новое значение xsl кэша. Используется внутри плагина.&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;reset&lt;/td&gt;       &lt;td&gt;Сбрасывает все значения кэша&lt;/td&gt;      &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;unlock&lt;/td&gt;       &lt;td&gt;Сервисный метод для проверки возможности работы с кэшом. Имеет только информативный смысл.  &lt;/td&gt;      &lt;/tr&gt;&lt;/tbody&gt;    &lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Работа с базовым кэшом&lt;/h3&gt;&lt;br /&gt;Базовый кэш используется внутри плагина для оптимизации преобразований. Кэширование происходит на основе строкового ключа (строковое представление xml или ссылка на ресурс) Возможны четыре состояния внутреннего кэша:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Кэшируется только xsl – режим по умолчанию&lt;/strong&gt;&lt;br /&gt;Этот режим предполагает ситуацию, когда шаблон загружается только один раз, а данные периодически обновляются. В этом случае подготовка шаблона к преобразованиям будет произведена только один раз.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кэшируется только xml&lt;/strong&gt;&lt;br /&gt;В этом режиме предполагается, что для одних, статических данных меняется только форма представления (шаблон)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кешируется и xml, и xsl&lt;/strong&gt;&lt;br /&gt;В этом случае предполагается, что и данные и представление являются статическим. Как правило, данный вариант используется, когда существует неопределенность о возможности повторной загрузки статического контента.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Кеширование не происходит&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Настройка базового кэша&lt;/h3&gt;&lt;br /&gt;Для четырех различных случаев кэширование настраивается по-разному:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Кэшируется только xsl – режим по умолчанию&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;или&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;cache&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Кэшируется только xml&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;cache&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Кешируется и xml, и xsl&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;true&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;или&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;cache&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Кеширование не происходит&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;или&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;cache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;cache&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Комплексный пример&lt;/h3&gt;&lt;blockquote&gt;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;document&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;ready&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;time&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;new&lt;/span&gt;&amp;nbsp;Date&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xmlString&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;message&amp;gt;It&amp;nbsp;working&amp;nbsp;with&amp;nbsp;string&amp;nbsp;representation&amp;nbsp;of&amp;nbsp;xml&amp;lt;/message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;"&amp;lt;/xml-message&amp;gt;"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xslString&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:stylesheet&amp;nbsp;xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;nbsp;version="1.0"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;xsl:template&amp;nbsp;match="xml-message"&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;p&amp;gt;Result:&amp;nbsp;&amp;lt;xsl:value-of&amp;nbsp;select="message/text()"/&amp;gt;!&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:template&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #3366cc;"&gt;'&amp;lt;/xsl:stylesheet&amp;gt;'&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test1'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xmlString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;xsltCache&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;$.&lt;span style="color: #660066;"&gt;getXSLTLocalCache&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onUnlock&lt;span style="color: #339933;"&gt;:&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;state&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.&lt;span style="color: #660066;"&gt;debug&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"Text&amp;nbsp;message&amp;nbsp;after&amp;nbsp;setting&amp;nbsp;new&amp;nbsp;value&amp;nbsp;in&amp;nbsp;local&amp;nbsp;cache!"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test2'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/data/message.xml"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xslString&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test3'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xsltCache.&lt;span style="color: #660066;"&gt;getXmlDoc&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"/tests/xslt/message-template.xsl"&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;'#test4'&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;xslt&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;xsltCache.&lt;span style="color: #660066;"&gt;getXmlDoc&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xsltCache.&lt;span style="color: #660066;"&gt;getXslDoc&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;function&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="color: #009900;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #003366;"&gt;var&lt;/span&gt;&amp;nbsp;time2&amp;nbsp;&lt;span style="color: #339933;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;new&lt;/span&gt;&amp;nbsp;Date&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"#time"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #660066;"&gt;text&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #3366cc;"&gt;"Calculating&amp;nbsp;time:"&lt;/span&gt;&lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;time2&lt;span style="color: #339933;"&gt;-&lt;/span&gt;time&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xsltCache&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xsltCache&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt;xsltCache&lt;span style="color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="color: #003366;"&gt;false&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Официальный сайт: &lt;a href="http://www.xslt-templater.com"&gt;http://www.xslt-templater.com&lt;/a&gt;&lt;br /&gt;Страница проекта: &lt;a href="http://code.google.com/p/xslt-templater/"&gt;http://code.google.com/p/xslt-templater/&lt;/a&gt;&lt;br /&gt;Страница на jQuery.com: &lt;a href="http://plugins.jquery.com/project/XSLTTemplater"&gt;http://plugins.jquery.com/project/XSLTTemplater&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вот так, интересно ваше мнение...&lt;br /&gt;&lt;br /&gt;&lt;a rev="vote-for" href="http://progg.ru/XSLT-Templater-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%B5-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Flive-scopes.blogspot.com%2F2010%2F07%2Fxslt-templater.html" style="border:0px"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1944741812972729020-6632029850346737893?l=www.devlogg.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.devlogg.com/feeds/6632029850346737893/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.devlogg.com/2010/07/xslt-templater.html#comment-form' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/6632029850346737893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1944741812972729020/posts/default/6632029850346737893'/><link rel='alternate' type='text/html' href='http://www.devlogg.com/2010/07/xslt-templater.html' title='XSLT Templater - шаблонизация на стороне клиента'/><author><name>Oleg Tsarev</name><uri>http://www.blogger.com/profile/12282729608112690108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_SXPVbpFLOms/S56IW4CYXzI/AAAAAAAAAB4/VIFNdEHMGwA/S220/x_de444470.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_SXPVbpFLOms/TD2Snmb_WQI/AAAAAAAAAIM/cWbOUd7VpXQ/s72-c/XSLTTemplater.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1944741812972729020.post-8059649033459483006</id><published>2010-03-31T12:25:00.007+04:00</published><updated>2010-07-07T14:50:47.059+04:00</updated><title type='text'>Отслеживание сторонних изменений через JavaScript</title><content type='html'>Что делать, если нужно отследить изменения, совершаемые через JavaScript?&lt;br /&gt;&lt;br /&gt;Такие изменения нельзя отловить обработчиками событий к элементам. Следовательно ответ напрашивается сам собой - изменить js код!&lt;br /&gt;&lt;br /&gt;А что если мы не имеем права его изменять? Что если наша необходимость локальна и не требует "таких глобальных" решений?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Допустим, что у нас есть некоторое текстовое поле, значение которого изменяется какой-либо сторонней библиотекой...Тогда существуют следующие варианты:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Использование таймера для постоянного опроса.&lt;/b&gt;&lt;br /&gt;В этом случае необходимо создать с помощью интервала циклический вызов функции, которая будет постоянно вытаскивать значение из текстового поля и сравнивать его с предыдущим:&lt;br /&gt;&lt;blockquote&gt;setInterval&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#003366"&gt;function&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt;&lt;font color="#000066"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#009900"&gt;&amp;#40;&lt;/font&gt;input.&lt;font color="#660066"&gt;value&lt;/font&gt;&lt;font color="#339933"&gt;!=&lt;/font&gt;oldValue&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#123;&lt;/font&gt;...&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#125;&lt;/font&gt;&lt;font color="#339933"&gt;,&lt;/font&gt;&amp;nbsp;&lt;font color="#CC0000"&gt;1000&lt;/font&gt;&lt;font color="#009900"&gt;&amp;#41;&lt;/font&gt;&lt;font color="#339933"&gt;;&lt;/font&gt;&amp;nbsp;&lt;/blockquote&gt;+ простота&lt;br /&gt;- задержка реакции на изменение значения поля&lt;br /&gt;- иногда может повисать страница из-за зацикливания&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Внедрение заготовленной функции в библиотечную.&lt;/b&gt;&lt;br /&gt;Процесс внедрения происходит не в самом коде библиотеки, а динамически на самой странице). Это решает проблемы, например, с лицензией и тому подобным, что может мешать редактировать саму библиотеку, но несколько сложнее чем в предыдущем случае)&lt;br /&gt;&lt;br /&gt;В основе такого внедрения лежит факт объектной природы функции в JS и специфика конвертации типов.&lt;br /&gt;&lt;br /&gt;Приведу пример...)&lt;br /&gt;Допустим у нас есть некоторая функция:&lt;br /&gt;&lt;blockquote&gt;&lt;font color="#003366"&gt;function&lt;/font&gt;&amp;nb
