Try the following:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MessageServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // output an HTML page res.setContentType("text/html"); // load a configuration parameter (you must set this yourself) String root = getInitParameter("root"); // print some html ServletOutputStream out = res.getOutputStream(); out. println("<html>"); out.println("<head><title>Message of the Day</title></head>"); out.println("<body><h1>Today's Message:</h1>"); // print the file InputStream in = null; try { in = new BufferedInputStream (new FileInputStream(root + "/message.txt") ); int ch; while ((ch = in.read()) !=-1) { out.print((char)ch); } } finally { if (in != null) in.close(); // very important } // finish up out.println("</body></html>"); } }[Note: I have now successfully compiled and run the above example. You asked for a working source, you got it :-)]
You may want to do more than just copy the file; look in the java.io package for classes that help you process a file, like StreamTokenizer.
Pay attention to the use of an InitParameter to provide a root on the file system. That way your servlet can be used on other servers without hardcoding a file path.
Also, note the use of a finally block to close the file. This way, even if the reading throws an exception, the file will be closed. This is important on a server, since file descriptors are limited, and you don’t want any leaks, since the server will be up for a very long time (hopefully!).
Whenever you access local resources, you have to consider security holes. For instance, if you make a file name based on a FORM parameter, you should validate it, to make sure if a hacker sends in, e.g., “/etc/passwd” as his user name, he won’t actually get the system password file.