??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av丰满熟妇在线播放,99久久婷婷国产综合亚洲,亚洲综合小说另类图片动图 http://m.tkk7.com/zellux/category/21869.htmlq的大二:M 思?{待 zh-cn Mon, 14 Apr 2008 06:16:58 GMT Mon, 14 Apr 2008 06:16:58 GMT 60 C# From a Java Programmer's Perspective http://m.tkk7.com/zellux/archive/2008/04/14/192725.htmlZelluX ZelluX Mon, 14 Apr 2008 04:27:00 GMT http://m.tkk7.com/zellux/archive/2008/04/14/192725.html http://m.tkk7.com/zellux/comments/192725.html http://m.tkk7.com/zellux/archive/2008/04/14/192725.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/192725.html http://m.tkk7.com/zellux/services/trackbacks/192725.html http://www.25hoursaday.com/CsharpVsJava.html#wishlist
有点长,不过写得很不?img src ="http://m.tkk7.com/zellux/aggbug/192725.html" width = "1" height = "1" /> ]]> Singleton模式与双锁?DCL) http://m.tkk7.com/zellux/archive/2008/04/07/191365.htmlZelluX ZelluX Mon, 07 Apr 2008 13:58:00 GMT http://m.tkk7.com/zellux/archive/2008/04/07/191365.html http://m.tkk7.com/zellux/comments/191365.html http://m.tkk7.com/zellux/archive/2008/04/07/191365.html#Feedback 6 http://m.tkk7.com/zellux/comments/commentRss/191365.html http://m.tkk7.com/zellux/services/trackbacks/191365.html
转蝲h?作?ZelluX
http://m.tkk7.com/zellux
看OOP教材Ӟ提到了一个双锁?Double-Checked Lock, DCL)的问题,但是书上没有多介l,只是说这是一个和底层内存机制有关的漏z。查阅了下相兌料,对这个问题大致有了点了解?/p>
从头开始说吧?/p>
在多U程的情况下Singleton模式会遇C问题,一个简单的例子
1: class Singleton { 2: private static Singleton instance = null; 3: 4: public static Singleton instance() { 5: if (instance == null) { 6: instance = new Singleton(); 7: } 8: return instance; 9: } 10: }
假设q样一个场景,有两个线E调用Singleton.instance()Q首先线E一判断instance是否{于nullQ判断完后一瞬间虚拟机把U程二调度ؓq行U程Q线E二再次判断instance是否为nullQ然后创Z个Singleton实例Q线E二的时间片用完后,U程一被唤醒,接下来它执行的代码依然是instance = new Singleton(); 两次调用q回了不同的对象Q出现问题了?/p>
最单的Ҏ自然是在c被载入时就初始化这个对象:private static Singleton instance = new Singleton();
JLS(Java Language Specification)中规定了一个类只会被初始化一ơ,所以这样做肯定是没问题的?/p>
但是如果要实现gq初始化(Lazy initialization)Q比如这个实例初始化时的参数要在q行期才能确定,应该怎么做呢Q?/p>
依然有最单的ҎQ用synchronized关键字修饰初始化ҎQ?/p>
public synchronized static Singleton instance() { if (instance == null) { instance = new Singleton(); } return instance; }
q里有一个性能问题Q多个线E同时访问这个方法时Q会因ؓ同步而导致每ơ只有一个线E运行,影响E序性能。而事实上初始化完毕后只需要简单的q回instance的引用就行了?/p>
DCL是一个“看似”有效的解决ҎQ先把对应代码放上来吧:
1 : class Singleton { 2 : private static Singleton instance = null ; 3 : 4 : public static Singleton instance() { 5 : if (instance == null ) { 6 : synchronized (this) { 7 : if (instance == null) 8 : instance = new Singleton(); 9 : } 10 : } 11 : return instance; 12 : } 13 : }
用JavaWorld上对应文章的标题来评U做法就是smart, but broken。来看原因:
Java~译器ؓ了提高程序性能会进行指令调度,CPU在执行指令时同样Z性能会ؕ序执行(臛_现在用的大多数通用处理器都是out-of-order的)Q另外cache的存在也会改变数据回写内存时的顺序[2]。JMM(Java Memory Model, 见[1])指出所有的q些优化都是允许的,只要q行l果和严格按序执行所得的l果一样即可?/p>
Java假设每个U程都跑在自q处理器上Qn有自q内存Q和׃n的主存交互。注意即使在单核上这U模型也是有意义的,考虑到cache和寄存器会保存部分时变量。理Z每个U程修改自己的内存后Q必ȝx新对应的d内容。但是Java设计师们认ؓq种U束会媄响程序性能Q他们试着创造了一套让E序跑得更快、但又保证线E之间的交互与预期一致的内存模型?/p>
synchronized关键字便是其中一把利器。事实上Qsynchronized块的实现和Linux中的信号?semaphore)q是有区别的Q前者过E中锁的获得和释N会都会引发一ơMemory Barrier来强制线E本地内存和d之间的同步。通过q个机制QJava中的同步机制保证了synchronized块中指o的原子?atomic)?/p>
好了Q回q头来看DCL问题。看h讉K一个未同步的instance字段不会产生什么问题,我们再次来假设一个场景:
U程一q入同步块,执行instance = new Singleton(); U程二刚开始执行getResource();
按照序的话Q接下来应该执行的步骤是 1) 分配新的Singleton对象的内?2) 调用Singleton的构造器Q初始化成员字段 3) instance被赋为指向新的对象的引用?/p>
前面说过Q编译器或处理器都ؓ了提高性能都有可能q行指o的ؕ序执行,U程一的真正执行步骤可能是1) 分配内存 2) instance指向新对?3) 初始化新实例。如果线E二?完成?执行前被唤醒Q它看到了一个不为null的instanceQ蟩出方法体CQ带着一个还没初始化的Singleton对象?/p>
错误发生的一U情形就是这P关于更详l的~译器指令调度导致的问题Q可以参看这个网?[4]?/p>
[3] 中提供了一个编译器指o调度的证?/p>
instance = new Singleton(); q条命o在Symantec JIT中被~译?/p>
0206106A mov eax,0F97E78h 0206106F call 01F6B210 ; 分配I间 02061074 mov dword ptr [ebp],eax ; EBP中保存了instance的地址
02061077 mov ecx,dword ptr [eax] ; 解引用,获得新的指针地址
02061079 mov dword ptr [ecx],100h ; 接下来四行是inline后的构造器 0206107F mov dword ptr [ecx+4],200h 02061086 mov dword ptr [ecx+8],400h 0206108D mov dword ptr [ecx+0Ch],0F84030h
可以看到Q赋值完成在初始化之前,而这是JLS允许的?br /> 另一U情形是Q假讄E一安稳地完成Singleton对象的初始化Q退Z同步块,q同步了和本地内存和d。线E二来了Q看C个非I的引用Q拿走。注意线E二没有执行一个Read BarrierQ因为它Ҏ没q后面的同步块。所以很有可能此时它看到的数据是陈旧的?/p>
q有很多人根据已知的几种提出了一个又一个fix的方法,但最l还是出C更多的问题。可以参阅[3]中的介绍?/p>
[5]中还说明了即使把instance字段声明为volatileq是无法避免错误的原因?/p>
由此可见Q安全的Singleton的构造一般只有两U方法,一是在c蝲入时创实例Q二是用性能较差的synchronizedҎ?/p>
(by ZelluX http://m.tkk7.com/zellux )
参考资料:
[1] Java Language Specification, Second Edition, W?7章介l了Java中线E和内存交互关系的具体细节?br />[2] out-of-order与cache的介l可以参阅Computer System, A Programmer's Perspective的第四、五章?br />[3] The "Double-Checked Locking is Broken" Declaration, http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html [4] Synchronization and the Java Memory Model, http://gee.cs.oswego.edu/dl/cpj/jmm.html [5] Double-checked locking: Clever, but broken, http://www.javaworld.com/javaworld/jw-02-2001/jw-0209-double.html?page=1 [6] Holub on Patterns, Learning Design Patterns by Looking at Code
]]>C# 学习W记 (1) http://m.tkk7.com/zellux/archive/2008/04/02/190479.htmlZelluX ZelluX Wed, 02 Apr 2008 15:33:00 GMT http://m.tkk7.com/zellux/archive/2008/04/02/190479.html http://m.tkk7.com/zellux/comments/190479.html http://m.tkk7.com/zellux/archive/2008/04/02/190479.html#Feedback 16 http://m.tkk7.com/zellux/comments/commentRss/190479.html http://m.tkk7.com/zellux/services/trackbacks/190479.html 入门看的书是CLR via C#中文版,译质量不错Qv码到现在q没觉得有必要翻一d版(不过Z么中文书都喜Ƣ把“栈”叫成“堆栈”呢Q?br />前面几章_略看了下,从第四章cd基础开始重炚w诅R?br />l箋漫无目的的学习感兴趣的东西,学习之中l常会惊喜的发现Q自q问题的角度已l不同于之前了?br /> 1. cȝnew操作会递归调用该类的所有父cL造器Q直到System.ObjectQ后者的构造器只是单返回,用ILDasm查看MSCorLib.dll可以证实q一炏V?br />.method public hidebysig specialname rtspecialname instance void .ctor() cil managed { .custom instance void System.Runtime.ConstrainedExecution.ReliabilityContractAttribute::.ctor(valuetype System.Runtime.ConstrainedExecution.Consistency, valuetype System.Runtime.ConstrainedExecution.Cer) = ( 01 00 03 00 00 00 01 00 00 00 00 00 ) // Code size 1 (0x1) .maxstack 8 IL_0000: ret } // end of method Object::.ctor 2. is和as操作W,iscM于Java中的instanceofQas会先查类型,如果兼容q回该对象的引用Q反之返回null?br />Emplooee e = o as Employee; if (e != null ) { // blah } 利用as可以做到只检验一ơ对象类型,提高E序性能。这本书的很多地斚w提到了性能因素?br /> 3. Ҏ调用和x86上汇~语a调用机制很类伹{先是参数入栈,接着q回地址入栈Q返回的时候也差不多?font color="#ff0000">不知道x64{寄存器较多的架构上会不会用寄存器传参呢,呵呵?br /> 4. 作ؓҎ的prologue的一部分QCLR会自动将所有局部变量初始化为null??font color="#ff0000">感觉q个自动初始化没什么必?/font>Q在W五章可以看到?br />SomeVal v1; SomeVal v1 = new SomeVal(); q里的SomeVal都是值类型,CLR都会它们初始化?。区别在于C#认ؓ前者没有初始化Q直接用这个g报错Q而后者在不赋值的情况下用这个倹{?br />可能q是CLR和C#之间不统一D的冗余步骤吧?br /> 5. CLR开始在一个进E中q行Ӟ会给System.Typecd创徏一个实例,每个c都会包含指向System.Typecd的指针?br /> 6. CLR提供了执行溢出检查的计算指oQ例如add.ovf对应addQmul.ovf对应mul。C#中默认关闭溢出检查?br />可以使用checked关键字用溢出检查。一般情况下Q对预计可能发生溢出的代码放到checked块中Q对允许溢出的代?比如计算hash?攑ֈ一个unchecked块中Q其他情况,Debug时打开~译器的/checked+开养IRelease版本关闭?br /> 7. 所有的值类型都是从System.ValueTypel承的。后者重写了EqualsҎQ比较两个值对象是否完全相{?br /> 8. boxing和unboxing?br />boxingQ托堆中分配内存,复制值类型,然后q回对象地址?br />unboxingQ相当于一个通过指针取值的q程Q不q这个指针是已装部分中的实际值部分?br /> 9. FCL(Framework Class Library)中包含了支持值类型的泛型容器c,不需要对容器中的元素q行boxing/unboxing处理?br />不过q里有个问题了Q值类型的话是攑֜栈上的,生命周期于容器的,q个怎么处理呢? W?6章才详细解释泛型Q先把这个问题留着?=,= 10. 依然是性能问题。有时候编译器会反复对一个值类型boxingQ此时手动boxing会提高一些性能?br />Int32 v = 5 ; // 需三次boxing Console.WriteLine( " {0}, {1}, {2} " , v, v, v); // 只需一ơboxing Object o = v; Console.WriteLine( " {0}, {1}, {2} " , o, o, o); 接下来书上D了个很搞的例子说明boxing和unboxing的各U情况,其实也很Ҏ理解?img src ="http://m.tkk7.com/zellux/aggbug/190479.html" width = "1" height = "1" /> ]]> Java Puzzler - 数值处理中Ҏ犯的错误 http://m.tkk7.com/zellux/archive/2007/11/10/159622.htmlZelluX ZelluX Sat, 10 Nov 2007 13:32:00 GMT http://m.tkk7.com/zellux/archive/2007/11/10/159622.html http://m.tkk7.com/zellux/comments/159622.html http://m.tkk7.com/zellux/archive/2007/11/10/159622.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/159622.html http://m.tkk7.com/zellux/services/trackbacks/159622.html public static boolean isOdd( int x) {
return x % 2 == 1 ;
}
当x奇数Ӟx % 2的gؓ负数?br />
NoteQ把 x % 2 == 1 改ؓ x % 2 != 0
Pitfall 2Q长整数计算
long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
q个表达式先计算左边几个int的乘U,然后再把D{换ؓlongQ因此仍会溢?br />
NoteQ把24Ҏ24L
Pitfall 3Q看看这句话的结?br />
System.out.println(12345+5432l);
NoteQ?432后面的l很容易被看成1Q因此徏议用L表示长整形时都用大写?br />
Pitfall 4Q下面这句话又会是什么结?br />
System.out.println(Long.toHexString(0x100000000L + 0xcafebabe));
Java计算时先用sign-extension把后面一个数转成longQ然后再计算
NoteQ尽量避免合类型计?br />
Pitfall 5Q这句话呢?
System.out.println((int) (char) (byte) -1);
l果?5535
NoteQchar是无W号cdQ将char转ؓint时用zero-extension
Pitfall 6Q交换变量?br />
int x = 1984;
int y = 2001;
x ^= y ^= x ^= y;
最l结果是x == 0, y == 1984
NoteQJava中操作符是从左往双的 (JLS 15.7)
Ҏ y = (x ^ (y ^= x) ^ y; 可以,但是永远不要q么?nbsp;
Pitfall 7Q问h作符
char x = 'X';
int i = 0;
System.out.print(true ? x : 0);
System.out.print(false ? i : x);
输出l果为X88
NoteQ同h混合cd计算D的问题,在条件表辑ּ中用类型相同的W二和第三操作符?
Pitfall 8Q看似相同的表达式的不同l果
short x = 0;
int i = 123456;
1) x += i; // 隐含了类型{换,l果?7616
2) x = x + i; // ~译无法通过Q因为损׃_ֺ
]]>Java3D 入门W记 (1) http://m.tkk7.com/zellux/archive/2007/11/05/158362.htmlZelluX ZelluX Mon, 05 Nov 2007 13:43:00 GMT http://m.tkk7.com/zellux/archive/2007/11/05/158362.html http://m.tkk7.com/zellux/comments/158362.html http://m.tkk7.com/zellux/archive/2007/11/05/158362.html#Feedback 1 http://m.tkk7.com/zellux/comments/commentRss/158362.html http://m.tkk7.com/zellux/services/trackbacks/158362.html
看的资料是The Java3d TutorialQ版本有ҎQ凑合着看了?nbsp;
Java 3D 的虚拟环境是从场景图(scene graph)中徏立的Q场景图聚合(assemble)了各U定义几何、声韟뀁光、位|、方位等元素的类?nbsp;
一U常用的定义囄数据l构q?node)和弧(arc)l成。结炚w是Java 3Dcȝ实例Q而弧则代表了实例间两U不同的关系?
最常见的关pL父子(parent-child)关系。一个组l点(group node)可以包含L多的子结点,但只能有一个父l点?
另一U关pL引用(reference)Q引用通过一个场景图的结点关联了一个NodeComponentc,NodeComponentcd义了各种视图对象的几何和外观属性?
q种l构可以用树来描qͼ从根l点CQ一叶子l点的\成ؓ场景图\?scene graph path). 每条路径都完整地描述了它的叶子结点的状态?nbsp;
q就是一个简单的场景囄l构Q其中包括VisualUniverse Locale GroupNode Leaf {元?nbsp;
每个场景N有单一的VirtualUniverseQ后者包含一串Locale对象。一个程序可以包含多个VirtualUniverse对象Q但是没有一U简单的Ҏ实现它们怺之间的通信?nbsp;
写Java3DE序的通常步骤Q?
1. 创徏一个Canvas3D对象
2. 创徏一个VirtualUniverse对象
3. 创徏一个Locale对象Q将其与VirtualUniverse相关?
4. 构造视囑ֈ?view branch graph)Q分别创Z个View ViewPlatform PhysicalBody PhysicalEnvironment对象Q将后面三个及Canvas3D与View对象兌
5. 构造内容分?content branch graph)
6. ~译(compile)各个分支
7. 子?subgraph)插入Locale?nbsp;
使用SimpleUniverse可以化这些步?nbsp;
虚线框v来的部分是SimpleUniverse中提供的内容
通过它可以将步骤化ؓ
1. 创徏一个Canvas3D对象
2. 创徏一个引用了之前的Canvas3D对象的SimpleUniversec,q定制该c?
3. 构造一个内容分支,~译后插入SimpleUniverse的Locale
什么是~译(compile)Q通过~译BranchGroupQ可以将它及其祖先{换ؓ一U更高效的实现方式。徏议在最后一步中做编译?
]]> Java 的类库真是方便啊 http://m.tkk7.com/zellux/archive/2007/10/17/153415.htmlZelluX ZelluX Tue, 16 Oct 2007 16:44:00 GMT http://m.tkk7.com/zellux/archive/2007/10/17/153415.html http://m.tkk7.com/zellux/comments/153415.html http://m.tkk7.com/zellux/archive/2007/10/17/153415.html#Feedback 3 http://m.tkk7.com/zellux/comments/commentRss/153415.html http://m.tkk7.com/zellux/services/trackbacks/153415.html
February 2007
---------------------------
Sun Mon Tue Wed Thu Fri Sat
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28
?font face="宋体">GregorianCalendarcd分钟做好了
Java的确很方便,主要是很多库都集成在jdk中,查一份手册就可以使用
如果q个用C++写,除非L个开源的库,否则估计得自己计算了,印象中日期方面的竞赛题都属于隑ֺ不大Q但是很Ҏ出错的题目?br />
话虽如此Q还是想学好C++ -,-|||
]]> Java泛型中的? super T语法 http://m.tkk7.com/zellux/archive/2007/08/15/136940.htmlZelluX ZelluX Wed, 15 Aug 2007 07:51:00 GMT http://m.tkk7.com/zellux/archive/2007/08/15/136940.html http://m.tkk7.com/zellux/comments/136940.html http://m.tkk7.com/zellux/archive/2007/08/15/136940.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/136940.html http://m.tkk7.com/zellux/services/trackbacks/136940.html ? super T 语法泛型类限制为所有T的超c(包括T自nQ,但只能用于参CQ不可以在返回值用加以限定?br>如果不加以限定,假设某个函数头ؓ ? super Manager get() ׃~译器不知道该方法究竟会q回什么类Q这样就只能用ObjectcL接收了?br>
该语法常用的一个情冉|泛型cȝ比较 java.util.TreeSet<E> 代表一个有序的元素为E的树Q它其中的一个构造器需要一个ComparatorcL比较两个元素Q以E为StringcLZQ此时的Comparator可以是Comparator<String>Q也可以是Comparator<Object>Q但Comparator<Integer>׃行,如何表示q样的限制呢Q?br>jdk源代码中是这LQ?br>public TreeSet(Comparator<? super E> c) q样׃证了传给构造器的Comparator是可以进行E元素的比较的?br>
另一个例子,java.util.Collections的maxҎ用于获得一个容器中的最大|q个函数头可以这样写Q?br>public static <T extends Comparable<T>> T max(Collection<T> coll)
q样限定T和自己比较的c,q于严格Qjdk源码是这LQ?
public static < T extends Object & Comparable <? super T >> T max(Collection <? extends T > coll) { Iterator <? extends T > i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0 ) candidate = next; } return candidate; }
很严谨的函数_但是限定斚w比较?/p>
]]> Project3 成功转移到Ubuntu http://m.tkk7.com/zellux/archive/2007/06/12/123550.htmlZelluX ZelluX Tue, 12 Jun 2007 03:17:00 GMT http://m.tkk7.com/zellux/archive/2007/06/12/123550.html http://m.tkk7.com/zellux/comments/123550.html http://m.tkk7.com/zellux/archive/2007/06/12/123550.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/123550.html http://m.tkk7.com/zellux/services/trackbacks/123550.html 1. 把WinXP下的所有项目文件复制到Ubuntu?br>2. 通过EMS导出数据库的sql文gQ在Ubuntu下导?br>3. 在Ubuntu下用MyEclipse加入该项目,重新讄引用的包的\径(包括数据库的配置Q?br>4. 把所有包含中文的java源程序设|编码方式ؓGBK 5. 注意linux下的mysql是对大小写敏感的Q因此原来windows下配|正的Hibernate文g可能在linux下需要修?br>6. 部vQenjoy
]]>Project - 假期学生订票pȝ http://m.tkk7.com/zellux/archive/2007/06/11/123459.htmlZelluX ZelluX Mon, 11 Jun 2007 12:45:00 GMT http://m.tkk7.com/zellux/archive/2007/06/11/123459.html http://m.tkk7.com/zellux/comments/123459.html http://m.tkk7.com/zellux/archive/2007/06/11/123459.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/123459.html http://m.tkk7.com/zellux/services/trackbacks/123459.html 1. 映射了一对多关系后需要做查询时碰到问题,M发现了个好东西Criterion Query?br>
Criteria criteria = session.createCriteria(Booking. class ); criteria.add(Expression.ne( " foregift " , Foregift.getInstance( 1 ))); return criteria.list();
q样得C已付押金的订单列?img src ="http://m.tkk7.com/zellux/aggbug/123459.html" width = "1" height = "1" /> ]]>[zz]Log4j日志理pȝ单说?/title> http://m.tkk7.com/zellux/archive/2007/05/20/118732.htmlZelluX ZelluX Sun, 20 May 2007 11:24:00 GMT http://m.tkk7.com/zellux/archive/2007/05/20/118732.html http://m.tkk7.com/zellux/comments/118732.html http://m.tkk7.com/zellux/archive/2007/05/20/118732.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/118732.html http://m.tkk7.com/zellux/services/trackbacks/118732.html 1?Loggers
Loggerslg在此pȝ中被分ؓ五个U别QDEBUG、INFO、WARN、ERROR和FATAL。这五个U别是有序的,DEBUG < INFO < WARN < ERROR < FATALQ明白这一点很重要Q这里Log4j有一个规则:假设LoggersU别为PQ如果在Loggers中发生了一个别Q比P高,则可以启动,否则屏蔽掉?/p>
JavaE序举例来说Q?/strong>
//建立Logger的一个实例,命名?#8220;com.foo”
Logger logger = Logger.getLogger("com.foo");
//讄logger的别。通常不在E序中设|logger的别。一般在配置文g中设|?/p>
logger.setLevel(Level.INFO);
Logger barlogger = Logger.getLogger("com.foo.Bar");
//下面q个h可用Q因为WARN >= INFO
logger.warn("Low fuel level.");
//下面q个h不可用,因ؓDEBUG < INFO
logger.debug("Starting search for nearest gas station.");
//命名?#8220;com.foo.bar”的实例barlogger会承实?#8220;com.foo”的别。因此,下面q个h可用Q因为INFO >= INFO
barlogger.info("Located nearest gas station.");
//下面q个h不可用,因ؓDEBUG < INFO
barlogger.debug("Exiting gas station search");
q里“是否可用”的意思是能否输出Logger信息?/strong>
在对Logger实例q行命名Ӟ没有限制Q可以取L自己感兴的名字。一般情况下以类的所在位|来命名Logger实例Q这是目前来讲比较有效的Logger命名方式。这样可以得每个类建立自己的日志信息,便于理。比如:
static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());
2?Appenders
用与用日志请求只是Log4j其中的一个小的地方QLog4j日志pȝ允许把日志输出到不同的地方,如控制台QConsoleQ、文ӞFilesQ、根据天数或者文件大生新的文件、以的形式发送到其它地方{等?/p>
其语法表CZؓQ?/p>
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?br>org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQorg.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br>org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
配置时用方式ؓQ?/p>
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
q样׃ؓ日志的输出提供了相当大的便利?/p>
3?Layouts
有时用户希望Ҏ自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四U日志输出样式,如根据HTML样式、自由指定样式、包含日志别与信息的样式和包含日志旉、线E、类别等信息的样式等{?/p>
其语法表CZؓQ?/p>
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q, org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q, org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q, org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
配置时用方式ؓQ?/p>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN 以上是从原理斚w说明Log4j的用方法,在具体Java~程使用Log4j可以参照以下CZQ?br>1?建立Logger实例Q?br> 语法表示Qpublic static Logger getLogger( String name) 实际使用Qstatic Logger logger = Logger.getLogger (ServerWithLog4j.class.getName ()) ;2?d配置文gQ?/strong> 获得了Logger的实例之后,接下来将配置Log4j使用环境Q?br> 语法表示Q?br> BasicConfigurator.configure()Q自动快速地使用~省Log4j环境?br> PropertyConfigurator.configure(String configFilename)Q读取用Java的特性文件编写的配置文g?br> DOMConfigurator.configure(String filename)Q读取XML形式的配|文件?br> 实际使用QPropertyConfigurator.configure("ServerWithLog4j.properties");3?插入日志信息 完成了以上连个步骤以后,下面可以按日志的不同别插入到你要记录日志的Q何地方了?br> 语法表示Q?br> Logger.debug(Object message); Logger.info(Object message); Logger.warn(Object message); Logger.error(Object message); 实际使用Qlogger.info("ServerSocket before accept: " + server); 在实际编E时Q要使Log4j真正在系l中q行事先q要寚w|文件进行定义。定义步骤就是对Logger、Appender及Layout的分别用,具体如下Q?br>1?配置根Logger Q其语法为: log4j.rootLogger = [ level ] , appenderName, appenderName, … q里level指Logger的优先QappenderName是日志信息的输出圎ͼ可以同时指定多个输出地。如Qlog4j.rootLogger= INFO,A1,A22?配置日志信息输出目的?/strong>Q其语法为: log4j.appender.appenderName = fully.qualified.name.of.appender.class 可以指定上面所qC个目的地中的一个?br>3?配置日志信息的格?/strong>Q其语法为: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class q里上面三个步骤是对前面Log4jlg说明的一个简化;下面l出一个具体配|例子,在程序中可以参照执行Q?br> log4j.rootLogger=INFO,A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern= %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n q里需要说明的是日志信息格式中几个符h代表的含义: QX? X信息输出时左寚wQ?br> %p: 日志信息U别 %d{}: 日志信息产生旉 %c: 日志信息所在地Q类名) %m: 产生的日志具体信?br> %n: 输出日志信息换行 Ҏ上面的日志格式,某一个程序的输出l果如下Q?/strong> 0 INFO 2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014] 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003' 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.' 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT' 16 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT
]]> Web Project 3 q解决Ҏ结 http://m.tkk7.com/zellux/archive/2007/05/15/117689.htmlZelluX ZelluX Tue, 15 May 2007 11:38:00 GMT http://m.tkk7.com/zellux/archive/2007/05/15/117689.html http://m.tkk7.com/zellux/comments/117689.html http://m.tkk7.com/zellux/archive/2007/05/15/117689.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/117689.html http://m.tkk7.com/zellux/services/trackbacks/117689.html 使用EMS SQL Manager for MySQL可以Ҏ地解册个问题,在table的属性对话框中将Character Set设ؓGBK卛_?br> 2. Ajax应用中Servletq回内容q 讄响应报头的编码即?br>response.setHeader("Content-Type", "text/html;charset=GB2312"); 3. JSP面昄q 在页面开头加?br><%@ page pageEncoding="GBK"%> 4. request.getParameter产生q 用postҎ只要在获取参数前讄~码卛_ request.setCharacterEncoding("GBK"); getҎq需要在获取参数后{换编?br>name = new String(name.getBytes("ISO8859-1"), "GBK"); 5. google到的另一个解x法,不过貌似不成?-,-
package filter; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.FilterChain; import java.io.IOException; public class EncodingFilter implements Filter { protected FilterConfig filterConfig; protected String encodingName; protected boolean enable; public EncodingFilter() { this .encodingName = " UTF-8 " ; this .enable = false ; } public void init(FilterConfig filterConfig) throws ServletException { this .filterConfig = filterConfig; loadConfigParams(); } private void loadConfigParams() { this .encodingName = this .filterConfig.getInitParameter( " encoding " ); String strIgnoreFlag = this .filterConfig.getInitParameter( " enable " ); if (strIgnoreFlag.equalsIgnoreCase( " true " )) { this .enable = true ; } else { this .enable = false ; } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if ( this .enable) { request.setCharacterEncoding( this .encodingName); } chain.doFilter(request, response); } public void destroy() { } }
web.xml
< filter > < filter-name > EncodingFilter </ filter-name > < filter-class > filter.EncodingFilter </ filter-class > < init-param > < param-name > encoding </ param-name > < param-value > UTF-8 </ param-value > </ init-param > < init-param > < param-name > enable </ param-name > < param-value > true </ param-value > </ init-param > </ filter > < filter-mapping > < filter-name > EncodingFilter </ filter-name > < url-pattern > /user/* </ url-pattern > </ filter-mapping > < filter-mapping > < filter-name > EncodingFilter </ filter-name > < url-pattern > /manager/* </ url-pattern > </ filter-mapping > ]]> Web Project 3 W记 (4) http://m.tkk7.com/zellux/archive/2007/05/15/117683.htmlZelluX ZelluX Tue, 15 May 2007 11:11:00 GMT http://m.tkk7.com/zellux/archive/2007/05/15/117683.html http://m.tkk7.com/zellux/comments/117683.html http://m.tkk7.com/zellux/archive/2007/05/15/117683.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/117683.html http://m.tkk7.com/zellux/services/trackbacks/117683.html 1. Filter 挺好用的。访问session时要把参数向下{型ؓHttpServletRequest
beans.User user = (beans.User) ((HttpServletRequest)arg0).getSession().getAttribute("user"); 2. 基本完成了,有空的话Q准备增加一点功?br>a) q问题解决 b) 新增书目时上传图片功?br>c) 删除图书、分cd?br>d) 购物车计、提交更改后使用AjaxQ做Ch界面?br> ]]> 关于Filter的基本知?/title> http://m.tkk7.com/zellux/archive/2007/05/13/117125.htmlZelluX ZelluX Sun, 13 May 2007 09:12:00 GMT http://m.tkk7.com/zellux/archive/2007/05/13/117125.html http://m.tkk7.com/zellux/comments/117125.html http://m.tkk7.com/zellux/archive/2007/05/13/117125.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/117125.html http://m.tkk7.com/zellux/services/trackbacks/117125.html 1. Filter ?br>q方面的内容以前看的几本书里都找不到Q想CSun J2EE的TutorialQ果焉面有比较详细的解释?br>Filter是一个传输请求或者响应的报头和内容的对象Q通常的作用是Q?br>a) Ҏ不同情况处理h?br>b) Lh-响应的过q传送?Block the request-and-response pair from passing any further.) c) 通过自定义新的请求版本,修改h报头和数据?br>d) 通过自定义新的响应版本,修改响应报头和数据?br>e) 和外部资源交互?/p>
2. Filter ~程 filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定义?br>其中最重要的方法是doFilter。它可以用来Q?br>a) 查请求报头?br>b) 自定义请求对象?br>c) 自定义响应对象?br>d) 调用qo?filter chain)中的下一个实?entity)。如果当前过滤器已经是链中最后一个过滤器了,下一个实体就是链资源Q否则它是在WAR中设|的下一个过滤器。当然也可以在此旉过不调用下一个实体来中断h?br>e) 在响应报头调用下一个过滤器后检查?br>f) 抛出反应处理错误的异常?/p>
3. 一?Duke's Bookstore 的例?br>HitCounterFilter在servlet被访问时计数?br>public final class HitCounterFilter implements Filter { private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } public void destroy() { this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterConfig == null) return; StringWriter sw = new StringWriter(); PrintWriter writer = new PrintWriter(sw); Counter counter = (Counter)filterConfig. getServletContext(). getAttribute("hitCounter"); writer.println(); writer.println("==============="); writer.println("The number of hits is: " + counter.incCounter()); writer.println("==============="); // Log the resulting string writer.flush(); System.out.println(sw.getBuffer().toString()); ... chain.doFilter(request, wrapper); ... } }
4. 讄qo器映?br>部v描述W文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系l注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL?br>1.filter元素 filter元素位于部v描述W文Ӟweb.xmlQ的前部Q所有filter-mapping、servlet或servlet-mapping元素之前。filter元素h如下六个可能的子元素Q?br>icon q是一个可选的元素Q它声明IDE能够使用的一个图象文件?br>filter-name q是一个必需的元素,它给qo器分配一个选定的名字?br>display-name q是一个可选的元素Q它l出IDE使用的短名称?br>description q也是一个可选的元素Q它l出IDE的信息,提供文本文?br>filter-class q是一个必需的元素,它指定过滤器实现cȝ完全限定名?br>init-param q是一个可选的元素Q它定义可利用FilterConfig的getInitParameterҎd的初始化参数。单个过滤器元素可包含多个init-param元素?/p>
filter-mapping元素 filter-mapping元素位于web.xml文g中filter元素之后serlvet元素之前。它包含如下三个可能的子元素Q: l filter-name q个必需的元素必M用filter元素声明时给予过滤器的名U相匚w?br>l url-pattern 此元素声明一个以斜杠Q?Q开始的模式Q它指定qo器应用的URL。所有filter-mapping元素中必L供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素V如果希望过滤器适用于多个模式,可重复整个filter-mapping元素?br>l servlet-name 此元素给Z个名Uͼ此名U必M利用servlet元素l予servlet或JSP面的名U相匚w。不能给单个filter-mapping元素提供多个servlet-name元素V如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素?/p>
]]> Web Project 3 W记 (1) http://m.tkk7.com/zellux/archive/2007/05/11/116866.htmlZelluX ZelluX Fri, 11 May 2007 14:32:00 GMT http://m.tkk7.com/zellux/archive/2007/05/11/116866.html http://m.tkk7.com/zellux/comments/116866.html http://m.tkk7.com/zellux/archive/2007/05/11/116866.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/116866.html http://m.tkk7.com/zellux/services/trackbacks/116866.html 感觉比去q那个简单点。不地斚w化了Q比如图书分c,使用了enumcdQ而不像去q的需要多表查询才能获得分cR?br>使用了Struts + HibernateQ准备先把基本功能做出来Q然后再加上Ajax?br>1. html:select 的列表框选择 在csdn上看到的两种ҎQ?br>1) <html:select property="personnelId"> <html:option value="">请选择</html:option> <html:options collection="personList" property="personId" labelProperty="personName"/> </html:select> html:options自动帮你q代personList中的内容Q前提是personList是Collectioncd的,而且装的是一个包含personIdQpersonName属性的对象 property昄的是valueQlabelProperty昄的是面看到的内?/p>
2) <html:select> <html:option value="">请选择***</html:option> <logic:notEmpty> <logic:iterate> <option value='11'>11</option> </logic:iterate> </logic:notEmpty> </html:select> 2. jsp面中用h限判断的问题 BBS上问了下Q一般是采用Filtercȝ。具体方法明天再看吧?img src ="http://m.tkk7.com/zellux/aggbug/116866.html" width = "1" height = "1" /> ]]> JDK1.5 源码阅读W记 (2) http://m.tkk7.com/zellux/archive/2007/05/04/115294.htmlZelluX ZelluX Fri, 04 May 2007 05:11:00 GMT http://m.tkk7.com/zellux/archive/2007/05/04/115294.html http://m.tkk7.com/zellux/comments/115294.html http://m.tkk7.com/zellux/archive/2007/05/04/115294.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/115294.html http://m.tkk7.com/zellux/services/trackbacks/115294.html java.util.AbstractCollection 感谢BBS上的outerheaven解答了add(E o)Ҏ的问题。在把addҎ写成抛出异常不是Z防止子类向上转型旉误地调用AbstractCollection的这个方法,而是Z让不支持addҎ的子cȝ承,比如EnumSetc,它的元素是在创徏时就军_的,不支持addҎ?br>java.util.AbstractList 1) 包含?br>private class Itr implements Iterator<E> private class ListItr extends Itr implements ListIterator<E> 而ListIterator又是l承Iterator接口的?br>分成两个cd是不是ؓ了代码清晰呢? 2) 使用了modCount变量查ƈ发操作时Ҏ发生的问题?br>Iterator中有一个expectedModCount变量Q每ơ通过Iterator操作Ӟ都会调用checkForComodification()ҎQ检查expectedModCount是否和AbstractList的modCount相等Q如果不同则抛出ConcurrentModificationException? 3) subListҎ和SubListcd视图view有关Q是不是Observer模式的应用呢Q)Q先不看?br> 4) equalsҎ中最后那个判断语句有Ҏ颖(或者我土了Q?br>
public boolean equals(Object o) { if (o == this ) return true ; if ( ! (o instanceof List)) return false ; ListIterator < E > e1 = listIterator(); ListIterator e2 = ((List) o).listIterator(); while (e1.hasNext() && e2.hasNext()) { E o1 = e1.next(); Object o2 = e2.next(); if ( ! (o1 == null ? o2 == null : o1.equals(o2))) return false ; } return ! (e1.hasNext() || e2.hasNext()); } }
5) hashCode的生成: hashCode(e1, e2, ..., en) = Sigma(hashCode(ei) * 32^i) 没有考虑溢出之类的情况,因ؓ只是个hashCode?br> ]]> JDK1.5 源码阅读W记 (1) http://m.tkk7.com/zellux/archive/2007/05/03/115082.htmlZelluX ZelluX Wed, 02 May 2007 17:33:00 GMT http://m.tkk7.com/zellux/archive/2007/05/03/115082.html http://m.tkk7.com/zellux/comments/115082.html http://m.tkk7.com/zellux/archive/2007/05/03/115082.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/115082.html http://m.tkk7.com/zellux/services/trackbacks/115082.html a) add(E o)Ҏ只有一?br>throw new UnsupportedOperationException(); ׃不同的容器有不同的加入元素的ҎQ这么做应该是ؓ了方式它的子c调用父cȝq个Ҏ?br>既然如此Qؓ什么不把方法声明ؓabstract呢? b) 容器cȝtoString()Ҏ是从AbstractionCollection里承的?
]]> 05 Web Project3 (2) http://m.tkk7.com/zellux/archive/2007/05/02/115015.htmlZelluX ZelluX Wed, 02 May 2007 05:35:00 GMT http://m.tkk7.com/zellux/archive/2007/05/02/115015.html http://m.tkk7.com/zellux/comments/115015.html http://m.tkk7.com/zellux/archive/2007/05/02/115015.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/115015.html http://m.tkk7.com/zellux/services/trackbacks/115015.html
1 input { } { 2 width: expression(this.type!="submit"?'150px':'') ; 3 height: 23px ; 4 }
2. 循环<c:forEach var="i" begin="1" end="${pages}"> 3. 分支
1 < c:choose > 2 < c:when test ="${boolean1}" > </ c:when > 3 < c:when test ="${boolean2}" > </ c:when > 4 < c:otherwise > </ c:otherwise > 5 </ c:choose >
4. DisplayTag 标签?br>q东东真不错Q支持奇偶数行css分离、自动换늭功能?br>a) <display:table name="test" /> q样一行代码就能自动列出test内的所有属性了?br>b) 如果要只列出指定的列Q可以?/p>
< display:table name ="test" > < display:column property ="id" title ="ID" /> < display:column property ="name" /> < display:column property ="email" /> < display:column property ="status" /> < display:column property ="description" title ="Comments" /> </ display:table >
c) 指定某一列的样式Q?lt;display:column property="id" title="ID" class="idcol"/> d) 创徏单的动态链?br><display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" /> q样只能产生details?action=xx的链?/p>
d) 自定义动态链?br>写一个类Q承org.displaytag.decorator.TableDecorator
package util; import org.displaytag.decorator.TableDecorator; public class Decorator extends TableDecorator { public String getEditLink() { beans.Policy p = (beans.Policy)getCurrentRowObject(); int pId = p.getId(); return " <a href=\ " servlet / editItem ? id = " + pId + " \ " >@</a> " ; } }
然后在jsp中声明这个Decorator <display:table name="policies" id="PolicyList" decorator="util.Decorator"> 增加相应的列 <display:column title="Edit" property="editLink"/> e) 生成的html代码中奇偶数行的cd别ؓ.odd?evenQ在CSS中就能区分它们了?br>f) 分页 display:table 中加个属性pagesize="10"卛_Q不q觉得这部分q是在数据库中解x较高效?br>g) 排序 列中的对象要实现Comparable接口Q没有的话可以用Decorator display:table 中的属?br>defaultsort="1" 默认以第一列ؓ主键排序 defaultorder="descending" 递减 也可以在display:column中增加属性sortable="true" headerClass="sortable" 官方l出的sample中的那个sortable列表头很漂亮Q有两个按钮选择排序方式?img src ="http://m.tkk7.com/zellux/aggbug/115015.html" width = "1" height = "1" /> ]]> 05 Web Project3 (1) http://m.tkk7.com/zellux/archive/2007/05/02/114989.htmlZelluX ZelluX Tue, 01 May 2007 17:05:00 GMT http://m.tkk7.com/zellux/archive/2007/05/02/114989.html http://m.tkk7.com/zellux/comments/114989.html http://m.tkk7.com/zellux/archive/2007/05/02/114989.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/114989.html http://m.tkk7.com/zellux/services/trackbacks/114989.html 开始做05Web应用评Project3?br>主要Z实践下EL/JSTLQ以及用servlet + jsp + javabean的mvc架构QSQL嘛上学期学过QCore Java II里介l得也比较详l,所以直接用Hibernate持久层解决问题了?br> 1. jsp里form action指向的\径居然打成了"servet/loginServet"Q然后tomcat报错。查了好一会儿web.xml也没发现什么问题,然后很郁L发现居然是jsp里\径写错了 2. djsp递交到servlet时如何隐藏用户名密码呢?
3. admind后要昄Policy列表。我Z个beans.Policiesc,然后在控制器servlet?br>List policies = beans.Policies.getPolicies(); //q没实现分页功能 然后再setAttribute递交l显C页面?br>觉得不应该这么做Q尽的是mvc分离了,但很占资源,而且貌似PoliciescL处理一ơ请求都要访问一ơ数据库Q不知道有没有更好的Ҏ。JavaBeanQ?br> 4. Policy列表行颜色深相间的效果。在饮水思源上看到过cM的问题,貌似正规的做法是自定义标{。。?img src ="http://m.tkk7.com/zellux/aggbug/114989.html" width = "1" height = "1" /> ]]> Struts 学习W记(3) - 文g上传的实?/title> http://m.tkk7.com/zellux/archive/2007/05/01/114960.htmlZelluX ZelluX Tue, 01 May 2007 13:04:00 GMT http://m.tkk7.com/zellux/archive/2007/05/01/114960.html http://m.tkk7.com/zellux/comments/114960.html http://m.tkk7.com/zellux/archive/2007/05/01/114960.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/114960.html http://m.tkk7.com/zellux/services/trackbacks/114960.html
1 < html:form action ="/upload" enctype ="multipart/form-data" > 2 theFile : 3 < html:file property ="theFile" /> 4 < html:errors property ="theFile" />< br /> 5 < html:submit /> 6 </ html:form >
|上看到的例子是在ActioncM处理的,不知道这么做合不合理Q这个是单的处理代码Q没有验证文件大和同名文g是否存在Q注意先要在相应目录中徏立file目录?br>
1 UploadForm uploadForm = (UploadForm) form; // TODO Auto-generated method stub 2 FormFile file = uploadForm.getTheFile(); 3 try { 4 InputStream stream = file.getInputStream(); 5 String filePath = getServlet().getServletContext().getRealPath( " / " ); 6 OutputStream fileout = new FileOutputStream(filePath + " /file/ " + file.getFileName()); 7 int bytesRead = 0 ; 8 byte [] buffer = new byte [ 8192 ]; 9 while ((bytesRead = stream.read(buffer, 0 , 8192 )) != - 1 ) { 10 fileout.write(buffer, 0 , bytesRead); 11 }12 fileout.close();13 stream.close();14 } catch (Exception e) { 15 System.err.println(e);16 }
一点积累: 1. ActioncM码中要获得当前地址可以使用 getServlet().getServletContext().getRealPath(String) 2. Forward的目标地址前面貌似都要?/"?Path success.jsp does not start with a "/" character ]]> Struts 学习W记(2) - 入门 http://m.tkk7.com/zellux/archive/2007/05/01/114945.htmlZelluX ZelluX Tue, 01 May 2007 11:12:00 GMT http://m.tkk7.com/zellux/archive/2007/05/01/114945.html http://m.tkk7.com/zellux/comments/114945.html http://m.tkk7.com/zellux/archive/2007/05/01/114945.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/114945.html http://m.tkk7.com/zellux/services/trackbacks/114945.html 1. 控制器以h中的值来填写ActionForm实例之前Q会先调用reset()Ҏ。将ActionForm的值重新设|回原来的状态很重要Q因单bean实例可能会由多个h׃n或者好几个不同的线E所存取。不q,如果是让好几共享一个ActionForm实例Q可能不会想d现reset()ҎQ这栯个实例的性质׃会被重新讄?br> 2. Struts 1.1 多了一个新的ActionFormcdQ名为org.apache.struts.action.DynaActionForm。它可以配置l动作映,q自动处理从HTML表单传递给q个Action对象的数据。原因在于它在内部用了一个Map对象存储数据?br> 3. JSP 主要的问题是Q?br> a) 开发h员可以自q应用逻辑内嵌到JSP面中,l果使得E序难以l护QJSP2.0中可以配|JSP面Q其不能用scriptletQ?br> b) JSP面有变动时Q容器必重新编译JSP面?br>一U常见的替代Ҏ是结合XML和XSLT?br> 4. Struts 1.1 可以为应用程序定义多个MessageResource?/p>
5. war文g实际上就是zip文g?br> 6. Struts 配置 呃,q一块怎么q么熟呢Q貌似孙卫琴的那本精通struts从这里抄了一堆东ѝ。。?img src ="http://m.tkk7.com/zellux/aggbug/114945.html" width = "1" height = "1" /> ]]> Struts 学习W记(1) - 入门 http://m.tkk7.com/zellux/archive/2007/04/29/114649.htmlZelluX ZelluX Sun, 29 Apr 2007 14:15:00 GMT http://m.tkk7.com/zellux/archive/2007/04/29/114649.html http://m.tkk7.com/zellux/comments/114649.html http://m.tkk7.com/zellux/archive/2007/04/29/114649.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/114649.html http://m.tkk7.com/zellux/services/trackbacks/114649.html 1. Struts框架?.1版以前,ActionServlet 的工作只有接收请求,以及调用适当的处理器来进行处理。到?.1版,引入了一个名为org.apache.struts.action.RequestProcessor的新c,由它来ؓ控制器处理请求。把h的处理责MActionServlet分离出来的主要原因,是要让你能保有灵zL,从而可以承RequestProcessorc,~写自己的子c,q修改请求的处理方式?br> 2. Struts框架只会为每个ActioncdZ个实例,因此要确保你的Actionc能在多U程的环境下正常工作?/p>
3. Struts1.1的新功能之一是能够声明异常处理,而不需要在E序中用try/catch块捕捉。可以在Struts配置文g中指定这些信息:
1 < global-exceptions > 2 < exception 3 key ="global.error.invalidlogin" 4 path="/login.jsp" 5 scope="request" 6 type="mypack.InvalidLoginException" /> 7 </ global-exceptions >
q个配置在InvalidLoginException被抛出时Q{向login.jspQƈ使用资源包的global.error.invalidlogin来构Z个错误消息?br> 4. 模型lg的一些基本概念: Business object 业务对象 Presentation object 表示对象 Data transfer object(DTO) 数据传输对象Q有时称为值对象Value object ]]> Tomcat 5.5 ?Apache 2.2 整合 http://m.tkk7.com/zellux/archive/2007/04/27/114135.htmlZelluX ZelluX Fri, 27 Apr 2007 08:54:00 GMT http://m.tkk7.com/zellux/archive/2007/04/27/114135.html http://m.tkk7.com/zellux/comments/114135.html http://m.tkk7.com/zellux/archive/2007/04/27/114135.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/114135.html http://m.tkk7.com/zellux/services/trackbacks/114135.html zz?br> (1) 打开conf\httpd.conf文g以下字D前的注?”#”)去除 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so (2) 在conf\httpd.conf文g的末添加以下内? ProxyRequests Off ProxyPass /admin balancer://tomcatcluster/admin lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3 ProxyPassReverse /admin balancer://tomcatcluster/admin <Proxy balancer://tomcatcluster> BalancerMember ajp://localhost:8009 route=tomcat8080 BalancerMember ajp://localhost:10009 smax=10 route=tomcat10080 BalancerMember ajp://localhost:11009 route=tomcat11080 BalancerMember ajp://localhost:12009 smax=10 route=tomcat12080 </Proxy> (3) 扑ֈ以下内容 # Virtual hosts # Include conf/extra/httpd-vhosts.conf 第二行前面?#8221;#”去除. (4) 打开conf/extra/httpd-vhosts.conf文g,在文件末添加以下内? <VirtualHost *:80> ServerAdmin 127.0.0.1 DocumentRoot "D:\Program Files\Apache oftware Foundation\Tomcat 5.5\webapps" ServerName 127.0.0.1 ErrorLog logs/127.0.0.1_error_log CustomLog logs/dummy-127.0.0.1-access_log common ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ ServerName localhost ServerAlias 127.0.0.1 </VirtualHost> ]]> 实践了下Hibernate多对一映射 http://m.tkk7.com/zellux/archive/2007/04/27/114126.htmlZelluX ZelluX Fri, 27 Apr 2007 08:27:00 GMT http://m.tkk7.com/zellux/archive/2007/04/27/114126.html http://m.tkk7.com/zellux/comments/114126.html http://m.tkk7.com/zellux/archive/2007/04/27/114126.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/114126.html http://m.tkk7.com/zellux/services/trackbacks/114126.html Ҏ书上的做法基本没什么问题,只是最新版本的Hibernate已经没有Session.findҎ了。老的Sessioncdl被攑ֈ了org.hibernate.classic包中?br>API中徏议?br>session.createQuery代替
例: List<Policy> policies = session.createQuery("from Policy as p").list(); 另外q没扑ֈ使用MyEclipse Reverse Engineering向导自动配置多对一的方法?img src ="http://m.tkk7.com/zellux/aggbug/114126.html" width = "1" height = "1" /> ]]> Struts 基本配置 http://m.tkk7.com/zellux/archive/2007/04/25/113614.htmlZelluX ZelluX Wed, 25 Apr 2007 12:40:00 GMT http://m.tkk7.com/zellux/archive/2007/04/25/113614.html http://m.tkk7.com/zellux/comments/113614.html http://m.tkk7.com/zellux/archive/2007/04/25/113614.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/113614.html http://m.tkk7.com/zellux/services/trackbacks/113614.html 声明ActionServlet <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.action.ActionServlet</servlet-class> </servlet> 把所有的.do映射到ActionServlet?br><servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ActionServlet初始化参?br><servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param>
</servlet> Ƣ迎文g清单 <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> 在struts配置文g中增?br><global-forwards> <forward name="welcome" path="HelloWorld.do" /> </global-forwards> 然后增加welcome.jspQ用标{?br><logic:forward name="welcome" /> 转向Ƣ迎面 配置Struts标签?br>略了 2. org.apache.struts.config ?br>JavaResearch.org 暂时q不去,所以看不到具体的struts.config包的源码 主要包含了ModuleConfig接口Q和ModuleConfigImplc,以及l承它们?br>ControllerConfig, ActionConfig, ActionMapping, ActionForward, ForwardConfig...{类 注意其中的某些一对多关系 在Struts启动室,会把配置信息d内存中,q存攑֜config包中相关的JavaBeancȝ实例中?br>今天先看到这Q复习物理去了,? ]]> [转蝲]Jakarta Commons FileUpload 用户指南 http://m.tkk7.com/zellux/archive/2007/04/23/113023.htmlZelluX ZelluX Mon, 23 Apr 2007 11:56:00 GMT http://m.tkk7.com/zellux/archive/2007/04/23/113023.html http://m.tkk7.com/zellux/comments/113023.html http://m.tkk7.com/zellux/archive/2007/04/23/113023.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/113023.html http://m.tkk7.com/zellux/services/trackbacks/113023.html Jakarta Commons FileUpload 用户指南
本文是分享文档站长胡萝卜的作品。大家可以自由阅诅R在|络上进行分发,前提是必M留本文档的完整性?br>分n文档是一家专业的Java技术网站,l中国Java E序员提供各UJava资源如文,工具Q教E,C交流{?br>我们的官方网站是Q?a >http://chinesedocument.com 我们的官方论坛是Q?a >http://bbs.chinesedocument.com 请大家多多关注分享文,我们q会发布更多优秀的文!
W??使用FileUpload FileUpload能以多种方式使用Q这取决于你的应用需求。D个简单的例子Q你可能调用一个单独的Ҏ来解析servelt的请求,q且处理那些目?从另一个方面来Ԍ你可能想自定义FileUpload来完全控制个别项目的存贮Q例如,你想化那些内容Qƈ存到数据库里厅R?br>q里我们会介l用FileUpload的基原则Qƈ描述一些简单的通用的用模式。我们会在在其它地方介绍关于FileUpload的自定义?br>FileUpload依赖于一些公用的IOQ因此,要确保在你l之前,你的classpath里已l有依赖面里提L那些版本?/p>
W??FileUpload如何工作Q?br>一个上传请求由一pdҎRFC1867Q?Form-based File Upload in HTML".Q编码的目列表l成。FileUpload可以解析q样的请求,qؓ你的应用提供那些已上传的目的列表。每一个这L目都实CFielItem接口Q我们不用管它们的底层实现?br>q个面描述了commons fileupload库的常用API。这些常用API是非常方便的途径。然而,Z最好的性能Q你可能更喜Ƣ最快的Streaming API ?br>每一个文仉目有一些自q属性,q些属性也许正是你的应用程序感兴趣的地斏V例如,每个目有个一个名字和内容cdQƈ且可以提供一个输入流来访问它们的数据。另一斚w来看Q你可能需要用不同方式来处理不同的目Q这׃赖于那些目是否是一个正常的表单字域Q也是_q些数据来自于一个普通的文本框或cMHTML的字域,q是一个要上传文g字段。FileItem接口提供一些方法来做这样一个决定,q且用最合适的Ҏ讉Kq些数据?br>FileUpload使用FileItemFactory创徏一个新的文仉目。这会lFileUpload最好的灉|性。工厂最l控制每个项目如何被创徏。默认的工厂在内存或者硬盘里存储目的数据,q依赖于目的大(例如Q有多少字节的数据。)。不q,Z适用于你的应用,你还是可以自定义q种行ؓ的?/p>
W??servlets and portlets 从V1.1版开始,FileUpload开始支持servlet和portlet的文件上传请求。这两种环境的用法基本上差不多,因此Q文档的剩下部分都将是在servlet环境里?br>如果你正在构Z个portet应用Q那么下面两个差别是你在L档时应注意的Q?br>你在哪里引用了ServletFileUploadc,qPortletFileUploadcL替代它?br>你在哪里引用了HttpServletRequestc,qActionRequestcL代它?/p>
W??解析h 在你同那些上传的目一起工作前Q你需要先解析h本n。以保q个h实是一个文件上传请求。FileUpload是通过调用一个静态方法来实现的?br>// Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); 现在Q我们已l准备好解析h里的目了?/p>
4.1 最单的例子 下面是一些简单的使用场景Q?br> 上传目只要_,应该保留在内存里?br> 较大的项目应该被写在盘的时文件上?br> 非常大的上传h应该避免?br> 限制目在内存中所占的I间Q限制最大的上传hQƈ且设定时文件的位置?br>处理q个场景的请求很单: // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request List /* FileItem */ items = upload.parseRequest(request); q就是我们所需要的全部代码了! 解析的结果就是一个项目的List,每个目都实CFileItem接口。我们将在下面讨论如何处理这些项目?br>4.2 训练如何控制 如果你的使用场景和上面那个简单的例子很接q,但是你又需要一点点控制Q那么你可以很容易地定义upload处理器或者文仉目工厂的行ؓ。下面这个例子显CZ几个配置选项?br>// Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(yourMaxMemorySize); factory.setRepository(yourTempDirectory); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(yourMaxRequestSize); // Parse the request List /* FileItem */ items = upload.parseRequest(request); 当然Q每个配|方法是独立于其它Q意一个的。但是如果你想一ơ性配|他们,你可以用parseRequest()的另一个重载方法,像这P // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory( yourMaxMemorySize, yourTempDirectory); 如果你还想用更多的控制Q比如存储项目到其它地方Q如Q数据库Q,那么你可以看FileUpload自定义介l?/p>
W??处理上传的项?br>一旦解析完成,那么你会得到一个待处理的文仉目列表。很多的情况下,你会想用不同的方式来处理文g上传域和正常的表单域Q因此,你可以这样做Q?br>// Process the uploaded items Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { processFormField(item); } else { processUploadedFile(item); } } 对于普通的表单域来_你可能对目的名U和字符型?很感兴趣。就像你希望的那P照下面的做: // Process a regular form field if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString(); ... } 对于上传文gQ这里就有很多不同啦~你可能想知道更多其它的内宏V下面是个例子,里面包含了不你感兴的Ҏ?br>// Process a file upload if (!item.isFormField()) { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); ... } 对于上传的文Ӟ你肯定不希望L通过内存来访问它Q除非它很小Q或者你实在没有别的选择余地了。你很希望用流来处理文件内Ҏ者将文g保存到它的最l位|。FileUpload提供单的方式来完成两斚w的需求?br>// Process a file upload if (writeToFile) { File uploadedFile = new File(...); item.write(uploadedFile); } else { InputStream uploadedStream = item.getInputStream(); ... uploadedStream.close(); } 注意Q在FileUpload的默认实Cwirte()Ҏ应该值得xQ如果数据还在时文仉没有U除Q那么这个方法就会试N命名q个文g为相应的目标文g。事实上如果重命名失败了的话Q数据就仅仅被拷贝?br>如果你需要访问内存中的上传数据,你可以用get()Ҏ来获得数据的二进制数lŞ式?br>// Process a file upload in memory byte[] data = item.get(); ...
W??清除资源 q一节只适用于你使用了DiskFileItem。换句话_它只适用于你在处理上传文件之前将上传文g写入q时文件这U情形?br>像这U时文件会被自动删除, 如果它们不再被用(更确切地_java.io.File的实例已l被GC掉了?Q这是由org.apache.commons.io.FileCleanercd后台完成的,它会启动一个收割机U程?br>q个收割机线E在它不再被需要时会被停止。在servlet环境里,q是通过指定一个名叫FileCleanerCleanup的servlet上下文监听器来实现的。要做到q里Q在你的web.xml增加下面的代码: <web-app> ... <listener> <listener-class> org.apache.commons.fileupload.servlet.FileCleanerCleanup </listener-class> </listener> ... </web-app> 不幸的是Q事情到q里q没完。如果你和下面的情况一P那么你就只需要按照上面的做,可以清除资源了?br>你用的是commons-io 1.3或者更晚的版本?br>你是从web应用的web-inf/lib里蝲入commons-io的,q不是从其它位置Q如Tomcat的common/lib下?br>如果commons-io 1.3是从你的WEB容器的classpath里蝲入的Q那么,下面的情况可能会出现Q?br>你运行两个应用,一个叫AQ一个叫B。(q两个应用可能是完全一P只不q上下文名称不一栗)q两个应用都使用了FileCleanerCleanup。现在,如果你终止应用AQBq在q行Q这ӞA会终止B的收割机U程。换a之,你要十分仔细地考虑是用FileCleanerCleanupQ还是不使用?/p>
W??观察上传q度 如果你希望可以上传很大的文gQ这Ӟ你可能想上传的状态告诉用P如已l接收了多少?br>观察上传q度需要通过一个处理监听器来实现?br>//Create a progress listener ProgressListener progressListener = new ProgressListener(){ public void update(long pBytesRead, long pContentLength, int pItems) { System.out.println("We are currently reading item " + pItems); if (pContentLength == -1) { System.out.println("So far, " + pBytesRead + " bytes have been read."); } else { System.out.println("So far, " + pBytesRead + " of " + pContentLength + " bytes have been read."); } } }; upload.setProgressListener(progressListener); 上面q个监听器是有问题的。因为它非常频繁地被调用。这会带来性能问题。一个比较好的解军_法是Q减调用。例如,如果megabytes被改变,那么发Z个消息?br>//Create a progress listener ProgressListener progressListener = new ProgressListener(){ private long megaBytes = -1; public void update(long pBytesRead, long pContentLength, int pItems) { long mBytes = pBytesRead / 1000000; if (megaBytes == mBytes) { return; } megaBytes = mBytes; System.out.println("We are currently reading item " + pItems); if (pContentLength == -1) { System.out.println("So far, " + pBytesRead + " bytes have been read."); } else { System.out.println("So far, " + pBytesRead + " of " + pContentLength + " bytes have been read."); } } };
]]> Hibernate 映射一对多关系 http://m.tkk7.com/zellux/archive/2007/04/23/112981.htmlZelluX ZelluX Mon, 23 Apr 2007 08:52:00 GMT http://m.tkk7.com/zellux/archive/2007/04/23/112981.html http://m.tkk7.com/zellux/comments/112981.html http://m.tkk7.com/zellux/archive/2007/04/23/112981.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/112981.html http://m.tkk7.com/zellux/services/trackbacks/112981.html 例如OrderQ一Q映CustomerQ多Q,在OrdercM增加 private Customer customer; 以及相关的getter setter 在Order.hbm.xml中增?br><many-to-one name="customer" column="CUSTOMER_ID" class="beans.Customer" cascade="sava-update" //极联保存和更?br> not-null="true" /> 2. 双向一对多Q多对多Q?br>在CustomercM增加 private Set orders = new HashSet(); 及setter getter 注意q里的初始化可以防止在orders为空时的异常 然后在Customer.hbm.xml中增?br><set name="orders" cascade="sava-update"> //cacade="delete" 极联删除 <key column="CUSTOMER_ID" /> <one-to-many class="beans.Order" /> </set> 3. 自n映射 其实是把上面两个结合了一下,但要注意变量命名Q如 parentCategory, childCategory ]]> Java notes - 关于ArrayList.asList()Ҏ http://m.tkk7.com/zellux/archive/2007/04/22/112784.htmlZelluX ZelluX Sun, 22 Apr 2007 12:26:00 GMT http://m.tkk7.com/zellux/archive/2007/04/22/112784.html http://m.tkk7.com/zellux/comments/112784.html http://m.tkk7.com/zellux/archive/2007/04/22/112784.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/112784.html http://m.tkk7.com/zellux/services/trackbacks/112784.html 2007-04-20 11:48:48
在水木上看到的问?/div>
int[] intArray = new int[]{1, 2, 3, 4}; List>Integer< list = new ArrayList>Integer<(); list.add(1); list.add(2); list.add(3); list.add(4); List listFromArray = Arrays.asList(intArray); System.out.println(listFromArray); System.out.println(list);
输出l果?/div>
[[I@c17164] [1, 2, 3, 4]
也就是说Arrays.asList()q没有返回一个{1,2,3,4}的List
原因在于QJDK5中asList接受变长参数表了Q把intArray作ؓ单独的参C递给asListҎ的时候,~译器会把它当作一个Object处理Q于是返回了只有一个元素的ListQ而这个元素应该就是指向int[]的引用?/div>
解决Ҏ之一是把intArray声明为Integer[]Q即
Integer[] intArray = new Integer[]{new Integer(1), new Integer(2), new Integer(3), new Integer(4)}; List>Integer< listFromArray2 = Arrays.asList(intArray2); System.out.println(listFromArray2);
q样p看到预期l果?/div>
]]>
Hibernate ȝ配置好了 http://m.tkk7.com/zellux/archive/2007/04/22/112785.htmlZelluX ZelluX Sun, 22 Apr 2007 12:26:00 GMT http://m.tkk7.com/zellux/archive/2007/04/22/112785.html http://m.tkk7.com/zellux/comments/112785.html http://m.tkk7.com/zellux/archive/2007/04/22/112785.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/112785.html http://m.tkk7.com/zellux/services/trackbacks/112785.html 2007-04-20 12:20:26
试着写了个简单的E序Q往数据库添加一条记录而已。没惛_Hibernate׃直配不好Q忙了一晚上 -,- 最后发现是MyEclipse自动写好hibernate.cfg.xml后,生成了HibernateSessionFactoryc,创徏session的时候只? HibernateSessionFactory.getSession() p了不需? Configuration config = new Configuration(); ... 后面那个Ҏ是针对hibernate.properties的,哎,太土了?img src ="http://m.tkk7.com/zellux/aggbug/112785.html" width = "1" height = "1" /> ]]>Lab 6 - W一ơ用struts http://m.tkk7.com/zellux/archive/2007/04/22/112786.htmlZelluX ZelluX Sun, 22 Apr 2007 12:26:00 GMT http://m.tkk7.com/zellux/archive/2007/04/22/112786.html http://m.tkk7.com/zellux/comments/112786.html http://m.tkk7.com/zellux/archive/2007/04/22/112786.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/112786.html http://m.tkk7.com/zellux/services/trackbacks/112786.html 2007-04-20 20:49:48
lab内容比较单,一个注册页面,一个登录界面,一个Userscȝ于时存储已l注册用戗想想用jsp/servlet做也没什么进步,直接用struts好了?/div>
下次lab会不会是数据库入门呢Qhibernate解决?/div>
再次感叹MyEclipse的方ѝ?/div>
q几天hibernate struts都有了一定的了解Q关键是配置斚w有一定的l验了,可以深入学习Q另外junit log4j貌似也要看一下的Q然后还有物理考试、核心课讨论、英语考试Q五一节后又要交一堆论文,D念。。?/div>
一些积累:
1. ActionError(String, String)的构造器中第二个参数是uriQ定位到
ApplicationResources.properties问题Q?/font>而不是错误提C?/div>
另外.properties文g的字W库如何ҎGBKq是个问题?/div>
2. Action中return mapping.findForward("blahblah")前还是要把内容存储在request或者其他域中的Qformbeanq不会自动伴随mapping.findForward提交到相关页面?/div>
]]>
关于Java的范型机?/title> http://m.tkk7.com/zellux/archive/2007/04/22/112788.htmlZelluX ZelluX Sun, 22 Apr 2007 12:26:00 GMT http://m.tkk7.com/zellux/archive/2007/04/22/112788.html http://m.tkk7.com/zellux/comments/112788.html http://m.tkk7.com/zellux/archive/2007/04/22/112788.html#Feedback 0 http://m.tkk7.com/zellux/comments/commentRss/112788.html http://m.tkk7.com/zellux/services/trackbacks/112788.html 2007-04-21 11:12:29
1. 前几天在水木上看到有人问
class Demo>E<{ public Class getDynamicClass(){ Class clazz=//----------------------如何获取E的类Q?br>return clazz; } }
貌似只能q样解决
class Demo>E<{ E e; public void addElement(E e){ this.e = e; } public Class getDynamicClass(){ Class clazz = e.getClass(); return clazz; } }
一些相兌?/div>
Java的范型就是半个残?/font>
nodQJava的范型除了防止类型{换错误以外我真想不v来有什么实质的用途?br>其是那个文中说的Q编译的时候拿掉,q行的时候再?..
实没什么用Qjg老糊涂了偏要听信c++那个bs老头才有q个败笔Q我一直这么认?/font>
q个东西Ƨnq前没有搞出来 q是有点用的Q在ORM中定义多对一或者多对多关系的时? List>C< numbers; q时候偶q道numbers兌的是Cc,不需要在其它地方再配|了Q?/font>
为啥没用 否则对容器的使用q得停留在指针时?/font>
C#的泛型性能q是很好的,只是Java的实现机刉啥了炏V。?br>
最后有人回
很多事情Q不要着急下l论。以下代码算转蝲Q不原创?br> -------------华丽的分割线--------------------------------- protected Class getDomainClass() { if (domainClass == null) { ParameterizedType thisType = (ParameterizedType) getClass().getGenericSuperclass(); domainClass = (Class) thisType.getActualTypeArguments()[0]; } return domainClass; } -------------华丽的分割线---------------------------------
q没试过可不可以
2. 另外一个类似的帖子的回?/font>
System.out.println(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
试验了半?br>public class BaseClass>M<{ public void showType(){ ParameterizedType ptype = (ParameterizedType) getClass() .getGenericSuperclass(); System.out.println(ptype.getActualTypeArguments()[0]); } } public class ExClass>M< extends BaseClass>M<{} new ExClass>Date<().showType(); //得到 "M" 而不是想要的 "Date" :'(
我以前也惌么搞Q可是没搞成Q后来看Java关于泛型的实玎ͼ认ؓ没希望?br>前面所说的方式只有?br>public class SomeClass extends BaseClass>AnotherClass< {...} q样定义的时候才能取到AnotherClass ...
3. 看到另一个帖子说q行期没有范?/font>
]]>
վ֩ģ壺
ɫˬŮС˵ѿ |
һëƬѲ |
avһۿ |
һĻ |
Av뾫Ʒ |
߹ۿ |
Ʒۿ91 |
ƷAò |
aƬ߹ۿר |
AVվþþƷ
|
3344ѲŹۿƵ |
1000ֹ߽ѹۿƵ |
5 |
97һƷ |
Ƶ |
Ʒ |
Ʒվ |
þֻоƷ10 |
91Ʒվ |
ŮƵ77777 |
߹ۿվ
|
AVרӰ߹ۿ |
ɫվ |
ަ߹ۿɫ |
Ƶ2ѹۿ |
һëƬ |
պAAƬѹۿ |
߹ۿƵ
|
Ƶۿڵ |
ҹɫһ |
һƷ |
õһۺϾƷ |
߾ƷƵ |
߹ۿƷ |
˾Ʒձ11 |
72paoƵ |
Ƶ |
ɫһ߹ۿ |
˿1ҳ |
þþžžþƷֱ |
ŷߴSUV |