我在Windows Server 2008上使用Tomcat7。
我的JSP页面中有以下两行
<apptags:SQLIteratorTag query="<%=myQuery%>">
</apptags:SQLIteratorTag>
如果myQuery
至少返回一行,那么我的JSP页面就会正常运行。
如果myQuery
没有返回任何行,那么我的JSP页面会从页面中复制一些文本(例如组合框的内容)并复制它!
我的想法如下:由于它复制的组合框由查询填充,似乎在没有查询返回结果的情况下,页面似乎抓住了不同查询的结果。
有没有人有任何想法如何解决这个问题? 谢谢!
答案 0 :(得分:1)
JSP主体中的Scriptlets <%...%>
通常很混乱。使用JSTL @taglib
和EL ${...}
可以完全避免这些问题,这是在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。