我有一個簡單的代碼,可以使用servlet和JSP。通常它在我使用下面的代碼時起作用。 然而,一些勝算,我得到這個意外的錯誤,不可能找出什麼問題無法使用JSTL標記顯示值
Caused by:
javax.el.ELException - Cannot convert testID of type class java.lang.String to
class java.lang.Integer
我的結果類
public class Result {
private String testID ;
private String date ;
private String result ;
private String grade ;
public String getTestID() {
return testID;
}
public String getDate() {
return date;
}
public String getResult() {
return result;
}
public String getGrade() {
return grade;
}
public void setTestID(String testID) {
this.testID = testID;
}
public void setDate(String date) {
this.date = date;
}
public void setResult(String result) {
this.result = result;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
我的servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String testID = request.getParameter("Action").trim();
User user = (User) request.getSession().getAttribute("currentSessionUser");
String sql = "select * from result where testID =" + testID + " and userID = " + user.getUserID();
PreparedStatement ps = DBconnection.getPreparedStatement(sql);
List <Result> results = new ArrayList<Result>();
try {
ResultSet rs = ps.executeQuery();
while(rs.next())
{
Result result = new Result();
result.setTestID(rs.getString("testID"));
result.setGrade(rs.getString("grade"));
result.setDate(rs.getString("dates"));
result.setResult(rs.getString("result"));
results.add(result);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
DBconnection.close();
}
request.getSession().setAttribute("results", results);
response.sendRedirect(request.getContextPath() +"/faces/subResult.jsp");
我的JSP
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
</head>
<body>
<ul>
<c:forEach items="${results}" var="results">
<li> ${results.testID} </li>
<li><c:out value="${result.grade}" /></li>
<li><c:out value="${result.result}" /></li>
<li>Hello</li>
</c:forEach>
</ul>
</body>
堆棧跟蹤
javax.faces.FacesException: javax.el.ELException: Cannot convert testID of type class java.lang.String to class java.lang.Integer
at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241)
at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:258)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1229)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3748)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:962)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1814)
Caused by: javax.el.ELException: Cannot convert testID of type class java.lang.String to class java.lang.Integer
at org.apache.el.lang.ELSupport.coerceToNumber(ELSupport.java:338)
at org.apache.el.lang.ELSupport.coerceToNumber(ELSupport.java:309)
at org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:422)
at org.apache.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:47)
at org.apache.myfaces.el.convert.PropertyResolverToELResolver.coerceToInt(PropertyResolverToELResolver.java:271)
at org.apache.myfaces.el.convert.PropertyResolverToELResolver.getValue(PropertyResolverToELResolver.java:157)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:142)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at org.apache.el.parser.AstValue.getValue(AstValue.java:173)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:283)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:778)
at com.ibm._jsp._subResult._jspx_meth_c_forEach_0(_subResult.java:182)
at com.ibm._jsp._subResult._jspService(_subResult.java:98)
at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:99)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1229)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:216)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1384)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:193)
at com.FYP.servletGetSubResult.doGet(servletGetSubResult.java:74)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1229)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1032)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1384)
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:193)
at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:367)
at org.apache.myfaces.view.jsp.JspViewDeclarationLanguage.buildView(JspViewDeclarationLanguage.java:94)
at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:66)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
... 25 more
發佈異常的完整堆棧跟蹤。另外,準備好的語句的全部要點是能夠安全地傳遞參數,但是您使用字符串連接來執行該操作,從而使代碼對SQL注入攻擊保持開放。爲什麼你將結果存儲到會話中並重定向到一個視圖,而不是將它們存儲在請求中,然後轉到視圖? –
@JBNizet嗨,抱歉給您帶來不便。我已經添加了堆棧跟蹤。至於Prepared語句,我確實知道它,這是因爲我仍然在對這個代碼想法進行測試,所以我把它留給了簡單的方法來首先測試運行。我仍然對JSP不熟悉,因此我認爲如果我有一個對象列表,使用會話更容易實現我想要做的事情 – hiboss
不知道是否與異常有關,但將當前項目命名爲'結果「(在'var =」results「'中)是一個壞主意:它與集合本身的名稱相同。將它命名爲'result',並將'$ {results.testID}'更改爲'$ {result.testID}'。 –