0

最近、Java ee アプリケーションの勉強を始めました。大学のプロジェクトのタスクの 1 つは、フライト予約システムを構築することです。これを行うために、私はいくつかのサーブレットとステートフルな Java Bean を使用しています。使用しているデータが配列にロードされた時点で、後でデータベースを追加します。

ステートフル Bean 内の情報はセッションの間そのままにしておく必要があることは理解していますが、途中でデータの配列を失っています。現在、3 つの Web サーブレットがあります。

  • AirportFinder:検索語に基づいて、利用可能なオプションから出発空港と目的空港をユーザーに提供します。

  • FlightConfirmation:これは、そのルートを飛行する航空会社のリストと価格を提供します。

  • BookingConfirmation:ユーザーに予約の詳細を確認するよう求めます。

現在、Bean は 1 つしかありません。

  • SearchFlights:これはステートフル Bean です。現在、データの処理を処理し、データベースを検索して結果を返します。

予約を確認しようとすると問題が発生します。ArrayList を作成し、Bean のコンストラクターでインスタンス化しました。FlightConfirmation サーブレットが情報を SearchFlights Bean に返すとき、その結果を ArrayList に追加してから、それを FlightConfirmation サーブレットに返します。

後で、BookingConfirmation サーブレットがデータを必要とするときに別のメソッドからこの ArrayList にアクセスしようとしましたが、null ポインター例外が発生し続けます。最初にデータを追加するときに ArrayList のサイズをテストすると、それは正しいです。しかし、次に ArrayList が BookingConfirmation サーブレットによってクエリされると、サイズは 0 になります。ステートフル Bean がどのように機能するかについての私の理解は間違っていますか?

SearchFlights Bean のコードは次のとおりです。

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();
    }
}
4

1 に答える 1

0

私の理解は間違っていました。答えは、ステートフル Bean は、ユーザー プロセス全体ではなく、単一のサーブレットからのメソッド呼び出しを介してデータでアクティブなままであるため、そのサーブレットがステートフル Bean で終了すると、データが失われるということです。

于 2013-10-22T11:40:32.593 に答える