我目前正在开展一个项目,但我收到了这个错误。我不知道为什么它会在索引38处停止。错误是
org.apache.jasper.JasperException: javax.el.ELException: java.lang.IndexOutOfBoundsException: Index: 38, Size: 38
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:413)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
我以前用来显示的代码是一个while循环
var count = ${count};
while (--count) {
var val = ${valueList.get(count)}; //get value from her code
var xValue = ${XValueList.get(count)};
var yValue = ${YValueList.get(count)};
//max = Math.max(max, val);
//
min = 0;
var point = {
x: xValue,
y: yValue,
value: val
};
points.push(point);
}
// var data = { max: max, min:min, data: points };
var data = {data: points };
return data;
};
我的数据库中有41条记录。有什么帮助吗?
答案 0 :(得分:3)
数组从0开始计数,但它们的大小以字段数给出。大小为38的数组实际上有0到37字段。访问字段38会抛出java.lang.IndexOutOfBoundsException。
答案 1 :(得分:3)
你错过了一个事实,即JSP是一个HTML / CSS / JS代码生成器,你期望JSP EL表达式在同步中运行"使用嵌入在JSP文件中的JavaScript代码。这是不真实的。 JSP / EL在webserver中运行,生成HTML / CSS / JS输出,基本上是一个大的String
,从webserver发送到webbrowser,后者又运行JSP / EL生成的HTML / CSS / JS输出。 / p>
实现错误的一种简单方法是在webbrowser中执行右键单击和查看源(在包含标记和EL表达式的JSP页面上,不会像这样抛出服务器端异常,当然)。您会注意到它实际上并不包含任何单行的JSP / EL代码。
基本上,代码段中的--count
仅在JavaScript中有效,而不在JSP中,因为在生成HTML输出期间,您基本上将${count}
打印为JavaScript变量var count
。但JavaScript中var count
的值绝不会影响${count}
中${valueList.get(count)}
进一步使用的值${count}
。 public class Point {
private int x;
private int y;
// Add/generate constructor+getter+setter+equals+hashcode.
}
在那里仍然是38,并且还没有变成37左右。
这就是问题所在。现在我们可以进入解决方案。我没有发布答案来专门修复您尝试的解决方案,原因很简单,这是因为您从高级别看到了您尝试解决的基础问题的错误解决方案:将Java模型对象转换为JavaScript对象。 / p>
正确的解决方案是将Java模型对象转换为Java端的JSON格式的字符串,然后让JSP打印它就好像它是一个JavaScript变量。您的Java模型对象还有另一个问题:您似乎已将两个单独列表中的X和Y值分离,而不是使用具有X和Y值的实体的单个列表。
首先创建一个decent模型对象:
XValueList
然后将YValueList
和List<Point> points = new ArrayList<>();
points.add(new Point(1, 2));
points.add(new Point(3, 4));
points.add(new Point(5, 6));
// ...
替换为如下:
String pointsAsJson = new Gson().toJson(points);
然后使用Java JSON APIs之一将其转换为JSON字符串。我将在下面的示例中选择Gson:
var data = {data: ${pointsAsJson} };
现在让JSP打印它,好像它是一个JS变量,正确的方式:
gruntfile.js
这里不需要笨拙的循环按摩数据。