从自定义标记创建Struts2标记

时间:2011-03-04 00:23:53

标签: struts2 jsp-tags

我正在尝试从自定义标记向我的JSP编写Struts2标记。我有下面的代码。这实际上是否可行,或者是否有关于JSP生命周期的事情使得这不可能?如果不可能,还有另一种方法可以做我想做的事吗?

        while (iterator.hasNext()) {
            Bulletin bulletin = (Bulletin) iterator.next();
            if (bulletin.isApproved()) {
                out.println("<s:url value=\"GetSingleBulletin\">");
                out.println("<s:param name=\"id\" " 
                        + "value=\"%{" + bulletin.getId()+ "}\" />");
                out.println(bulletin.getName() + " -- " + bulletin.getSubject() 
                        + " " + bulletin.getDate());
                out.println("</s:url>");
                out.println("<br><br>");
            }
        }

2 个答案:

答案 0 :(得分:0)

标记作为将JSP转换为servlet的“转换阶段”的一部分进行解析。通过在标签中发出其他标签,您将假设“第二次通过”翻译,但这种情况不会发生。所以从根本上说这是一个坏主意。

相反,我建议只发出等效的HTML(实际上只是带参数的URL,给出上面的代码)。假设您的问题并不比上面描述的复杂,这似乎是最简单的方法。事实上,即使你可以发出标签,我也没有看到一个非常有说服力的案例,为什么标签会比原始HTML更好。 JSP taglibs应该在可能的情况下促进自动化和更少的代码;更少的代码减少了错误并使JSP更易于维护。但是你的上述案例并不是一个尖叫着“必须使用标签”的案例。

或者,如果你真的更喜欢使用上面自定义标记中的标记,或者你愿意完全删除你的taglib,你可以在scriptlet中编写上面的Java代码并散布你对另一个的使用struts标记在该scriptlet代码之间。所以,像:

<%
        while (iterator.hasNext()) {
            Bulletin bulletin = (Bulletin) iterator.next();
            if (bulletin.isApproved()) {
%>
                <s:url value="GetSingleBulletin">
etc.

<%
            }
        }
%>

答案 1 :(得分:0)

不可能只允许在html tag.fa

中使用out.println