2013-10-19 3 views
0

저는 최근에 Java ee 응용 프로그램을 공부하기 시작했습니다. 대학 프로젝트를위한 우리의 과제 중 하나는 비행 예약 시스템을 구축하는 것입니다. 이렇게하려면 여러 서블릿과 stateful java bean을 사용하고 있습니다. 내가 사용하고있는 데이터가 배열로로드되는 순간, 나중에 데이터베이스를 추가 할 것입니다.스테이트 빈은 다른 웹 서블릿에 의해 쿼리 될 때 배열의 내용을 기억해야합니까?

Stateful Bean의 정보가 세션 기간 동안 거기에 남아 있어야한다는 것은 필자의 견해이지만, 나는 어딘가에있는 데이터 배열을 잃어 가고있다.

  • AirportFinder :이 자신의 검색어에 따라 사용 가능한 옵션에서 시작과 목적지 공항을 사용자에게 제공 나는 현재 3 웹 서블릿을 가지고있다.

  • FlightConfirmation :이 예약 세부 사항을 확인하도록 요청 :이 가격

  • BookingConfirmation과 함께 그 길을 운항하는 항공사의 목록을 제공합니다.

    • SearchFlights :

    I은 ​​단지 하나의 빈 가지고 이것은 상태 콩이다를, 그것은 현재의 데이터베이스를 검색하고 결과를 반환하는 데이터의 프로세싱을 처리한다.

예약을 확인하려고 할 때 문제가 발생합니다. 나는 ArrayList를 생성하고 그것을 빈의 생성자로 인스턴스화했다. FlightConfrimation 서블릿이 SearchFlights 빈에 정보를 다시 전달할 때 FlightConfirmation 서블릿으로 다시 전달하기 전에 결과를 ArrayList에 추가합니다.

나중에 BookingConfirmation 서블릿에 데이터가 필요하지만 다른 메소드에서이 ArrayList에 액세스하려고 시도하지만 null 포인터 예외가 계속 발생합니다. 처음에 데이터를 추가 할 때 ArrayList의 크기를 테스트하면 정확합니다. 그러나 ArrayList가 BookingConfirmation 서블릿에 의해 질의 될 때 다음과 같이 크기가 0이됩니다. Stateful Bean이 올바로 작동하는 방법을 이해하고 있습니까? 여기

는 SearchFlights 빈 내 코드입니다 :

public class SearchFlights { 

    String[][] bookedFlights; 
    String filePath = "C:\\Users\\some path\\Documents\\NetBeansProjects\\FlightFinder\\database_files\\"; 
    BufferedReader reader; 
    ArrayList<String[]> airports; 
    ArrayList<String[]> airlines; 
    ArrayList<String[]> routes; 
    ArrayList<String[]> routeResults; 

    public SearchFlights() { 
     airports = new ArrayList(); 
     airlines = new ArrayList(); 
     routes = new ArrayList(); 
     routeResults = new ArrayList(); 

     try { 
      reader = new BufferedReader(new FileReader(filePath + "airports.dat")); 
      while (reader.ready()) { 
       String row = reader.readLine(); 
       row = row.replaceAll("\"", ""); 
       airports.add(row.split(",")); 
      } 
      reader = new BufferedReader(new FileReader(filePath + "airlines.dat")); 
      while (reader.ready()) { 
       String row = reader.readLine(); 
       row = row.replaceAll("\"", ""); 
       airlines.add(row.split("\\s*,\\s*")); 
      } 
      reader = new BufferedReader(new FileReader(filePath + "routes.dat")); 
      while (reader.ready()) { 
       String row = reader.readLine(); 
       row = row.replaceAll("\"", ""); 
       routes.add(row.split("\\s*,\\s*")); 
       routes.get(routes.size() - 1)[7] = String.valueOf((int) (Math.random() * 500)); 
      } 

      reader.close(); 


     } catch (Exception ex) { 
      Logger.getLogger(SearchFlights.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    public String searchDatabase(String from, String to) { 

     ArrayList<String[]> fromIATA = new ArrayList(); 
     ArrayList<String[]> toIATA = new ArrayList(); 

     int found = 0; 
     for (String[] airport : airports) { 

      if (airport[2].toLowerCase().contains(from.toLowerCase())) { 

       fromIATA.add(airport); 
       found++; 

      } else if (airport[2].toLowerCase().contains(to.toLowerCase())) { 

       toIATA.add(airport); 
       found++; 
      } 

     StringBuilder form = new StringBuilder(); 
     form.append("<h2>Select From:</h2>"); 
     for (int i = 0; i < fromIATA.size(); i++) { 
      String[] result = fromIATA.get(i); 
      form.append("<input type=\"radio\" name=\"from\" value=\"").append(result[0]).append("\">") 
        .append("<b>").append(result[1]).append("</b>") 
        .append(", ").append(result[2]) 
        .append(", ").append(result[3]) 
        .append(", ").append(result[4]) 
        .append(", ").append(result[5]) 
        .append(", ").append(result[6]) 
        .append(", ").append(result[7]) 
        .append(", ").append(result[8]) 
        .append(", ").append(result[9]) 
        .append("<br>"); 

     } 
     form.append("<h2>Select To:</h2>"); 
     for (int i = 0; i < toIATA.size(); i++) { 
      String[] result = toIATA.get(i); 
      form.append("<input type=\"radio\" name=\"to\" value=\"").append(result[0]).append("\">") 
        .append("<b>").append(result[1]).append("</b>") 
        .append(", ").append(result[2]) 
        .append(", ").append(result[3]) 
        .append(", ").append(result[4]) 
        .append(", ").append(result[5]) 
        .append(", ").append(result[6]) 
        .append(", ").append(result[7]) 
        .append(", ").append(result[8]) 
        .append(", ").append(result[9]) 
        .append("<br>"); 
     } 


     StringBuilder message = new StringBuilder(
       "<!DOCTYPE html>" 
       + "<html>" 
       + "<head>" 
       + "<title>Flight Finder Results</title>" 
       + "</head>" 
       + "<body>" 
       + "<h1>Available Flights </h1>" 
       + "<form action=\"FlightConfirmation\" method=\"post\">" 
       + form.toString() 
       + "<input type=\"submit\" value=\"Select Flight\">" 
       + "</form>" 
       + "</body>" 
       + "</html>"); 



     return message.toString(); 
    } 

    public ArrayList<String[]> findRoutes(String from, String to) { 
     ArrayList<String[]> validRoutes = new ArrayList(); 

     for (String[] route : routes) { 

      if (route[3].toLowerCase().equals(from.toLowerCase()) && route[5].toLowerCase().equals(to.toLowerCase())) { 
       validRoutes.add(route); 
       routeResults.add(route); 
      } 
     } 

     System.out.println("Results size = " + routeResults.size()); 
     return validRoutes; 
    } 

    public ArrayList<String> getAirlineNames(ArrayList<String[]> airlineRoutes) { 
     ArrayList<String> names = new ArrayList(); 
     for (String[] airline : airlineRoutes) { 

      for (int i = 0; i < airlines.size(); i++) { 
       if (airlines.get(i)[3].equals(airline[0])) { 
        names.add(airlines.get(i)[1]); 
       } 
      } 
     } 

     return names; 
    } 

    public String[] getAirportNames(String from, String to) { 
     String[] names = new String[2]; 
     for (String[] airport : airports) { 

      if (airport[0].equals(from)) { 
       names[0] = airport[1]; 
      } else if (airport[0].equals(to)) { 
       names[1] = airport[1]; 
      } 
     } 

     return names; 
    } 

    public String getResultForConfirmaiton(int i) { 
     StringBuilder form = new StringBuilder(); 

     System.out.println("routeResults called from BookingConfirmation: " + routeResults.size()); 
     String[] result = routeResults.get(i); 
     String[] airportNames = getAirportNames(result[2], result[4]); 
     ArrayList<String> airlineNames = getAirlineNames(routeResults); 
     form.append("<input type=\"radio\" name=\"selectedflight\" value=\"").append("\">") 
       .append("<b>").append(airlineNames.get(i)).append("</b>") 
       .append(": ").append(airportNames[0]) 
       .append(" to ").append(airportNames[1]) 
       .append(". Price: ").append(result[7]) 
       .append(".<br>"); 
     return form.toString(); 
    } 
} 

답변

0

나의 이해는, 내가 방법이 아닌 전체 사용자를 통해, 하나의 서블릿에서 호출을 통해 대답은 상태 콩 데이터를 활성 상태로 유지한다는 것입니다 생각이 잘못되었습니다 프로세스이므로, 서블릿이 stateful 빈으로 끝나면 데이터가 손실된다.