2016-04-30 65 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