我在Windows Server 2008上使用Tomcat7。
我的 JSP 页面中有以下两行
<apptags:SQLIteratorTag query="<%=myQuery%>">
</apptags:SQLIteratorTag>
如果myQuery
返回至少一行,则我的 JSP 页面行为正常。如果myQuery
没有返回任何行,那么我的 JSP 页面会从页面中复制一些文本(例如组合框的内容(并复制它!
我的想法如下:由于它从中复制的组合框是由查询填充的,因此在没有返回结果的查询的情况下,页面似乎抓取了不同查询的结果。
有没有人有任何想法如何解决这个问题?谢谢!
JSP主体中<%...%>
的脚本通常很混乱。通过将 JSTL @taglib
与 EL 一起使用,可以完全避免它们 ${...}
,这是在 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 类,将查询结果存储在类型为 List
的变量myList
中,并将其发送(获取/转发(到您的页面,该页面应仅显示值,而不显示其他任何内容:
<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
而不是请求,则在同一页面上递归两次。
此外,如果您的 taglib apptags
是您自己制作的,另一种可能性是它正在操纵不应该操作的标签。
如果没有看到更多页面,我敢打赌您使用的是与以下内容相同的变量名称:
%=myQuery%
因此,当没有返回查询结果时,它只是返回它的最后一个对象......即组合框。尝试为查询字符串名称指定一个不同的名称,例如 query1、query2 等,而不是所有 myQuery。