Невозможно записать в файл - сервлеты JAVA - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь записать файл в сервлеты Java.У меня есть тот же код в обычном проекте Java, и он работает нормально, но не в Java-сервлете.

Пожалуйста, обратитесь к приведенному ниже коду для класса, который содержит метод:

public class UserRecords {

    private String fileName = "Users.txt";

    public void addRecord(String firstName, String lastName, String email, String pass){

        try {
            FileWriter fw = new FileWriter(fileName, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter pw = new PrintWriter(bw);

            pw.println(firstName + " " + lastName + " " + email + " " + pass);

            fw.flush();
            fw.close();

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

Java Servlet, который вызывает метод:

public class Register extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String firstName = request.getParameter("firstName");
        String lastName = request.getParameter("lastName");
        String email = request.getParameter("email");
        String pass = request.getParameter("pass");

        UserRecords ur = new UserRecords();

//        ur.addRecord(firstName, lastName, email, pass);
          ur.addRecord("Bucky", "Roberts", "bucky@records.com", "mypass");

        HttpSession session = request.getSession();
        session.setAttribute("firstName", firstName);

        RequestDispatcher rd = request.getRequestDispatcher("/welcome.jsp");
        rd.forward(request, response);


    }

}

Пожалуйста, помогите и руководство для записи в файл Users.txt

Заранее спасибо!

1 Ответ

0 голосов
/ 21 января 2019

Если вы хотите, чтобы это работало надежно в средах сервлетов, вам нужно понять кое-что о среде, в которой будут работать ваши вещи.

Во-первых, ваш сервлет может быть развернут в нескольких различныхконтейнеры сервлетов, работающие на одной машине одновременно.Подумайте об испытательной машине, предназначенной для проверки того, работает ли она на Tomcat, Glassfish, Websphere и ..., Tomcat 7, Tomcat 8 и Tomcat 9. Каждый из них должен бытьполучить свой собственный файл users.txt, и каждый из них должен быть изолирован от users.txt любого из остальных.Нет элегантного способа выйти из этого, кроме как указать путь к файлу в $ {user.home}, а затем надеяться, что, скажем, три экземпляра tomcat не будут работать под одним и тем же идентификатором пользователя.

Тогдав данном контейнере сервлета ваш сервлет может быть развернут на нескольких отдельных виртуальных хостах.Поэтому вам нужно получить имя виртуального хоста из вашей среды и включить его в полный путь к файлу (в java EE есть вызов, чтобы сделать это, но я не знаю наизусть, какое это).

Затем в пределах данного виртуального хоста ваш сервлет мог быть включен в более чем одно отдельное приложение (/ context), и вам необходимо убедиться, что каждый экземпляр изолирован от экземпляров других приложений (/ contextx), которые он включаетв. Таким образом, вам нужно получить имя приложения (/ context) из вашей среды и включить его в полный путь к файлу.

И, наконец, выполнять эти вызовы в среде, не связанной с EE ("в обычной java").project "), очевидно, в лучшем случае приведет к сбоям, и та же самая проблема" куда пропал файл "в худшем случае.

РЕДАКТИРОВАТЬ для дополнительного уточнения:

, где я сказал" вам нужночтобы обеспечить ... изоляцию "Я имел в виду больше" вам нужно продумать это и определить, хотите ли вы изоляцию или совместное использование на этом уровне ".Если вы действительно хотите поделиться, то вы должны убедиться, что управление данными получает все обычные свойства ACID, как и любой другой механизм СУБД, который вы / могли бы использовать.

...