<apptags:sqliteratortag query =“&lt;%= myQuery%&gt;”>其中myQuery返回没有结果导致奇怪的HTML行为</apptags:sqliteratortag>

时间:2012-05-16 13:07:29

标签: html sql jsp tomcat7

我在Windows Server 2008上使用Tomcat7。

我的JSP页面中有以下两行

<apptags:SQLIteratorTag query="<%=myQuery%>">
</apptags:SQLIteratorTag>

如果myQuery至少返回一行,那么我的JSP页面就会正常运行。 如果myQuery没有返回任何行,那么我的JSP页面会从页面中复制一些文本(例如组合框的内容)并复制它!

我的想法如下:由于它复制的组合框由查询填充,似乎在没有查询返回结果的情况下,页面似乎抓住了不同查询的结果。

有没有人有任何想法如何解决这个问题? 谢谢!

2 个答案:

答案 0 :(得分:1)

JSP主体中的Scriptlets <%...%>通常很混乱。使用JSTL @taglibEL ${...}可以完全避免这些问题,这是在JSP中迭代查询结果的干净且强烈推荐的方法。

下载jstl-api.jar and jstl-impl.jar,将它们放入您的lib文件夹并添加到页面顶部:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

对于查询部分,将所有处理保留到Java类,将查询结果存储在myList类型的变量List中并将其发送(获取/发送前进)到您的页面,应该只显示值而不显示其他内容:

<c:forEach items="${myList}" var="product" varStatus="status">
    Product number ${status.count}: ${product}<br />
</c:forEach>

这应足以避免页面中出现意外行为。如果没有行,它就什么都不做。但如果您仍想检查,那么您不必再次进行查询,因为其结果已在myList内:

<c:if test="${fn:length(myList) != 0}">
    <c:forEach items="${myList}" var="product" varStatus="status">
        Product number ${status.count}: ${product}<br />
    </c:forEach>
</c:if>

或者使用${noCompanySelected}代替${fn:length(myList) != 0},如果这确实是您的条件。

...您可能需要验证的其他事项:

如果您在会话中创建了myQuery而不是请求,那么您的myQuery将被其他内容,应用程序中的其他位置重复使用...或者在同一页面上递归两次。

此外,如果您的标签库apptags是由您自己制作的,另一种可能性是它不应该操纵标签。

答案 1 :(得分:0)

如果没有看到更多的页面,我会打赌您使用的变量名称与:

相同
%=myQuery%

因此,当没有返回查询结果时,它只返回它拥有的最后一个对象...即组合框。尝试给查询字符串名称一个不同的名称,如query1,query2等,而不是所有myQuery。