我正在使用JSP编写一些嵌套的自定义标记。我知道有两种方法可以做到这一点:1)编写扩展BodyTagSupport的标记处理程序,2)编写标记文件。
在第一种方法中,代码很难看。我找不到合并当前struts标签的方法。如果我使用JspWriter编写以下内容,我会在最终的HTML输出中获取此字符串,而不是由编译的JSP生成的有意义的输出。
<bean:write name="label">
所以,我转向第二种方法,我写了标签文件。然后上面的问题就解决了。但是,我在获取标记的父标记时遇到问题,因为我不知道父标记类。如果我编写自己的标记处理程序
,我可以执行以下操作 ParentTag parent =
(ParentTag)findAncestorWithClass(this, ParentTag.class);
if (parent == null) {
throw new JspTagException("this tag is outside of its parent tag");
}
但是,因为我使用了标记文件,我不太清楚它的父类是什么类。
我怎么能解决这个问题?
答案 0 :(得分:1)
好吧,Tag文件本身并不像标记处理程序那样是“类”(我的意思是,显然它就像所有JSP文件一样,但是,你理解我的意思)。
当我必须使用标记文件执行“嵌套”标记时,我所做的是将状态数据放入“知道名称”下的请求中。实际上是两个标签之间共享的“秘密”。
例如,我可以在一个标签文件中执行:
<%
jspContext.setAttribute("_myWellKnownName", new java.util.LinkedHashMap(), PageContext.REQUEST_SCOPE);
%>
然后,在以后的标签文件中:
<%
java.util.LinkedHashMap map = (java.util.LinkedHashMap) jspContext.findAttribute("_myWellKnownName");
%>
然后我操纵我想要的那个变量。
在父标记中,执行子标记的代码,因此在填充了我的地图(在这种情况下)后,我可以做任何我需要做的事情。
我发现的基本模式是将子标记的结果收集到类似列表的内容中,然后父项在子项完成所有工作后将实际数据呈现给页面。
我的标签中没有我需要父母嵌套在其他父母中的地方(即一个标签会与另一个标签的状态发生冲突),显然这在一般意义上可能是这个方法的问题。虽然对我的目的仍然有效。
答案 1 :(得分:0)
我愚蠢到忘记我可以将上面的Java代码插入到JSP中,并在页面上设置一个参数以将“父”传递给JSP页面......
我不确定,我是否应该关闭这个问题。因为答案有些愚蠢。高级StackOverflow用户请指教。
答案 2 :(得分:0)
也许this会有所帮助。
迈克尔·布瑞德于2010年11月9日凌晨1点23分左右 我知道这已经快一岁了 现在,但正好像我正在寻找 我想,自己使用标签文件 我会纠正所述的限制 这里。实际上可以注射 使用JSP术语的多个部分 “片段”并使用jsp:invoke 标签。方法如下: