Template Overriding not work
----------------------------

                 Key: WW-3522
                 URL: https://issues.apache.org/jira/browse/WW-3522
             Project: Struts 2
          Issue Type: Bug
    Affects Versions: 2.2.1
         Environment: All
            Reporter: Li Ying


===========================================================
The problem:

If you modify some template of Struts2 tag, and put it into a folder under the 
web root.
then the new template file should override the old template shipped with 
Struts2.

It is described in this document:
http://struts.apache.org/2.2.1/docs/template-loading.html

But in Struts2.2.1, it not works. The old template, but not the new template, 
always get used.


===========================================================
My investigation report:

I have spent several hours on this problem, and i think i have found what is 
wrong.

(1) In class [org.apache.struts2.views.freemarker.FreemarkerManager], there are 
method [init] and [createTemplateLoader]

(2) In method [init], it read the servlet context parameter "TemplatePath" or 
"templatePath", if either of them are set, FreemarkerManager will use
a default value, which is "class://"

(3) In method [createTemplateLoader], it will create a ClassTemplateLoader (if 
the value of "TemplatePath" starts with "class://") or a FileTemplateLoader(if 
the value of "TemplatePath" starts with "file://"), and this TemplateLoader 
will get a higher priority than WebappTemplateLoader.

(4) If you don't set parameter [TemplatePath], the default value "class://" 
will cause a ClassTemplateLoader be created. And it will always load template 
from [Struts2-core.2.2.1.jar] successfully, so the WebappTemplateLoader get no 
chance to load the overridden template files.

So, if you use the default setting, Template overriding will not work in 
Struts2.2.1.
The only way to make it work is:
set a invalid value for [TemplatePath], then FreemarkerManager will ignore it, 
and
don't create ClassTemplateLoader or FileTemplateLoader,
so WebappTemplateLoader will get work correctly.


I have looked the SVN, it looks like these codes were changed in revision 
835248 at Nov/12/2009.
The previous revision 719672 use the parameter [TemplatePath] as an absolute 
file path, and only create the FileTemplateLoader.
That why there were not this bug in this revision.


===========================================================
My suggestion:

Delete the default value of [TemplatePath].
If user don't set it, then neither ClassTemplateLoader nor FileTemplateLoader 
should be created.
Only if user set it, they explicitly want it, then ClassTemplateLoader or 
FileTemplateLoader should be created.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to