JSP自定义标签问题:jsp:doBody使标签小写且不解析主体内容
解决JSP自定义标签体标签被转小写且未解析的问题
这个问题的核心原因在于你给e:MyTag设置了body-content="tagdependent"——这个属性会告诉JSP容器完全不解析标签体里的任何JSP元素,直接把标签体内容当作纯文本处理。这就是为什么<e:MyOtherTag />会被转成小写的<e:myothertag />直接输出,而不是被执行替换的原因。
下面给你几个可行的解决办法:
1. 修改body-content属性(最推荐)
把<%@ tag body-content = "tagdependent" %>改成以下两种之一:
- 如果你的标签体里不需要脚本代码(比如
<% ... %>),只包含自定义标签和EL表达式,用scriptless:<%@ tag body-content = "scriptless" %> - 如果标签体里需要包含脚本代码,用
JSP:<%@ tag body-content = "JSP" %>
改成这两个值后,JSP容器就会正常解析标签体里的e:MyOtherTag,不会把它当作纯文本转小写输出了。
2. 手动解析标签体(仅当必须用tagdependent时)
如果因为特殊需求必须保留tagdependent,那你需要在MyTag的标签处理类里手动解析标签体内容。举个用SimpleTagSupport的示例:
public class MyTag extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { JspFragment body = getJspBody(); if (body != null) { // 先把标签体内容写入临时流 StringWriter sw = new StringWriter(); body.invoke(sw); String rawBodyContent = sw.toString(); // 这里需要手动调用JSP容器的解析器处理标签内容 // 要处理命名空间、前缀映射等逻辑,复杂度较高,仅建议特殊场景使用 String parsedContent = 你的解析逻辑(rawBodyContent); // 输出解析后的内容 getJspContext().getOut().write(parsedContent); } // 执行e:MyMessageTag相关逻辑 // ... } }
这种方法需要深入了解JSP标签的解析机制,一般不推荐,除非你有必须使用tagdependent的理由。
3. 检查容器配置(少见场景)
部分JSP容器(比如Tomcat)可能有关于标签大小写敏感性的配置项,你可以查看容器文档,看看是否有开关能关闭标签名的自动小写转换。不过这属于容器特定配置,兼容性较差,优先考虑前两种方法。
内容的提问来源于stack exchange,提问作者outofmind
相关产品推荐
相关产品推荐

