钏说观不雅观赏器wwW34sd不兼容,就大年夜概照成登34sdCoM不上是吗

tomjamescn 阅读(488) |
今天在做red5和flashplayer之间传递数据时,犯了一个让人郁闷的错误,记录下来,让自己今后保持头脑清醒...
昨天晚上还可以正确传递ArrayCollection,但是今天下午却不行...我的解决方法太失败了,我竟然首先没有对比和昨天的差异,而就是在那不停的测啊,改啊,测啊...还以为发现了red5序列化的一个bug...太傻冒了...遇到这种问题,很自然的应该找昨天为什么行,而今天为什么不行...很明显应该从代码入手...唉,而自己只会看现象...很多时候,多看看代码,问题就会解决的...唉,可能是自己的思维定势吧...改正...
在记录一下错误的原因:自己对NetConnection的编码方式设置成了AMF0,由于ArrayCollection的传递需要AMF3,所以出错了...文章来源:
tomjamescn 阅读(37) |
越来越深刻的觉得,从小到大的各个阶段,不能跳跃前行,只能脚踏实地。
这些天师兄们讲找工作只要算法和C/C++基础好,找工作那是一个一帆风顺...回想本科学习时,当时觉得做项目很牛逼,久而久之,就忽略了项目的基础——算法,回过头来,现在还得重新啃算法。算法里面的一些时间复杂度的证明,又是高数极限里面的一些基础知识(还好,高数还没忘光...)。这一个个鲜活而血淋淋的实例再一次向我昭示了脚踏实地的重要性。
既然已经决定先走技术路线,那么就彻底点,卸下那些与技术路线背道而驰的坏毛病,脚踏实地的走吧,人生可不是买东西,没有折扣啊...文章来源:
tomjamescn 阅读(22) |
linux 分区操作试验
=============
一:试验环境
1.vmware虚拟机
2.linux9.0
3.设置两块硬盘
=============
二:试验步骤
1.在linux9.0中安装第二块硬盘;
2.使用fdisk工具对第二块硬盘分区;
3.格式化分区;
4.挂载分区到系统目录;
5.对挂载点进行存取;
6.卸载挂载点;
7.设置系统启动自动挂载分区;
=============
三:分区工具
1.fdisk使用
因为我使用的是两块scsi硬盘,故第二块硬盘被识别为sdb
查看sdb的分区情况,因为是新硬盘,所以没有任何分区信息;
[root@www root]# fdisk -l /dev/sdb
Disk /dev/sdb: 4294 MB,
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&& Device Boot&&& Start&&&&&& End&&& Blocks&& Id& System
2.对sdb硬盘进行分区操作
[root@www root]# fdisk /dev/sdb
Command (m for help): m
Command action
&& a&& toggle a bootable flag
&& b&& edit bsd disklabel
&& c&& toggle the dos compatibility flag
&& d&& delete a partition&&&//删除分区;
&& l&& list known partition types
&& m&& print this menu&&&&//打印操作菜单;
&& n&& add a new partition&&&//建立新分区;
&& o&& create a new empty DOS partition table
&& p&& print the partition table&&//打印分区表;
&& q&& quit without saving changes&&//不保存分区表,推出;
&& s&& create a new empty Sun disklabel
&& t&& change a partition's system id&&//该表分区的id表示;
&& u&& change display/entry units
&& v&& verify the partition table
&& w&& write table to disk and exit&&//保存分区表,推出;
&& x&& extra functionality (experts only)
3.建立主分区
Command (m for help): n
Command action
&& e&& extended
&& p&& primary partition (1-4)
Partition number (1-4): 1
First cylinder (1-522, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-522, default 522): +500M
Command (m for help): p
Disk /dev/sdb: 4294 MB,
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&& Device Boot&&& Start&&&&&& End&&& Blocks&& Id& System
/dev/sdb1&&&&&&&&&&&& 1&&&&&&& 62&&& 497983+& 83& Linux
4..创建扩展分区,最好将硬盘的所有剩余空间都作为扩展分区
Command (m for help): n
Command action
&& e&& extended
&& p&& primary partition (1-4)
Partition number (1-4): 2
First cylinder (63-522, default 63):
Using default value 63
Last cylinder or +size or +sizeM or +sizeK (63-522, default 522):
Using default value 522
Command (m for help): p
Disk /dev/sdb: 4294 MB,
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&& Device Boot&&& Start&&&&&& End&&& Blocks&& Id& System
/dev/sdb1&&&&&&&&&&&& 1&&&&&&& 62&&& 497983+& 83& Linux
/dev/sdb2&&&&&&&&&&& 63&&&&&& 522&& 3694950&&& 5& Extended
5.创建逻辑分区
Command (m for help): n
Command action
&& l&& logical (5 or over)
&& p&& primary partition (1-4)
First cylinder (63-522, default 63):
Using default value 63
Last cylinder or +size or +sizeM or +sizeK (63-522, default 522): +500M
Command (m for help): p
Disk /dev/sdb: 4294 MB,
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&& Device Boot&&& Start&&&&&& End&&& Blocks&& Id& System
/dev/sdb1&&&&&&&&&&&& 1&&&&&&& 62&&& 497983+& 83& Linux
/dev/sdb2&&&&&&&&&&& 63&&&&&& 522&& 3694950&&& 5& Extended
/dev/sdb5&&&&&&&&&&& 63&&&&&& 124&&& 497983+& 83& Linux
Command (m for help):
6.改变分区的系统代码
Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): L
&0& Empty&&&&&&&&&& 1c& Hidden Win95 FA 70& DiskSecure Mult bb& Boot Wizard hid
&1& FAT12&&&&&&&&&& 1e& Hidden Win95 FA 75& PC/IX&&&&&&&&&& be& Solaris boot
&2& XENIX root&&&&& 24& NEC DOS&&&&&&&& 80& Old Minix&&&&&& c1& DRDOS/sec (FAT-
&3& XENIX usr&&&&&& 39& Plan 9&&&&&&&&& 81& Minix / old Lin c4& DRDOS/sec (FAT-
&4& FAT16 &32M&&&&& 3c& PartitionMagic& 82& Linux swap&&&&& c6& DRDOS/sec (FAT-
&5& Extended&&&&&&& 40& Venix 80286&&&& 83& Linux&&&&&&&&&& c7& Syrinx
&6& FAT16&&&&&&&&&& 41& PPC PReP Boot&& 84& OS/2 hidden C:& da& Non-FS data
&7& HPFS/NTFS&&&&&& 42& SFS&&&&&&&&&&&& 85& Linux extended& db& CP/M / CTOS / .
&8& AIX&&&&&&&&&&&& 4d& QNX4.x&&&&&&&&& 86& NTFS volume set de& Dell Utility
&9& AIX bootable&&& 4e& QNX4.x 2nd part 87& NTFS volume set df& BootIt
&a& OS/2 Boot Manag 4f& QNX4.x 3rd part 8e& Linux LVM&&&&&& e1& DOS access
&b& Win95 FAT32&&&& 50& OnTrack DM&&&&& 93& Amoeba&&&&&&&&& e3& DOS R/O
&c& Win95 FAT32 (LB 51& OnTrack DM6 Aux 94& Amoeba BBT&&&&& e4& SpeedStor
&e& Win95 FAT16 (LB 52& CP/M&&&&&&&&&&& 9f& BSD/OS&&&&&&&&& eb& BeOS fs
&f& Win95 Ext'd (LB 53& OnTrack DM6 Aux a0& IBM Thinkpad hi ee& EFI GPT
10& OPUS&&&&&&&&&&& 54& OnTrackDM6&&&&& a5& FreeBSD&&&&&&&& ef& EFI (FAT-12/16/
11& Hidden FAT12&&& 55& EZ-Drive&&&&&&& a6& OpenBSD&&&&&&&& f0& Linux/PA-RISC b
12& Compaq diagnost 56& Golden Bow&&&&& a7& NeXTSTEP&&&&&&& f1& SpeedStor
14& Hidden FAT16 &3 5c& Priam Edisk&&&& a8& Darwin UFS&&&&& f4& SpeedStor
16& Hidden FAT16&&& 61& SpeedStor&&&&&& a9& NetBSD&&&&&&&&& f2& DOS secondary
17& Hidden HPFS/NTF 63& GNU HURD or Sys ab& Darwin boot&&&& fd& Linux raid auto
18& AST SmartSleep& 64& Novell Netware& b7& BSDI fs&&&&&&&& fe& LANstep
1b& Hidden Win95 FA 65& Novell Netware& b8& BSDI swap&&&&&& ff& BBT
Hex code (type L to list codes):b
Changed system type of partition 5 to b (Win95 FAT32)
Command (m for help): p
Disk /dev/sdb: 4294 MB,
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&& Device Boot&&& Start&&&&&& End&&& Blocks&& Id& System
/dev/sdb1&&&&&&&&&&&& 1&&&&&&& 62&&& 497983+& 83& Linux
/dev/sdb2&&&&&&&&&&& 63&&&&&& 522&& 3694950&&& 5& Extended
/dev/sdb5&&&&&&&&&&& 63&&&&&& 124&&& 497983+&& b& Win95 FAT32
7.创建逻辑分区sdb6,并将其转换为swap类型;
Command (m for help): p
Disk /dev/sdb: 4294 MB,
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
&& Device Boot&&& Start&&&&&& End&&& Blocks&& Id& System
/dev/sdb1&&&&&&&&&&&& 1&&&&&&& 62&&& 497983+& 83& Linux
/dev/sdb2&&&&&&&&&&& 63&&&&&& 522&& 3694950&&& 5& Extended
/dev/sdb5&&&&&&&&&&& 63&&&&&& 124&&& 497983+&& b& Win95 FAT32
/dev/sdb6&&&&&&&&&& 125&&&&&& 186&&& 497983+& 82& Linux swap
8.保存分区表信息;重启计算机;
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
[root@www root]# reboot
==============
四:格式化分区
1.格式化linux类型文件系统;
[root@www root]# mkfs -t ext3 /dev/sdb1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
124928 inodes, 497983 blocks
24899 blocks (5.00%) reserved for the super user
First data block=1
61 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
&&&&&&& , 4, 7, 1409
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.& Use tune2fs -c or -i to override.
2.格式化 vfat文件系统
[root@www root]# mkfs -t vfat /dev/sdb5
mkfs.vfat 2.8 (28 Feb 2001)
3.格式化swap文件系统;
[root@www root]#& mkswap /dev/sdb6
Setting up swapspace version 1, size = 509927 kB
================
五:挂载使用分区
[root@www root]# mkdir /mnt/sdb1
[root@www root]# mount /dev/sdb1 /mnt/sdb1
[root@www root]# cd /mnt/sdb1
[root@www sdb1]# touch testfile
[root@www sdb1]# ll
drwx------&&& 2 root&&&& root&&&&&&& 12288 10月 16 19:22 lost+found
-rw-r--r--&&& 1 root&&&& root&&&&&&&&&&& 0 10月 16 19:25 testfile
[root@www sdb1]# cd
[root@www root]# umount /mnt/sdb1
[root@www root]# ls /mnt/sdb1
==========================
六:让系统启动时自动挂载分区
[root@www root]# vi /etc/fstab
LABEL=/&&&&&&&&&&&&&&&& /&&&&&&&&&&&&&&&&&&&&&& ext3&&& defaults&&&&&&& 1 1
LABEL=/boot&&&&&&&&&&&& /boot&&&&&&&&&&&&&&&&&& ext3&&& defaults&&&&&&& 1 2
none&&&&&&&&&&&&&&&&&&& /dev/pts&&&&&&&&&&&&&&& devpts& gid=5,mode=620& 0 0
none&&&&&&&&&&&&&&&&&&& /proc&&&&&&&&&&&&&&&&&& proc&&& defaults&&&&&&& 0 0
none&&&&&&&&&&&&&&&&&&& /dev/shm&&&&&&&&&&&&&&& tmpfs&& defaults&&&&&&& 0 0
/dev/sda3&&&&&&&&&&&&&& swap&&&&&&&&&&&&&&&&&&& swap&&& defaults&&&&&&& 0 0
/dev/cdrom&&&&&&&&&&&&& /mnt/cdrom&&&&&&&&&&&&& udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0&&&&&&&&&&&&&&& /mnt/floppy&&&&&&&&&&&& auto&&& noauto,owner,kudzu 0 0
/dev/sdb1&&&&&&&&&&&&&& /mnt/sdb1&&&&&&&&&&&&&& auto&&& default&&&&&&&& 0 0
tomjamescn 阅读(321) |
&&& 来自:http://www.moandroid.com/?p=638
DDMS 的全称是Dalvik Debug Monitor Service,它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
如何启动 DDMS
DDMS 工具存放在SDK – tools/路径下,启动DDMS方法如下:
直接双击ddms.bat运行;
在Eclipes调试程序的过程中启动DDMS,在Eclipes中的界面如下:
选择“Other”,界面如下:
双击DDMS就可以启动了。
DDMS对Emulator和外接测试机有同等效用。如果系统检测到它们(VM)同时运行,那么DDMS将会默认指向 Emulator。以上2种启动后的操作有些不一样,建议分别尝试下。
DDMS 的工作原理
DDMS将搭建起IDE与测试终端(Emulator 或者connected
device)的链接,它们应用各自独立的端口监听调试器的信息,DDMS可以实时监测到测试终端的连接情况。当有新的测试终端连接后,DDMS将捕捉到
终端的ID,并通过adb建立调试器,从而实现发送指令到测试终端的目的。
DDMS监听第一个终端App进程的端口为8600,APP进程将分配8601,如果有更多终端或者更多APP进程将按照这个顺序依次类推。DDMS通过8700端口(”base port”)接收所有终端的指令。
下边通过GUI详细了解DDMS的一些功能
在GUI的左上角可以看到标签为”Devices”的面板,这里可以查看到所有与DDMS连
接的终端的详细信息,以及每个终端正在运行的APP进程,每个进程最右边相对应的是与调试器链接的端口。因为Android是基于Linux内核开发的操
作平台,同时也保留了Linux中特有的进程ID,它介于进程名和端口号之间。
在面板的右上角有一排很重要的按键他们分别是Debug the selected process、Update Threads、Update Heap、Stop Process和ScreenShot。
Emulator Control
通过这个面板的一些功能可以非常容易的使测试终端模拟真实手机所具备的一些交互功能,比如:接听电话,根据选项模拟各种不同网络情况,模拟接受SMS消息和发送虚拟地址坐标用于测试GPS功能等。
Telephony Status: 通过选项模拟语音质量以及信号连接模式。
Telephony Actions: 模拟电话接听和发送SMS到测试终端。
Location Control: 模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识,可以通过以下3种方式:
Manual: 手动为终端发送二维经纬坐标。
GPX: 通过GPX文件导入序列动态变化地理坐标,从而模拟行进中GPS变化的数值。
KML: 通过KML文件导入独特的地理标识,并以动态形式根据变化的地理坐标显示在测试终端。
Threads、Heap、File Exporler
这几项,我们在其他开发工具中也经常使用,就在不此详细说明了。通过File Exporler可以查看Android模拟器中的文件,可以很方便的导入/出文件。
Locate、Console
Locate:显示输出的调试信息,详见;
Console:是Android模拟器输出的信息,加载程序等信息;
使用DDMS模拟发送短信,操作过程如下:
在Emulator Control"Telephony Actions 中输入以下内容
单击发送后,在Android模拟器中打开Messaging,看到下面的短信:
单击新短信,详细查看短信内容:
中文显示为乱码,在未来的开发中,我们必须要注意中文字符的问题。
DDMS是我们开发人员最好的调试工具,它将是每个从事Android开发的人员都不可缺少的。
tomjamescn 阅读(930) |
&&& 一切从String str = new String("abc")说起...
&&& 这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。
&&& 我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。下面说明为什么创建了两个String对象。
&&& 首先,来了解一下Java中的字符串驻留池的概念。JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:
&&& 形式一:String str = "abc";
&&& 形式二:"abc"
&&& 其实,形式一和形式二都是字符串的字面常量。所以,可以这样理解,即把字符串的字面常量都放在了字符串驻留池中。对形式一来说,str其实就是引用的字符串驻留池中"abc"这个String对象。
&&& 如果有如下的两行代码:
&&& String str1 = "abc";
&&& String str2 = "abc";
&&& 那么,上面的两行代码创建了几个String对象?答案是一个。根据我们刚才所述,那么第一行语句将在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String对象,如果有,就直接引用,没有这在池中新建String对象。这下,就明白了为什么上面的两行语句仅仅创建了一个String对象。
&&& 然后,让我们来看一看String str = new String("abc")。我们先不讨论到底创建了几个String对象。我们在这里,比较一下这种new的方式和上面的直接赋值方式两种创建String对象的不同,直接赋值的方式是在字符串驻留池中创建对象,但new这种方式是在堆中创建对象。即,new创建的String对象是不会放入字符串驻留池中的。如果一定要把某个通过new创建的字符串对象放入驻留池,可以使用intern()方法。如String strt = str.intern(),将把str的值放在驻留池中(当然,是在驻留池原来没有这个值对应的String对象的情况下),并返回驻留池中String对象的引用。
&&& 现在,可以分析String str = new String("abc");创建了几个String对象了:)很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象。
&&& 对于Java中的其他类的对象的创建,应该没有这种问题。看来,String对象还是挺特殊的...追根究底,我觉得还是因为字符串操作太多了,为了优化,不得已而为之。
tomjamescn 阅读(198) |
&&& Java标注(Annotation)是语言5.0版本开始支持加入源代码的特殊语法。
&&& Java语言中的类、方法、变量、参数和包等都可以被标注。Java标注和不同,标注有自反性。在编译器生成类文件时,标注可以被嵌入到中,由Java虚拟机执行时获取到标注。
&&& Java标注可以用于编译时,也可以用于运行时。下面的讨论主要集中于运行时。
&&& Annotation分类
&&& 1,内建Annotation——Java5.0版在java语法中经常用到的内建Annotation:
&&& @Deprecated用于修饰已经过时的方法;
&&& @Override用于修饰此方法覆盖了父类的方法(而非重载);
&&& @SuppressWarnings用于通知java编译器禁止特定的编译警告。
&&& 下面代码展示了内建Annotation类型的用法:
&1&package&com.bjinfotech.practice.
&4&&*&演示如何使用java5内建的annotation
&5&&*&参考资料:
&6&&*&http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html
&7&&*&http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
&8&&*&http://mindprod.com/jgloss/annotations.html
&9&&*&@author&cleverpig
12&import&java.util.L
14&public&class&UsingBuiltInAnnotation&{
15&&&&&&&&&//食物类
16&&&&&&&&&class&Food{}
17&&&&&&&&&//干草类
18&&&&&&&&&class&Hay&extends&Food{}
19&&&&&&&&&//动物类
20&&&&&&&&&class&Animal{
21&&&&&&&&&&&&&&&&&Food&getFood(){
22&&&&&&&&&&&&&&&&&&&&&&&&&return&null;
23&&&&&&&&&&&&&&&&&}
24&&&&&&&&&&&&&&&&&//使用Annotation声明Deprecated方法
25&&&&&&&&&&&&&&&&&@Deprecated
26&&&&&&&&&&&&&&&&&void&deprecatedMethod(){
27&&&&&&&&&&&&&&&&&}
28&&&&&&&&&}
29&&&&&&&&&//马类-继承动物类
30&&&&&&&&&class&Horse&extends&Animal{
31&&&&&&&&&&&&&&&&&//使用Annotation声明覆盖方法
32&&&&&&&&&&&&&&&&&@Override
33&&&&&&&&&&&&&&&&&Hay&getFood(){
34&&&&&&&&&&&&&&&&&&&&&&&&&return&new&Hay();
35&&&&&&&&&&&&&&&&&}
36&&&&&&&&&&&&&&&&&//使用Annotation声明禁止警告
37&&&&&&&&&&&&&&&&&@SuppressWarnings({"deprecation","unchecked"})
38&&&&&&&&&&&&&&&&&void&callDeprecatedMethod(List&horseGroup){
39&&&&&&&&&&&&&&&&&&&&&&&&&Animal&an=new&Animal();
40&&&&&&&&&&&&&&&&&&&&&&&&&an.deprecatedMethod();
41&&&&&&&&&&&&&&&&&&&&&&&&&horseGroup.add(an);
42&&&&&&&&&&&&&&&&&}
43&&&&&&&&&}
&&& 2,开发者自定义Annotation:由开发者自定义Annotation类型。
&&& 下面是一个使用annotation进行方法测试的sample:
&&& AnnotationDefineForTestFunction类型定义如下:
&2&package&com.bjinfotech.practice.
&4&import&java.lang.annotation.*;
&6&&*&定义annotation
&7&&*&@author&cleverpig
10&//加载在VM中,在运行时进行映射
11&@Retention(RetentionPolicy.RUNTIME)
12&//限定此annotation只能标示方法
13&@Target(ElementType.METHOD)
14&public&@interface&AnnotationDefineForTestFunction{}
&&& 测试annotation的代码如下:
&1&package&com.bjinfotech.practice.
&3&import&java.lang.reflect.*;
&6&&*&一个实例程序应用前面定义的Annotation:AnnotationDefineForTestFunction
&7&&*&@author&cleverpig
10&public&class&UsingAnnotation&{
11&&&&&&&&&@AnnotationDefineForTestFunction&public&static&void&method01(){}
12&&&&&&&&&
13&&&&&&&&&public&static&void&method02(){}
14&&&&&&&&&
15&&&&&&&&&@AnnotationDefineForTestFunction&public&static&void&method03(){
16&&&&&&&&&&&&&&&&&throw&new&RuntimeException("method03");
17&&&&&&&&&}
18&&&&&&&&&
19&&&&&&&&&public&static&void&method04(){
20&&&&&&&&&&&&&&&&&throw&new&RuntimeException("method04");
21&&&&&&&&&}
22&&&&&&&&&
23&&&&&&&&&public&static&void&main(String[]&argv)&throws&Exception{
24&&&&&&&&&&&&&&&&&int&passed&=&0,&failed&=&0;
25&&&&&&&&&&&&&&&&&//被检测的类名
26&&&&&&&&&&&&&&&&&String&className="com.bjinfotech.practice.annotation.UsingAnnotation";
27&&&&&&&&&&&&&&&&&//逐个检查此类的方法,当其方法使用annotation声明时调用此方法
28&&&&&&&&&&&&&for&(Method&m&:&Class.forName(className).getMethods())&{
29&&&&&&&&&&&&&&&&if&(m.isAnnotationPresent(AnnotationDefineForTestFunction.class))&{
30&&&&&&&&&&&&&&&&&&&try&{
31&&&&&&&&&&&&&&&&&&&&&&m.invoke(null);
32&&&&&&&&&&&&&&&&&&&&&&passed++;
33&&&&&&&&&&&&&&&&&&&}&catch&(Throwable&ex)&{
34&&&&&&&&&&&&&&&&&&&&&&System.out.printf("测试&%s&失败:&%s&%n",&m,&ex.getCause());
35&&&&&&&&&&&&&&&&&&&&&&failed++;
36&&&&&&&&&&&&&&&&&&&}
37&&&&&&&&&&&&&&&&}
38&&&&&&&&&&&&&}
39&&&&&&&&&&&&&System.out.printf("测试结果:&通过:&%d,&失败:&%d%n",&passed,&failed);
40&&&&&&&&&}
&&& 3,使用第三方开发的Annotation类型
&&& 这也是开发人员所常常用到的一种方式。比如我们在使用Hibernate3.0时就可以利用Annotation生成数据表映射配置文件,而不必使用Xdoclet。
tomjamescn 阅读(947) |
&&& 来自:http://www.cnblogs.com/ssqjd/archive//1386427.html
要玩GPhone的模拟器,当然需要先去google上面下载Android的SDK,解压出来后在SDK的根目录下有一个tools文件夹,里面就是模拟器和一些非常有用的工具。
双击“emulator.exe”,直接启动模拟器,简单吧。当然,如果要对模拟器进行一些定制,还是要从命令行调用,带上参数启动。下面就来介绍一下启动是常用的几个参数:
1.模拟器外观的定制:
480x320, landscape: emulator -skin HVGA-L
320x480, portrait : emulator -skin HVGA-P (default)
320x240, landscape: emulator -skin QVGA-L
240x320, portrait : emulator -skin QVGA-P
2.为模拟器加上SD卡:
emulator -sdcard D:"sdcard.img
下面我们再来说说如何创建"sdcard.img"文件:
“tools”目录下还有另外一个很好用的工具“mksdcard.exe”,一看名字就知道——make sdcard。对,就用它来创建一个“SD卡”。
mksdcard 1024M D:"sdcard.img
OK,这样一个容量为1G的SD卡就创建完毕了。
使用SDCard:
创建: mksdcard &1024M& &sdcard.img&
(bytes(default),K,M)
连接到模拟器: emulator -sdcard &目录/sdcard.img&
传文件到SDCard: adb push &目录/audio.mp3& &/sdcard/audio.mp3&
玩过手机模拟器的人一般最感兴趣的当然是模拟器能做什么呢?下面一一道来:
GPhone的模拟器有个特有的号码:,这个就类似我们实体手机的SIM卡号码啦。要实现拨号,用手机?当然不行!
更简单,三步:
1.运行 cmd
2.连接: telnet localhost 5554
3.命令:gsm call
look!是不是模拟器上显示来电了?接听/挂断和实体手机一样。
发短信也一样简单,重复上面1,2两步,第三部命令改一下:
Hello,this is a Message.
来说说PC与模拟器文件传输的方法吧。这里需要用到另一个重要工具,也在“tools”目录下,“adb.exe”。
adb(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机 模拟器 的状态 。还可以进行以下的操作:
1、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;
2、在设备上运行shell命令;
3、管理设备或手机模拟器上的预定端口;
4、在设备或手机模拟器上复制或粘贴文件
一些常用的操作:
进入Shell: adb shell
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux 的命令,另外如果只想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg会打印出内核的调试信息。
(Android的linux shell做了大量精简,很多linux常用指令都不支持)
上传文件: adb push &PC文件& &/tmp/...&
下载文件: adb pull &/tmp/...& &PC文件&
安装程序: adb install &*.apk&
卸载软件: adb shell rm /data/app/&*.apk&
补充一点,通过adb安装的软件(*.apk)都在"/data/app/"目录下,所以安装时不必制定路径,卸载只需要简单的执行"rm"就行。
结束adb: adb kill-server
显示android模拟器状态:
adb devices (端口信息)
adb get-product (设备型号)
adb get-serialno (序列号)
等待正在运行的设备: adb wait-for-device
端口转发: adb forward adb forward tcp:5555 tcp:1234
(将默认端口TCP 5555转发到1234端口上)
查看bug报告: adb bugreport
adb shell sqlite3 访问数据库SQLite3
adb shell logcat -b radio 记录无线通讯日志: 一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
应用程序配置文件:
"AndroidManifest.xml"中
"&category android:name="android.intent.category.LAUNCHER" /&"
决定是否应用程序是否显示在Panel上
-----------------------------------------------------------------------------------
am指令(在shell内使用am来加载android应用):
am [start|instrument]&&&
am start [-a &ACTION&]
&&[-d &DATA_URI&]
&&[-t &MIME_TYPE&]&&&&&&&&&&&&&&&&
&&[-c &CATEGORY& [-c &CATEGORY&] ...]&
&&[-e &EXTRA_KEY& &EXTRA_VALUE& [-e &EXTRA_KEY& &EXTRA_VALUE& ...]
&&[-n &COMPONENT&] [-D] [&URI&]&&&&&&&
am instrument [-e &ARG_NAME& &ARG_VALUE&]
&&[-p &PROF_FILE&]&&&&&&&&&&&&&&&&
&&[-w] &COMPONENT&
启动浏览器:
am start -a android.intent.action.VIEW -d
am start -a android.intent.action.CALL -d tel:10086
启动google map直接定位到北京:
am start -a android.intent.action.VIEW geo:0,0?q=beijing
-----------------------------------------------------------------------------------
sqlite_stmt_jou
init.goldfish.r
default.prop
这里要说明下,从andorid中得到的文件流的字符串的顺序是按“类型+权限+拥有者+数组+大小+日期+名称+链接到”顺序排列的,其中类型“d”表示的是文件夹,"l"表示的是链接,'-'表示的是文件。
例如d&rwxrwx--- system&& &cache&&&&&&&&&&&&&&&
11:46&&&&&&&&&&&&& cache
上面的目录就是通过解析ls命令返回的字符串进行解析的。
-----------------------------------------------------------------------------------
联络人(含通话记录)数据库:/data/data/com.android.providers.contacts/databases/contacts.db
媒体库(貌似记录铃声设置等信息): /data/data/com.android.providers.media/internal.db
系统设置: /data/data/com.android.providers.settings/databases/settings.db
短信库: /data/data/com.android.providers.telephony/databases/mmssms.db
Web设置: /data.data/com.android.settings/databases/webview.db
地图搜索历史记录:/data/data/com.google.android.apps.maps/databases/search_history.db
帐号库?(内含androidId信息) : /data/data/com.google.android.googleapps/databases/accounts.db
铃声: /system/media/audio
时区设置: /data/property/persist.sys.timezone
-----------------------------------------------------------------------------------
目前的安装模式
  安装前:
1. emulator -wipe-data
2. adb push busybox ./
3. adb shell ./busybox tar -cf /tmp/data.tar /data
4. adb pull /tmp/data.tar .
5. mkdir original
6. cd original
7. tar -xf ../data.tar
  安装后:
1. adb shell ./busybox tar -cf /tmp/data.tar /data
2. adb pull /tmp/data.tar .
3. mkdir after_install
4. cd after_install
5. tar -xf ../data.tar
&&& 目前来看,就是/data/app和data/data下多了两个相关文件,同时在/data/system/packages.xml中增加了安装的程序信息。似乎菜单也是从这个文件中得到是否新安装程序,以及如何显示相关信息比如名称什么的。
android模拟器和真机的不同之处:
&&& * 不支持呼叫和接听实际来电;但可以通过控制台模拟电话呼叫(呼入和呼出)
&&& * 不支持USB连接
&&& * 不支持相机/视频捕捉
&&& * 不支持音频输入(捕捉);但支持输出(重放)
&&& * 不支持扩展耳机
&&& * 不能确定连接状态
&&& * 不能确定电池电量水平和交流充电状态
&&& * 不能确定SD卡的插入/弹出
&&& * 不支持蓝牙
andoroid模拟器使用注意:
平时使用emulator测试开发的网友注意应该定期清理下C:"Documents and Settings"sh"Local
Settings"Temp"AndroidEmulator文件夹,由于Android模拟器每次运行时会临时生成几个.tmp后缀的临时文件,没有几
个月功夫简单一看竟然占用磁盘空间高达5GB之多。这些文件网友可以安全的删除。
tomjamescn 阅读(215) |
&&& 最近在读高焕堂的《Android应用框架原理与程序设计》,由于高焕堂是台湾省的,所以术语不太一样,这里是网上收集的大陆和台湾的IT术语对比表:
中国台湾省 中国大陆
程式-----------&程序
图示-----------&图标
功能表---------&菜单
视窗-----------&窗口
作业-----------&工作
内存-----------&记忆体
埠-------------&端口
资讯-----------&信息
硬盘-----------&硬碟
互动-----------&交互
光盘-----------&光碟
硬碟机---------&硬盘驱动器
光碟机---------&光盘驱动器
变数-----------&变量
物件-----------&对象
乱数-----------&随机数
测验-----------&测试
滑鼠-----------&鼠标
回应-----------&响应
设定-----------&设置
撰写-----------&编写
列印-----------&打印
网路-----------&网络
档案-----------&文件
位元-----------&比特
档名-----------&文件名
影像-----------&图像
萤屏-----------&屏幕
存盘-----------&存储
指标-----------&指示
影片-----------&动画
真伪-----------&真假
显示幕---------&显示器
工具列---------&工具栏
重绘-----------&刷新
装置-----------&设置
游标-----------&光标
关於-----------&关于
支援-----------&支持
软体-----------&软件
硬体-----------&硬件
著作权---------&版权
tomjamescn 阅读(292) |
整合ssi虽然原理比较简单,但在实际操作的时候还是容易出错的,在这里也记录一下...
各个组件的版本号:struts2.1 spring2.5 ibatis2.3
struts2.1需要的包
&&& 首先是struts2.1必须的包:
&&& 然后是要与spring集成需要的包:struts2-spring-plugin-2.1.6.jar
spring2.5需要的包
&&& 这里用的是集成了spring所有模块的包:spring.jar
ibatis2.3需要的包
&&& ibatis-2.3.*.*.jar
web.xml的配置
&1&&?xml&version="1.0"&encoding="UTF-8"?&
&2&&web-app&version="2.4"&xmlns="http://java.sun.com/xml/ns/j2ee"
&3&&&&&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
&4&&&&&xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee&
&5&&&&&http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&
&6&&&&&&filter&
&7&&&&&&&&&&filter-name&struts2&/filter-name&
&8&&&&&&&&&&filter-class&
&9&&&&&&&&&&&&&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
10&&&&&&&&&&/filter-class&
11&&&&&&/filter&
12&&&&&&listener&
13&&&&&&&&&&listener-class&
14&&&&&&&&&&&&&org.springframework.web.context.ContextLoaderListener
15&&&&&&&&&&/listener-class&
16&&&&&&/listener&
17&&&&&&filter-mapping&
18&&&&&&&&&&filter-name&struts2&/filter-name&
19&&&&&&&&&&url-pattern&/*&/url-pattern&
20&&&&&&/filter-mapping&
21&&&&&&welcome-file-list&
22&&&&&&&&&&welcome-file&login.jsp&/welcome-file&
23&&&&&&/welcome-file-list&
24&&/web-app&
applicationContext.xml的配置
&?xml&version="1.0"&encoding="UTF-8"?&
&beans&xmlns="http://www.springframework.org/schema/beans"
&&&&&&&&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
&&&&&&&&xmlns:aop="http://www.springframework.org/schema/aop"
&&&&&&&&xmlns:tx="http://www.springframework.org/schema/tx"
&&&&&&&&xsi:schemaLocation="
&&&&&&&&&&&&http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
&&&&&&&&&&&&http://www.springframework.org/schema/aop&http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
&&&&&&&&&&&&http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&
&&&&&bean&id="dataSource"
&&&&&&&&class="org.springframework.jdbc.datasource.DriverManagerDataSource"&
&&&&&&&&&property&name="driverClassName"&
&&&&&&&&&&&&&value&org.gjt.mm.mysql.Driver&/value&
&&&&&&&&&/property&
&&&&&&&&&property&name="url"&
&&&&&&&&&&&&&value&jdbc:mysql://localhost:3306/test&/value&
&&&&&&&&&/property&
&&&&&&&&&property&name="username"&
&&&&&&&&&&&&&value&root&/value&
&&&&&&&&&/property&
&&&&&&&&&property&name="password"&
&&&&&&&&&&&&&value&&/value&
&&&&&&&&&/property&
&&&&&/bean&
&&&&&bean&id="sqlMapClient"
&&&&&&&&class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"&
&&&&&&&&&property&name="dataSource"&ref="dataSource"&/&
&&&&&&&&&property&name="configLocation"&value="WEB-INF/sql-map-config.xml"&/&
&&&&&/bean&
&&&&&bean&id="sqlMapClientTemplate"&class="org.springframework.orm.ibatis.SqlMapClientTemplate"&
&&&&&&&&&property&name="sqlMapClient"&ref="sqlMapClient"&/&
&&&&&/bean&
&&&&&!--&其他配置,如DAO,Action--/&
sql-map-config.xml的配置
&?xml&version="1.0"&encoding="UTF-8"&?&
&!DOCTYPE&sqlMapConfig&&&&&&
&&&&PUBLIC&"-//ibatis.apache.org//DTD&SQL&Map&Config&2.0//EN"&&&&&&
&&&&"http://ibatis.apache.org/dtd/sql-map-config-2.dtd"&
&sqlMapConfig&
&&&&&settings&useStatementNamespaces="true"&/&
&&&&&sqlMap&resource="ssi/persistance/sqlmap/user_SqlMap.xml"&/&
&/sqlMapConfig&
&&& 具体sql-map文件的配置,这里就不写了,我也是刚刚学习ibatis,呵呵,由于最近马上就要开发了,就找了工具来加快速度,ibatis官方提供的ibator(原来叫abator)这个工具相当猛啊,还在学习中...
&&& 在配置过程当中,特别需要注意各个配置文件的存放位置,比如对于applicationContext.xml来说,默认应该存放在WEB-INF文件夹中,如果想放到类路径上去,需要在web.xml里面配置,一般配置在web.xml的开头部分:
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&
classpath:applicationContext.xml
&/param-value&
&/context-param&
tomjamescn 阅读(1566) |
来自:http://www.javaeye.com/topic/106626
一、简介:
hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议。
相对其他数据库来说,其体积小,才563kb。
仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容。
下载地址:
二、使用hsql数据库:
1、hsql数据库引擎有几种服务器模式:常用的Server模式、WebServer模式、Servlet模式、Standlone模式、Memory-On&ly数据库。
2、最为常用的Server模式:
1)首先却换到lib文件夹下,运行java -cp hsqldb.jar
org.hsqldb.Server -database.0 db/mydb -dbname.0 xdb
执行命令后,将会在db文件夹下创建一个数据库mydb,别名(用于访问数据库)是xdb,如果存在mydb数据库,将会打开它。
2)运行数据库界面操作工具:java -cp hsqldb.jar
org.hsqldb.util.DatabaseManager
在Type选项里选上相应的服务器模式,这里选择HSQL
Database Engine
Server模式;Driver不用修改;URL修改为jdbc:hsqldb:hsql://localhost/xdb
(主要这里xdb就是上面我们设置的别名);user里设置用户名,第一次登录时,设置的是管理员的用户名,password设置密码。然后点击Ok。
3)第一次运行数据库引擎,创建数据库完毕。好了,你可以打开db文件夹,会发现里面多了几个文件。
mydb.properties文件:是关于数据库的属性文件。
mydb.script:hsql主要保存的表(这里按hsql的说法是Memory表,就是最为常用的),里面的格式都是文本格式,可以用文本查看,里面的语&句都是sql语句,熟悉sql语句的话,你也可以手动修改它。每次运行数据库引擎的话都是从这里加载进内存的。
mydb.lck表示数据库处于打开状态。
其他的请参看hsqldb包里的手册。
3、WebServer模式和Server运行模式基本一样,只是支持了Http等协议,主要用于防火墙,默认端口是9001。启动Server,java
-cp hsqldb.jar org.hsqldb.WebServer ...剩余的和上面的一致。
4、Servlet模式可以允许你通过Servlet容器来访问数据库,请查看hsqlServlet.java的源代码,和WebServer类似。
5、另一个值得思考的模式是Standalone模式:不能通过网络来访问数据库,主要是在一个JVM中使用,那样的话,访问的速度会更加快。虽然文档里
面提到&主要是用于开发时使用,但是我们可以假设一下,该方法不需要一个引擎类的东西,而类似于打开文件的方式,返回一个
Connection对象:
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:mydb",
"sa", "");
将会在当前目录找到mydb数据库相关文件,打开并返回一个Connection对象。该方式有点好处就是可以不使用引擎,在需要的时候操作数据。所以那
些对数&据库不是特别有要求的,但又需要一个操作数据库的方式的话,可以使用这种方法。对于那些不想额外在数据库引擎花费金钱的话,可以
使用这种方法。但是不推荐使用该&方法。记得Hibernate里SessionFactory可以使用
openSession(Connecttion
c)来获得一个Session对象的,因此,在测试或者实际应用的话都可以这样使用。
6、Memory-Only
数据库:顾名思义,主要是内存中使用,不用于保存数据。可以用于在内存中交换数据。
上面是关于hsqldb的一些基本信息的介绍,可以看到它的一些优势和特性。
我们可以把hsqldb内置在web程序中,除考虑Standalone模式外,最好是采用最为常用的Server模式。
那么Server模式如何和web程序合理搭配使用呢。
可以采用两种方式:
1)采用上面提到的方法,运行java -cp hsqldb.jar
org.hsqldb.Server -database.0 db/mydb -dbname.0 xdb
来启动db,通过设置的URL:jdbc:hsqldb:hsql://localhost/xdb
以达到在程序中访问hsql数据库的
(注:设置URL等信息,可以通过hibernate来配置,例如:
hibernate.dialect org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class org.hsqldb.jdbcDriver
hibernate.connection.username sa
hibernate.connection.password
hibernate.connection.url jdbc:hsqldb:hsql://localhost/xdb )
2)为了省去第一种方法的琐碎,可以在启动web容器的过程中同时启动hsqldb。具体做法如下:编写一个有关hsql的Listener类,扩展javax&.servlet.ServletContextListener,可以在配置文件中设置dbPath、dbName、port等等hsqldb的信息,启动h&sqldb。
在web.xml中配置
&listener&
&listener-class&com.iplan.portal.framework.web.HsqlListener&/listener-class&&
&/listener&
这样在启动web容器的时候,同时启动了hsqldb,关闭容器的时候同时也shutdown掉hsqldb。
tomjamescn 阅读(99) |
MyEclipse6.5集成SVN
第一步:安装Mylyn:
&&&&& 打开Myeclipse6.5,依次点击Hellp--&Software Updates--&Find and Install
&&&&& 在弹出的对话框中选择第二项(Search for new features to install),点击next后,在新的对话框中选择New Remote Site...然后填写下面内容:
Name:Mylyn
&&&& 然后一路点击下一步。完成安装后重启workspace。
第二步:安装Subversive:
&&&&& 打开Myeclipse6.5,依次点击Hellp--&Software Updates--&Find and Install
&&&&& 在弹出的对话框中选择第二项(Search for new features to install),点击next后,在新的对话框中选择New Remote Site...然后填写下面内容:
Name:subversive
&&&&& 然后一路点击下一步。完成安装后重启workspace。
第三步:安装Subservice Connectors:
&&&&& 打开MyEclipse6.5,依次点击Hellp--&Software Updates--&Find and Install
&&&&& 在弹出的对话框中选择第二项(Search for new features to install),点击next后,在新的对话框中选择New Remote Site...然后填写下面内容:
Name:subservice connectors
&&&&& 然后一路点击下一步。完成安装后重启workspace。
&&&&& 到这里安装完毕。
&&&&& 然后在MyEclipse6.5点击Window--&Show View--&Other...--&SVN--&SVN Repositories,点击OK,添加SVN Repositories的窗口。
&&&&& 好了,下面就可以新建一个Repository Location了。
在SVN Repositories窗口中右键New--&Repository Location,输入SVN服务端的URL和用户名,密码,点击确定后就完成了。
tomjamescn 阅读(1195) |
&&& 磁盘命令应该是最基本的命令了。linux下的磁盘命令主要有三个:
&&& df命令用来检查文件系统的磁盘空间占用情况。这里的文件系统指挂载到linux系统上的文件系统。没有挂载上来的是没有包含进来的。
&&& fdisk命令主要用来分区。先复习一下基础知识。一个硬盘可以划分4个区,3个主要分区,一个扩展分区,而扩展分区里可以划分n个逻辑分区,扩展分区本身不能储存任何东西,也不能格式化成某种文件系统,只能用于区分逻辑分区。
&&& sudo fdisk -l
&&& fdisk用来分区比较复杂,Linux有一个图形化的软件gparted来进行分区。
&&& sudo apt-get install gparted&&&&&&&&& 安装
&&& mkfs是格式化的命令,它的形式:sudo&mkfs&-t&文件系统&存储设备,如:
&&& sudo&mkfs -t ext3&/dev/sda6&&&&&&&&&&&& 把该设备格式化成ext3文件系统
&&& mount和umount是挂载和取消挂载命令。
&&& sudo&mount&[-t&文件系统&]&[-o&选项]&设备&目录
&&& 使用这个命令前需要先生成一个用于被挂的目录,创建了这样的目录后有个细节问题就是更改这个目录的权限,最起码要你可读写,这样才能使你挂载的硬盘可读写,当然ntfs的硬盘除外。如:chmod&777&目录。挂载时,也有可以省事的地方,比如说你不知道你的分区是什么文件类型你可以:sudo&mount&-t&auto&设备&目录。sudo&mount&设备&目录
tomjamescn 阅读(177) |
ROWNUM的概念
一个虚假的列。它将被分配为 1,2,3,4,...N,N 是行的数量。一个ROWNUM值不是被永久的分配给一行
(这是最容易被误解的)。表中的某一行并没有标号;你不可以查询ROWNUM值为5的行——根本没有这个概念。另一个容易搞糊涂的问题是ROWNUM值是
何时被分配的。ROWNUM值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的。ROWNUM值只有当被分配之后才会增长。这就是为什么下面的查
询永远都不会返回结果:
select * from countries where rownum&1;
ROWNUM & 1对于第一行来说并不是真值,ROWNUM没有增长到 2。所以,没有比1大的ROWNUM.永远都不要使用’ROWNUM&?‘和’ROWNUM=2…N’这样的条件。
用rownum显示排序结果的前N条记录
FROM/WHERE子句先被执行.
根据FROM/WHERE子句输出的行, ROWNUM被分配给他们并自增长.
SELECT 被应用.
GROUP BY 被应用.
HAVING is 被应用.
ORDER BY 被应用.
这就是为什么下面的SQL几乎总是错误的:
select rownum,job_title,min_salary
from jobs where rownum&3 order by min_
正确的写法:
& & & & select rownum,tmp.* from (
& & & & select job_title,min_salary
& & & & from jobs order by min_salary) tmp
& & & & where rownum&=3;
用ROWNUM实现分页
select * from
& & & & (select /*+ FIRST_ROWS(n) */ a.*,
& & & & ROWNUM rnum
& & & & from (your_query_goes_here, with order by) a
& & & & where ROWNUM &=
& & & & :MAX_ROW_TO_FETCH )
where rnum &= :MIN_ROW_TO_FETCH;
FIRST_ROWS(N)使优化器考虑最短时间获得前N条记录.
:MAX_ROW_TO_FETCH 某一页中结果集的最后一行。如果你每页显示10行,要显示第6页,那么此值取60。
:MIN_ROW_TO_FETCH 某一页中结果集的第一行。如果你每页显示10行,要显示第6页,那么此值取50。
ROWNUM对性能的影响
ROWNUM可以避免oracle在磁盘上进行排序。rownum无法避免全表扫描的发生,但是它可以避免对整个表数据的排序操作,在指定了rownum后,排序操作在内存中可以轻松完成。
tomjamescn 阅读(169) |
&&& sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操
作。没有sequence,顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环
境下,必须有人等待下一个主键值的产生。而且此方法很容易产生主键冲突的错误,如下图:
time a......trans1 begin.........................................................
&&&&&&&&&&&&&&&&&&&&&& |
&&&&&&&&&&&&&&取max value=5&
&&&&&&&&&&&&&&&&&&&&&&& |
time b......&max value+1=6........trans2 begin.....................
&&&&&&&&&&&&&&&&&&&&&&& |&&&&&&&&&&&&&&&&&&&&&&&& |
&&&&&&&&&&&&&& other action&&&&&&&&&&&&&&&max value=5
&&&&&&&&&&&&&&&&&&&&&&& |&&&&&&&&&&&&&&&&&&&&&&&& |
time c.....&&&...................max value+1=6................
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& |
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& commt(ora-00001)
如上图,事务2会报主键冲突的错误,而再刷新一下页面(再执行一边程序),可能就正常了。
还有一个问题,那就是完成生成主键的程序
(一般情况包含plsql块)本身对于并发调用也是一个瓶颈,因为这样的程序段往往是提供给好多程序去调用,如果代码端写的不够优化(比如没有使用邦定变
量等等),或者此代码段存在问题,那么它所影响的是系统的全局。我们应该提倡开发人员使用sequence。sequence消除了序列化问题,而且改善
了应用的并发能力。
创建sequence
sequence的命名最重要的是要统一,命名规则是次要的。
&CREATE SEQUENCE emp_sequence
&&&&& INCREMENT BY 1
&&&&& START WITH 1
&&&&& NOMAXVALUE
&&&&& NOCYCLE
&&&&& CACHE 10;
里需要重点说明的是cache参数,它是为了应对并发访问的。cache参数告诉oracle预先分配一个sequence
numbers的集合,并且保留在内存中,以便sequence
number能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在oracle
SGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequence
cache相关的等待(enq: SQ - contention),影响系统性能。
既然cache涉及到了内存,那么就会想到oracle实例恢复的问题。如果数据库shutdown abort,sequence会如何呢?当然会有问题,sequence number保存在内存里的但是没有被应用到表中的会丢失!
修改sequence
除了修改sequence的starting number,你什么都能改,如果想改starting number,只能先drop然后create。
ALTER SEQUENCE emp_sequence
&&& INCREMENT BY 10
&&& MAXVALUE 10000
&&& CACHE 20;
改很有用,最典型的情况是“需要把sequence 的current value改大一点,避免程序报错!”。你就可以看看current
value是多少,然后修改increment by 足够大的值,然后执行.nextval,最后别忘了再将increnent
by改成原来的值,还要注意做这些工作的前提是当前没有人用此sequence。
使用 sequence
CURRVAL 和 NEXTVAL 能够在以下情况使用:
insert的values字句、select中的select列表、update中的set字句
CURRVAL 和 NEXTVAL 不能够在以下情况使用:
子查询、视图和实体化视图的查询、带distinct的select语句、带
group by和order
by的select语句、带union或intersect或minus的select语句、select中的where字句、create
table与alter table中的default值、check约束条件。
删除sequence
drop sequence seq_a;
当删除sequence后,对应它的同义词会被保留,但是引用时会报错。
oracle rac环境中的sequence
oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。
row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;
SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。
锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache
和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。
创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。
cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。
rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内
存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)"sql& create
sequence seq_b cache 100
order"。如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁
的情况相同,就是将cache 值进行适当调整。
在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的
cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。
tomjamescn 阅读(1395) |
每次struts的更新,都会发现它的基础jar包不同,下面我就列举最新版的struts2的基础jar包.
struts2.0.14:它们为commons-logging-1.0.4,freemarker-2.3.8,ognl-2.6.11,struts2-core-2.0.14,xwork-2.07.
struts2.1.6:它们为commons-fileupload-1.2.1,commons-io-1.3.2,commons-
logging-1.0.4,freemarker-2.3.13,ognl-2.6.11,struts2-core-2.1.6,xwork-2.1.2.
考虑到以后兼容以后的版本,原来的FilterDispatcher和ActionContextCleanUp将在以后的版本中去掉,官方推荐使用
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
tomjamescn 阅读(868) |
来自:http://silverw0396.javaeye.com/blog/90554
&&& ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持,ORACLE为用户提供自己熟悉的数据库母语环境,诸如日期格式、数字格式和存储序列等。Oracle可以支持多种语言及字符集,其中oracle8i支持48种语言、76个国家地域、229种字符集,而oracle9i则支持57种语言、88个国家地域、235种字符集。由于oracle字符集种类多,且在存储、检索、迁移oracle数据时多个环节与字符集的设置密切相关,因此在实际的应用中,数据库开发和管理人员经常会遇到有关oracle字符集方面的问题。本文通过以下几个方面阐述,对oracle字符集做简要分析
二.字符集基本知识
&&& 实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。
&&& Oracle的字符集命名遵循以下命名规则:
&&& &Language&&bit size&&encoding&
&&& 即:& &语言&&比特位数&&编码&
&&& 比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集
2.2字符编码方案
2.2.1 单字节编码
&&& (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII
&&& (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家
&&&&&&&&&&& 例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)
2.2.2 多字节编码
&&& (1)变长多字节编码
&&&&某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,例如日语、汉语、印地语等
&&& 例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280
&&& (2)定长多字节编码
&&& 每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集
2.2.3 unicode编码
&&& Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。
&&& UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集
2.3 字符集超级
&&& 当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。
&&& Oracle8i和oracle9i官方文档资料中备有子集-超级对照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。
2.4 数据库字符集(oracle服务器端字符集)
&&& 数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。
2.4.1 字符集
&&& (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据
&&& (2)用来标示诸如表名、列名以及PL/SQL变量等
&&& (3)用来存储SQL和PL/SQL程序单元等
2.4.2 国家字符集:
&&& (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据
&&& (2)国家字符集实质上是为oracle选择的附加字符集,主要作用是为了增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16
2.4.3查询字符集参数
&&& 可以查询以下数据字典或视图查看字符集设置情况
&&& nls_database_parameters、props$、v$nls_parameters
&&& 查询结果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符集
2.4.4修改数据库字符集
&&& 按照上文所说,数据库字符集在创建后原则上不能更改。如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。
2.5 客户端字符集(NLS_LANG参数)
2.5.1 客户端字符集含义
&&& 客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。
2.5.2 NLS_LANG参数格式
&&& NLS_LANG=&language&_&territory&.&client character set&
&&& Language:显示oracle消息,校验,日期命名
&&& Territory:指定默认日期、数字、货币等格式
&&& Client character set:指定客户端将使用的字符集
&&& 例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII&
&&& AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集
2.5.3客户端字符集设置方法
&&&& 1)UNIX环境
&&&&&&&& $NLS_LANG=“simplified chinese”_china.zhs16gbk
&&&&&&&& $export NLS_LANG
&&&&&&&& 编辑oracle用户的profile文件
&&& 2)Windows环境
&&&&&&&& 编辑注册表
&&&&&&&& Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0
2.5.4 NLS参数查询
&&& Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
&&& NLS_DATABASE_PARAMETERS--显示数据库当前NLS参数取值,包括数据库字符集取值
&&& NLS_SESSION_PARAMETERS--显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
&&& NLS_INSTANCE_PARAMETE--显示由参数文件init&SID&.ora 定义的参数V$NLS_PARAMETERS--显示数据库当前NLS参数取值
2.5.5修改NLS参数
&&& 使用下列方法可以修改NLS参数
&&& (1)修改实例启动时使用的初始化参数文件
&&& (2)修改环境变量NLS_LANG
&&& (3)使用ALTER SESSION语句,在oracle会话中修改
&&& (4)使用某些SQL函数
&&& NLS作用优先级别:Sql function&alter session&环境变量或注册表&参数文件&数据库默认参数
三.导入/导出与字符集转换
3.1 EXP/IMP
&&& Export 和 Import 是一对读写Oracle数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中,由于使用exp/imp进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
&&&& ____________& &_________________& _____________
&&&& |imp导入文件|&-|环境变量NLS_LANG|&-|数据库字符集|
&&&&&------------&& -----------------&&-------------
&&&& ____________& &_________________& _____________
&&&& |imp导入文件|-&|环境变量NLS_LANG|-&|数据库字符集|
&&&&&------------&& -----------------&&-------------
&&& 四个字符集是
&& (1)源数据库字符集
&& (2)Export过程中用户会话字符集(通过NLS_LANG设定)
&& (3)Import过程中用户会话字符集(通过NLS_LANG设定)
&& (4)目标数据库字符集
3.2导出的转换过程
&&& 在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。
例:如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,这样转换后生成的Dmp文件已经发生了数据丢失。
因此如果想正确导出源数据库数据,则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集
3.3导入的转换过程
&&& (1)确定导出数据库字符集环境
&&& 通过读取导出文件头,可以获得导出文件的字符集设置
&&& (2)确定导入session的字符集,即导入Session使用的NLS_LANG环境变量
&&& (3)IMP读取导出文件
&&& 读取导出文件字符集ID,和导入进程的NLS_LANG进行比较
&&& (4)如果导出文件字符集和导入Session字符集相同,那么在这一步骤内就不需要转换,如果不同,就需要把数据转换为导入Session使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换
&&& 第一次:导入文件字符集与导入Session使用的字符集之间的转换,如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。
&&& 第二次:导入Session字符集与数据库字符集之间的转换。
&&& 然而,oracle8i的这种转换只能在单字节字符集之间进行,oracle8i导入Session不支持多字节字符集之间的转换,因此为了避免第一次转换,导入Session使用的NLS_LANG与导出文件字符集相同,第二次转换(通过SQL*Net)支持任何两种字符集。以上情况在Oracle9i中略有不同
四.乱码问题
&&& oracle在数据存储、迁移过程中经常发生字符乱码问题,归根到底是由于字符集使用不当引起。下面以使用客户端sqlplus向数据库插入数据和导入/导出(EXP/IMP)过程为例,说明乱码产生的原因。
4.1使用客户端sqlplus向数据库存储数据
&&& 这个过程存在3个字符集设置
&&& (1)客户端应用字符集
&&& (2)客户端NLS_LANG参数设置
&&& (3)服务器端数据库字符集(Character Set)设置
&&& 客户端应用sqlplus中能够显示什么样的字符取决于客户端操作系统语言环境(客户端应用字符集),但在应用中录入这些字符后,这些字符能否在数据库中正常存储,还与另外两个字符集设置紧密相关,其中客户端NLS_LANG参数主要用于字符数据传输过程中的转换判断。常见的乱码大致有两种情形:
&&& (1)汉字变成问号“?”;
当从字符集A 转换成字符集B时,如果转换字符之间不存在对应关系,NLS_LANG使用替代字符“?”替代无法映射的字符
&&& (2)汉字变成未知字符(虽然有些是汉字,但与原字符含义不同)
转换存在对应关系,但字符集A 中的字符编码与字符集B 中的字符编码代表不同含义
4.2发生乱码原因&
&& &乱码产生是由于几个字符集之间转换不匹配造成,分以下几种情况:
&&& (注:字符集之间如果不存在子集、超集对应关系时的情况不予考虑,因为这种情况下字符集之间转换必产生乱码)&&&
&&& 1)服务器端数据库字符集与客户端应用字符集相同,与客户端NLS_LANG参数设置不同
&&& 如果客户端NLS_LANG字符集是其它两种字符集的子集,转换过程将出现乱码。
&&& 解决方法:将三种字符集设置成同一字符集,或NLS_LANG字符集是其它两种字符集的超集
&&& 2)服务器端数据库字符集与客户端NLS_LANG参数设置相同,与客户端应用字符集不同
&&& 如果客户端应用字符集是其它两种字符集的超集时,转换过程将出现乱码,但对于单字节编码存储中文问题,可参看本文第5章节的分析
&&& 3)客户端应用字符集、客户端NLS_LANG参数设置、服务器端数据库字符集互不相同
&& &此种情况较为复杂,但三种字符集之间只要有不能转换的字符,则必产生乱码
4.3导入/导出过程出现乱码原因
&&& 这个过程存在4个字符集设置,在3.1章节中已分析
&& (1)源数据库字符集
&& (2)EXP过程中NLS_LANG参数
&& (3)IMP过程中NLS_LANG参数
&& (4)目标数据库字符集
&&& 出现乱码原因
&&& 1)当源数据库字符集不等于EXP过程中NLS_LANG参数,且源数据库字符集是EXP过程中NLS_LANG的子集,才能保证导出文件正确,其他情况则导出文件字符乱码
&&& 2)EXP过程中NLS_LANG字符集不等于IMP过程中NLS_LANG字符集,且EXP过程中NLS_LANG字符集是IMP过程中NLS_LANG字符集的子级, 才能保证第一次转换正常,否则第一次转换中出现乱码。
&&& 3)如果第一次转换正常,IMP过程中NLS_LANG字符集是目标数据库字符集的子集或相同,才能保证第二次转换正常,否则则第二次转换中出现乱码
五.单字节编码存储中文问题
&&& 由于历史的原因,早期的oracle没有中文字符集(如oracle6、oracle7、oracle7.1),但有的用户从那时起就使用数据库了,并用US7ASCII字符集存储了中文,或是有的用户在创建数据库时,不考虑清楚,随意选择一个默认的字符集,如WE8ISO8859P1或US7ASCII,而这两个字符集都没有汉字编码,虽然有些时候选用这种字符集好象也能正常使用,但用这种字符集存储汉字信息从原则上说就是错误的,它会给数据库的使用与维护带来一系列的麻烦。
&&& 正常情况下,要将汉字存入数据库,数据库字符集必须支持中文,而将数据库字符集设置为US7ASCII等单字节字符集是不合适的。US7ASCII字符集只定义了128个符号,并不支持汉字。另外,如果在SQL*PLUS中能够输入中文,操作系统缺省应该是支持中文的,但如果在NLS_LANG中的字符集设置为US7ASCII,显然也是不正确的,它没有反映客户端的实际情况。但在实际应用中汉字显示却是正确的,这主要是因为Oracle检查数据库与客户端的字符集设置是同样的,那么数据在客户与数据库之间的存取过程中将不发生任何转换,但是这实际上导致了数据库标识的字符集与实际存入的内容是不相符的。而在SELECT的过程中,Oracle同样检查发现数据库与客户端的字符集设置是相同的,所以它也将存入的内容原封不动地传送到客户端,而客户端操作系统识别出这是汉字编码所以能够正确显示。
&&& 在这个例子中,数据库与客户端都没有设置成中文字符集,但却能正常显示中文,从应用的角度看好象没问题。然而这里面却存在着极大的隐患,比如在应用length或substr等字符串函数时,就可能得到意外的结果。
&&& 对于早期使用US7ASCII字符集数据库的数据迁移到oracle8i/9i中(使用zhs16gbk),由于原始数据已经按照US7ASCII格式存储,对于这种情况,可以通过使用Oracle8i的导出工具,设置导出字符集为US7ASCII,导出后使用UltraEdit等工具打开dmp文件,修改第二、三字符,修改 0001 为0354,这样就可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中。
六.结束语
&&& 为了避免在数据库迁移过程中由于字符集不同导致的数据损失,oracle提供了字符集扫描工具(character set scanner),通过这个工具我们可以测试在数据迁移过程中由于字符集转换可能带来的问题,然后根据测试结果,确定数据迁移过程中最佳字符集解决方案。
[1]Biju Thomas , Bob Bryla《oracle9i DBA基础I 学习指南》电子工业出版社 2002
tomjamescn 阅读(380) |
&&过滤器是很多Web层框架(特别是对MVC模式的框架,如Struts2...等等)实现的基础,有必要对其进行了解。
一、Servlet过滤器的概念:
◆Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。 
◆Servlet过滤器本身并不产生请求和响应对象,它只能提供过滤作用。Servlet过期能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容。
Servlet过期负责过滤的Web组件可以是Servlet、JSP或者HTML文件。 
二、Servlet过滤器的特点:
◆Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
◆Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器
◆Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象
三、Servlet过滤器的作用:
◆查询请求并作出相应的行动。
◆阻塞请求-响应对,使其不能进一步传递。
◆修改请求的头部和数据。用户可以提供自定义的请求。
◆修改响应的头部和数据。用户可以通过提供定制的响应版本实现。
◆与外部资源进行交互。
四、Servlet过滤器的适用场合:
◆认证过滤
◆登录和审核过滤
◆图像转换过滤
◆数据压缩过滤
◆加密过滤
◆令牌过滤
◆资源访问触发事件过滤
◆XSL/T过滤
◆Mime-type过滤
五、Servlet过滤器接口的构成:
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
◆init(FilterConfig):
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数
◆doFilter(ServletRequest,ServletResponse,FilterChain):
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
◆destroy():
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源
六、Servlet过滤器的创建步骤:
◆实现javax.servlet.Filter接口
◆实现init方法,读取过滤器的初始化函数
◆实现doFilter方法,完成对请求或过滤的响应
◆调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
◆销毁过滤器
七、Servlet过滤器对请求的过滤:
◆Servlet容器创建一个过滤器实例
◆过滤器实例调用init方法,读取过滤器的初始化参数
◆过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法
◆如果该请求不合法则阻塞该请求
◆如果该请求合法则调用chain.doFilter方法将该请求向后续传递
八、Servlet过滤器对响应的过滤:
◆过滤器截获客户端的请求
◆重新封装ServletResponse,在封装后的ServletResponse中提供用户自定义的输出流
◆将请求向后续传递
◆Web组件产生响应
◆从封装后的ServletResponse中获取用户自定义的输出流
◆将响应内容通过用户自定义的输出流写入到缓冲流中
◆在缓冲流中修改响应的内容后清空缓冲流,输出响应内容
九、Servlet过滤器的发布:
◆发布Servlet过滤器时,必须在web.xml文件中加入﹤filter﹥元素和﹤filter-mapping﹥元素。
◆filter元素用来定义一个过滤器:
◆filter-mapping元素用于将过滤器和URL关联:
十一、Servlet过滤器使用的注意事项
◆由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的请求、响应对象ServletRequest、ServletResponse在使用前都必须先转换成HttpServletRequest、HttpServletResponse再进行下一步操作。
◆在web.xml中配置Servlet和Servlet过滤器,应该先声明过滤器元素,再声明Servlet元素
◆如果要在Servlet中观察过滤器生成的日志,应该确保在server.xml的localhost对应的﹤host﹥元素中配置如下﹤logger﹥元素:
Servlet过滤器的情况就向你介绍到这里,那么你对Servlet过滤器是否有了了解呢?
tomjamescn 阅读(155) |
& 来自:http://www.blogjava.net/Unmi/archive//285020.html
作为 Java& 程序员,对于 JavaBean 也许你会说再熟悉不过了,它贯穿在系统的多层中,不同的叫法有
PO、VO、DTO、POJO、DO(Domain Object)。然而它无外乎就是一个 Class 类,带上些属性和它们的
setter/getter 方法,set/get 后面那一个字母大写。虽然我们现在很少把 JavaBean 与那个古老的 2.0 的&EJB
搞混,但为什么明明用 IDE 为属性生成的 getter/setter 方法,应用一运行,还是报找不到某个 bean 属性的 setter 或
getter 方法呢?
要知道,在 Sun 的网站上那个关于 JavaBean 规范的 PDF 文档可是有足足实实的 114 页啊。难免有些规则有点古怪,至使知名的 IDE 都难以应对,所以我们还是有必要了解其中二三,来规范我们的 JavaBean 和解释一些情形。
Sun& 的关于 JavaBean 规范见:,其中可下载到 JavaBean 规范的& PDF 文档。
实际中的问题
先,当然还是要说它的属性及 setter/getter 方法。属性以小写字母开头,驼峰命名格式,相应的 getter/setter 方法是
get/set 接上首字母大写的属性名。多数情况是对的,且当前流行的 IDE(Eclipse、JBuilder) 也都认这个死理,这里
值得表扬一下。但要是碰到些遗留的代码中属性名不规范,或者有些人就是顽固,或真是对属性命名犹豫不决时的写下的代码时,那还是有得你研究一下。
这里来看看 Eclipse 为几个属性生成的 getter/setter 方法吧:
sName(从 C 转过来的,受匈牙利的影响,认为 Name 是个字符串,所以加个前缀 s)&&&&&&&&&& getSName()/setSName(String name)
URL (平时认为是缩略语/专有名词,理当全部大写,这在我们对待 ID 时经常发生的)&&&&&&&&&&&getURL()/setURL(String url)
面第一个由 Eclipse 为我们生成的 getSName()/setSName(String name)&方法,参照 JavaBean&
规范来说,其实是错误的。如果出现这样的方法,放到我们的标签(像 Struts 标签,如 &s:textfield
name="sName"/&),或是进行 Hibernate/iBatis 那种映射时,你就能收到报 找不到 sName 属性相应的 getter/setter 方法 那样的错误。不是明明有 getSName() 和 setSName(String name),可是方法名错了,正确的版本应该是 getsName() 和 setsName(String name)。
前面首先解释了属性命名不规范产生问题的原因,现在就来更仔细的了解关于 JavaBean 属性及其 getter/setter 方法的约定,有些是硬性的。
属性与存取访问的规定
为 JavaBean 创建属性时,必须牢记:缩略语通常被视为一个独立的单词,而不是单个字母。例如,URL 对应的属性名应该用 url,相应的 getUrl()/setUrl(),所以 ID 还是用 id 作为属性吧,相应的 getId()/setId()。
范中另一个特别的地方就是,第二个字母为大写的属性名要区别对待。如果属性名的第二个字母是大写的,那么该属性名直接用作 getter/setter
方法中 get/set 的后部分,就是说大小写不变。这就是为什么 sName 对应的存取方法是 getsName()/setsName()
的原因,不能不说这条规则很令人费解。那就更有必要看看下面表格的规范:
属性名/类型
getter 方法
setter 方法
xcoordinate/Double
public Double getXcoordinate()
public void setXcoordinate(Double newValue)
xCoordinate/Double
public Double getxCoordinate()
public void setxCoordinate(Double newValue)
XCoordinate/Double
public Double getXCoordinate()
public void setXCoordinate(Double newValue)
Xcoordinate/Double
student/Boolean
public Boolean getStudent()
public void setStudent(Boolean newValue)
student/boolean
public boolean getStudent()
public boolean isStudent()
public void setStudent(boolean newValue)
性是首字母大写,次字母小写是,你永远都找不到它的 getter/setter 方法的,对这个属性的使用是会害人的。对于 boolean
类型属性的 getter 方法是 isXxx() 还是 getXxx() 就自己决定了,isXxx() 应该更接近于自然语言,更顺溜些。
知道了属性及存取方法的规定,那么你即使是面对古老代码,在使用标签来引用或与 Hibernate/iBatis 等进行映射,你就知道该填什么样的属性名了。
还有一个我们很少碰触到的是关于可索引属性的 getter/setter 方法(这方面 C# 表现的比 Java 要优秀),比如有属性
private& OrderItem[] orderI&&&&& 那它相应的 getter/setter 除常见的两个外,还有带索引参数的两个版本,如下:
public OrderItem[] getOrderItem();
public void setOrderItem(OrderItem[] newArray);
public OrderItem[] getOrderItem(int index);
public void setOrderItem(int index, OrderItem orderItem);
关于 Bean 导航
最后就是 Bean 导航的规范,通常用点记法(dot notation) 来引用属性,同时也要注意索引属性的访问。在 Web MVC 的表单中,以及标签中, Jarkata-Commons-BeanUtils& 中用得很多。看点记法的示例:
anOrder.getAccount().getUsername()
anOrder.account.username
anOrder.getOrderItem().get(0).getProductId()
anOrder.orderItem[0].productId
anObject.getId()
anObject.id
anObject.getxCoordinate()
anObject.xCoordinate
上表应该从右往左边看,点记法中的属性名运行时要被解析成相应的存取方法调用。比如像 Struts1 标签:
&html:text&property="stocks[1].code"/&
会显示出 FormBean 中 stocks 列表的第二个元素的 code 属性,提交就填充到相应的位置上去。
tomjamescn 阅读(114) |
&&& 转自:http://blog.csdn.net/ccat/archive//4180765.aspx
&&& 几乎每一个新人在初学关系型数据库设计的时候,都会接触到关系范式。但是,我还是见到了大量很离谱的设计。客观的说,背下关系范式,离一个合格的数据库设
计师还差很远。设计工作总是在理想与现实之,规范与工艺之间妥协。建筑如是,造船如是,操作系统设计如是,数据库设计亦如是。
是的,你记得范式,你还记得反范式建议。你知道范式减少冗余,提高一致性;你还知道反范式可以方便编程。不幸的是,最终的结果总是遵守范式的做法使自己的应用层代码混乱,而反范式的企图使得数据库也陷入混乱。
这是谁的错?
不必太自责,设计工作是一个经验的积累过程。没有人天生就会做设计。天才与勤奋,是乘法关系。并不是你笨,只是天才对面的那个系数还不够大而已。
以下的一些经验,或许在你读完关系范式以后,可以抽空看一看 。世上没有魔法,读完这篇文章,并不会立即让你拥有多年设计经验。但是,这些在设计工作中积累的经验教训,应该可以帮助你少走一些弯路。
关系范式并不邪恶,也不要把它想得太神秘,如果书本上的定义不能让你很快理解,不妨试着回答以下的问题:
字段还可以再分吗?分成两个或更多的字段以后,还能不能表达完整的含义?
字段的值是不是有限的几个离散的状态?
两个或若干个字段,能不能提取出来建立为一个数据字典?
如果表中某个字段依赖其他表,被依赖的字段是不是唯一的(最好是主键)?
查询中是否会出现超过两个表的Join?
将数据库设计与系统设计结合起来
数据库设计并不是一个孤立的过程,整个软件生命期中,各方面的工作应该有机结合。这方面我觉得ACCP过去的教材讲得还不错,至少思路是对的:
在做需求分析的时候,做Use Case。
此时可以分析出应用层的功能接口,对于数据库的实体分类可以有一个大概的划定。例如,这个项目会需要一个工作流,这个项目会需要一个订单系统,或者一个文档库,等等。通常,每个子系统可以对应一个
在做概要设计的时候,出类关系和ER简图。
通常来说,此时不能确定所有的字段,但是会有哪些表,有哪些主外键依赖,有哪些地方应该需要存储过程和触发器的辅助,等等。
详细设计时尽可能将数据库结构完全固定。
尽管现代开发工具不断提升XP能力,重构越来越简单。数据库的重构仍然是一件牵一发而动全身的事情,毕竟数据库是信息存储的根本。大厦楼顶加个小花园容易,把地基下面的承重柱子拔出来换两根试试?
近年来ORM发展很快,几乎每个框架都要提供这个功能,以至于会有些菜鸟认为“ORM”会淘汰SQL语言。
这是一块试金石,如果你有这样的感觉,应该考虑认真评估一下自己在这个领域是不是太菜了。
SQL不是一种编程语言这么简单,SQL代表的是一种与应用开发语言完全不同的思想。面向集合,过程无关,着眼于规则定义。可以说,SQL是FP High Order计算的最成功应用,也可以说,SQL是一种静态强类型的MapReduce语言。
看,换上时髦的名词,会不会让你觉得它上等起来了?
在应用层语言惨烈竞争的同时,SQL语言压倒了同时代出现的其他关系型数据库操作语言,在这个拥有巨大利润的领域占据了绝对统治地位。即使桀骜不驯的
Postgres,也在1995年变身为PostgrSQL。这一过程,并非像VC淘汰BC那么多盘外招,而是长时间争议与选择的结果。
对于信息操作规则定义,SQL几乎是最好的表达方式。接近自然语言,高度可读,并且非常利于优化。
打个比方,一个基于过程语言的上帝,这样说:
* 构造一个光源对象
* 构造一个能源对象
* 调用光源对象方法,设置能源
* 调用光源对象的发光方法,传入照明范围内的对象列表
基于SQL的上帝说,要有光。
当然,在这位老兄背后,要有打杂的小弟去完成插电点灯的事情,但是作为上帝,什么活都自己做了,要天使干什么?
看看那些应用层语言的list comprehensions(列表推导式)。不止一次我想要为Python实现一个基于存储层的列表推导式实现,都可耻的失败了。
当然,我承认这跟跟人能力有关,我不是Gudio。
看看LINQ,不管如何吹嘘,它就是一个抽象出I/O的SQL。我见过一些人激烈的贬低SQL,抬高ORM,同时又对LINQ顶礼膜拜,这可真够分裂的。
ORM对应用层编程效率的提升是客观的,无需回避。但是随着你数据操作越来越精细和复杂,就越来越需要通过规则定义来抽象High Order I/O过程。当你转了一圈儿回来,会发现自己又在写SQL。
想想Hibernate的HQL,想想C#的LINQ。
计算机不会变魔术。想让它做事更聪明,就需要你这个驭者更加聪明才行。
好的工具和方法可以给你带来更高的能力系数,但是记住,一个乘法计算,仅有一头大是不够的。
不懂SQL的人,是不能驾驭好ORM的。
与ORM做朋友
ORM对于开发工作,无疑是有好处的。我的朋友沈葳说,人脑能组织和

我要回帖

更多关于 sd卡与手机不兼容 的文章

 

随机推荐