简单的在线客户demo---备忘

luozhangwen 2010-09-09 04:12:31

CREATE TABLE `msg` (
`id` int(11) NOT NULL auto_increment,
`senduid` int(11) default NULL, --发送人uid
`recvuid` int(11) default NULL, --接收人uid
`senddate` datetime default NULL, --发送时间
`msg` varchar(1000) default NULL, --发送消息
`iframe` int(11) default NULL, --是否已经被接收
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=230 DEFAULT CHARSET=utf8;

CREATE TABLE `usertable` (
`uid` int(11) NOT NULL auto_increment,
`userName` varchar(50) default NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


public class MsgBean
{
private int id;
private Timestamp sendDate;
private String msgContent;
private int sendUid;
private int recivUid;
//get set
}
public class UserBean
{
private Integer uid;
private String username;
//get set
}
...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luozhangwen 2010-10-19
  • 打赏
  • 举报
回复
注意:sendMsg.jsp页面接收信息的时候textare发送消息回车换行的时候需要需要

String msgContext = request.getParameter("saytext").replaceAll("\n|\r\n","</br>");


发送消息的时候需要替换掉HTML等标签.
liuyuhua0066 2010-09-13
  • 打赏
  • 举报
回复
又发博客来了
joy102 2010-09-13
  • 打赏
  • 举报
回复
//chatFrame的Iframe.src=refMsg.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8" session="false"%>
<%@page import="com.lzw.bean.RefMsgService"%>
<%@page import="com.lzw.bean.UserBean"%>
<html>
<head>
<meta http-equiv="Refresh" content= "3;URL=refMsg.jsp">
</head>

<body>

<%
UserBean user = (UserBean) request.getSession().getAttribute("user");
String newMsg = null;
if (user.getUid() == 1)
{
newMsg = RefMsgService.getContent(2, 1,user.getUid());
}
else
{
newMsg = RefMsgService.getContent(1, 2,user.getUid());
}
if (newMsg == null){
return;
}

%>

<SCRIPT LANGUAGE="javascript">
var obj= parent.document.getElementById("msgs");
if(obj.innerHTML != null)
{
obj.innerHTML=obj.innerHTML+ "<%=newMsg%>";
} else
{
obj.innerHTML = "<%=newMsg%>";
}
obj.doScroll('scrollbarPageDown');

</script>

<!--
function getNowDate() {
var dateObj = new Date();
var formatDate = "[" + dateObj.getYear( )+ "-" + dateObj.getMonth()+"-"+dateObj.getDay() + " " + dateObj.getHours()+":"+dateObj.getMinutes()+":"+dateObj.getSeconds()+"]";
return formatDate;
}

var flag ="<div><font color=#ff0000>" + getNowDate()+" 您说:</font></br></div>"
var obj= parent.document.getElementById("msgs");
var newMsg = "<div><font color=#ff0000>" +parent.document.getElementById("sayText").value + "</font></br></div>";
obj.innerHTML=obj.innerHTML + flag + newMsg;
obj.doScroll('scrollbarPageDown');
-->
</body>
</html>
joy102 2010-09-13
  • 打赏
  • 举报
回复
//这里貌似使用jsp页面来写.因为有特殊符号使用out.println的时候会有问题, sendMsg.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8" session="false"%>
<%@page import="com.lzw.bean.RefMsgService"%>
<%@page import="com.lzw.bean.UserBean"%>
<html>
<head>
<meta http-equiv="Refresh" content= "3;URL=refMsg.jsp">
</head>

<body>

<%
UserBean user = (UserBean) request.getSession().getAttribute("user");
String newMsg = null;
if (user.getUid() == 1)
{
newMsg = RefMsgService.getContent(2, 1,user.getUid());
}
else
{
newMsg = RefMsgService.getContent(1, 2,user.getUid());
}
if (newMsg == null){
return;
}

%>

<SCRIPT LANGUAGE="javascript">
var obj= parent.document.getElementById("msgs");
if(obj.innerHTML != null)
{
obj.innerHTML=obj.innerHTML+ "<%=newMsg%>";
} else
{
obj.innerHTML = "<%=newMsg%>";
}
obj.doScroll('scrollbarPageDown');

</script>

<!--
function getNowDate() {
var dateObj = new Date();
var formatDate = "[" + dateObj.getYear( )+ "-" + dateObj.getMonth()+"-"+dateObj.getDay() + " " + dateObj.getHours()+":"+dateObj.getMinutes()+":"+dateObj.getSeconds()+"]";
return formatDate;
}

var flag ="<div><font color=#ff0000>" + getNowDate()+" 您说:</font></br></div>"
var obj= parent.document.getElementById("msgs");
var newMsg = "<div><font color=#ff0000>" +parent.document.getElementById("sayText").value + "</font></br></div>";
obj.innerHTML=obj.innerHTML + flag + newMsg;
obj.doScroll('scrollbarPageDown');
-->
</body>
</html>
luozhangwen 2010-09-09
  • 打赏
  • 举报
回复
//登陆页面省略, 直接跳到.comfirm.html

<html>
<script>
var f="width=450,height=458,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no";
var result = window.open("chatFrame.jsp","",f);
if (result!=null) {
result.focus();
window.opener=null;
window.close();
}
</script>
</html>
//charFrame.jsp 聊天页面
[code=HTML]
<%@ page language="java" contentType="text/html;charset=UTF-8" session="false" %>
<html>
<head>
<script type="text/javascript">
function myKeyDown()
{
if ((event.altKey)&&
((event.keyCode==37)|| //屏蔽 Alt+ 方向键 ←
(event.keyCode==39))){ //屏蔽 Alt+ 方向键 →
event.returnValue=false;
return ;
}
if (/*(event.keyCode==8)||*/ //屏蔽退格删除键
(event.keyCode==116)){ //屏蔽 F5 刷新键
event.keyCode=0;
event.returnValue=false;
return ;
}
if ((event.ctrlKey)&&(event.keyCode==78)){ //屏蔽 Ctrl+n
event.returnValue=false;
return ;
}
if ((event.shiftKey)&&(event.keyCode==121)){ //屏蔽 shift+F10
event.returnValue=false;
return ;
}
if (event.keyCode==122){ //屏蔽 F11
event.keyCode=0;
event.returnValue=false;
return ;
}
event.returnValue=true;
}

</script>
<style>
.chatContent {
overflow: auto;
height: 210px;
text-align: left;
line-height: 20px;
width: 424px;
border: 2px inset;
font-family: "宋体";
ime-mode: active;
}

.sendContent {
height: 90px;
width: 424px;
text-align: left;
overflow: auto;
font-family: "宋体";
}
</style>
</head>
<!-- oncontextmenu="self.event.returnValue=false"-->
<body onkeydown="myKeyDown();" oncontextmenu="return false">

<form action="sendMsg.jsp" id="say" method="post" target="sendFrame">
<table width="400" border="0" cellpadding="0" cellspacing="1"
bgcolor="#D3E4FD">
<tr>
<td height="35">聊天系统</td>
</tr>
<tr>
<td valign="top" bgcolor="#FFFFFF"><div class="chatContent" id="msgs"></div></td>
</tr>
<tr>
<td>
<textarea class="sendContent" name="saytext" id="saytext"></textarea>
</td>
</tr>
<tr>
<td>
<input type="button" onclick="sendMsg();" value="发送" />
</td>
</tr>
</table>
</form>

<iframe id="msgFrame" name="msgFrame" src="refMsg.jsp" width="0" marginwidth="0" height="0" marginheight="0" scrolling="no" frameborder="0"></iframe>
<iframe name="sendFrame" id="sendFrame" src="" width="0" height="0"></iframe>

<script language=javascript>
function sendMsg()
{
document.getElementById("say").submit();
}
</script>
</body>
</html>

[/code]
luozhangwen 2010-09-09
  • 打赏
  • 举报
回复

public static String getUserNameByUid(int uid)
{
Connection conn = DBConnection.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = conn.prepareStatement("select userName from usertable where uid=?");
pstmt.setInt(1, uid);
rs = pstmt.executeQuery();
while (rs.next())
{
return rs.getString("userName");
}
}
catch (SQLException e)
{
e.printStackTrace();
}finally{
try
{
rs.close();
pstmt.close();
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return null;
}

public static String getNowDate()
{
Calendar calendar = Calendar.getInstance();
return RefMsgService.formatDate(calendar.getTime());
}

public static String formatDate(Date date)
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String formatDate = format.format(date);
return formatDate;
}
}

luozhangwen 2010-09-09
  • 打赏
  • 举报
回复

package com.lzw.bean;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;

import java.util.Date;

public class RefMsgService
{
public static String getContent(int senduid, int recivuid, int uid)
{
List<MsgBean> list = queryAllmsg(senduid, recivuid);
StringBuffer sb = new StringBuffer();
if(list != null)
{
for (MsgBean msgBean : list)
{
sb.append(getMsg(msgBean, uid));
}
}
return sb.toString();
}
private static List<MsgBean> queryAllmsg(int senduid, int recivuid)
{

List<MsgBean> list = new ArrayList<MsgBean>();
Connection conn = DBConnection.getConnection();
PreparedStatement pstmt1 = null;
PreparedStatement pstmt2 = null;
ResultSet rs = null;
try
{
pstmt1 = conn.prepareStatement("select * from msg where senduid=? and recvuid=? and iframe=1 order by senddate asc");
pstmt1.setInt(1, senduid);
pstmt1.setInt(2, recivuid);

rs = pstmt1.executeQuery();
while (rs.next())
{
MsgBean bean = new MsgBean();
bean.setId(rs.getInt("id"));
bean.setSendUid(rs.getInt("senduid"));
bean.setRecivUid(rs.getInt("recvuid"));
bean.setMsgContent(rs.getString("msg"));
bean.setSendDate(rs.getTimestamp("senddate"));
list.add(bean);
}

for (MsgBean msgBean : list)
{
pstmt2 = conn.prepareStatement("update msg set iframe=0 where id=?");
//这里偷懒了, 写死了.
pstmt2.setInt(1, msgBean.getId());
pstmt2.executeUpdate();
}

return list;
}
catch (SQLException e)
{
e.printStackTrace();
}finally{
try
{
rs.close();
pstmt1.close();
if(pstmt2 != null)
{

pstmt2.close();
}
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
return null;

}

public static String getMsg(MsgBean msg, int uid)
{
StringBuffer sb = new StringBuffer();
sb.append("<div><font size=2 color=#888888> [");
sb.append(RefMsgService.formatDate(msg.getSendDate()));
sb.append("] ");
String sendPeople = null;
if(uid == msg.getSendUid())
{
sendPeople = "您";
}
else
{
sendPeople = getUserNameByUid(msg.getSendUid());
}

sb.append("" + sendPeople + "说:</font></br></div>");

sb.append("<div><font color=#666666>");
sb.append(msg.getMsgContent());

sb.append("</font></br></div>");

return sb.toString();
}

JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bea
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double  引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 7、String 和StringBuffer的区别  JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。 8、运行时异常与一般异常有何异同?  异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 10、说出ArrayList,Vector, LinkedList的存储性能和特性  ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Ses

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧