JSP内部功能打印

时间:2012-08-15 15:45:05

标签: java jsp printing

应该在JSP声明标签函数中直接HTML打印合法吗?

<%! void recursivePaintLevels(List<String> things, int deepLevel){ %>
    <ul class="level-<%=deepLevel%>">   
         <% for (int i=0; i<things.size(); i++){ %>
             <li class="whatever">
                             //(...)
            </li>
         <% } %>
    </ul>
<% } %>

然后在普通的JSP正文流中调用它:

 //(...)
 <% recursivePaintLevels(things, 1); %>

我的意思是使用相同的普通JSP逻辑隐式out.println()但是在方法中。 对我来说它不起作用(Eclipse说“语法错误,插入”最后“完成TryStatement”)但我不确定我的错误是否与它有关。

我也知道我应该使用JSLT和EL,但这是我的选择。

2 个答案:

答案 0 :(得分:0)

不,这不合法。 JSP页面有效地实现为执行页面中所有代码的一个大方法。在java中,您不能简单地插入嵌套在方法中的其他方法。

您的代码会生成如下内容:

public void _jspService(...) {
    ...
    void recursivePaintLevels(...) {
        ...    
    }
}

这根本不是合法的java。

相反,您应该将代码推迟到与您的Web应用程序捆绑在一起的实用程序库类。

你可能会创建一个递归标记文件,我还没试过。

答案 1 :(得分:-1)

我认为这是非常合法和有效的,虽然是一种不好的做法。我认为这里的问题是因为双引号"level-<%=deepLevel%>" 尝试使用

分离
<% String str= "level-"+deepLevel; %>

然后使用     <ul class="<%=str%>">

或简单地用out.println

替换整行

修改

看来jsp中方法的主体不应该有任何scriptlet。我试图嵌入一个没有内容的scriptlet,并观察到生成的java文件在求结时添加了第一部分(从delcaration到scriptlet之前的内容),最后添加了方法的剩余部分(以及所有成员变量和其他方法声明成为此方法的一部分)。提供错误答案的道歉(因为我注意到缓存jsp的行为)。

看起来out.prinltn是此问题的唯一解决方案