在一个工程chat中:down.jsp
<html>
<head><title>Chating...</title>
    <script type="text/javascript">
        var xmlHttpRequest;        function createXMLHttpRequest() {
            if(window.ActiveXObject) {
                return new ActiveXObject("Microsoft.XMLHTTP");
            } else if(window.XMLHttpRequest) {
                return new XMLHttpRequest();
            }
        }        function send() {
            var message = document.getElementById("message").value;
            document.getElementById("message").value = "";
            message = encodeURI(encodeURI(message));
            var url = "servlet/SendMessageServlet?message=" + message;
            xmlHttpRequest = createXMLHttpRequest();
            xmlHttpRequest.onreadystatechange = callBack_send;
            xmlHttpRequest.open("GET", url, true);
            xmlHttpRequest.send(null);
        }        function callBack_send() {
            if(xmlHttpRequest.readystate == 4 && xmlHttpRequest.status == 200) {
                //var retVal = xmlHttpRequest.responseText;
            }
        }
</script>
</head>
<body>
    <textarea id="message" cols="50" rows="7"></textarea>
    <input type="button" onclick="send()" value="Send"/>
</body>
</html>SendMessageServlet.java:package chat;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class SendMessageServlet extends HttpServlet { /**
 * Destruction of the servlet. <br>
 */
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} /**
 * The doGet method of the servlet. <br>
 *
 * This method is called when a form has its tag value method equals to get.
 * 
 * @param request the request send by the client to the server
 * @param response the response send by the server to the client
 * @throws ServletException if an error occurred
 * @throws UnsupportedEncodingException 
 * @throws IOException if an error occurred
 */
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException { try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

String message = request.getParameter("message");
try {
message = java.net.URLDecoder.decode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} HttpSession session = request.getSession();
String currentSessionId = (String)session.getAttribute("currentSessionId");
if(null == currentSessionId) {
currentSessionId = session.getId();
session.setAttribute("currentSessionId", currentSessionId);
}
File file = new File("c:\\ChatHistory\\" + currentSessionId + ".txt");
try {
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw); bw.newLine();
bw.write("访客说: " + message + "<br>");

bw.flush();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
 * The doPost method of the servlet. <br>
 *
 * This method is called when a form has its tag value method equals to post.
 * 
 * @param request the request send by the client to the server
 * @param response the response send by the server to the client
 * @throws ServletException if an error occurred
 * @throws IOException if an error occurred
 */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doGet(request, response);
} /**
 * Initialization of the servlet. <br>
 *
 * @throws ServletException if an error occurs
 */
public void init() throws ServletException {
// Put your code here
}
}在浏览器的地址栏输入地址访问进入了down.jsp页面,在文本域中输入:aaa,点击发送按钮,这时在c:\ChatHistory\目录下生成一个文件:283019C145D41C836909FAB2A0D8FC7E.txt,内容为:
访客说: aaa<br>
再在文本域中输入:bbb,点击发送按钮,这时,此文件的内容变成:
访客说: aaa<br>
访客说: bbb<br>
再在文本域中输入:ccc,点击发送按钮,这时,此文件的内容变成:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
再在文本域中输入:ddd,点击发送按钮,这时,此文件的内容变成:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
再在文本域中输入:eee,点击发送按钮,这时,此文件的内容变成:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>
这些都是期待的结果,但是,接下来,我输入:eee,点击发送按钮,这时此文件的内容还是:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>且在Eclipse的控制台中没有报任何出错信息。
再输入ddd,点击发送按钮,这时此文件的内容还是:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>且在Eclipse的控制台中没有报任何出错信息。
再输入ccc,点击发送按钮,这时此文件的内容还是:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>且在Eclipse的控制台中没有报任何出错信息。
再输入bbb,点击发送按钮,这时此文件的内容还是:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>且在Eclipse的控制台中没有报任何出错信息。
再输入aaa,点击发送按钮,这时此文件的内容还是:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>且在Eclipse的控制台中没有报任何出错信息。
接下来输入:fff,点击发送按钮,这时此文件的内容变成:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>
访客说: fff<br>
最终测试得出的结论是:若要发送以前曾发送过的信息,是无法写入文件的,只能发送以前没有发送过的信息。
问题1:如何使之可以发送重复信息?例如:我已经发送了5条信息,这时文本文件中的内容是:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>
当我在文本域中输入eee时,也能正确写到文本文件中,即我希望文本文件的内容这时变成:
访客说: aaa<br>
访客说: bbb<br>
访客说: ccc<br>
访客说: ddd<br>
访客说: eee<br>
访客说: eee<br>
请教各位朋友们!

解决方案 »

  1.   

    在这里还要关闭一下流:
    File file = new File("c:\\ChatHistory\\" + currentSessionId + ".txt");
            try {
                FileWriter fw = new FileWriter(file, true);
                BufferedWriter bw = new BufferedWriter(fw);            bw.newLine();
                bw.write("访客说: " + message + "<br>");
                
                bw.flush();
                bw.close();//注意这一行,还要关闭一下流
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
      

  2.   

    kokobox,谢谢你的回复,我试了,还是不行。
      

  3.   

    我测试了一下,没有问题,会不会是你的文件名不对?
    package kokobox;import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;public class Test { /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
    File file = new File("G:\\aaaa\\");
    if(!file.isDirectory()){
    file.mkdirs();
    }
    file = new File("G:\\aaaa\\kokobox.txt");
    if(!file.isFile()){
    file.createNewFile();
    }
            try {
                FileWriter fw = new FileWriter(file, true);
                BufferedWriter bw = new BufferedWriter(fw);
                for(int i = 0 ; i < 3 ; i++ ){
                 bw.newLine();
                 bw.write("访客说: " + i + "<br>");
                }
                bw.flush();
                bw.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }}
    得到的内容:
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>
      

  4.   

    我再次检查了一下,代码中已经加了bw.close();,即:...
    ...
    bw.flush();
    bw.close();
    fw.close();
    ...
    ...
    ...重新启动了Tomcat,重新部署了一下,访问进入down.jsp页面,在文本域中输入1,点击Send按钮,检查文本文件,里面内容是:
    访客说: 1<br>
    在文本域中输入2,点击Send按钮,检查文本文件,里面内容是:
    访客说: 1<br>
    访客说: 2<br>
    再在文本域中输入2,点击Send按钮,检查文本文件,里面内容还是:
    访客说: 1<br>
    访客说: 2<br>
    在文本域中输入3,点击Send按钮,检查文本文件,里面内容是:
    访客说: 1<br>
    访客说: 2<br>
    访客说: 3<br>
    整个过程中用的都是同一个页面:down.jsp页面,且第2次输入2后发送,检查文件,文件没有变化,还是访客说: 1<br>
    访客说: 2<br>紧接着就输入3后发送,再检查那个文件,就出现了:访客说: 1<br>
    访客说: 2<br>
    访客说: 3<br>
    所以,整个过程中操作的应该同一个文件。
    kokobox兄,你写的那个程序代码,我将之改成了e盘下,因为我没有g盘,我执行了2次,输出了:
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>
    访客说: 0<br>
    访客说: 1<br>
    访客说: 2<br>你能用我的那个文件试一下吗?B/S与C/S可能有些地方会不一样。
    ----------
    xingqiliudehuanghun兄,down.jsp与SendMessageServlet.java,就这2个文件,我都贴在上面了。你是用这2个文件测试的吗?
      

  5.   

    File file = new File("c:\\ChatHistory\\" + currentSessionId + ".txt");
            try {
                FileWriter fw = new FileWriter(file, true);
                BufferedWriter bw = new BufferedWriter(fw);            bw.newLine();
                bw.write("访客说: " + message + "<br>");
                
                bw.flush();
                bw.close();//注意这一行,还要关闭一下流
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
      

  6.   

    强哥,我测试过,代码如下<html>
    <head><title>Chating...</title>
        <script type="text/javascript">
            var xmlHttpRequest;        function createXMLHttpRequest() {
                if(window.ActiveXObject) {
                    return new ActiveXObject("Microsoft.XMLHTTP");
                } else if(window.XMLHttpRequest) {
                    return new XMLHttpRequest();
                }
            }        function send() {
                var message = document.getElementById("message").value;
                document.getElementById("message").value = "";
                message = encodeURI(encodeURI(message));
                var url = "servlet/SendMessageServlet?message=" + message+"&random="+Math.random();
                xmlHttpRequest = createXMLHttpRequest();
                xmlHttpRequest.onreadystatechange = callBack_send;
                xmlHttpRequest.open("GET", url, true);
                xmlHttpRequest.send(null);
            }        function callBack_send() {
                if(xmlHttpRequest.readystate == 4 && xmlHttpRequest.status == 200) {
                    //var retVal = xmlHttpRequest.responseText;
                }
            }
        </script>
    </head>
    <body>
        <textarea id="message" cols="50" rows="7"></textarea>
        <input type="button" onclick="send()" value="Send"/>
    </body>
    </html>
    package chat;import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;public class SendMessageServlet extends HttpServlet {    /**
         * Destruction of the servlet. <br>
         */
        public void destroy() {
            super.destroy(); // Just puts "destroy" string in log
            // Put your code here
        }    /**
         * The doGet method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to get.
         * 
         * @param request the request send by the client to the server
         * @param response the response send by the server to the client
         * @throws ServletException if an error occurred
         * @throws UnsupportedEncodingException 
         * @throws IOException if an error occurred
         */
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException {        try {
                request.setCharacterEncoding("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
            String message = request.getParameter("message");
            try {
                message = java.net.URLDecoder.decode(message, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }        HttpSession session = request.getSession();
            String currentSessionId = (String)session.getAttribute("currentSessionId");
            if(null == currentSessionId) {
                currentSessionId = session.getId();
                session.setAttribute("currentSessionId", currentSessionId);
            }
            File file = new File("c:\\ChatHistory\\" + currentSessionId + ".txt");
            BufferedWriter bw = null;
            try {
                bw = new BufferedWriter(new FileWriter(file, true));            bw.newLine();
                bw.write("访客说: " + message + "<br>");
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                try {
    bw.flush();
    } catch (IOException e) {
    }
    try {
    bw.close();
    } catch (IOException e) {
    }
            }
        }    /**
         * The doPost method of the servlet. <br>
         *
         * This method is called when a form has its tag value method equals to post.
         * 
         * @param request the request send by the client to the server
         * @param response the response send by the server to the client
         * @throws ServletException if an error occurred
         * @throws IOException if an error occurred
         */
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {        this.doGet(request, response);
        }    /**
         * Initialization of the servlet. <br>
         *
         * @throws ServletException if an error occurs
         */
        public void init() throws ServletException {
            // Put your code here
        }
    }
      

  7.   

    是你的浏览器在耍你,当你提交相同的url的时候,浏览器没有提交,所以你服务器那边根本没有相应,我在后面加上了一个random的函数,让每次提交url的值都改变一次!以后你要注意这个问题
      

  8.   

    vincent1234, Very Good!用你的代码,问题解决!--------------------------------------------------case 1:我还是用我以前的代码,在SendMessagesServlet.java中的这一行设置了一个断点:
    try {
    request.setCharacterEncoding("UTF-8");// A行,这行设置了一个断点。
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }访问进入down.jsp页面,输入3,点击Send按钮,程序停在了A行,
    输入2,点击Send按钮,程序停在了A行,
    输入1,点击Send按钮,程序停在了A行。再输入3或2或1,点击Send按钮,程序没有停在A行,看来根本没进入Servlet。
    问题1:我每次点击Send按钮,提交过的所有url,IE浏览器都会保存在一个列表中,是这样吗?当我再提交这个列表中提交过的那些地址时IE浏览器就不会再向服务器端重新请求此url了,是这样吗?
    case 2:我还是用我以前的代码,在FireFox中访问进入down.jsp,发送同样的信息也可以正常写入文本文件中,看来,IE与FireFox在这一点上是不同的。结论:问题不出在BufferedWriter上,BufferedWriter是能够向一个文件中写入重复信息的,问题出在IE浏览器上,当提交重复的地址时,IE浏览器不会重新向服务器端提交此请求,而FireFox与IE不同,FireFox也会重新向服务器端提交此请求。因为客户端用IE、FireFox的都有,所以,就可以用vincent1234的作法,将每次提交的url变一下。
    按照vincent1234提供的思路,我将代码改成了:
    down.jsp:<html>
    <head><title>Chating...</title>
        <script type="text/javascript">
            var xmlHttpRequest;
            var n = 0;        function createXMLHttpRequest() {
                if(window.ActiveXObject) {
                    return new ActiveXObject("Microsoft.XMLHTTP");
                } else if(window.XMLHttpRequest) {
                    return new XMLHttpRequest();
                }
            }        function send() {
                n++;
                var message = document.getElementById("message").value;
                document.getElementById("message").value = "";
                message = encodeURI(encodeURI(message));
                var url = "servlet/SendMessageServlet?message=" + message + "&n=" + n;
                xmlHttpRequest = createXMLHttpRequest();
                xmlHttpRequest.onreadystatechange = callBack_send;
                xmlHttpRequest.open("GET", url, true);
                xmlHttpRequest.send(null);
            }        function callBack_send() {
                if(xmlHttpRequest.readystate == 4 && xmlHttpRequest.status == 200) {
                    //var retVal = xmlHttpRequest.responseText;
                }
            }
    </script>
    </head>
    <body>
        <textarea id="message" cols="50" rows="7"></textarea>
        <input type="button" onclick="send()" value="Send"/>
    </body>
    </html>
    问题也成功解决!
      

  9.   

    如果有兴趣可以研究一下js,现在市面上还有三种浏览器的用户很多的  Opera 我最爱的 Safari 苹果电脑专用, google浏览器 目前启动和加载最快的他们的js都有各自特色!
      

  10.   

    如果有兴趣可以研究一下js,现在市面上还有三种浏览器的用户很多的  Opera 我最爱的 Safari 苹果电脑专用, google浏览器 目前启动和加载最快的他们的js都有各自特色!