应该在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,但这是我的选择。
答案 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是此问题的唯一解决方案