【问题标题】:FileNotFoundException web.xmlFileNotFoundException web.xml
【发布时间】:2011-12-13 01:00:50
【问题描述】:

继续我的学习...我正在尝试将一些数据写入 txt 文件,但我收到了这个异常。我正在使用Tomcat 7.0。 EmailList.txt 在文件夹中,所以我不知道发生了什么。各位大神,帮帮我吧

web.xml

<?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>

servlet 类这个类将处理数据。

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);             
    }    
}

I/O 类

包数据;

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

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();
    }
}

【问题讨论】:

    标签: servlets web.xml filenotfoundexception


    【解决方案1】:

    问题出在UserIO#addRecord() 方法背后的代码中,您根本没有在问题中显示,因此很难查明根本原因。但我猜你只是在给定的相对路径上做了一个new File()。这是一个坏主意,但由于以下原因:

    • new File() 相对于磁盘文件系统中的当前工作文件夹进行操作,而不是相对于 webapp 文件夹结构。即便如此,前导斜线 / 仍使其相对于磁盘根目录。
    • WAR 不一定要在磁盘上扩展,也可以在内存中扩展,这样就没有任何有效的磁盘文件系统路径可以在new File() 中使用。
    • 当重新部署 WAR 时,甚至当服务器重新启动时,扩展的 WAR 文件夹中的所有更改都将丢失,因为它们不存在于原始 WAR 文件中。

    宁可将文件写入到 扩展 WAR 文件夹之外的绝对路径上的文件,或者改用数据库。

    【讨论】:

    • 感谢您的建议。但我正在关注一本书,我将在接下来的几章中介绍数据库访问。我注意到的一件事是我在 web.xml 中所做的所有更改都不起作用。我创建了一个自定义 404 错误页面。发生错误时,Tomcat 会加载其默认页面。你知道是否可以是配置或其他东西?干杯
    • 您需要在每次web.xml 更改后重新启动Tomcat,或者将其配置为开启热部署,以便在web.xml 发生更改时自动重新启动webapp。如果这不能解决问题,那么您可能没有正确理解 servlet 异常处理。这本身就是一个完整的主题,所以这里只是一个链接:stackoverflow.com/questions/5299169/… 如果您仍然卡住,请提出一个新问题。这是题外话。
    • 再次感谢。稍后我会查看此链接。我已经重新启动了Tomcat,但它不起作用。好笑的是书上提供了代码,不知道是不是和Tomcat的兼容性问题。本书使用的 Tomcat 是第 6 版,我使用的是最新版本。无论如何,我看看这个链接,如果我不能让它工作,我会再问一次。谢谢
    • 嗨,我刚刚上传了 I/O 类。我还是被困住了。我没有收到任何异常,但文件中没有写入任何数据。我将文件的位置更改为应用程序的根目录,但它仍然无法正常工作。正如我在另一个主题中所问的那样,我对 web.xml 文件所做的任何更改都无法正常工作。例如,如果我创建了一个自定义的 404 错误页面,当错误发生时它不会出现该页面,但是如果我没有在这个文件中使用正确的语句 Tomcat 午餐会出错。有什么想法吗?
    • 如回答,File 相对于当前磁盘的工作目录运行(例如Tomcat/bin 或其他)。路径中的前导斜杠使其相对于磁盘根目录。所以使用new File("/WEB-INF/foo.txt") 会写信给C:\WEB-INF\foo.txt。您不应尝试写入扩展的 WAR 文件夹,而应写入磁盘文件系统上的 绝对 路径。您应该写信给/var/webapp/data/EmailList.txt 之类的东西,并确保这些文件夹存在于与服务器安装位置相同的磁盘分区上。
    猜你喜欢
    • 2013-10-03
    • 2011-12-10
    • 2013-12-09
    • 2011-06-09
    • 2016-04-05
    • 2018-07-11
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多