【问题标题】:Not able to write in file - JAVA Servlets无法写入文件 - JAVA Servlets
【发布时间】:2018-09-28 16:14:23
【问题描述】:

我正在尝试在 Java Servlet 中写入文件。我在普通的 java 项目中有相同的代码,它工作正常,但在 Java Servlet 中却没有。

包含该方法的类请参考以下代码:

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

提前致谢!

【问题讨论】:

  • 在普通的java项目中可以正常工作,但在Java Servlet中不行。,没有描述问题,请详细说明问题。如果创建了文件或创建了空白文件,或者是否捕获了与遇到的错误相关的任何日志(如果有),您是否检查了路径。
  • 您能否确认该方法是否被调用?或者在方法被调用之前是否有一些异常?
  • @Arvind 我已经在一个常规的 java 项目中测试了相同的代码,它创建了文件并打印到它,但它在这里没有做同样的事情。甚至没有创建文件。我还尝试在根目录中创建该文件以测试它是否至少可以打印但它没有做任何事情。
  • 在服务器跟踪文件绝对路径上尝试更多日志,使用File类的权限(读/写)。
  • 您可以使用文件Users.txt 搜索您的工作空间一次吗?如果根据您的 cmets 没有例外,则应在某处创建它。通过 IDE 以及本地目录结构进行搜索。

标签: java file servlets printwriter


【解决方案1】:

如果您希望它在 servlet 环境中可靠地工作,您需要了解更多关于您的东西将在其中运行的环境的信息。

第一,您的 servlet 可能会部署到同时在同一台机器上运行的多个不同 servlet 容器中。考虑一台专门用于测试它是否在 Tomcat 以及 Glassfish 以及 Websphere 以及 ...,或 Tomcat 7 以及 Tomcat 8 以及 Tomcat 9 上运行的测试机器。然后每个都应该是获取他们自己的 users.txt 文件,并且每个人都应该与其他任何人的 users.txt 隔离。没有优雅的方法可以摆脱这种情况,而是将文件路径放在 ${user.home} 中,然后希望三个 tomcat 实例不在同一个用户 ID 下运行。

然后,在给定的 servlet 容器中,您的 servlet 可能会部署到多个不同的虚拟主机。因此,您需要从您的环境中获取虚拟主机名并将其包含在完整的文件路径中(在 java EE 中有一个调用来执行此操作,但我不知道是哪一个)。

然后,在给定的虚拟主机中,您的 servlet 可能已包含在多个不同的应用程序 (/context) 中,您需要确保每个实例都与其他应用程序 (/contexts) 的实例隔离包含在其中。因此您需要从您的环境中获取应用程序(/context)名称并将其包含在完整文件路径中。

最后,在非 EE 环境中(“在普通的 java 项目中”)进行这些调用显然最多会产生崩溃,最坏的情况是同样的问题“文件去哪儿了”。

编辑以获取更多说明:

我说“你需要确保......绝缘”我的意思更多的是“你需要仔细考虑并确定你是否想要在那个级别进行绝缘或共享”。如果您确实想要共享,结果是您必须确保为您的数据管理提供所有常见的 ACID 属性,就像您将/可能使用的任何其他 DBMS 引擎一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    相关资源
    最近更新 更多