2

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

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

我该如何解决这个问题?

4

3 回答 3

1

好吧,标签文件本身并不是像标签处理程序那样的“类”(我的意思是,显然它是,就像所有 JSP 文件一样,但是,你明白我的意思)。

当我必须对标签文件进行“嵌套”标签时,我所做的就是将我的状态数据以“众所周知的名称”放入请求中。实际上是两个标签之间共享的“秘密”。

例如,在一个标签文件中,我可能会这样做:

<%
jspContext.setAttribute("_myWellKnownName", new java.util.LinkedHashMap(), PageContext.REQUEST_SCOPE);
%>

然后,在稍后的标记文件中:

<%
    java.util.LinkedHashMap map = (java.util.LinkedHashMap) jspContext.findAttribute("_myWellKnownName");
%>

然后我随心所欲地操纵那个变量。

在父标签中,执行子标签的代码,所以在我的地图(在这种情况下)被填充之后,我可以在那时做任何我需要做的事情。

我发现的基本模式是将子标签的结果收集到一个列表中,然后在孩子完成所有工作后,父母将实际数据呈现到页面上。

我的标签不需要我的父母嵌套在其他父母中(即一个标签将与另一个标签的状态冲突),但显然这在一般意义上可能是这种方法的问题。不过对我的目的仍然有效。

于 2009-04-15T16:52:55.443 回答
0

我傻到忘记了我可以将上面的Java代码插入到JSP中,并在页面上设置一个参数以将“父”传递给JSP页面......

我不确定,如果我应该关闭这个问题。因为答案有些愚蠢。请资深 StackOverflow 用户指教。

于 2009-04-15T16:37:12.703 回答
0

也许会有所帮助。

Michael Breed 2010 年 11 月 9 日凌晨 1:23

我知道这已经快一年了,但是当我碰巧自己正在研究使用标签文件时,我想我会纠正这里所说的限制。事实上,使用 JSP 术语“片段”并使用 jsp:invoke 标记注入多个部分是可能的。就是这样:

于 2011-03-31T19:39:46.523 回答