Servlets FileNotFoundException web.xml

Servlets 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方法背后的代码中,您在问题中根本没有显示该方法,因此很难找出根本原因。但我推测您刚刚在给定的相对路径上创建了一个新文件。这是一个糟糕的主意,原因如下: 新文件相对于磁盘文件系统中的当前工作文件夹而不是

继续我的学习。。。我试图将一些数据写入txt文件,但收到了此异常。我正在使用Tomcat7.0。EmailList.txt在文件夹中,所以我不知道其中发生了什么。你们能帮帮我吗

web.xml

I/O类

包装数据

导入java.io。; 导入java.util


问题出在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();
    }
}