为什么 Tiles REGEXP 通配符定义会导致无尽的 jsp 包含错误

2023-12-08

我将tiles 2.2.2与Struts2 2.2.3一起使用,因为Struts2-Tiles插件相当旧,它的实现使用了许多Tiles已弃用的API,并且我想尝试REGEXP通配符,所以我在下面实现了我自己的监听器:

我的TilesContainerFactory

package tiles;

import org.apache.tiles.definition.pattern.DefinitionPatternMatcherFactory;
import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
import org.apache.tiles.definition.pattern.PrefixedPatternDefinitionResolver;
import org.apache.tiles.definition.pattern.regexp.RegexpDefinitionPatternMatcherFactory;
import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
import org.apache.tiles.factory.BasicTilesContainerFactory;


public class MyTilesContainerFactory extends BasicTilesContainerFactory {

  @Override
  protected <T> PatternDefinitionResolver<T> createPatternDefinitionResolver(Class<T> customizationKeyClass) {

    DefinitionPatternMatcherFactory wildcardFactory = new WildcardDefinitionPatternMatcherFactory();
    DefinitionPatternMatcherFactory regexpFactory = new RegexpDefinitionPatternMatcherFactory();
    PrefixedPatternDefinitionResolver<T> resolver = new PrefixedPatternDefinitionResolver<T>();
    resolver.registerDefinitionPatternMatcherFactory("WILDCARD", wildcardFactory);
    resolver.registerDefinitionPatternMatcherFactory("REGEXP", regexpFactory);
    return resolver;
  }
}

MyTiles初始化器

package tiles;

import org.apache.tiles.TilesApplicationContext;
import org.apache.tiles.factory.AbstractTilesContainerFactory;
import org.apache.tiles.startup.AbstractTilesInitializer;


public class MyTilesInitializer extends AbstractTilesInitializer {

  @Override
  protected AbstractTilesContainerFactory createContainerFactory(TilesApplicationContext context) {
    return new MyTilesContainerFactory();
  }

}

MyTilesListener

package tiles;

import org.apache.tiles.startup.TilesInitializer;
import org.apache.tiles.web.startup.AbstractTilesListener;


public class MyTilesListener extends AbstractTilesListener {

  @Override
  protected TilesInitializer createTilesInitializer() {
    return new MyTilesInitializer();
  }


}

然后我定义我的tiles.xml

<tiles-definitions>
  <definition name="REGEXP:(.*)" template="/WEB-INF/tiles/basicLayout.jsp">
    <put-attribute name="header" value="/WEB-INF/tiles/header.jsp" />
    <put-attribute name="content" value="/WEB-INF/pages/{1}.jsp" />
    <put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp" />
  </definition>
</tiles-definitions>

当我尝试返回图块结果的操作时,它最终会出现无限循环,即 jsp include 错误。

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.StackOverflowError
    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
    at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228)
    at java.io.File.exists(File.java:733)
    at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:999)
    at sun.misc.URLClassPath.getResource(URLClassPath.java:169)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at org.apache.jasper.compiler.ErrorDispatcher.createJavacError(ErrorDispatcher.java:526)
    at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:490)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:638)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:632)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:103)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:96)
    at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:690)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:644)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:627)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321)
    at org.apache.tiles.renderer.impl.DefinitionAttributeRenderer.write(DefinitionAttributeRenderer.java:56)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.renderer.impl.ChainedDelegateAttributeRenderer.write(ChainedDelegateAttributeRenderer.java:76)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:336)
    at org.apache.tiles.template.InsertAttributeModel.renderAttribute(InsertAttributeModel.java:210)
    at org.apache.tiles.template.InsertAttributeModel.end(InsertAttributeModel.java:126)
    at org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:311)
    at org.apache.jsp.WEB_002dINF.tiles.basicLayout_jsp._jspx_meth_tiles_005finsertAttribute_005f0(basicLayout_jsp.java:128)
    at org.apache.jsp.WEB_002dINF.tiles.basicLayout_jsp._jspService(basicLayout_jsp.java:93)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jasper.runtime.PageContextImpl.doInclude(PageContextImpl.java:638)
    at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:632)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.include(JspTilesRequestContext.java:103)
    at org.apache.tiles.jsp.context.JspTilesRequestContext.dispatch(JspTilesRequestContext.java:96)
    at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:690)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:644)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:627)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321)
    at org.apache.tiles.renderer.impl.DefinitionAttributeRenderer.write(DefinitionAttributeRenderer.java:56)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.renderer.impl.ChainedDelegateAttributeRenderer.write(ChainedDelegateAttributeRenderer.java:76)
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670)
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:336)
    at org.apache.tiles.template.InsertAttributeModel.renderAttribute(InsertAttributeModel.java:210)
    at org.apache.tiles.template.InsertAttributeModel.end(InsertAttributeModel.java:126)
    at org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:311)
    at org.apache.jsp.WEB_002dINF.tiles.basicLayout_jsp._jspx_meth_tiles_005finsertAttribute_005f0(basicLayout_jsp.java:128)
    at org.apache.jsp.WEB_002dINF.tiles.basicLayout_jsp._jspService(basicLayout_jsp.java:93)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

有人能给我建议吗?我不得不说,如果我不使用通配符定义,相同的定义也可以正常工作。多谢。


我还没有完全解决这个问题,但我希望它能有所帮助。您正在使用的正则表达式可能是您可能使用的最贪婪的表达式。它匹配所有内容,包括图块定义本身内的所有内容(basicLayout.jsp、header.jsp、footer.jsp)。这解释了为什么您会遇到无限循环,因为您的 REGEXP 磁贴定义不断匹配每个文件请求并尝试使用新模板调用(模板递归!)来满足每个新文件请求。

The Tiles 通配符支持页面显示了几个例子。这些例子都没有使用(.*)- 我想我们刚刚弄清楚了为什么会这样。

你需要让你的 REGEXP 稍微不那么贪婪;我知道 Struts 使用稍微不同的方法来调用模板图块,但假设您有一个包含以下内容的 JSP 页面:

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<tiles:insertDefinition name="somepage.tile" />

下面的图块定义应该创建包含以下内容的模板页面/WEB-INF/pages/somepage.jsp:

<definition name="REGEXP:(.*)\.tile" template="/WEB-INF/tiles/basicLayout.jsp">
  <put-attribute name="header" value="/WEB-INF/tiles/header.jsp" />
  <put-attribute name="content" value="/WEB-INF/pages/{1}.jsp" />
  <put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp" />
</definition>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Tiles REGEXP 通配符定义会导致无尽的 jsp 包含错误 的相关文章

随机推荐

  • 无法将自定义标头从 WebAPI 公开给客户端

    我编写了一个程序来下载 web api 返回的 pdf word 或 txt 文件 并且工作正常 在服务器端我使用了 WebApi 和客户端 AngularJs 现在的问题是 我还需要来自 api 的文件名 为此我需要读取 api 返回的标
  • JSON 和 JSONP 有什么区别?

    格式明智 文件类型明智和实际用途明智 JSONP 是带填充的 JSON 也就是说 您在开头放置一个字符串 并在其周围放置一对括号 例如 JSON name stackoverflow id 5 JSONP func name stackov
  • AWS RDS 的 Mysqldump

    我想备份 RDS MYsql 数据库 我目前正在运行一个小实例 我需要程序来获取 sqldump 但我的问题是 RDS 在获取 sqldump 时是否会冻结 因为在其生产过程中会发生大量读 写操作 请帮忙 要回答确切的问题 获取 sqldu
  • 如何通过浏览器检测某个协议是否受支持?

    类似于 iTunes 的 链接制作器 http www apple com itunes linkmaker faq 通过网络浏览器 iTunes 网页能够查明是否itms 已在客户端工作站上注册 因此显示正确的消息 在 iTunes 中查
  • Worker 服务意外停止工作

    我有 NET Core 3 辅助服务 每 10 秒检查 一些内容 有一次 它 随机 停止这样做 我不确定为什么 到目前为止 它发生了两次 并且没有异常日志或类似的东西 所以我只能假设我应该添加一个try catch在 ExecuteAsyn
  • Android 2.3 设备上的 Android MediaPlayer 错误 (1, -38)

    最近被分配一个任务 开发一个 Android 应用程序 通过 WiFI 播放 RTSP 流 该应用程序在 SurfaceView 上使用 Android MediaPlayer 类 相同的代码适用于 Android 4 2 4 3 和 4
  • 为什么 FileWriter 不创建新文件?

    考虑以下代码 m Writer new PrintWriter new FileWriter LoginHistory dat m Writer println Integer toString s NumOfLogins m Writer
  • 如何在 ASP.NET 中从 JavaScript 触发按钮单击事件

    如何从 JavaScript 触发服务器端按钮单击事件 我尝试这样 document getElementById click 但没有用 我该怎么做 您可以将此行放在 JavaScript 函数中 doPostBack btnSubmit
  • DispatcherTimer - 如果上一个刻度仍在运行,则防止触发刻度事件

    在 Silverlight 应用程序中 我有一个代码块必须每 500 毫秒运行一次 我计划使用 DispatcherTimer 来实现此目的 请参阅下面的代码 DispatcherTimer dt new DispatcherTimer d
  • Visual Studio 更新是否会破坏 iText7?

    我在使用 iText7 7 1 6 和 Visual Studio 2019 时遇到问题 我的程序已经运行一年了 但刚刚将 Visual Studio 社区 从 16 6 1 更新到版本 16 6 2 我进行了重建 但没有更改任何内容 现在
  • Plupload HTML4 添加文件对话框在 IE 中未触发

    我正在使用 Plupload jQuery 版本 和 HTML4 for IE 由于某种原因 当我按下 添加文件 按钮时 它没有打开文件对话框 Plupload 容器被放置在一个对话框中 我调用 pluploadQueue 每次在我显示对话
  • 如何在 iOS 中计算 SHA-2(最好是 SHA 256 或 SHA 512)哈希值?

    安全服务 API 似乎不允许我直接计算哈希值 有很多公共领域和自由许可的版本可用 但如果可能的话 我宁愿使用系统库实现 数据可以通过 NSData 或普通指针访问 哈希的加密强度对我来说很重要 SHA 256 是可接受的最小哈希大小 这就是
  • 用于打印括号内整数的正则表达式

    第一次使用正则表达式 尽管 stackoverflow 中已经有很多例子 但无法让它工作 如何提取括号内字符串中的整数 Example dijdi d43 d5 55 43 32 dm dij 99 x 会回来 43 32 99 and 如
  • WPF:允许用户调整 RichTextBox 中图像的大小

    WPF 中的 RichTextBox 控件中是否有一种方法允许用户调整插入图像的大小 或者您是否必须为此设计自己的方法 我想要实现的目标如下所示 是写字板执行我想要的操作的屏幕截图 Notes 以纯文本形式读取 RTF 文件 我发现与图像大
  • Python:父子层次结构的组合

    对于子父关系表 csv 我尝试使用表中的所有数据收集可能的父子关系组合链 我正在尝试解决一个问题 如果存在多个子父级 参见第 3 行和第 4 行 则第二个子父级组合 第 4 行 不包含在迭代中 数据示例 孩子 父母 A B A C B D
  • 对 Android 库应用程序进行单元测试的最简单方法?

    抱歉 如果这是一个有点模糊的问题 但是我很难找到一个solid有关如何使用 Android 进行单元测试 隔离测试 的示例 这是我想要实现的目标的示例 Some class class Calculator public int Add i
  • 检测屏幕分辨率来加载替代 CSS 是个好主意吗?

    我与一位平面设计师合作 他一直希望制作大于我推荐的 960 像素的网站 我可以使用液体布局做一定量的工作 但我真的很喜欢能够加载不同的 CSS 以实现更大的分辨率 我用谷歌搜索并找到了下面的链接 但我担心我没有听到更多关于此的信息 这是一个
  • NSDate 一天的开始和一天的结束

    NSDate beginningOfDay NSDate date NSCalendar cal NSCalendar currentCalendar NSDateComponents components cal components N
  • 如何在android中使用Gson库解析json响应?

    我有 api 它的响应如下 0 serialize 1 login users token aaaaa message login successful 我如何使用 Gson 在 android 中解析它 创建一个 Json 的 pojo
  • 为什么 Tiles REGEXP 通配符定义会导致无尽的 jsp 包含错误

    我将tiles 2 2 2与Struts2 2 2 3一起使用 因为Struts2 Tiles插件相当旧 它的实现使用了许多Tiles已弃用的API 并且我想尝试REGEXP通配符 所以我在下面实现了我自己的监听器 我的TilesConta