Rod*_*zel 5 freemarker struts2
背景
我们有一个使用Struts 2和Freemarker构建的现有webapp,我通过复制一些代码和模板创建了一个变体.克鲁迪,但可管理.然而,我们将很快制作其他一些变体(需要单独的WAR),使复制变得站不住脚.我的想法是将所有共享内容放入每个webapp包含的jar中:公共文件可以在一个地方维护,甚至更好的给定webapp可以覆盖类路径中的文件.到目前为止,我已经能够使用代码执行此操作,但是Convention插件使得为Freemarker模板执行相同操作变得困难.
问题
到目前为止,我们的webapp依靠Convention来为应用程序启动时的动作找到Freemarker"动作结果"(即模板),从而使我们不必繁琐地注释每个动作.如果我已经正确地追踪了事情,那么班级DefaultResultMapBuilder负责找到行动结果; 特别是,该方法createFromResources在webapp中查找,然后在类路径中查找与我们的操作匹配的模板文件.
这正是我想要的 - 除了我们放置模板/WEB-INF以保护它们免受外部访问(使用struts.convention.result.path我们的Struts配置中的常量).到目前为止,这个工作正常,所有模板文件都在下面/WEB-INF,但是它也不能在类路径上使用文件. DefaultResultMapBuilder当然可以在类路径上找到文件,但只有当webapp模板直接位于上下文根目录下时,因为任何类路径模板都必须位于与上下文根目录下模板的目录结构等效的包结构中.对于在"struts.convention.result.path"以"/ WEB-INF /"开头时要求的操作结果,需要一个名为"web-inf"的根包 - 但当然包名中不允许使用连字符.
(请注意,此问题与TemplateLoader以后用于实际获取模板文件的类无关.加载过程很容易配置为在许多地方查找 - 但如果找不到"操作结果",应用程序永远不会那么远如果两个进程使用相同的配置,这将是很好的...)
解决方案?
所以......我可以将所有模板移到外面,/WEB-INF但实际上我不愿意.或者我可以为每个动作类提供特定的注释,并且我宁愿不再(实际上它可能会遇到同样的问题).
或者我可以ResultMapBuilder通过复制和稍微改变来实现我自己的实现DefaultResultMapBuilder(后者中的每个成员都是私有的,所以我不能扩展类并只更改相关部分 - 唉!),然后弄清楚如何覆盖"struts-plugin.xml"Struts配置文件(更改org.apache.struts2.convention.ResultMapBuilderbean),因此我在查看类路径时可以让Convention忽略"/ WEB-INF".或者更好的是,在查看ServletContext时始终使用"/ WEB-INF /"为路径添加前缀.
但也许有一种更简单的方法?一些无证的配置魔术?
| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |