2016-04-30 61 views
0

我有一個簡單的代碼,可以使用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  
+0

發佈異常的完整堆棧跟蹤。另外,準備好的語句的全部要點是能夠安全地傳遞參數,但是您使用字符串連接來執行該操作,從而使代碼對SQL注入攻擊保持開放。爲什麼你將結果存儲到會話中並重定向到一個視圖,而不是將它們存儲在請求中,然後轉到視圖? –

+0

@JBNizet嗨,抱歉給您帶來不便。我已經添加了堆棧跟蹤。至於Prepared語句,我確實知道它,這是因爲我仍然在對這個代碼想法進行測試,所以我把它留給了簡單的方法來首先測試運行。我仍然對JSP不熟悉,因此我認爲如果我有一個對象列表,使用會話更容易實現我想要做的事情 – hiboss

+0

不知道是否與異常有關,但將當前項目命名爲'結果「(在'var =」results「'中)是一個壞主意:它與集合本身的名稱相同。將它命名爲'result',並將'$ {results.testID}'更改爲'$ {result.testID}'。 –

回答

1

我想這條線給問題

<li> ${results.testID + ""} </li> 

我不知道是什麼目的那。你爲什麼試圖用一個空字符串連接整數?

el中的級聯不是用+運算符實現的。你只需要將el表達式放在彼此靠近的地方。

下應該工作

<li> ${results.testID} ${""}</li> 

,這將做同樣的,但更有意義

<li> ${results.testID}</li> 

編輯:

由於JB Nizet作爲對他的評論指出,當命名引用當前項目的變量時,問題是由錯誤的選擇造成的。

引述他:

不知道這有什麼做的異常,但命名 當前項結果(VAR =「結果」)是一個壞主意:它是 同名作爲集合本身。將其結果命名,並將 $ {results.testID}更改爲$ {result.testID}。

+0

同樣的結果..因爲最初我已經把

  • $ {results.testID}
  • ,但是,它顯示相同的錯誤。因此我嘗試把空字符串強制爲字符串。不過,這是我的錯誤。將編輯它 – hiboss

    +0

    你可以發佈你的Result類的代碼嗎? –

    +0

    當然,我已經發布了Result類的代碼 – hiboss

    -1

    最大的可能是你定義Result.testID是整數(Result類)。 但是在你的數據庫中,testID列是String。大多數數據都是數字的,所以result.setTestID(rs.getString("testID"));通常不會失敗,但是您有些情況下testID列中的數據庫數據不是數字。因此,「無法將類型類java.lang.String的testID到類java.lang.Integer」錯誤

    +0

    Straightly都是字符串。我可以在servlet中使用System.out.println(result.getTestID)。然而,當我把它帶到JSP,繼承人錯誤發生 – hiboss