[
http://www.stripesframework.org/jira/browse/STS-861?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Haggi updated STS-861:
----------------------
Attachment: LayoutWriter.java
LayoutRenderTag.java
LayoutDefinitionTag.java
> freemarker.template.TemplateModelException when using Stripes LayoutRenderTag
> with Freemarker 2.3.18
> ----------------------------------------------------------------------------------------------------
>
> Key: STS-861
> URL: http://www.stripesframework.org/jira/browse/STS-861
> Project: Stripes
> Issue Type: Bug
> Components: Tag Library
> Affects Versions: Release 1.5.4, Release 1.5.5, Release 1.5.6
> Environment: Freemarker 2.3.18
> Stripes 1.5.6
> Reporter: Haggi
> Attachments: LayoutDefinitionTag.java, LayoutRenderTag.java,
> LayoutWriter.java
>
>
> We managed Stripes LayoutRenderTag to work with the latest version of
> Freemarker 2.3.x. without the need of a dynamic attribute to be set.
> Freemarker throws some curious exception when using the LayoutRenderTag
> without a dynamic attribute.
> It's because Stripes overrides the Tagwriter instance of Freemarker in the
> getContext() method of the LayoutRenderTag class within the doStartTag()
> method. That's a problem because Freemarks checks if the Writer (Tagwriter)
> before the Tag is called is the same like after Tag processing.
> If you set a dynamic attribute on the layout-render tag the getContext()
> method in LayoutRenderTag is called within the setDynamicAttribute() method
> and before the doStartTag() method is invoked. If the LayoutContext is
> initialized before the doStartTag() method is invoked all goes fine.
> So i override the setPageContext() method within the LayoutRenderTag class
> and call the getContext() method before anything else is invoked.
> {code:title=LayoutRenderTag.java|borderStyle=solid}
> @Override
> public void setPageContext(PageContext pageContext) {
> super.setPageContext(pageContext);
> this.getContext();
> }
> {code}
> Here is the layout used in my tests:
> {code:title=layout.ftl with the layout-definition|borderStyle=solid}
> <#ftl>
> <#assign s=JspTaglibs["http://stripes.sourceforge.net/stripes.tld"]/>
> <@s["layout-definition"]>
> HEAD: <@s["layout-component"] name="html_head" /><br/>
> BODY: <@s["layout-component"] name="body" />
> </@>
> {code}
> {code:title=test.ftl with the layout-render|borderStyle=solid}
> <#ftl>
> <#assign s=JspTaglibs["http://stripes.sourceforge.net/stripes.tld"]/>
> <@s["layout-render"] name="/web/manager/layout/default.ftl">
> <@s["layout-component"] name="html_head">
> Here is the head
> </@>
> <@s["layout-component"] name="body">
> Here is the body
> </@>
> </@>
> {code}
> There some other really annoying problems when using Stripes and Freemarker
> we have managed to go away.
> {code}
> 12:58:42 WARN: freemarker.jsp - Tag.SKIP_PAGE was ignored from a
> net.sourceforge.stripes.tag.layout.LayoutDefinitionTag tag.
> {code}
> This execption is raised because of the SKIP_PAGE return value in
> LayoutDefinitionTag class in the doEndTag() method.
> I change the return value in EVAL_PAGE to prevent the output of the WARN
> message.
> and
> in the LayoutWriter class the flush() method throw an unhandled exception
> NullPointerException because the expected Writer is null. The root cause is
> unknown, but i added a null-check to prevent this WARN message too.
> After that all pages renders fine, i can use Freemarker templates with layout
> tags of Stripes.
> {code}
> 12:58:42 WARN: net.sourceforge.stripes.exception.DefaultExceptionHandler -
> Unhandled exception caught by the Stripes default exception handler.
> java.lang.NullPointerException
> at
> net.sourceforge.stripes.tag.layout.LayoutWriter.flush(LayoutWriter.java:125)
> at freemarker.ext.jsp.JspWriterAdapter.flush(JspWriterAdapter.java:40)
> at
> net.sourceforge.stripes.tag.layout.LayoutWriter.tryFlush(LayoutWriter.java:108)
> at
> net.sourceforge.stripes.tag.layout.LayoutWriter.setSilent(LayoutWriter.java:70)
> at
> net.sourceforge.stripes.tag.layout.LayoutRenderTag.doEndTag(LayoutRenderTag.java:189)
> at
> freemarker.ext.jsp.TagTransformModel$TagWriter.endEvaluation(TagTransformModel.java:430)
> at
> freemarker.ext.jsp.TagTransformModel$TagWriter.afterBody(TagTransformModel.java:406)
> at freemarker.core.Environment.visit(Environment.java:312)
> at freemarker.core.UnifiedCall.accept(UnifiedCall.java:130)
> at freemarker.core.Environment.visit(Environment.java:221)
> at freemarker.core.MixedContent.accept(MixedContent.java:92)
> at freemarker.core.Environment.visit(Environment.java:221)
> at freemarker.core.Environment.process(Environment.java:199)
> at freemarker.template.Template.process(Template.java:237)
> at
> freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:452)
> at
> freemarker.ext.servlet.FreemarkerServlet.doGet(FreemarkerServlet.java:391)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
> at
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
> at
> org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
> at
> org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
> at
> org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
> at
> net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
> at
> net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508)
> at
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
> at
> org.stripesstuff.plugin.security.SecurityInterceptor.intercept(SecurityInterceptor.java:140)
> at
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
> at
> net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99)
> at
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
> at
> net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
> at
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
> at
> net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
> at
> net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502)
> at
> net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286)
> at
> net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
> at
> net.sourceforge.stripes.controller.DynamicMappingFilter$2.doFilter(DynamicMappingFilter.java:431)
> at
> net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
> at
> net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:418)
> at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
> at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
> at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
> at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
> at
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
> at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
> at
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
> at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
> at
> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
> at
> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
> at
> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:619)
> {code}
--
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure
contains a definitive record of customers, application performance,
security threats, fraudulent activity, and more. Splunk takes this
data and makes sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-novd2d
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development