在一个工程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>
请教各位朋友们!
<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>
请教各位朋友们!
解决方案 »
- flash Builder4 能和 struts2 框架结合么?
- forEach iterator 怎么循环显示啊?急救!!
- myeclipse,tomcat配置问题
- 高手帮一下忙Eclipse中启动tomcat启动不成"
- 急,谁弄过扫描仪
- 经理让学JBuilder进行bs模式的开发,但JB的两本书看下来觉得跟BS没啥关系,求助
- 100分求,jreechar9.21或jreechar9.20下的demo!
- [求助]查询条件为中文就查不到该数据?我该怎么半呀?
- tomcat包的问题!
- 高手请看---如何取到客户端的IP地址
- 快救命: dao组件测试中getBean()后为null?(在线等!)
- jsp下载中文文件出现乱码
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();
}
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>
...
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个文件测试的吗?
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();
}
<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
}
}
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>
问题也成功解决!