jsp -
问题描述
我有一个 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
解决方案
您有一个错误,因为您正在将书籍集合发送到 JSP 文件,但您正试图将它当作一本书来使用。
在您的 servlet 中,您正在执行以下操作:
request.setAttribute("livre", tableLivres.recupererLivres());
该tableLivres.recupererLivres()
方法返回一个List<Livres>
. 这是一本书的集合,而不是一本书。但是在您的 JSP 中,您将此集合视为一本书并执行${livre.titre}
.
顺便说一句,您应该真正清理一下单复数的混乱Livre
。你的课应该叫Livre
not 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
为应该根据您正在执行的操作来命名。
推荐阅读
- sql - 为什么当数据在表中的后面位置重复时(不在相关行旁边),SQL LAG (HIVE) 给出的差异为 0?
- android - 创建新表时房间迁移查询失败
- html - 如何在网页上发布 HTML 电子邮件?
- javascript - Discord.js SyntaxError: Unexpected Identifier (For command handler)
- sql - 有没有其他方法可以解决涉及员工数据的 SQL 问题?
- mysql - MySQL-Query中的关键字
- python - 附加查询字符串以查看渲染函数 Django
- c - 为什么我的opengl 2D动画代码输出窗口没有响应,只显示动画的最终结果
- c++ - 无法从 C++ 中的 SQLAPI++ 程序连接到我的 Oracle 数据库
- php - 望远镜安装在 laravel-7.25 上失败