??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
(tng) (tng) (tng)q行环境Q?br /> (tng) (tng) (tng) (tng) (tng) (tng)JDK1.4QEclipse3.1QMyeclipse4.0QTomcat5.5
(tng) (tng) (tng)现象Q?br /> (tng) (tng) (tng) (tng) (tng) (tng)在eclipse中对应用q行调整后进行重布vQ提C布v成功Q重启Tomcat后没有Q意变化?br />
(tng) (tng) (tng)原因Q?br /> (tng) (tng) (tng) (tng) (tng) (tng)׃我重做了(jin)pȝQ以?web 应用所引用的包路径发生?jin)变?该包q没有在应用中直接引?Q但是由于在 tomcat/commons/lib 下已l手工添加了(jin)包,因此q行时正常,但是?eclipse 目上可见到错误提示(没注意啊)Q结果造成布v的失?提示上可是说布v成功??br />
(tng) (tng) (tng)后话Q?br /> (tng) (tng) (tng) (tng) (tng) (tng)后来想了(jin)下,原因有可能是׃目存在着错误Q因?eclipse q没有对新的 java q行重新~译Q因此不论怎么d|实际上都是用出现错误之前的最后一ơ编译出来的 class 文g去进行布|Ԍ所?java 文g中的更改q不?x)生Q何效果?br />
]]>
import
(tng)java.io.
*
;
public
(tng)
class
(tng)Test (tng)
{
(tng) (tng) (tng) (tng)
/** (tng)*/
/**
(tng) (tng) (tng) (tng) (tng)* (tng)l计字串中中文字W数?br />
(tng) (tng) (tng) (tng) (tng)* (tng)
@param
(tng)str:GB~码字符?br />
(tng) (tng) (tng) (tng) (tng)
*/
(tng) (tng) (tng) (tng)
public
(tng)
static
(tng)
int
(tng)statGBCharCount1(String (tng)str) (tng)
{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
int
(tng)GBCount (tng)
=
(tng)
-
1
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String (tng)otherStr (tng)
=
(tng)
null
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
try
{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)otherStr (tng)
=
(tng)
new
(tng)String(str.getBytes(),
"
ISO8859_1
"
);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)GBCount (tng)
=
(tng)otherStr.length() (tng)
-
(tng)str.length();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
catch
(UnsupportedEncodingException (tng)ex)
{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
throw
(tng)
new
(tng)RuntimeException(
"
UnsupportedEncodingException
"
);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return
(tng)GBCount;
(tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng)
/** (tng)*/
/**
(tng) (tng) (tng) (tng) (tng)* (tng)l计字串中中文字W数?br />
(tng) (tng) (tng) (tng) (tng)
*/
(tng) (tng) (tng) (tng)
public
(tng)
static
(tng)
int
(tng)statGBCharCount2(String (tng)str) (tng)
{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
int
(tng)GBCount (tng)
=
(tng)
-
1
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)GBCount (tng)
=
(tng)str.replaceAll(
"
[\u0000-\u0127]
"
,
""
).length();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"
asc字符:
"
(tng)
+
(tng)str.replaceAll(
"
[\u0000-\u0127]
"
,
""
));
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"
非asc字符:
"
(tng)
+
(tng)str.replaceAll(
"
[^\u0000-\u0127]
"
,
""
));
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
return
(tng)GBCount;
(tng) (tng) (tng) (tng)}
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng)
public
(tng)
static
(tng)
void
(tng)main(String[] (tng)args) (tng)
{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)String (tng)str (tng)
=
(tng)
"
This (tng)is (tng)test (tng)string (tng)q是一个测试字W串
"
;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"
中文字符?
"
+
(tng)Test.statGBCharCount1(str));
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)System.out.println(
"
中文字符?
"
+
(tng)Test.statGBCharCount2(str));
(tng) (tng) (tng) (tng)}
}
可以看到Q方?中用的办法Q可能局限性更大,不过也是一U思\?br />自己想的是第2U方法,用正则表辑ּ直接qo(h)Q也挺快捗?/font>
]]>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 以前上培训时的设计,是个作业Q不q我实现得比较麻?ch)一点,用上?jin)一些MVC的东东。不断在QQ上见到有h需要类似的东西Q是不是只要是毕业设计都是一L(fng)题目Q?img height="19" src="http://www.aygfsteel.com/Emoticons/thumbs_down.gif" width="19" border="0" />Q,所以放上来Q以后自׃可以用用?/font>
介如?
开发环?Win2k+JDK1.4.2
开发工?Eclipse3.0
数据环境:
(tng) (tng) (tng) (tng) (tng) (tng) (tng) SqlServer2000
开发?
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 个h
功能:
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 能够实现?表的演示Q学生的分组/分班Q对班及(qing)l还有学生进行增/??查操作,
在添加及(qing)修改Ӟq行序号以及(qing)名称的检查,
学生可以实现变更学号/名称/班/l等各项操作Q?/font>
可以在组览的表栏上右键单击Q将选定的学生从l中删除
使用注意Q?/strong>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 已经打好Jar包,在DOS提示W下q行"java -jar students.jar"卛_。当然前提是Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 1.你安装有SqlServer2000Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 2.你导入我提供的student.sqlQ新Z(jin)一个数据库
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 3.你有SqlServer2000的驱动(?个Jar包,没有的自己去下)(j)Qƈ在查找\径之?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 4.你的SqlServerq接参数与我相同Q你可以解开包,q接参数我放在stendendts.common.InitcMQ自己去Ҏ(gu)好
l构说明:
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 已经q去?jin)很多时_(d)无话可说Q可以看看运行时的效果图Q?br />
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)效果?/a>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 功能不是很多的,够交pQ呵c(din)另外还有右键菜单等功能?br />拜托Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 有拿q个直接交设计的朋友Q记得把我的名字也写q去好了(jin)Q当q遗憄是我写得q么好却只刚?qing)格Q今天放上来才晓得是打包的时候少打了(jin)那个.classpath?project文g?jin),路径也不太对Q肯定是老师没法导入我这个工E,所以才那样?br />下蝲Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) students.rar
介如?
开发环?Win2k+JDK1.4.2
开发工?Eclipse3.0
数据环境:
(tng) (tng) (tng) (tng) (tng) (tng) (tng) access+软连接池,演示时容易沙
开发?
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 个h,原本?个h想着学点东西,l果没曾想那两个兄弟觉得ȝ(ch)?一个写?jin)不?00行的SOCKED通信,一个写?jin)N的聊天?
功能:
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 能够实现用户注册,d,查找(3U方?跟当q的QQ学的),聊天以及(qing)好友的上/下线提示{?..
使用注意Q?/strong>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 一定要记得配数据源QZIP包中有说明的。不然无法工作?br />l构说明:
(tng) (tng) (tng) (tng) (tng) (tng) (tng) q个得要好好说一下,毕竟是心(j)血呕作啊。看看Socket的工作方式,是服务端用serversocket在指定端口侦听,客户端向此端口连接,一旦成功,则serversocket从阻塞状态中恢复Q生一个socket对象与之对应。结果生的是Socket的一对一(在QQ上听见Socket可以一对多Q不晓得咋整)。图C如?
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)ICQC意?/a>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 其中客户端与服务端都是一L(fng)Socket对象Q可以封成一个类Q把输入侦听也封q去(它与其它的对象完全无?,输出留下一个接口,q个cL叫它"Linker"Q然后作为ICQ,每个客h当然是有ID和图?性别{信息的Q我把它攑օ"ClientInfo"c,q个cd际上是一个JavaBeanQ这样与数据库打交道时就比较好用?jin)。在q两个类的上一层我提供?jin)一?Client"再次了(jin)一下,它的最大用途是用于与消息分发器打交道,让它持有一个消息分发器的引用,q个cdƈ保留?jin)Linker的输出接口便于消息处理器调用。ؓ(f)?jin)实现Linker收到消息旉知ClientQ我使用?jin)观察者模?让Linker实现Observable接口Q而Clientl承至Observer.q样通讯的线路方面就搞定?jin)?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在Client对象的管理上Qؓ(f)?jin)便于分l?QQ不也提供好友之类的么)。我提供?jin)一个ClientGroupcL放ClientQ提供两个实?已登?未登?来分开放,感觉上好一些。由于消息处理上l常需要调用Client对象Q把q个功能拿出来专门封在一个类中,我叫?ClientMangager"来管理那滑头的Client?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) 然后到重要的消息处理上了(jin)Q做?jin)一?MessageProcessor"的接口,让消息分发器"ServerMessageProcessor"和针对具体情늚消息处理器都实现q个接口Q由于ICQ的通讯是实时也是多对多的,只能采用队列+先进先出的方式,q样x(chng)可以处理一些状况了(jin)。分发器中持有一个HashMapQKey放上消息PValue放上处理器的引用。由控制器来兛_(j)如何L配好?jin)。这L(fng)考虑是Q如果后期有兴趣增加I(yng)CQ的功能,如传输文?囄{,比较简单了(jin)Q加一个消息号Q加一个消息处理器Q在控制器中向消息分发器d一个注册即可。感觉上q是个么事模式之cȝQ呵c(din)?br /> (tng) (tng) (tng) (tng) (tng) 服务端这边还剩一个端口侦听和数据处理?jin),端口侦听用?jin)一?PortListener"Q我把它攑֜common包中Q原来打是客户端那边以后实现客?客户交互的时候也能够用上。数据处理上用上学校里的例子Q有例子好啊Ҏ(gu)成自己的了(jin)
。数据存取上为图方便采取的是直接对象存取(C++学习(fn)时的大禁?Q不它?jin),反正能用Q不q遗留下?jin)隐?zhn),一旦改动了(jin)一下类Q就M出来?jin)?br /> (tng) (tng) (tng) (tng) (tng) 服务端这Ҏ(gu)后再上一?Server"做ؓ(f)控制器,让它持有PortListener、ServerMessageProcessor、ServerClientMangerQ还是老套路用观察者模式与PortListener挂上勾。服务端OK?br /> (tng) (tng) (tng) (tng) (tng) 再到非常非常重要的消息上Q消息是多种多样的,每一个消息对应一个功能,来一个接口好?Message"Q该接口中还放上?jin)消息?final)q样~写的时候也q单直观得多了(jin)?br /> (tng) (tng) (tng) (tng) (tng) 到此Q时间已l过去N久,开始客L(fng)~程Q客L(fng)是要来上几个H体的,ȝ(ch)啊。根据功能分成多个JPanel/JFrame?jin),如登录窗口,昄聊天的面板,输?发送面板,好友昄的面板,q有查找好友。。。M耐心(j)快没?jin)。最后还是栽在了(jin)那个好友面板上,那个JList是个痛,我用上了(jin)ListCellRender渲染器,q个渲染器说实话q是蛮成功的Q但是整到JList中就不贼Q在单类的Main中演C都是好的。但是在最后的成果上就时灵时不灵,l常都会(x)出现JList白板一块的问题Q完全随机啊
Q。后来思考了(jin)一下,怀疑是在构造函C调用太多东西的缘故,所以下载的朋友最后多试几ơ我保证能OKQ我咟?br /> (tng) (tng) (tng) (tng) (tng) 东西说得蛮多?jin),x(chng)为止Q眼见ؓ(f)实?br />拜托Q?/strong>
(tng) (tng) (tng) (tng) (tng) (tng) (tng) 有研I的朋友能整好那个JList昄的问题,万望告之。。。?br />如实告之Q?/strong>
(tng) (tng) (tng) (tng) (tng) (tng) Serverq边是先写的Q比较有耐心(j)QClient那边是先来写的,耐心(j)没了(jin)Q要评论的朋友多看看ServerQ好多留个面?br />下蝲Q?/strong>
(tng) (tng) (tng) (tng) (tng) MyICQ.zip