0

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); %>

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

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

4

2 回答 2

0

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

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

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

这根本不是合法的java。

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

您可能能够创建一个递归标记文件,我还没有尝试过。

于 2012-08-15T16:01:49.213 回答
-1

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

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

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

或者干脆用 out.println 替换整行

编辑

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

看起来 out.printltn 是这个问题的唯一解决方案

于 2012-08-15T16:14:54.680 回答