抛出 java.lang.NumberFormatException:对于输入字符串:“tire”,jsp,servlets,el"/>

首页 > 解决方案 >

  • 抛出 java.lang.NumberFormatException:对于输入字符串:“tire”
  • 问题描述

    我有一个 500 错误,堆栈跟踪显示一个数字格式错误,但我所有的变量都是字符串,所以我根本看不到错误在哪里。

    此外,我的 JDBC 连接很好,因为在调试模式下,我可以从数据库中看到我的值,但是一旦它进入 JSP,它就不再工作了。

    有人可以帮我吗?这是我的代码:

    我的小服务程序:

    package com.octest.servlets;
    import java.io.IOException;
    
    import bdd.LivresBDD;
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import model.Livres;
    /**
     * Servlet implementation class test
     */
    
    public class test extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /**
         * Default constructor. 
         */
        public test() {
            // TODO Auto-generated constructor stub
        }
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            LivresBDD tableLivres = new LivresBDD();
            request.setAttribute("livre", tableLivres.recupererLivres());
            this.getServletContext().getRequestDispatcher("/WEB-INF/bonjour.jsp").forward(request, response);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Livres livre = new Livres();
            livre.setTitre(request.getParameter("titre"));
            livre.setAuteur(request.getParameter("auteur"));
            livre.setGenre(request.getParameter("genre"));
           
           LivresBDD tableLivres = new LivresBDD();
           tableLivres.ajouterLivres(livre);
           
           request.setAttribute("livre", tableLivres.recupererLivres());
           
            this.getServletContext().getRequestDispatcher("/WEB-INF/bonjour.jsp").forward(request, response);
        }
    
    }
    

    我的jsp文件:

    <%@ page pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>Test</title>
        </head>
        <body>
            <%@ include file="menu.jsp" %>
            <p>Bonjour à vous !</p>
            <p>
            <ul>
            <li value="${livre.titre}"></li>
            </ul>
        </body>
    </html>
    

    我的豆子:

    package model;
    
    public class Livres {
        private String titre;
        private String auteur;
        private String genre;
        
    
        
        public String getTitre() {
            return titre;
        }
        
        public void setTitre(String titre) {
            this.titre = titre;
        }
        public String getAuteur() {
            return auteur;
        }
        
        public void setAuteur(String auteur) {
            this.auteur = auteur;
        }
        public String getGenre() {
            return genre;
        }
        
        public void setGenre(String genre) {
            this.genre = genre;
        }
    }
    

    我的数据库连接:

    package bdd;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.PreparedStatement;
    import java.util.ArrayList;
    import java.util.List;
    
    import model.Livres;
    
    public class LivresBDD {
    
    
        private Connection connexion;
        
        public List<Livres> recupererLivres() {
            List<Livres> livres = new ArrayList<Livres>();
            Statement statement = null;
            ResultSet resultat = null;
    
            loadDatabase();
            
            try {
                statement = connexion.createStatement();
    
                // Exécution de la requête
                resultat = statement.executeQuery("SELECT titre, auteur, genre FROM livres;");
    
                // Récupération des données
                while (resultat.next()) {
                    String titre = resultat.getString("titre");
                    String auteur = resultat.getString("auteur");
                    String genre = resultat.getString("genre");
                    
                    Livres livre = new Livres();
                    livre.setTitre(titre);
                    livre.setAuteur(auteur);
                    livre.setGenre(genre);
                    
                    livres.add(livre);
                }
            } catch (SQLException e) {
            } finally {
                // Fermeture de la connexion
                try {
                    if (resultat != null)
                        resultat.close();
                    if (statement != null)
                        statement.close();
                    if (connexion != null)
                        connexion.close();
                } catch (SQLException ignore) {
                }
            }
            
            return livres;
        }
        
        private void loadDatabase() {
            // Chargement du driver
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
    
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/bibliotheque", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        public void ajouterLivres(Livres livre) {
            loadDatabase();
            
            try {
                PreparedStatement preparedStatement = connexion.prepareStatement("INSERT INTO livres(titre,auteur,genre) VALUES(?, ?, ?);");
                preparedStatement.setString(1, livre.getTitre());
                preparedStatement.setString(2, livre.getAuteur());
                preparedStatement.setString(3, livre.getGenre());
                
                preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    这是我的堆栈跟踪:

    État HTTP 500 – Erreur interne du serveur
    Type Rapport d'exception
    message Une exception s'est produite lors du traitement de [WEB-INF/bonjour.jsp] à la ligne [13]
    description Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.
    exception
    org.apache.jasper.JasperException: Une exception s'est produite lors du traitement de [WEB-INF/bonjour.jsp] à la ligne [13]
    
    10:         <p>Bonjour à vous !</p>
    11:         <p>
    12:         <ul>
    13:         <li value="${livre.titre}"></li>
    14:         </ul>
    15:     </body>
    16: </html>
    
    Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:611)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:500)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        com.octest.servlets.test.doGet(test.java:32)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:663)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    cause mère
    java.lang.NumberFormatException: For input string: "titre"
    java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
        java.base/java.lang.Integer.parseInt(Integer.java:652)
        java.base/java.lang.Integer.parseInt(Integer.java:770)
        jakarta.el.ListELResolver.coerce(ListELResolver.java:150)
        jakarta.el.ListELResolver.getValue(ListELResolver.java:67)
    org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:125)
        org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
    org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:709)
    org.apache.jsp.WEB_002dINF.bonjour_jsp._jspService(bonjour_jsp.java:141)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        com.octest.servlets.test.doGet(test.java:32)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:663)
        jakarta.servlet.http.HttpServlet.service(HttpServlet.java:770)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de ce serveur.
    Apache Tomcat/10.0.4
    

    标签: jspservletsel

    解决方案


    您有一个错误,因为您正在将书籍集合发送到 JSP 文件,但您正试图将它当作一本书来使用。

    在您的 servlet 中,您正在执行以下操作:

    request.setAttribute("livre", tableLivres.recupererLivres());
    

    tableLivres.recupererLivres()方法返回一个List<Livres>. 这是一本书的集合,而不是一本书。但是在您的 JSP 中,您将此集合视为一本书并执行${livre.titre}.

    顺便说一句,您应该真正清理一下单复数的混乱Livre。你的课应该叫Livrenot Livres,因为它只是一本书。当您将集合发送到 JSP 时,应该调用它,livres因为还有更多,如下所示:

    request.setAttribute("livres", tableLivres.recupererLivres());
    

    完成此操作后,您需要在 JSP 中将数据视为列表。在您的代码中,您将其视为一本书,并且EL表达式引擎可能会尝试使用该titre属性来索引列表,并从这里开始您的NumberFormatException. 按原样处理 JSP 中的数据:列表。JSTL可以帮助循环列表。如果您还没有它,请将其添加到您的项目中,然后在您的 JSP 循环中遍历列表,如下所示:

    <ul>
      <c:forEach items="${livres}" var="unLivre">
        <li>
          <c:out value="${unLivre.titre}" />
        </li>
      </c:forEach>        
    </ul>
    

    请注意,我将属性名称更改livres为应该根据您正在执行的操作来命名。


    推荐阅读