处理JSP页,数组列表时出现异常错误

v1uwarro  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(173)

I'm not able to figure out this problem.
My error:
org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 28

Line 28:             <c:forEach items="${data.visit}" var="visit">

java class:

public class DataBean implements Serializable, ServletContextListener {

    private static final String nameOfLogger = DataBean.class.getName();
    private static final Logger logger = Logger.getLogger(nameOfLogger);

    public class Visit {

        public Visit(String dateOfTheVisit, String category, String idClient, String idInsrurer, String idDoctor, String idVisit,String accepted) {
            this.dateOfTheVisit = dateOfTheVisit;
            this.category = category;
            this.idClient = idClient;
            this.idInsrurer = idInsrurer;
            this.idDoctor = idDoctor;
            this.idVisit = idVisit;
            this.accepted = accepted;
        }

        public String getIdVisit() {
            return idVisit;
        }

        public void setIdVisit(String idVisit) {
            this.idVisit = idVisit;
        }

        public String getDateOfTheVisit() {
            return dateOfTheVisit;
        }

        public void setDateOfTheVisit(String dateOfTheVisit) {
            this.dateOfTheVisit = dateOfTheVisit;
        }

        public String getCategory() {
            return category;
        }

        public void setCategory(String category) {
            this.category = category;
        }

        public String getIdClient() {
            return idClient;
        }

        public void setIdClient(String idClient) {
            this.idClient = idClient;
        }

        public String getIdInsrurer() {
            return idInsrurer;
        }

        public void setIdInsrurer(String idInsrurer) {
            this.idInsrurer = idInsrurer;
        }

        public String getIdDoctor() {
            return idDoctor;
        }

        public void setIdDoctor(String idDoctor) {
            this.idDoctor = idDoctor;
        }

        String idVisit;
        String dateOfTheVisit;
        String category;
        String idClient;
        String idInsrurer;
        String idDoctor;
        String accepted;

        public String getAccepted() {
            return accepted;
        }

        public void setAccepted(String accepted) {
            this.accepted = accepted;
        }

    }

    public class Insurer {

        public Insurer(String idInsurer, String name) {
            this.idInsurer = idInsurer;
            this.name = name;
        }

        public String getIdInsurer() {
            return idInsurer;
        }

        public void setIdInsurer(String idInsurer) {
            this.idInsurer = idInsurer;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        String idInsurer;
        String name;
    }

    //public List<Visit> visitArray = new ArrayList<>();
    public List<Insurer> insurerArray = new ArrayList<>();

    private java.sql.Connection psqlCon = null;
    private boolean psqlConnectionCreated = false;

    synchronized public ArrayList<Visit> getVisit() throws ClassNotFoundException, SQLException {
    Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "password");
    Statement stm;
    stm = conn.createStatement();
    String sql = "Select * From Customer";
    ResultSet rst;
    rst = stm.executeQuery(sql);
    ArrayList<Visit> visitArray = new ArrayList<>();
    while (rst.next()) {
        Visit visit = new Visit(rst.getString("dateOfTheVisit"), rst.getString("category"), rst.getString("idClient"), rst.getString("idInsurer"), rst.getString("idDoctor"), rst.getString("idVisit"),rst.getString("accepted"));
        visitArray.add(visit);
    }
    return visitArray;
}

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

    }
}

jsp:

<%@page import="java.util.List"%>
<HTML>
    <HEAD>
    </HEAD>

    <BODY>

        <jsp:useBean id="data" class="sevenet.DataBean" scope="application"/>

        <H1>The tableName Database Table </H1>

        <TABLE BORDER="1">
            <TR>
                <TH>Date</TH>
                <TH>Category</TH>
                <TH>IdClient</TH>
                <TH>IdInsurer</TH>
                <TH>IdDoctor</TH>
                <TH>Accepted</TH>
                <TH>ID</TH>
            </TR>
            <tbody>
            <c:forEach items="${data.visit}" var="visit">
                <tr>
                <td><c:out value="${visit.dateOfTheVisit}"/></td>
                <td><c:out value="${visit.category}"/></td>  
                <td><c:out value="${visit.idClient}"/></td>
                <td><c:out value="${visit.idInsrurer}"/></td> 
                <td><c:out value="${visit.idDoctor}"/></td>
                <td><c:out value="${visit.idVisit}"/></td> 
                <td><c:out value="${visit.accepted}"/></td> 
                </tr>
            </c:forEach>
        </tbody>
    </TABLE>

</BODY>
</HTML>

I'm not sure what I did wrong, but I think that it is something about the definition of the bean.
I appreciate every attempt to help!

sirbozc5

sirbozc51#

以下是我为让您的应用程序运行所做的工作。
FolderStructure(文件夹结构的图像)ApplicationExample(应用程序运行示例)
创建2个新Java包
(1)小服务程序(2)列表
添加2个类到列表(1)Visit.java(2)VisitListVariables.java添加1个类到Servlet(1)Servlet. java
Inside Visit.java

package lists;

import java.util.ArrayList;
import java.util.List;

 public class Visit{
      public static List<VisitListVariables> BuildVisitList(){

        List<VisitListVariables> BuildVisitList = new ArrayList<>(); //creates List to return
        try{
          //Database connection variables
          //Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "password");
          //Statement stm;
          //stm = conn.createStatement();
          //String sql = "Select * From Customer";
          //ResultSet rs;
          //rs = stm.executeQuery(sql);

            //while(rs.next()){
              VisitListVariables buildList = new VisitListVariables(); //Gets variables needed for list
              //String visitDate = rs.getString("visitDate"); 
              String dateOfTheVisit = "today";
              buildList.setDateOfTheVisit(dateOfTheVisit);
              buildList.setCategory("Doctor Visit");
              buildList.setIdClient("666");
              buildList.setIdInsrurer("999");
              buildList.setIdDoctor("1001");
              buildList.setIdVisit("001");
              buildList.setAccepted("yes");

              BuildVisitList.add(buildList);
            //}
            //rs.close();stm.close();conn.close();

        }catch(Exception e){}



        return BuildVisitList;

      }
    }

Inside VisitListVariables.java

package lists;

public class VisitListVariables {
    private String dateOfTheVisit;
    private String category;
    private String idClient;
    private String idInsrurer;
    private String idDoctor;
    private String idVisit;
    private String accepted;

  public String getDateOfTheVisit() {
    return dateOfTheVisit;
  }

  public void setDateOfTheVisit(String dateOfTheVisit) {
    this.dateOfTheVisit = dateOfTheVisit;
  }

  public String getCategory() {
    return category;
  }

  public void setCategory(String category) {
    this.category = category;
  }

  public String getIdClient() {
    return idClient;
  }

  public void setIdClient(String idClient) {
    this.idClient = idClient;
  }

  public String getIdInsrurer() {
    return idInsrurer;
  }

  public void setIdInsrurer(String idInsrurer) {
    this.idInsrurer = idInsrurer;
  }

  public String getIdDoctor() {
    return idDoctor;
  }

  public void setIdDoctor(String idDoctor) {
    this.idDoctor = idDoctor;
  }

  public String getIdVisit() {
    return idVisit;
  }

  public void setIdVisit(String idVisit) {
    this.idVisit = idVisit;
  }

  public String getAccepted() {
    return accepted;
  }

  public void setAccepted(String accepted) {
    this.accepted = accepted;
  }

}

Inside Servlet.java

package Servlet;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lists.Visit;
import lists.VisitListVariables;

public class Servlet extends HttpServlet {

  /**
   * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
   * methods.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {

      List<VisitListVariables> visit = Visit.BuildVisitList();
      request.setAttribute("visitParam", visit); // Will be available as ${visitParam} in JSP
      request.getRequestDispatcher("/test.jsp").forward(request, response);

  }

  // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
  /**
   * Handles the HTTP <code>GET</code> method.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    processRequest(request, response);
  }

  /**
   * Handles the HTTP <code>POST</code> method.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    processRequest(request, response);
  }

  /**
   * Returns a short description of the servlet.
   *
   * @return a String containing servlet description
   */
  @Override
  public String getServletInfo() {
    return "Short description";
  }// </editor-fold>

}

在jsp中,我将其命名为test.jsp

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <TITLE>The tableName Database Table </TITLE>
</head>

<body>

    <H1>The tableName Database Table </H1>

    <table BORDER="1">
        <tr>
            <th>Date</th>
            <th>Category</th>
            <th>IdClient</th>
            <th>IdInsurer</th>
            <th>IdDoctor</th>
            <th>Accepted</th>
            <th>ID</th>
        </tr>
        <tbody>
            <c:forEach items="${visitParam}" var="visit">
                <tr>
                    <td><c:out value="${visit.dateOfTheVisit}"/></td>
                    <td><c:out value="${visit.category}"/></td>  
                    <td><c:out value="${visit.idClient}"/></td>
                    <td><c:out value="${visit.idInsrurer}"/></td> 
                    <td><c:out value="${visit.idDoctor}"/></td>
                    <td><c:out value="${visit.idVisit}"/></td> 
                    <td><c:out value="${visit.accepted}"/></td> 
                </tr>
            </c:forEach>
        </tbody>
    </table>

</body>
</html>

Web.xml(通常您会有一个带有链接<a href='/Servlet'>Visits</a>的索引页,它指向您的servlet,但是为了进行测试,您可以将servlet键入url//localhost:8080/ProjectName/Servlet)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>Servlet.Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/Servlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>Servlet</welcome-file>
    </welcome-file-list>
</web-app>
cqoc49vn

cqoc49vn2#

Your code is quite tricky!!
1)Who is the caller of the method getVisit()? 2) Why you created a DataBean class with inner classes declared inside? 3) You are returning a ArrayList visitArray = new ArrayList<>(), and not a DataBean!
So, first of all, the DataBean class is useless Secondly, in the Visit class, don't just use a Insrured id, but use a instance of Insurer. this is the code examples:

public class Visit {

public Visit(String dateOfTheVisit, String category, String idClient, Insurer insurer, String idDoctor, String idVisit,String accepted) {
    this.dateOfTheVisit = dateOfTheVisit;
    this.category = category;
    this.idClient = idClient;
    this.insurer = insurer;
    this.idDoctor = idDoctor;
    this.idVisit = idVisit;
    this.accepted = accepted;
}

public String getIdVisit() {
    return idVisit;
}

public void setIdVisit(String idVisit) {
    this.idVisit = idVisit;
}

public String getDateOfTheVisit() {
    return dateOfTheVisit;
}

public void setDateOfTheVisit(String dateOfTheVisit) {
    this.dateOfTheVisit = dateOfTheVisit;
}

public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

public String getIdClient() {
    return idClient;
}

public void setIdClient(String idClient) {
    this.idClient = idClient;
}

public String getIdDoctor() {
    return idDoctor;
}

public void setIdDoctor(String idDoctor) {
    this.idDoctor = idDoctor;
}

String idVisit;
String dateOfTheVisit;
String category;
String idClient;
String idInsrurer;
String idDoctor;
String accepted;
Insurer insurer;

public String getAccepted() {
    return accepted;
}

public void setAccepted(String accepted) {
    this.accepted = accepted;
}

}
public class Insurer {

public Insurer(String idInsurer, String name) {
    this.idInsurer = idInsurer;
    this.name = name;
}

public String getIdInsurer() {
    return idInsurer;
}

public void setIdInsurer(String idInsurer) {
    this.idInsurer = idInsurer;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

String idInsurer;
String name;

}
Now you should create a servlet to show the datas, check this tutorial: http://www.mkyong.com/servlet/a-simple-servlet-example-write-deploy-run/
NOTICE THAT in the class ServletDemo1 the method name must be doGet (and not doGe, it was a simple digit error).
So, in your ServletDemo1, in the doGet method, you must do the same logic of your your getVisit(), then, before the return, you have to add this:

request.setAttribute("visitList",visitArray);

and instead o returning the list, dispatch to the your jsp path like this:

request.getRequestDispatcher("/index.jsp").forward(request, response);

Now, in your jsp, delete

<jsp:useBean id="data" class="sevenet.DataBean" scope="application"/>

and correct the for each like this:

<c:forEach items="${visitList}" var="visit">

and instead of

<td><c:out value="${visit.idInsrurer}"/></td>

put

<td><c:out value="${visit.insrurer.idInsurer}"/></td>

I did not tried the code, but if you have any question do not hesitate to ask!

v8wbuo2f

v8wbuo2f3#

Firstly, thank you very much for your answers. I have modified the code according to the first answer, but i got some trouble.
java:

public class DataBean{

private static final String nameOfLogger = DataBean.class.getName();
private static final Logger logger = Logger.getLogger(nameOfLogger);

public class VisitListVariables{
private String dateOfTheVisit;
private String category;
private String idClient;
private String idInsrurer;
private String idDoctor;
private String idVisit;
private String accepted;

    public String getDateOfTheVisit() {
        return dateOfTheVisit;
    }

    public void setDateOfTheVisit(String dateOfTheVisit) {
        this.dateOfTheVisit = dateOfTheVisit;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getIdClient() {
        return idClient;
    }

    public void setIdClient(String idClient) {
        this.idClient = idClient;
    }

    public String getIdInsrurer() {
        return idInsrurer;
    }

    public void setIdInsrurer(String idInsrurer) {
        this.idInsrurer = idInsrurer;
    }

    public String getIdDoctor() {
        return idDoctor;
    }

    public void setIdDoctor(String idDoctor) {
        this.idDoctor = idDoctor;
    }

    public String getIdVisit() {
        return idVisit;
    }

    public void setIdVisit(String idVisit) {
        this.idVisit = idVisit;
    }

    public String getAccepted() {
        return accepted;
    }

    public void setAccepted(String accepted) {
        this.accepted = accepted;
    }

}

private java.sql.Connection psqlCon = null;
private boolean psqlConnectionCreated = false;

    public static class Visit{
  public static List<VisitListVariables> BuildVisitList(String dateOfTheVisit, String category, String idClient, String idInsrurer, String idDoctor, String idVisit,String accepted) throws SQLException {

    List<VisitListVariables> BuildVisitList = new ArrayList<>();

    Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "password");
    Statement stm;
    stm = conn.createStatement();
    String sql = "Select * From Customer";
    ResultSet rs;
    rs = stm.executeQuery(sql);
    ArrayList<Visit> visitArray = new ArrayList<>();

    BuildSearch buildList = new BuildSearch();
    while(rs.next()){
      String visitDate = rs.getString("visitDate"); //gets variable from database
      buildList.setDateOfTheVisit(visitDate);
      BuildVisitList.add(buildList);
    }

    return BuildVisitList;

  }

    public class Insurer {

        public Insurer(String idInsurer, String name) {
            this.idInsurer = idInsurer;
            this.name = name;
        }

        public String getIdInsurer() {
            return idInsurer;
        }

        public void setIdInsurer(String idInsurer) {
            this.idInsurer = idInsurer;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        String idInsurer;
        String name;
    }

    }
}

servlet:

public class Servlet extends HttpServlet{

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         visit = Visit.BuildVisitList(dateOfTheVisit, category, idClient, idInsrurer, idDoctor, idVisit, accepted);
        request.setAttribute("visitParam", visit); // Will be available as ${visitParam} in JSP
        request.getRequestDispatcher("index.jsp").forward(request, response);

    }
}

jsp:

<HTML>
<HEAD>
    <TITLE>The tableName Database Table </TITLE>
</HEAD>

<BODY>

    <jsp:useBean id="data" class="sevenet.DataBean" scope="application"/>

    <H1>The tableName Database Table </H1>

    <TABLE BORDER="1">
        <TR>
            <TH>Date</TH>
            <TH>Category</TH>
            <TH>IdClient</TH>
            <TH>IdInsurer</TH>
            <TH>IdDoctor</TH>
            <TH>Accepted</TH>
            <TH>ID</TH>
        </TR>
        <tbody>
            <c:forEach items="${visitParam}" var="visit">
                <tr>
                    <td><c:out value="${visit.dateOfTheVisit}"/></td>
                    <td><c:out value="${visit.category}"/></td>  
                    <td><c:out value="${visit.idClient}"/></td>
                    <td><c:out value="${visit.idInsrurer}"/></td> 
                    <td><c:out value="${visit.idDoctor}"/></td>
                    <td><c:out value="${visit.idVisit}"/></td> 
                    <td><c:out value="${visit.accepted}"/></td> 
                </tr>
            </c:forEach>
        </tbody>
    </TABLE>

</BODY>

How to declare BuildSearch()? What should be in this method?
Servlet can not find symbol visit, how to fix it? I know that this can be basic issues, but it is my first java project with database, web service..

guicsvcw

guicsvcw4#

You need to use a servlet to get and send data to the jsp and set session variables. use your class to do your logic.
create a separate getter and setter class for each list
In New class

public class VisitListVariables{
    private String dateOfTheVisit;
    private String category;
    private String idClient;
    private String idInsrurer;
    private String idDoctor;
    private String idVisit;
    private String accepted;

    public String getDateOfTheVisit(){
      return dateOfTheVisit;
    }
    public void setDateOfTheVisit(String dateOfTheVisit){
      this.dateOfTheVisit = dateOfTheVisit;
    }
    ...(More Getter and Setters)...
}

Visit class

public class Visit{
  public static List<VisitListVariables> BuildVisitList(String dateOfTheVisit, String category, String idClient, String idInsrurer, String idDoctor, String idVisit,String accepted) {

    List<VisitListVariables> BuildVisitList = new ArrayList<>();

    //database connection here
    VisitListVariables buildList = new VisitListVariables();
    while(rs.next()){
      String visitDate = rs.getString("visitDate"); //gets variable from database
      buildList.setDateOfTheVisit(visitDate);
      BuildVisitList.add(buildList);
    }

    return BuildVisitList;

  }

}
//In New Servlet Put the visit in the session and you can get it with JSTL.

protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
  visit = Visit.BuildVisitList(dateOfTheVisit,category,idClient, idInsrurer,idDoctor,idVisit,accepted);
  request.setAttribute("visitParam", visit); // Will be available as ${visitParam} in JSP
  request.getRequestDispatcher("/PageName.jsp").forward(request, response);

}

Your jsp

<c:forEach items="${visitParam}" var="visit">
    <tr>
      <td><c:out value="${visit.dateOfTheVisit}"/></td>
      <td><c:out value="${visit.category}"/></td>  
      <td><c:out value="${visit.idClient}"/></td>
      <td><c:out value="${visit.idInsrurer}"/></td> 
      <td><c:out value="${visit.idDoctor}"/></td>
      <td><c:out value="${visit.idVisit}"/></td> 
      <td><c:out value="${visit.accepted}"/></td> 
    </tr>
</c:forEach>
kx7yvsdv

kx7yvsdv5#

使用getter代替,如**<c:out value="${visit.getDateOfTheVisit()}"/>**

相关问题