1

我在 Windows Server 2008 上使用 Tomcat7。

我的 JSP 页面中有以下两行

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

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

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

有没有人知道如何解决这个问题?谢谢!

4

2 回答 2

1

JSP 主体中的Scriptlet<%...%>通常是杂乱无章的。可以通过将JSTL @taglibEL ${...}一起使用来完全避免它们,这是在 JSP 中迭代查询结果的干净且强烈推荐的方法。

下载jstl-api.jar 和 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并将其发送(get/post forward)到您的页面,它应该只显示值而不是其他内容:

<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在会话而不是请求中创建,则被同一页面递归两次。

此外,如果您的 taglibapptags是您自己制作的,另一种可能性是它正在操作不应该的标签。

于 2012-07-01T08:51:05.557 回答
0

在没有看到更多页面的情况下,我敢打赌您使用的是与以下相同的变量名称:

%=myQuery%

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

于 2012-06-28T21:57:56.390 回答