JSP 中的编译错误:无法解析 req

Compilation error in JSP: req cannot be resolved

提问人:yousra_tb 提问时间:10/31/2023 最后编辑:Roman Cyousra_tb 更新时间:11/18/2023 访问量:94

问:

我创建了一个简单的JSP/Servlet项目来计算每月付款。但是,当我在我的 HTTP 上发出 HTTP 请求时,我收到以下错误:localhost,

HTTP Status 500 – Internal Server Error
Type Exception Report

message Unable to compile class for JSP:

description The server encountered an internal error that prevented it from fulfilling the request.

Exception:

org.apache.jasper.JasperException: Impossible de compiler la classe pour la JSP: 

Une erreur s'est produite à la ligne : [3] dans le fichier jsp : [/ServletJsp.jsp]
req cannot be resolved
1:  <%@ page import="web.CreditModel"%>
2:  <%
3:   CreditModel model = (CreditModel) req.getAttribute("creditModel");
4: 
5:  %>
6: <!DOCTYPE html>


Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:214)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:531)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:398)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:368)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:352)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    web.ControllerServlet.doGet(ControllerServlet.java:25)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
note The complete trace of the root cause of this error is available in the log files of this server.

这是调用的 servlet 的代码:

控制器 Servlet.java:

package web;

import metier.CreditMetier;
import metier.CreditMetierImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hi")
public class ControllerServlet extends HttpServlet {
    private CreditMetier metier;
    @Override
    public void init() throws ServletException {
        metier = new CreditMetierImpl();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("creditModel", new CreditModel());
        req.getRequestDispatcher("ServletJsp.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        double montant = Double.parseDouble(req.getParameter("montant"));
        double taux = Double.parseDouble(req.getParameter("taux"));
        int duree = Integer.parseInt(req.getParameter("duree"));

        CreditModel model = new CreditModel();
        model.setMontant(montant);
        model.setTaux(taux);
        model.setDuree(duree);

        double result = metier.calculerMensualiterCredit(montant,taux,duree);
        model.setResultat(result);
        req.setAttribute("creditModel", model);

        req.getRequestDispatcher("ServletJsp.jsp").forward(req,resp);

    }
}

这是 JSP 的代码,它调用:

ServletJsp.jsp:

 <%@ page import="web.CreditModel"%>
 <%
  CreditModel model = (CreditModel) req.getAttribute("creditModel");

 %>
<!DOCTYPE html>
<html>
<head>
<title> Crédit bancaire </title>
<meta charset = "utf-8">
<link rel= "stylesheet" type="text/css" href="css/style.css"/>
</head>
<body>
  <div>


    <form action="hi" method="post">
    <table>
      <tr>
        <td> Montant:</td>
        <td><input type="text" name="montant"/></td>
        <td>DH</td>
      </tr>

      <tr>
        <td> Taux:</td>
        <td><input type="text" name="taux"/></td>
        <td>%</td>
      </tr>

      <tr>
        <td> Duree:</td>
        <td><input type="text" name="duree"/></td>
        <td>mois</td>
      </tr>
    </table>
    <button type="submit">Calculer</button>
    </form>
  </div>
  <div>
   <p> Mensualite = <%=model.getResultat() %> </p>
  </div>
</body>
</html>

这是调用

CreditMetierImpl.java:

package metier;

public class CreditMetierImpl implements CreditMetier{
    @Override
    public double calculerMensualiterCredit(double capital, double taux, int duree) {
        double t = taux/100;
        double t1 = capital* t/12;
        double t2 = 1 - Math.pow(1 +t/12, -duree);
        return t1/t2;
    }
}

以及调用

信用模型.java:

package web;

public class CreditModel {
    private double montant;
     private double taux;
     private int duree;
     private double mensualite;
     private double resultat;

    public double getMontant() {
        return montant;
    }

    public void setMontant(double montant) {
        this.montant = montant;
    }

    public double getTaux() {
        return taux;
    }

    public void setTaux(double taux) {
        this.taux = taux;
    }

    public int getDuree() {
        return duree;
    }

    public void setDuree(int duree) {
        this.duree = duree;
    }

    public double getMensualite() {
        return mensualite;
    }

    public void setMensualite(double mensualite) {
        this.mensualite = mensualite;
    }

    public double getResultat() {
        return resultat;
    }

    public void setResultat(double resultat) {
        this.resultat = resultat;
    }
}

我尝试了使用 get 的 HTTP 请求,但它不起作用。

JSP Servlet http-status-code-500

评论

0赞 Roman C 11/1/2023
在您的代码中不需要 scriptlet。您可以使用 EL 表达式解决您的问题。此外,自 2000 年的 Struts #1 框架以来,为 Web 应用程序编写原始 servlet 代码也已开始讨论。现在,您可以使用任何可用的 Web 框架来代替 servlet。
0赞 The KNVB 11/1/2023
您可以尝试将 替换为 .reqrequest

答:

-1赞 Roman C 11/2/2023 #1

你有一个编译错误

无法解析 req

因为是方法的局部参数。当一个方法结束时,它将在代码中的任何位置都不可用,包括编译到另一个 servlet 的 JSP。reqdoGet()

在 JSP 中使用 scriptlet。它们通常是用 Java 编写的,并且可以将代码移动到 servlet 中,以便使用 EL 表达式进行进一步引用。

因此,您需要从 JSP 的头部删除 scriptlet 代码。并且此代码可以替换

<p> Mensualite = <%=model.getResultat() %> </p>  

<p> Mensualite = ${model.resultat}  </p>