无法在文件中写入-JAVA servlet
我正在尝试用Javaservlet写入一个文件。我在一个普通的java项目中有相同的代码,它工作得很好,但在JavaServlet中没有 对于包含该方法的类,请参考下面的代码:无法在文件中写入-JAVA servlet,java,file,servlets,printwriter,Java,File,Servlets,Printwriter,我正在尝试用Javaservlet写入一个文件。我在一个普通的java项目中有相同的代码,它工作得很好,但在JavaServlet中没有 对于包含该方法的类,请参考下面的代码: public class UserRecords { private String fileName = "Users.txt"; public void addRecord(String firstName, String lastName, String email, String pass){
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);
}
}
}
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);
}
}
调用该方法的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);
}
}
}
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
提前谢谢 如果您想让它在servlet环境中可靠地工作,您需要了解更多关于您的东西将在其中运行的环境的信息 首先,您的servlet可能被部署到同时在同一台机器上运行的几个不同的servlet容器中。设想一台专用于测试它是否在Tomcat、Glassfish、Websphere以及…、Tomcat 7、Tomcat 8以及Tomcat 9上运行的测试机器。然后,每个人都应该获得自己的users.txt文件,并且每个人都应该与其他人的users.txt文件隔离。除了将文件路径放在${user.home}中,然后希望(比如说三个tomcat实例)不是在同一个用户ID下运行之外,没有什么好办法可以摆脱这种情况 然后,在给定的servlet容器中,您的servlet可能被部署到多个不同的虚拟主机。因此,您需要从您的环境中获取虚拟主机名,并将其包含在完整的文件路径中(JavaEE中有一个这样做的调用,但我不知道是哪一个) 然后,在给定的虚拟主机中,您的servlet可能包含在多个不同的应用程序(/context)中,您需要确保每个实例都与它所包含的其他应用程序(/context)的实例隔离。因此,您需要从环境中获取应用程序(/context)名称,并将其包含在完整的文件路径中 最后,在非EE环境(“在普通java项目中”)中执行这些调用显然最多会产生崩溃,最坏的情况下也会产生“文件到哪里去了”的问题 编辑以获得更多澄清:
我说的“你需要确保……绝缘”更多的是指“你需要仔细考虑,并确定你是想要绝缘还是在那个层次上共享”。如果您确实想要共享,其结果是您必须确保您的数据管理具有所有常见的ACID属性,就像您将/可能使用的任何其他DBMS引擎一样。在普通java项目中,它工作正常,但在java Servlet中不工作。没有描述该问题,请详细说明该问题。如果创建了文件或创建了空白文件,或者捕获了与遇到的错误相关的任何日志(如果有),您是否检查了路径。是否可以确认是否调用了该方法?或者在调用该方法之前是否存在异常?@Arvind我在一个常规java项目中测试了相同的代码,它创建了文件并打印到其中,但在这里它没有这样做。甚至文件也没有创建。我还尝试在根目录中创建该文件,以测试它是否至少可以打印,但它不会执行任何操作。请尝试使用
文件类在服务器上跟踪文件绝对路径、预任务(读/写)的更多日志。您能用文件Users.txt
搜索您的工作空间一次吗?如果根据您的评论没有例外,那么应该在某个地方创建它。通过IDE以及本地目录结构进行搜索。