因为ports使用fetch来下载源代码,所以设置fetch的环境变量即可。
setenv HTTP_PROXY 192.168.25.22:3128;
setenv FTP_PROXY 192.168.25.22:3128;
192.168.25.22:3128为代理服务器地址和端口。
Saturday, December 22, 2007
Tuesday, March 20, 2007
get the last day in a month in java
from http://forum.java.sun.com/thread.jspa?threadID=700253&messageID=4063642
it says:
// create calendar instance :: now
Calendar calendar = Calendar.getInstance();
int lastDateofThisMonth = calendar.getActualMaximum(Calendar.DATE);
Just check this one and understand how to expand
// create calendar instance :: now
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,2000);
// month 0 is january
calendar.set(Calendar.MONTH,1);
int lastDateofMonth = calendar.getActualMaximum(Calendar.DATE);
System.out.println(lastDateofMonth);
Monday, March 19, 2007
sound on gentoo
it seems i installed a generic kernel. at default, no device configed for the sound.
when i wanna use ALSA, but can't emerge alsa-driver cause couldn't download a patch for my kernel.
so i use "emerge alsa-utils", after that, run "alsaconf", after a reboot manually, everything with the sound are work well.
:)
when i wanna use ALSA, but can't emerge alsa-driver cause couldn't download a patch for my kernel.
so i use "emerge alsa-utils", after that, run "alsaconf", after a reboot manually, everything with the sound are work well.
:)
Sunday, March 18, 2007
triangle_strip,triangle_fan,triangle_list
看了一下psp sdk里对sceGuDrawArray中prim这个参数的值的描述,始终对“3 vertices for the first primitive, 1 for every following”这句话的后半句理解不能!
void sceGuDrawArray ( int prim,
int vtype,
int count,
const void * indices,
const void * vertices
)
Draw array of vertices forming primitives.
Available primitive-types are:
* GU_POINTS - Single pixel points (1 vertex per primitive)
* GU_LINES - Single pixel lines (2 vertices per primitive)
* GU_LINE_STRIP - Single pixel line-strip (2 vertices for the first primitive, 1 for every following)
* GU_TRIANGLES - Filled triangles (3 vertices per primitive)
* GU_TRIANGLE_STRIP - Filled triangles-strip (3 vertices for the first primitive, 1 for every following)
* GU_TRIANGLE_FAN - Filled triangle-fan (3 vertices for the first primitive, 1 for every following)
* GU_SPRITES - Filled blocks (2 vertices per primitive)
在看了
http://hankfiles.pcvsconsole.com/answer.php?file=87
后才恍然大悟原来是这个意思,似乎的确是sdk文档上没说清楚。
triangle_strip:就是前3个点组成一个简单图形(这里不就是3角形嘛),第4个点和其之前2个点组成又一个简单图形,以此类推。
triangle_fan:就是前3个点组成一个简单图形,第4个点和其之前一个点以及第一个点组成又一个简单图形,以此类推。
triangle_list:哈哈,见图。。。。。

void sceGuDrawArray ( int prim,
int vtype,
int count,
const void * indices,
const void * vertices
)
Draw array of vertices forming primitives.
Available primitive-types are:
* GU_POINTS - Single pixel points (1 vertex per primitive)
* GU_LINES - Single pixel lines (2 vertices per primitive)
* GU_LINE_STRIP - Single pixel line-strip (2 vertices for the first primitive, 1 for every following)
* GU_TRIANGLES - Filled triangles (3 vertices per primitive)
* GU_TRIANGLE_STRIP - Filled triangles-strip (3 vertices for the first primitive, 1 for every following)
* GU_TRIANGLE_FAN - Filled triangle-fan (3 vertices for the first primitive, 1 for every following)
* GU_SPRITES - Filled blocks (2 vertices per primitive)
在看了
http://hankfiles.pcvsconsole.com/answer.php?file=87
后才恍然大悟原来是这个意思,似乎的确是sdk文档上没说清楚。
triangle_strip:就是前3个点组成一个简单图形(这里不就是3角形嘛),第4个点和其之前2个点组成又一个简单图形,以此类推。
triangle_fan:就是前3个点组成一个简单图形,第4个点和其之前一个点以及第一个点组成又一个简单图形,以此类推。
triangle_list:哈哈,见图。。。。。
同步opera blog(http://my.opera.com/jojomclntosh)
install realplayer on gentoo
Friday, 16. March 2007, 02:51:16
realplayer, gentoo, Linux
1st step:
#emerge ca-certificates
2nd step:
#emerge realplayer
Friday, 16. March 2007, 02:51:16
realplayer, gentoo, Linux
1st step:
#emerge ca-certificates
2nd step:
#emerge realplayer
Wednesday, March 14, 2007
Monday, March 12, 2007
nullpx,一个困扰了半天的问题
使用spring的JasperReportsHtmlView和JasperReportsPdfView,产生报表,pdf格式完全正常,html格式却总是不能显示一个叫nullpx的image。昏倒!
在用ireport做报表模板后用html preview时完全正常,看了一下页面代码,发觉他使用的image不是nullpx,而是px,其实就是一个像素点的图片。看样子这个图片在显示html时是不能少的了。
没有办法之下只能把这个px文件copy到webroot下面改名为nullpx,到此这个问题算是解决了。晕~~~!
同步opera blog(http://my.opera.com/jojomclntosh)
JasperReports与spring的集成
Thursday, 8. March 2007, 09:04:19
spring 包含了5种JasperReports View classes,分别是JasperReportsCsvView,JasperReportsPdfView, JasperReportsHtmlView,JasperReportsXslView和JasperReportsMultiFormatView, 最后一个是在运行时选择前面四个之一用的。
在spring中要使用这5种View,就先要定义ViewResolver。一般情况下使用ResourceBundleViewResolver这个类。
其次是定义刚才"value"指定的views.properties(或者是xml文件)这个文件。以下名值对先定义了 simpleReport这个view的class,再定义了由iReport产生或者手工完成的jasperreport的报表定义文件(在 spring中使用jasper和jrxml文件都可以,因为spring会自动把jrxml编译成jasper文件)。随后是指定数据源,这里用到已经 配置好的一个数据源myDataSource所以ref一定要加上。
到这里配置基本结束了,接下来就是在Controller里写代码了。最后一句return中的simpleReport就是我们定义的那个view,model是一个Map类。
具体参考见http://www.springframework.org/docs/reference/view.html
在spring中要使用这5种View,就先要定义ViewResolver。一般情况下使用ResourceBundleViewResolver这个类。
其次是定义刚才"value"指定的views.properties(或者是xml文件)这个文件。以下名值对先定义了 simpleReport这个view的class,再定义了由iReport产生或者手工完成的jasperreport的报表定义文件(在 spring中使用jasper和jrxml文件都可以,因为spring会自动把jrxml编译成jasper文件)。随后是指定数据源,这里用到已经 配置好的一个数据源myDataSource所以ref一定要加上。
simpleReport.class=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView
simpleReport.url=/WEB-INF/reports/DataSourceReport.jasper
simpleReport.jdbcDataSource(ref)=myDataSource
到这里配置基本结束了,接下来就是在Controller里写代码了。最后一句return中的simpleReport就是我们定义的那个view,model是一个Map类。
return ModelAndView("simpleReport",model);
具体参考见http://www.springframework.org/docs/reference/view.html
Monday, March 5, 2007
Saturday, March 3, 2007
3*3的puzzle游戏居然分有解和无解
Saturday, 3. March 2007, 16:09:35




拿出草稿纸,用广度算法比画了n多步,发现就是弄不出,晕~~~!

网上找了一下,才发觉原来随机摆放图片可能造成无解,我倒~~!今天运气还真是好的可以,两次都是无解!以前只是玩,现在是自己写,果然思考的方式和思考的广度深度不同了~~!

大学高数不努力,游戏编程徒伤悲!

判断有无解的算法是这样的:
先把矩阵matrix[3][3]放到一维数组array[9]中,如:
123
456
78X
就成为12345678X。
然后只要把位置i的f(i)计算出来,然后sum(f(i)),即对f(i)求和,得到偶数则有解,得到奇数则无解。
注:f(i)求的是从array[0]到array中比array的值小的元素个数。
BMW能用钱买来,但很多东西钱是买不到的!
Friday, 2. March 2007, 21:49:02
今天下班经过沪闵路和七莘路、莘松路的那个十字路口时看到了如下情景——一辆BMW在近十字路口的自行车道上,刚好被前面的消防栓卡主了,此时是下班高峰,车后延绵了几十米的非机动车使BMW进退两难!
果然你有钱买BMW,但很多东西你用钱是买不到的,哈哈~~!
往往有一部分开BMW的缺的就是那些他们用钱买不到的东西~~~!
今天下班经过沪闵路和七莘路、莘松路的那个十字路口时看到了如下情景——一辆BMW在近十字路口的自行车道上,刚好被前面的消防栓卡主了,此时是下班高峰,车后延绵了几十米的非机动车使BMW进退两难!
果然你有钱买BMW,但很多东西你用钱是买不到的,哈哈~~!


又一个好老师去了——陈毛狗
Wednesday, 28. February 2007, 15:18:27
陈毛狗老师听说是因为胃癌走了~~~!


为什么?为什么那些好老师都操劳而去,而那些人渣老师却还活得那么逍遥?因为他们不为学生,只为金钱,没有负担... ...

突然想起以前课本上的一句话“有些人死了,但他还活着!有些人活着,却已经死了”。
春节吃喝最后一战——港丽
Sunday, 25. February 2007, 23:04:37
发觉从公司坐91路到北新泾再坐2号线到南京东路貌似比925b要快不少,果然我是最准时的一个(17:45到达宏伊广场的港丽,哈哈!)

一进去发觉景色不错,窗外就是东方明珠和金茂,就期待着美味的食物了,哈哈。
今天simon应该不算放鸽子,因为原定是年初六,他已经跟同事换好班了,现在没法改,所以缺席(哎~~!损失一员大将!)!

总结一下菜,都很不错!哈哈,这个总结果然是高度概括!

照片既然有人弄好了,我就懒得弄了,直接链接:
部分照片
那个长肚脐眼的我挺喜欢吃的,哈哈~~!
Nice! jojo's 1st program on psp~~!
Saturday, 24. February 2007, 00:24:06
C, PSP, 随手记
it really works on my psp~~!:D
按照http://www.psp-programming.com上的tutorials手动完成了自己的第一个psp程序!
hello_psp.c
#include
#include
PSP_MODULE_INFO("hello psp",0,1,1);
#define printf pspDebugScreenPrintf
/* Exit callback */
int exit_callback(int arg1,int arg2,void *common){
sceKernelExitGame();
return 0;
}
/* Callback thread */
int CallbackThread(SceSize args, void *argp){
int cbid;
cbid=sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void){
int thid=0;
thid=sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
if(thid>=0){
sceKernelStartThread(thid,0,0);
}
return thid;
}
int main(){
pspDebugScreenInit();
SetupCallbacks();
printf("hello psp!jojo's 1st psp program!");
sceKernelSleepThread();
return 0;
}
这个是Makefile
TARGET = hello_psp
OBJS = hello_psp.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = hello psp
PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
ok,之后运行#gmake kxploit,编译连接成功后就产生了包含能运行在psp1.5firmware上的程序的两个文件夹hello_psp和hello_psp%。nice~~!:beer: (对于1.0 firmware,只要gmake就能产生直接在psp上运行的程序了,我没试过,应该可以。)
C, PSP, 随手记
it really works on my psp~~!:D
按照http://www.psp-programming.com上的tutorials手动完成了自己的第一个psp程序!
hello_psp.c
#include
#include
PSP_MODULE_INFO("hello psp",0,1,1);
#define printf pspDebugScreenPrintf
/* Exit callback */
int exit_callback(int arg1,int arg2,void *common){
sceKernelExitGame();
return 0;
}
/* Callback thread */
int CallbackThread(SceSize args, void *argp){
int cbid;
cbid=sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void){
int thid=0;
thid=sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
if(thid>=0){
sceKernelStartThread(thid,0,0);
}
return thid;
}
int main(){
pspDebugScreenInit();
SetupCallbacks();
printf("hello psp!jojo's 1st psp program!");
sceKernelSleepThread();
return 0;
}
这个是Makefile
TARGET = hello_psp
OBJS = hello_psp.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = hello psp
PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
ok,之后运行#gmake kxploit,编译连接成功后就产生了包含能运行在psp1.5firmware上的程序的两个文件夹hello_psp和hello_psp%。nice~~!:beer: (对于1.0 firmware,只要gmake就能产生直接在psp上运行的程序了,我没试过,应该可以。)
psptoolchain on FreeBSD
Friday, 23. February 2007, 10:48:23
FreeBSD, PSP, 随手记
一开始费了九牛二虎之力也没把PSPTOOLCHAIN在FREEBSD上搭建好!:frown: 找了半天原因,AUTOMAKE是最新的,AUTOCONF是最新的,SVN也是最新的。。。。。。:wait: 但就是在安装NEWLIB和编译PSP-G++的时候出错,妖了~~!:confused:
最终SVN(#svn co svn://svn.ps2dev.org/psp/trunk/psptoolchain)了一个最新版本的PSPTOOLCHAIN,设置好环境变量之后运行脚本(#./psptoolchain.sh)。一觉醒来全部KO!
哈哈,可以为PSP写程序了~~~!:D
FreeBSD, PSP, 随手记
一开始费了九牛二虎之力也没把PSPTOOLCHAIN在FREEBSD上搭建好!:frown: 找了半天原因,AUTOMAKE是最新的,AUTOCONF是最新的,SVN也是最新的。。。。。。:wait: 但就是在安装NEWLIB和编译PSP-G++的时候出错,妖了~~!:confused:
最终SVN(#svn co svn://svn.ps2dev.org/psp/trunk/psptoolchain)了一个最新版本的PSPTOOLCHAIN,设置好环境变量之后运行脚本(#./psptoolchain.sh)。一觉醒来全部KO!
哈哈,可以为PSP写程序了~~~!:D
大年初五迎财神~~!
Thursday, 22. February 2007, 21:10:36
春节, 随手记
一大早就被窗外劈里啪啦的鞭炮声吵醒!(其实凌晨00:00的时候已经被吵过一次了)
今天我的胃终于是稍微调整了一下休息了一天,从小年夜奋战到大年初四,期间也就大年初一略有休息,其余几天胃里传出的都是这句话“兄弟们支援支援,今天的任务要完不成了,明天还有更艰巨的任务啊~~~!”。:worried: 的确,明天确实有更艰巨的任务在等着我的胃!:faint:
除了吃还是吃,年年过节都是吃,只是今年吃的东西还多了一样——中药!:cry: 吃了十多天的罗汉果和琵琶膏,咳嗽终于好转了,感谢中国人的智慧发明了中药,否则估计浑身的细胞都被西药给杀灭了~~!呵呵!
大年初五迎财神,恭喜发财~~~!
春节, 随手记
一大早就被窗外劈里啪啦的鞭炮声吵醒!(其实凌晨00:00的时候已经被吵过一次了)
今天我的胃终于是稍微调整了一下休息了一天,从小年夜奋战到大年初四,期间也就大年初一略有休息,其余几天胃里传出的都是这句话“兄弟们支援支援,今天的任务要完不成了,明天还有更艰巨的任务啊~~~!”。:worried: 的确,明天确实有更艰巨的任务在等着我的胃!:faint:
除了吃还是吃,年年过节都是吃,只是今年吃的东西还多了一样——中药!:cry: 吃了十多天的罗汉果和琵琶膏,咳嗽终于好转了,感谢中国人的智慧发明了中药,否则估计浑身的细胞都被西药给杀灭了~~!呵呵!
大年初五迎财神,恭喜发财~~~!
使用jtds的jdbc驱动代替ms官方的sql server jdbc驱动
Monday, 5. February 2007, 12:10:56
随手记, tomcat, java
用了才发现,在tomcat连接池中似乎用MS官方的JDBC驱动无法做到autoReconnect。这使得万一数据库连接暂时性的中断会导致数据库持久化框架中的数据库连接失败。现在用了jtds的sql server jdbc的驱动,果然比MS的强很多,而且可以自动重连了!:D
用法:
驱动程序名称:net.sourceforge.jtds.jdbc.Driver(即classforname)
数据库连接URL:jdbc:jtds:sqlserver://localhost:1433;DatabaseName=hbdt;autoReconnect=true(即url)
下载地址:
http://sourceforge.net/project/showfiles.php?group_id=33291
随手记, tomcat, java
用了才发现,在tomcat连接池中似乎用MS官方的JDBC驱动无法做到autoReconnect。这使得万一数据库连接暂时性的中断会导致数据库持久化框架中的数据库连接失败。现在用了jtds的sql server jdbc的驱动,果然比MS的强很多,而且可以自动重连了!:D
用法:
驱动程序名称:net.sourceforge.jtds.jdbc.Driver(即classforname)
数据库连接URL:jdbc:jtds:sqlserver://localhost:1433;DatabaseName=hbdt;autoReconnect=true(即url)
下载地址:
http://sourceforge.net/project/showfiles.php?group_id=33291
mac os x 10.4中使用vpn
Monday, 8. January 2007, 21:08:45
MAC, 随手记
发觉很简单,不需要额外的第三方vpn客户端,直接从Application文件夹中打开Internet Connect程序设置就可以了!:smile:
MAC, 随手记
发觉很简单,不需要额外的第三方vpn客户端,直接从Application文件夹中打开Internet Connect程序设置就可以了!:smile:
Saturday, January 6, 2007
party 4 gang of 6(1 absent)
差不多时隔了5个月,大家终于在厚味香辣馆小聚,真的很开心。唯一失望的就是邬昌琪缺席(石家庄上航飞行员培训),哎~~!唯一的遗憾,5缺1啊~~!这次算是spytyty做庄吧,呵呵,反正她发钱了,她不做庄谁做?呵呵呵(哎!迟早会轮到我的,我这么开心做啥?哈哈)。
下面我来描述一下大家的状况,先来后到原则,我第1个到,状况良好,哈哈哈!
接着是spytyty,号称食神的人。喔哟哟!这家伙还是那么高,呵呵!高人高人,貌似越来越高了,咔咔!估计是因为人高,体积大,体内容积大,所以能比我们吃得多!对于紧接着我而到的人,表扬一下,哈哈哈!
第3个到的是simon,似乎是2个月前的一次雨天车祸,还好是他自己和自己的摩托车意外,没有牵涉到第三方(简称自残)。导致右手肩部脱臼+骨折(喔哟哟,难怪今天发现simon吃的时候改用左手筷了,我晕哦),一直在家开心疗养到现在,几乎伤愈复出,估计离上班的日子不远了,哈哈。昨天晚上突然号称发高烧而且自称很早就睡了,还电话我们扬言今天可能在缺席1人的情况下要充当缺席第2人,昏倒哦~~!结果今天还是来了。哈哈哈!
接下来到的估计是今天最早出家门但是仅仅是第4个到的candice,越来越豪放了,居然还玩弄我们说带好吃的麦粒素,结果违约!吃不消,下次要打压一下她的士气,哈哈哈!
最后到的居然是离厚味天钥桥店最近的kathy,这家伙和simon如出一辙,昨天下午发sms给spytyty称自己胃不舒服,疯狂呕吐ing,今天不能来了,结果晚上就立马态度良好,又sms给spytyty要求参加聚会,哈哈哈!
分析一下simon和kathy的反常表现,这充分地体现出了我们组织内部纪律严明,决不向任何个人妥协原定计划,在我、spytyty、candice的强大攻势下,弱势和无正当理由一方被摧垮和妥协是理所当然的结果。对于这次因故缺席的那位,我们特殊情况特殊考虑,奖给他一个下次做庄的机会,以此体现出组织对个人特殊情况的照顾。哇咔咔咔!
发觉许明昊推荐的芥末黄吼是挺好吃的,我喜欢,今天的两盆鲶鱼最终因为大家点菜时高估了自己今天的食力,最终没有全部消灭,遗憾啊。不过还是体现出了我们食肉动物的特征――没有点蔬菜,喔哈哈!下次暂定大宁国际吧!
下面我来描述一下大家的状况,先来后到原则,我第1个到,状况良好,哈哈哈!
接着是spytyty,号称食神的人。喔哟哟!这家伙还是那么高,呵呵!高人高人,貌似越来越高了,咔咔!估计是因为人高,体积大,体内容积大,所以能比我们吃得多!对于紧接着我而到的人,表扬一下,哈哈哈!
第3个到的是simon,似乎是2个月前的一次雨天车祸,还好是他自己和自己的摩托车意外,没有牵涉到第三方(简称自残)。导致右手肩部脱臼+骨折(喔哟哟,难怪今天发现simon吃的时候改用左手筷了,我晕哦),一直在家开心疗养到现在,几乎伤愈复出,估计离上班的日子不远了,哈哈。昨天晚上突然号称发高烧而且自称很早就睡了,还电话我们扬言今天可能在缺席1人的情况下要充当缺席第2人,昏倒哦~~!结果今天还是来了。哈哈哈!
接下来到的估计是今天最早出家门但是仅仅是第4个到的candice,越来越豪放了,居然还玩弄我们说带好吃的麦粒素,结果违约!吃不消,下次要打压一下她的士气,哈哈哈!
最后到的居然是离厚味天钥桥店最近的kathy,这家伙和simon如出一辙,昨天下午发sms给spytyty称自己胃不舒服,疯狂呕吐ing,今天不能来了,结果晚上就立马态度良好,又sms给spytyty要求参加聚会,哈哈哈!
分析一下simon和kathy的反常表现,这充分地体现出了我们组织内部纪律严明,决不向任何个人妥协原定计划,在我、spytyty、candice的强大攻势下,弱势和无正当理由一方被摧垮和妥协是理所当然的结果。对于这次因故缺席的那位,我们特殊情况特殊考虑,奖给他一个下次做庄的机会,以此体现出组织对个人特殊情况的照顾。哇咔咔咔!
发觉许明昊推荐的芥末黄吼是挺好吃的,我喜欢,今天的两盆鲶鱼最终因为大家点菜时高估了自己今天的食力,最终没有全部消灭,遗憾啊。不过还是体现出了我们食肉动物的特征――没有点蔬菜,喔哈哈!下次暂定大宁国际吧!
Tuesday, January 2, 2007
[转贴][DWR(Ajax)]DWR使用笔记
转自:DWR使用笔记 (http://blogger.org.cn/blog/more.asp?name=lhwork&id=21045)
DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。
DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。
网上有不少DWR的例子,但大都只是某种方法的调用,本文只在使用层面上介绍DWR,并不涉更多的技术与设计,其目的是让初学者能够很快的学会各种java方法在javascript中是如何调用的。
本文以DWR 1.1 为基础,对于DWR 2.0,因为还没有正式发布版,故不做介绍。
1 、最小配置
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、当我们想看DWR自动生成的测试页(Using debug/test mode)时,可在servlet配置中加上
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、当我们想看DWR自动生成的测试页(Using debug/test mode)时,可在servlet配置中加上
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
这个参数DWR默认是false。如果选择true,我们可以通过 http://localhost:port/app/dwr看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑,在正式环境下你一定把这个参数设为false。
3、多个dwr.xml文件的配置
可能有几种情况,我们一一列举。一个servlet,多个dwr.xml配置文件;多个servlet,每个servlet对应一个或多个dwr.xml配置文件。
3.1、一个servlet,多个dwr.xml配置文件
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-1</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>config-2</param-name>
<param-value>WEB-INF/dwr2.xml</param-value>
</init-param>
</servlet>
在 这种配置下,param-name的值必须以config开头。param-name可以有>=0个。如果没有param-name,那么将会读取 WEB-INF/dwr.xml。如果有大于零个param-name,那么WEB-INF/dwr.xml文件将不会被读取。
3.2 、多个 servlet ,每个 servlet 对应一个或多个 dwr.xml
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>dwr-invoker1</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr1.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-invoker1</servlet-name>
<url-pattern>/dwr1/*</url-pattern>
</servlet-mapping>
在这种情况下,我们可以根据 J2EE security 来控制权限,针对不同 url, 加不同的角色。
二、 dwr使用篇
1、调用没有返回值和参数的JAVA方法
1.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod1"/>
</create>
</allow>
</dwr>
<allow> 标签中包括可以暴露给 javascript 访问的东西。
<create> 标签中指定 javascript 中可以访问的 java 类,并定义 DWR 应当如何获得要进行远程的类的实例。 creator="new" 属性指定 java 类实例的生成方式, new 意味着 DWR 应当调用类的默认构造函数来获得实例,其他的还有 spring 方式,通过与 IOC 容器 Spring 进行集成来获得实例等等。 javascript=" testClass " 属性指定 javascript代码访问对象时使用的名称。
<param> 标签指定要公开给 javascript 的 java 类名。
<include> 标签指定要公开给 javascript 的方法。不指定的话就公开所有方法。
<exclude> 标签指定要防止被访问的方法。
1.2、javascript中调用
首先,引入 javascript 脚本
<script src='dwr/interface/ testClass.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
其中 TestClass.js 是 dwr 根据配置文件自动生成的, engine.js 和 util.js 是 dwr 自带的脚本文件。
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod1(){
testClass.testMethod1();
}
2、调用有简单返回值的java方法
2.1、dwr.xml的配置
配置同1.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod2"/>
</create>
</allow>
</dwr>
2.2、javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数和接收返回值的回调函数
Function callTestMethod2(){
testClass.testMethod2(callBackFortestMethod2);
}
Function callBackFortestMethod2(data){
// 其中 date 接收方法的返回值
// 可以在这里对返回值进行处理和显示等等
alert("the return value is " + data);
}
其中 callBackFortestMethod2 是接收返回值的回调函数
3、调用有简单参数的java方法
3.1、dwr.xml的配置
配置同1.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod3"/>
</create>
</allow>
</dwr>
3.2、javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod3(){
// 定义要传到 java 方法中的参数
var data;
// 构造参数
data = "test String";
testClass.testMethod3(data);
}
4、调用返回JavaBean的java方法
4.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod4"/>
</create>
<convert converter="bean" match=" "com.dwr.TestBean">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>
<creator> 标签负责公开用于 Web 远程的类和类的方法, <convertor> 标签则负责这些方法的参数和返回类型。 convert 元素的作用是告诉 DWR 在服务器端 Java 对象表示和序列化的 JavaScript 之间如何转换数据类型。 DWR 自动地在 Java 和 JavaScript 表示之间调整简单数据类型。这些类型包括 Java 原生类型和它们各自的封装类表示,还有 String 、 Date 、数组和集合类型。 DWR 也能把 JavaBean 转换成 JavaScript 表示,但是出于安全性的原因,要求显式的配置, <convertor> 标签就是完成此功能的。 converter="bean" 属性指定转换的方式采用 JavaBean 命名规范, match=""com.dwr.TestBean" 属性指定要转换的 javabean 名称, <param> 标签指定要转换的 JavaBean 属性。
4.2 、javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数和接收返回值的回调函数
Function callTestMethod4(){
testClass.testMethod4(callBackFortestMethod4);
}
Function callBackFortestMethod4(data){
// 其中 date 接收方法的返回值
// 对于 JavaBean 返回值,有两种方式处理
// 不知道属性名称时,使用如下方法
for(var property in data){
alert("property:"+property);
alert(property+":"+data[property]);
}
// 知道属性名称时,使用如下方法
alert(data.username);
alert(data.password);
}
其中 callBackFortestMethod4 是接收返回值的回调函数
5、调用有JavaBean参数的java方法
5.1、dwr.xml的配置
配置同4.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod5"/>
</create>
<convert converter="bean" match=" com.dwr.TestBean">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>
5.2 、javascript中调用
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod5(){
// 定义要传到 java 方法中的参数
var data;
// 构造参数, date 实际上是一个 object
data = { username:"user", password:"password" }
testClass.testMethod5(data);
}
6、调用返回List、Set或者Map的java方法
6.1、dwr.xml的配置
配置同4.1
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod6"/>
</create>
<convert converter="bean" match= "com.dwr.TestBean ">
<param name="include" value="username,password" />
</convert>
</allow>
</dwr>
注意:如果 List 、 Set 或者 Map 中的元素均为简单类型(包括其封装类)或 String 、 Date 、数组和集合类型,则不需要<convert>标签。
6.2 、javascript中调用(以返回List为例,List的元素为TestBean)
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数和接收返回值的回调函数
Function callTestMethod6(){
testClass.testMethod6(callBackFortestMethod6);
}
Function callBackFortestMethod6(data){
// 其中 date 接收方法的返回值
// 对于 JavaBean 返回值,有两种方式处理
// 不知道属性名称时,使用如下方法
for(var i=0;i<data.length;i++){
for(var property in data){
alert("property:"+property);
alert(property+":"+data[property]);
}
}
// 知道属性名称时,使用如下方法
for(var i=0;i<data.length;i++){
alert(data.username);
alert(data.password);
}
}
7、调用有List、Set或者Map参数的java方法
7.1、dwr.xml的配置
<dwr>
<allow>
<create creator="new" javascript="testClass" >
<param name="class" value= "com.dwr.TestClass" />
<include method="testMethod7"/>
</create>
<convert converter="bean" match= "com.dwr.TestBean ">
<param name="include" value="username,password" />
</convert>
</allow>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
</dwr>
<signatures> 标签是用来声明 java 方法中 List 、 Set 或者 Map 参数所包含的确切类,以便 java 代码作出判断。
7.2 、javascript中调用(以返回List为例,List的元素为TestBean)
首先,引入 javascript 脚本
其次,编写调用 java 方法的 javascript 函数
Function callTestMethod7(){
// 定义要传到 java 方法中的参数
var data;
// 构造参数, date 实际上是一个 object 数组,即数组的每个元素均为 object
data = [
{
username:"user1",
password:"password2"
},
{
username:"user2",
password:" password2"
}
];
testClass.testMethod7(data);
}
注意:
1、 对于第 6 种情况,如果 java 方法的返回值为 Map ,则在接收该返回值的 javascript 回调函数中如下处理:
function callBackFortestMethod(data){
// 其中 date 接收方法的返回值
for(var property in data){
var bean = data[property];
alert(bean.username);
alert(bean.password);
}
}
2、 对于第 7 种情况,如果 java 的方法的参数为 Map (假设其 key 为 String , value 为 TestBean ),则在调用该方法的 javascript 函数中用如下方法构造要传递的参数:
function callTestMethod (){
// 定义要传到 java 方法中的参数
var data;
// 构造参数, date 实际上是一个 object ,其属性名为 Map 的 key ,属性值为 Map 的 value
data = {
"key1":{
username:"user1",
password:"password2"
},
"key2":{
username:"user2",
password:" password2"
}
};
testClass.testMethod(data);
}
并且在 dwr.xml 中增加如下的配置段
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(Map<String,TestBean>);
]]>
</signatures>
3、 由以上可以发现,对于 java 方法的返回值为 List(Set) 的情况, DWR 将其转化为 Object 数组,传递个 javascript ;对于 java 方法的返回值为 Map 的情况, DWR 将其转化为一个 Object ,其中 Object 的属性为原 Map 的 key 值,属性值为原 Map 相应的 value 值。
4、 如果 java 方法的参数为 List(Set) 和 Map 的情况, javascript 中也要根据 3 种所说,构造相应的 javascript 数据来传递到 java 中。
为了方便大家学习,可以邮件到 minisun2000@163.com ,我可以将整套的源代码公开给大家学习用^_^。
Subscribe to:
Posts (Atom)