Servlets FileNotFoundException web.xml
继续我的学习。。。我试图将一些数据写入txt文件,但收到了此异常。我正在使用Tomcat7.0。EmailList.txt在文件夹中,所以我不知道其中发生了什么。你们能帮帮我吗 web.xml I/O类 包装数据 导入java.io。; 导入java.utilServlets FileNotFoundException web.xml,servlets,web.xml,filenotfoundexception,Servlets,Web.xml,Filenotfoundexception,继续我的学习。。。我试图将一些数据写入txt文件,但收到了此异常。我正在使用Tomcat7.0。EmailList.txt在文件夹中,所以我不知道其中发生了什么。你们能帮帮我吗 web.xml I/O类 包装数据 导入java.io。; 导入java.util 问题出在UserIOaddRecord方法背后的代码中,您在问题中根本没有显示该方法,因此很难找出根本原因。但我推测您刚刚在给定的相对路径上创建了一个新文件。这是一个糟糕的主意,原因如下: 新文件相对于磁盘文件系统中的当前工作文件夹而不是
问题出在UserIOaddRecord方法背后的代码中,您在问题中根本没有显示该方法,因此很难找出根本原因。但我推测您刚刚在给定的相对路径上创建了一个新文件。这是一个糟糕的主意,原因如下: 新文件相对于磁盘文件系统中的当前工作文件夹而不是webapp文件夹结构进行操作。即使如此,前导的斜杠/使其相对于磁盘根。 WAR不一定是在磁盘上扩展的,它也可以在内存中扩展而不是在硬盘上,这样就没有任何有效的磁盘文件系统路径可以在新文件中使用。 重新部署WAR时,甚至服务器重新启动时,扩展WAR文件夹中的所有更改都将丢失,因为它们不在原始WAR文件中。
而是在扩展的WAR文件夹之外的绝对路径上写入文件,或者改用数据库。谢谢您的建议。但我在读一本书,我将在接下来的几章中讨论数据库访问。我注意到的一件事是,我在web.xml中所做的所有更改都不起作用。我创建了一个自定义404错误页面。当错误发生时,Tomcat将加载其默认页面。你知道是配置还是其他什么吗?谢谢您需要在每次web.xml更改后重新启动Tomcat,或者将其配置为打开hotdeployment,以便在web.xml发生更改时自动重新启动webapp。如果这不能解决问题,那么您可能没有正确理解servlet异常处理。这本身就是一个完整的主题,所以这里有一个链接:如果你仍然结巴,就提出一个新问题。这是离题。再次感谢。稍后我将查看此链接。我已经重新启动了Tomcat,但它不工作。有趣的是,这本书提供了代码,所以我不知道这是否是Tomcat的兼容性问题。这本书使用的Tomcat是版本6,我使用的是最新版本。无论如何,我在这个链接上有一个看,如果我没有得到它的工作,我再问。谢谢,我刚刚上传了I/O类。我还是被卡住了。我没有收到任何异常,但文件中没有写入任何数据。我将文件的位置更改为应用程序的根目录,但它仍然不工作。正如我在另一个主题中所问的,我对web.xml文件所做的任何更改都不起作用。例如,如果我创建了一个自定义的404错误页面,当错误发生时,它不会显示该页面,但是如果我在这个文件中没有使用正确的语句,Tomcat将显示一个错误。有什么想法吗?正如所回答的,文件是相对于当前磁盘的工作目录运行的,例如Tomcat/bin或其他。路径中的前导斜杠使其相对于磁盘根。因此,使用新文件/WEB-INF/foo.txt将写入C:\WEB-INF\foo.txt。您不应尝试写入扩展的WAR文件夹,而应写入磁盘文件系统上的绝对路径。您应该写入/var/webapp/data/EmailList.txt之类的文件,并确保这些文件夹与安装服务器的磁盘分区位于同一磁盘分区上。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>AddToEmailListServlet</servlet-name>
<servlet-class>email.AddToEmailListServlet</servlet-class>
<init-param>
<param-name>relativePathToFile</param-name>
<param-value>/WEB-INF/EmailList.txt</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>AddToEmailListServlet</servlet-name>
<url-pattern>/addToEmailList</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>join_email_list.jsp</welcome-file>
</welcome-file-list>
</web-app>
package email;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import business.User;
import data.UserIO;
public class AddToEmailListServlet extends HttpServlet
{ @Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// get parameters from the request
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
String emailAddress = request.getParameter("emailAddress");
User user = new User(firstName, lastName, emailAddress);
//validation
String message = "";
String url = "";
if (firstName.length() == 0 || lastName.length() == 0 || emailAddress.length() == 0) {
message = "Please fill out all three boxes";
url = "/join_email_list.jsp";
}else{
message = "";
ServletConfig config = getServletConfig();
String relativePath = config.getInitParameter("relativePathToFile");
UserIO.addRecord(user, relativePath);
url = "/display_email_entry.jsp";
}
request.setAttribute("user", user);
request.setAttribute("message", message);
//forward request and response
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
import business.User;
public class UserIO
{
public static void addRecord(User user, String filename) throws IOException
{
File file = new File(filename);
PrintWriter out = new PrintWriter(
new BufferedWriter(new FileWriter(file)));
out.println(user.getEmailAddress()+ "|"
+ user.getFirstName() + "|"
+ user.getLastName());
out.close();
}
}