JSP标记文件:检查嵌套

时间:2009-03-31 22:00:58

标签: jsp jsp-tags

我正在使用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");
      }

但是,因为我使用了标记文件,我不太清楚它的父类是什么类。

我怎么能解决这个问题?

3 个答案:

答案 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   标签。方法如下: