如何解决<li value="${livre.titre}"> 抛出 java.lang.NumberFormatException:对于输入字符串:“titre”
我有一个 500 错误,堆栈跟踪显示一个数字格式错误,但我所有的变量都是字符串,所以我根本看不到错误在哪里。
另外,我的 JDBC 连接很好,因为在调试模式下我可以从数据库中看到我的值,但是一旦它进入 JSP,它就不再工作了。
有人可以帮我吗?这是我的代码:
我的 servlet :
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,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,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
解决方法
您有一个错误,因为您将一组书籍发送到 JSP 文件,但您试图将其用作单本书。
在您的 servlet 中,您正在执行:
request.setAttribute("livre",tableLivres.recupererLivres());
tableLivres.recupererLivres()
方法返回一个 List<Livres>
。这是一本书的合集,而不是一本书。但是在您的 JSP 中,您将此集合视为一本书并执行 ${livre.titre}
。
顺便说一句,你真的应该把单复数 Livre
弄得一团糟。你的类应该叫Livre
而不是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
,因为它应该根据您正在执行的操作命名。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。