??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av丰满熟妇在线播放,99久久婷婷国产综合亚洲,亚洲综合小说另类图片动图http://m.tkk7.com/zellux/category/21869.htmlq的大二:M 思?{待zh-cnMon, 14 Apr 2008 06:16:58 GMTMon, 14 Apr 2008 06:16:58 GMT60C# From a Java Programmer's Perspectivehttp://m.tkk7.com/zellux/archive/2008/04/14/192725.htmlZelluXZelluXMon, 14 Apr 2008 04:27:00 GMThttp://m.tkk7.com/zellux/archive/2008/04/14/192725.htmlhttp://m.tkk7.com/zellux/comments/192725.htmlhttp://m.tkk7.com/zellux/archive/2008/04/14/192725.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/192725.htmlhttp://m.tkk7.com/zellux/services/trackbacks/192725.htmlhttp://www.25hoursaday.com/CsharpVsJava.html#wishlist

有点长,不过写得很不?img src ="http://m.tkk7.com/zellux/aggbug/192725.html" width = "1" height = "1" />

ZelluX 2008-04-14 12:27 发表评论
]]>
Singleton模式与双锁?DCL)http://m.tkk7.com/zellux/archive/2008/04/07/191365.htmlZelluXZelluXMon, 07 Apr 2008 13:58:00 GMThttp://m.tkk7.com/zellux/archive/2008/04/07/191365.htmlhttp://m.tkk7.com/zellux/comments/191365.htmlhttp://m.tkk7.com/zellux/archive/2008/04/07/191365.html#Feedback6http://m.tkk7.com/zellux/comments/commentRss/191365.htmlhttp://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

 



ZelluX 2008-04-07 21:58 发表评论
]]>
C# 学习W记 (1)http://m.tkk7.com/zellux/archive/2008/04/02/190479.htmlZelluXZelluXWed, 02 Apr 2008 15:33:00 GMThttp://m.tkk7.com/zellux/archive/2008/04/02/190479.htmlhttp://m.tkk7.com/zellux/comments/190479.htmlhttp://m.tkk7.com/zellux/archive/2008/04/02/190479.html#Feedback16http://m.tkk7.com/zellux/comments/commentRss/190479.htmlhttp://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 />

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" />

ZelluX 2008-04-02 23:33 发表评论
]]>
Java Puzzler - 数值处理中Ҏ犯的错误http://m.tkk7.com/zellux/archive/2007/11/10/159622.htmlZelluXZelluXSat, 10 Nov 2007 13:32:00 GMThttp://m.tkk7.com/zellux/archive/2007/11/10/159622.htmlhttp://m.tkk7.com/zellux/comments/159622.htmlhttp://m.tkk7.com/zellux/archive/2007/11/10/159622.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/159622.htmlhttp://m.tkk7.com/zellux/services/trackbacks/159622.htmlpublic 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因为损׃_ֺ 
 

ZelluX 2007-11-10 21:32 发表评论
]]>
Java3D 入门W记 (1) http://m.tkk7.com/zellux/archive/2007/11/05/158362.htmlZelluXZelluXMon, 05 Nov 2007 13:43:00 GMThttp://m.tkk7.com/zellux/archive/2007/11/05/158362.htmlhttp://m.tkk7.com/zellux/comments/158362.htmlhttp://m.tkk7.com/zellux/archive/2007/11/05/158362.html#Feedback1http://m.tkk7.com/zellux/comments/commentRss/158362.htmlhttp://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更高效的实现方式。徏议在最后一步中做编译?

ZelluX 2007-11-05 21:43 发表评论
]]>
Java 的类库真是方便啊http://m.tkk7.com/zellux/archive/2007/10/17/153415.htmlZelluXZelluXTue, 16 Oct 2007 16:44:00 GMThttp://m.tkk7.com/zellux/archive/2007/10/17/153415.htmlhttp://m.tkk7.com/zellux/comments/153415.htmlhttp://m.tkk7.com/zellux/archive/2007/10/17/153415.html#Feedback3http://m.tkk7.com/zellux/comments/commentRss/153415.htmlhttp://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++  -,-|||


ZelluX 2007-10-17 00:44 发表评论
]]>
Java泛型中的? super T语法http://m.tkk7.com/zellux/archive/2007/08/15/136940.htmlZelluXZelluXWed, 15 Aug 2007 07:51:00 GMThttp://m.tkk7.com/zellux/archive/2007/08/15/136940.htmlhttp://m.tkk7.com/zellux/comments/136940.htmlhttp://m.tkk7.com/zellux/archive/2007/08/15/136940.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/136940.htmlhttp://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 <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>

ZelluX 2007-08-15 15:51 发表评论
]]>
Project3 成功转移到Ubuntuhttp://m.tkk7.com/zellux/archive/2007/06/12/123550.htmlZelluXZelluXTue, 12 Jun 2007 03:17:00 GMThttp://m.tkk7.com/zellux/archive/2007/06/12/123550.htmlhttp://m.tkk7.com/zellux/comments/123550.htmlhttp://m.tkk7.com/zellux/archive/2007/06/12/123550.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/123550.htmlhttp://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


ZelluX 2007-06-12 11:17 发表评论
]]>
Project - 假期学生订票pȝhttp://m.tkk7.com/zellux/archive/2007/06/11/123459.htmlZelluXZelluXMon, 11 Jun 2007 12:45:00 GMThttp://m.tkk7.com/zellux/archive/2007/06/11/123459.htmlhttp://m.tkk7.com/zellux/comments/123459.htmlhttp://m.tkk7.com/zellux/archive/2007/06/11/123459.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/123459.htmlhttp://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" />

ZelluX 2007-06-11 20:45 发表评论
]]>
[zz]Log4j日志理pȝ单说?/title><link>http://m.tkk7.com/zellux/archive/2007/05/20/118732.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 20 May 2007 11:24:00 GMT</pubDate><guid>http://m.tkk7.com/zellux/archive/2007/05/20/118732.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/118732.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/05/20/118732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/118732.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/118732.html</trackback:ping><description><![CDATA[  Log4j有三个主要的lgQLoggersQAppenders和LayoutsQ这里可单理解ؓ日志cdQ日志要输出的地方和日志以何UŞ式输出。综合用这三个lg可以L的记录信息的cd和别,q可以在q行时控制日志输出的样式和位|。下面对三个lg分别q行说明Q? <p style="MARGIN-RIGHT: 0px" align=left><strong>1?Loggers</strong></p> <p style="MARGIN-RIGHT: 0px" align=left><strong>    </strong>Loggerslg在此pȝ中被分ؓ五个U别QDEBUG、INFO、WARN、ERROR和FATAL。这五个U别是有序的,DEBUG < INFO < WARN < ERROR < FATALQ明白这一点很重要Q这里Log4j有一个规则:假设LoggersU别为PQ如果在Loggers中发生了一个别Q比P高,则可以启动,否则屏蔽掉?/p> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <p style="MARGIN-RIGHT: 0px" align=left><strong>JavaE序举例来说Q?/strong></p> <p style="MARGIN-RIGHT: 0px" align=left>//建立Logger的一个实例,命名?#8220;com.foo”</p> <p style="MARGIN-RIGHT: 0px" align=left>Logger  logger = Logger.getLogger("com.foo");</p> <p style="MARGIN-RIGHT: 0px" align=left>//讄logger的别。通常不在E序中设|logger的别。一般在配置文g中设|?/p> <p style="MARGIN-RIGHT: 0px" align=left>logger.setLevel(Level.INFO);</p> <p style="MARGIN-RIGHT: 0px" align=left>Logger barlogger = Logger.getLogger("com.foo.Bar");</p> <p style="MARGIN-RIGHT: 0px" align=left>//下面q个h可用Q因为WARN >= INFO</p> <p style="MARGIN-RIGHT: 0px" align=left>logger.warn("Low fuel level.");</p> <p style="MARGIN-RIGHT: 0px" align=left>//下面q个h不可用,因ؓDEBUG < INFO</p> <p style="MARGIN-RIGHT: 0px" align=left>logger.debug("Starting search for nearest gas station.");</p> <p style="MARGIN-RIGHT: 0px" align=left>//命名?#8220;com.foo.bar”的实例barlogger会承实?#8220;com.foo”的别。因此,下面q个h可用Q因为INFO >= INFO</p> <p style="MARGIN-RIGHT: 0px" align=left>barlogger.info("Located nearest gas station.");</p> <p style="MARGIN-RIGHT: 0px" align=left>//下面q个h不可用,因ؓDEBUG < INFO</p> <p style="MARGIN-RIGHT: 0px" align=left>barlogger.debug("Exiting gas station search"); </p> <p style="MARGIN-RIGHT: 0px" align=left><strong>q里“是否可用”的意思是能否输出Logger信息?/strong> </p> </blockquote> <p style="MARGIN-RIGHT: 0px" align=left>    在对Logger实例q行命名Ӟ没有限制Q可以取L自己感兴的名字。一般情况下以类的所在位|来命名Logger实例Q这是目前来讲比较有效的Logger命名方式。这样可以得每个类建立自己的日志信息,便于理。比如:</p> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <p style="MARGIN-RIGHT: 0px" align=left>static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());</p> </blockquote> <p style="MARGIN-RIGHT: 0px" align=left><strong>2?Appenders</strong></p> <p dir=ltr style="MARGIN-RIGHT: 0px" align=left>    用与用日志请求只是Log4j其中的一个小的地方QLog4j日志pȝ允许把日志输出到不同的地方,如控制台QConsoleQ、文ӞFilesQ、根据天数或者文件大生新的文件、以的形式发送到其它地方{等?/p> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <p style="MARGIN-RIGHT: 0px" align=left>其语法表CZؓQ?/p> <p style="MARGIN-RIGHT: 0px" align=left>org.apache.log4j.ConsoleAppenderQ控制台Q,</p> <p style="MARGIN-RIGHT: 0px" align=left><br>org.apache.log4j.FileAppenderQ文ӞQ?br>org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQorg.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br>org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)</p> <p style="MARGIN-RIGHT: 0px" align=left>配置时用方式ؓQ?/p> <p style="MARGIN-RIGHT: 0px" align=left>log4j.appender.appenderName = fully.qualified.name.of.appender.class</p> <p style="MARGIN-RIGHT: 0px" align=left>log4j.appender.appenderName.option1 = value1</p> <p style="MARGIN-RIGHT: 0px" align=left>…</p> <p style="MARGIN-RIGHT: 0px" align=left>log4j.appender.appenderName.option = valueN</p> <p style="MARGIN-RIGHT: 0px" align=left>q样׃ؓ日志的输出提供了相当大的便利?/p> </blockquote> <p style="MARGIN-RIGHT: 0px" align=left><strong>3?Layouts</strong></p> <p style="MARGIN-RIGHT: 0px" align=left>    有时用户希望Ҏ自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四U日志输出样式,如根据HTML样式、自由指定样式、包含日志别与信息的样式和包含日志旉、线E、类别等信息的样式等{?/p> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <p dir=ltr style="MARGIN-RIGHT: 0px" align=left>其语法表CZؓQ?/p> <p dir=ltr style="MARGIN-RIGHT: 0px" align=left>org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,<br>org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,<br>org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,<br>org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)</p> <p dir=ltr style="MARGIN-RIGHT: 0px" align=left>配置时用方式ؓQ?/p> </blockquote> <p dir=ltr style="MARGIN-RIGHT: 0px" align=left>     log4j.appender.appenderName.layout =       fully.qualified.name.of.layout.class<br>     log4j.appender.appenderName.layout.option1 = value1<br>     …<br>     log4j.appender.appenderName.layout.option = valueN<br> <br>    以上是从原理斚w说明Log4j的用方法,在具体Java~程使用Log4j可以参照以下CZQ?br><strong>1?建立Logger实例Q?br></strong>    语法表示Qpublic static Logger getLogger( String name)<br>    实际使用Qstatic Logger logger = Logger.getLogger   (ServerWithLog4j.class.getName ()) ;<br><strong>2?d配置文gQ?/strong><br>    获得了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");<br><strong>3?插入日志信息</strong><br>    完成了以上连个步骤以后,下面可以按日志的不同别插入到你要记录日志的Q何地方了?br>    语法表示Q?br>    Logger.debug(Object message);<br>    Logger.info(Object message);<br>    Logger.warn(Object message);<br>    Logger.error(Object message);<br>    实际使用Qlogger.info("ServerSocket before accept: " + server);<br> <br>    在实际编E时Q要使Log4j真正在系l中q行事先q要寚w|文件进行定义。定义步骤就是对Logger、Appender及Layout的分别用,具体如下Q?br><strong>1?配置根Logger</strong>Q其语法为:<br>    log4j.rootLogger = [ level ] , appenderName, appenderName, …<br>q里level指Logger的优先QappenderName是日志信息的输出圎ͼ可以同时指定多个输出地。如Qlog4j.rootLogger= INFO,A1,A2<br><strong>2?配置日志信息输出目的?/strong>Q其语法为:<br>    log4j.appender.appenderName = fully.qualified.name.of.appender.class<br>    可以指定上面所qC个目的地中的一个?br><strong>3?配置日志信息的格?/strong>Q其语法为:<br>    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br>    q里上面三个步骤是对前面Log4jlg说明的一个简化;下面l出一个具体配|例子,在程序中可以参照执行Q?br>    log4j.rootLogger=INFO,A1<br>    log4j.appender.A1=org.apache.log4j.ConsoleAppender<br>    log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br>    log4j.appender.A1.layout.ConversionPattern=<br>                                        %-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br>    q里需要说明的是日志信息格式中几个符h代表的含义:<br>    QX? X信息输出时左寚wQ?br>    %p: 日志信息U别<br>    %d{}: 日志信息产生旉<br>    %c: 日志信息所在地Q类名)<br>    %m: 产生的日志具体信?br>    %n: 输出日志信息换行<br> <br><strong>Ҏ上面的日志格式,某一个程序的输出l果如下Q?/strong><br>0    INFO  2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]<br>16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'<br>16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD<br>16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'<br>16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP<br>16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'<br>16   DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT</p> <img src ="http://m.tkk7.com/zellux/aggbug/118732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-05-20 19:24 <a href="http://m.tkk7.com/zellux/archive/2007/05/20/118732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Project 3 q解决Ҏ结http://m.tkk7.com/zellux/archive/2007/05/15/117689.htmlZelluXZelluXTue, 15 May 2007 11:38:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/15/117689.htmlhttp://m.tkk7.com/zellux/comments/117689.htmlhttp://m.tkk7.com/zellux/archive/2007/05/15/117689.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/117689.htmlhttp://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>  
  


ZelluX 2007-05-15 19:38 发表评论
]]>
Web Project 3 W记 (4)http://m.tkk7.com/zellux/archive/2007/05/15/117683.htmlZelluXZelluXTue, 15 May 2007 11:11:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/15/117683.htmlhttp://m.tkk7.com/zellux/comments/117683.htmlhttp://m.tkk7.com/zellux/archive/2007/05/15/117683.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/117683.htmlhttp://m.tkk7.com/zellux/services/trackbacks/117683.html1. 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>

ZelluX 2007-05-15 19:11 发表评论
]]>
关于Filter的基本知?/title><link>http://m.tkk7.com/zellux/archive/2007/05/13/117125.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 13 May 2007 09:12:00 GMT</pubDate><guid>http://m.tkk7.com/zellux/archive/2007/05/13/117125.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/117125.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/05/13/117125.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/117125.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/117125.html</trackback:ping><description><![CDATA[<p>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.)<br>c) 通过自定义新的请求版本,修改h报头和数据?br>d) 通过自定义新的响应版本,修改响应报头和数据?br>e) 和外部资源交互?/p> <p>2. Filter ~程<br>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> <p>3. 一?Duke's Bookstore 的例?br>HitCounterFilter在servlet被访问时计数?br>public final class HitCounterFilter implements Filter {<br>  private FilterConfig filterConfig = null;</p> <p>  public void init(FilterConfig filterConfig) <br>    throws ServletException {<br>    this.filterConfig = filterConfig;<br>  }<br>  public void destroy() {<br>    this.filterConfig = null;<br>  }<br>  public void doFilter(ServletRequest request,<br>    ServletResponse response, FilterChain chain) <br>    throws IOException, ServletException {<br>    if (filterConfig == null)<br>      return;<br>    StringWriter sw = new StringWriter();<br>    PrintWriter writer = new PrintWriter(sw);<br>    Counter counter = (Counter)filterConfig.<br>      getServletContext().<br>      getAttribute("hitCounter");<br>    writer.println();<br>    writer.println("===============");<br>    writer.println("The number of hits is: " +<br>      counter.incCounter());<br>    writer.println("===============");<br>    // Log the resulting string<br>    writer.flush();<br>    System.out.println(sw.getBuffer().toString());<br>    ...<br>    chain.doFilter(request, wrapper);<br>    ...<br>  }<br>} </p> <p>4. 讄qo器映?br>部v描述W文件的2.3版本引入了两个用于过滤器的元素,分别是:filter和filter-mapping。filter元素向系l注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL?br>1.filter元素<br>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> <p>filter-mapping元素<br>filter-mapping元素位于web.xml文g中filter元素之后serlvet元素之前。它包含如下三个可能的子元素Q:<br>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> <p> </p><img src ="http://m.tkk7.com/zellux/aggbug/117125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-05-13 17:12 <a href="http://m.tkk7.com/zellux/archive/2007/05/13/117125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web Project 3 W记 (1)http://m.tkk7.com/zellux/archive/2007/05/11/116866.htmlZelluXZelluXFri, 11 May 2007 14:32:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/11/116866.htmlhttp://m.tkk7.com/zellux/comments/116866.htmlhttp://m.tkk7.com/zellux/archive/2007/05/11/116866.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/116866.htmlhttp://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" />

ZelluX 2007-05-11 22:32 发表评论
]]>
JDK1.5 源码阅读W记 (2)http://m.tkk7.com/zellux/archive/2007/05/04/115294.htmlZelluXZelluXFri, 04 May 2007 05:11:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/04/115294.htmlhttp://m.tkk7.com/zellux/comments/115294.htmlhttp://m.tkk7.com/zellux/archive/2007/05/04/115294.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/115294.htmlhttp://m.tkk7.com/zellux/services/trackbacks/115294.htmljava.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>


ZelluX 2007-05-04 13:11 发表评论
]]>
JDK1.5 源码阅读W记 (1)http://m.tkk7.com/zellux/archive/2007/05/03/115082.htmlZelluXZelluXWed, 02 May 2007 17:33:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/03/115082.htmlhttp://m.tkk7.com/zellux/comments/115082.htmlhttp://m.tkk7.com/zellux/archive/2007/05/03/115082.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/115082.htmlhttp://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里承的?


ZelluX 2007-05-03 01:33 发表评论
]]>
05 Web Project3 (2)http://m.tkk7.com/zellux/archive/2007/05/02/115015.htmlZelluXZelluXWed, 02 May 2007 05:35:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/02/115015.htmlhttp://m.tkk7.com/zellux/comments/115015.htmlhttp://m.tkk7.com/zellux/archive/2007/05/02/115015.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/115015.htmlhttp://m.tkk7.com/zellux/services/trackbacks/115015.html
1input {
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" />

ZelluX 2007-05-02 13:35 发表评论
]]>
05 Web Project3 (1)http://m.tkk7.com/zellux/archive/2007/05/02/114989.htmlZelluXZelluXTue, 01 May 2007 17:05:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/02/114989.htmlhttp://m.tkk7.com/zellux/comments/114989.htmlhttp://m.tkk7.com/zellux/archive/2007/05/02/114989.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/114989.htmlhttp://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" />

ZelluX 2007-05-02 01:05 发表评论
]]>
Struts 学习W记(3) - 文g上传的实?/title><link>http://m.tkk7.com/zellux/archive/2007/05/01/114960.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Tue, 01 May 2007 13:04:00 GMT</pubDate><guid>http://m.tkk7.com/zellux/archive/2007/05/01/114960.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/114960.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/05/01/114960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/114960.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/114960.html</trackback:ping><description><![CDATA[struts标签库中有相应html:file标签Qenctypeq个属性貌似去掉也可以Q不知道有什么用?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">1</span><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #0000ff;"><</span><span style="color: #800000;">html:form </span><span style="color: #ff0000;">action</span><span style="color: #0000ff;">="/upload"</span><span style="color: #ff0000;"> enctype</span><span style="color: #0000ff;">="multipart/form-data"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br></span><span style="color: #008080;">2</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top">theFile : <br></span><span style="color: #008080;">3</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;"><</span><span style="color: #800000;">html:file </span><span style="color: #ff0000;">property</span><span style="color: #0000ff;">="theFile"</span><span style="color: #ff0000;"> </span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br></span><span style="color: #008080;">4</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;"><</span><span style="color: #800000;">html:errors </span><span style="color: #ff0000;">property</span><span style="color: #0000ff;">="theFile"</span><span style="color: #0000ff;">/><</span><span style="color: #800000;">br</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br></span><span style="color: #008080;">5</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;"><</span><span style="color: #800000;">html:submit</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br></span><span style="color: #008080;">6</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;"></</span><span style="color: #800000;">html:form</span><span style="color: #0000ff;">></span></div> |上看到的例子是在ActioncM处理的,不知道这么做合不合理Q这个是单的处理代码Q没有验证文件大和同名文g是否存在Q注意先要在相应目录中徏立file目录?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;"> 1</span><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">UploadForm uploadForm </span><span style="color: #000000;">=</span><span style="color: #000000;"> (UploadForm) form;</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span><span style="color: #008000;"><br></span><span style="color: #008080;"> 2</span><span style="color: #008000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #000000;">FormFile file </span><span style="color: #000000;">=</span><span style="color: #000000;"> uploadForm.getTheFile();<br></span><span style="color: #008080;"> 3</span><span style="color: #000000;"><img id="Codehighlighter1_122_528_Open_Image" onclick="this.style.display='none'; codehighlighter1_122_528_open_text.style.display="'none';" codehighlighter1_122_528_closed_image.style.display="'inline';" codehighlighter1_122_528_closed_text.style.display="'inline';"" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_122_528_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_122_528_closed_text.style.display="'none';" codehighlighter1_122_528_open_image.style.display="'inline';" codehighlighter1_122_528_open_text.style.display="'inline';"" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff;">try</span><span style="color: #000000;"> </span><span id="Codehighlighter1_122_528_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://m.tkk7.com/Images/dot.gif"></span><span id="Codehighlighter1_122_528_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;"> 4</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  InputStream stream </span><span style="color: #000000;">=</span><span style="color: #000000;"> file.getInputStream();<br></span><span style="color: #008080;"> 5</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  String filePath </span><span style="color: #000000;">=</span><span style="color: #000000;"> getServlet().getServletContext().getRealPath(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;"> 6</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  OutputStream fileout </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> FileOutputStream(filePath </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">/file/</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> file.getFileName());<br></span><span style="color: #008080;"> 7</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> bytesRead </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;"> 8</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  </span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[] buffer </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> </span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">8192</span><span style="color: #000000;">];<br></span><span style="color: #008080;"> 9</span><span style="color: #000000;"><img id="Codehighlighter1_444_489_Open_Image" onclick="this.style.display='none'; codehighlighter1_444_489_open_text.style.display="'none';" codehighlighter1_444_489_closed_image.style.display="'inline';" codehighlighter1_444_489_closed_text.style.display="'inline';"" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_444_489_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_444_489_closed_text.style.display="'none';" codehighlighter1_444_489_open_image.style.display="'inline';" codehighlighter1_444_489_open_text.style.display="'inline';"" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">  </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> ((bytesRead </span><span style="color: #000000;">=</span><span style="color: #000000;"> stream.read(buffer, </span><span style="color: #000000;">0</span><span style="color: #000000;">, </span><span style="color: #000000;">8192</span><span style="color: #000000;">)) </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">) </span><span id="Codehighlighter1_444_489_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://m.tkk7.com/Images/dot.gif"></span><span id="Codehighlighter1_444_489_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">    fileout.write(buffer, </span><span style="color: #000000;">0</span><span style="color: #000000;">, bytesRead);<br></span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">  }</span></span><span style="color: #000000;"><br></span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  fileout.close();<br></span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  stream.close();<br></span><span style="color: #008080;">14</span><span style="color: #000000;"><img id="Codehighlighter1_550_577_Open_Image" onclick="this.style.display='none'; codehighlighter1_550_577_open_text.style.display="'none';" codehighlighter1_550_577_closed_image.style.display="'inline';" codehighlighter1_550_577_closed_text.style.display="'inline';"" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_550_577_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_550_577_closed_text.style.display="'none';" codehighlighter1_550_577_open_image.style.display="'inline';" codehighlighter1_550_577_open_text.style.display="'inline';"" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">}</span></span><span style="color: #000000;"> </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) </span><span id="Codehighlighter1_550_577_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://m.tkk7.com/Images/dot.gif"></span><span id="Codehighlighter1_550_577_Open_Text"><span style="color: #000000;">{<br></span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top">  System.err.println(e);<br></span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span></div> <br>一点积累:<br>1. ActioncM码中要获得当前地址可以使用<br>getServlet().getServletContext().getRealPath(String)<br><br>2. Forward的目标地址前面貌似都要?/"?<em>Path success.jsp does not start with a "/" character<br><br></em><img src ="http://m.tkk7.com/zellux/aggbug/114960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-05-01 21:04 <a href="http://m.tkk7.com/zellux/archive/2007/05/01/114960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 学习W记(2) - 入门http://m.tkk7.com/zellux/archive/2007/05/01/114945.htmlZelluXZelluXTue, 01 May 2007 11:12:00 GMThttp://m.tkk7.com/zellux/archive/2007/05/01/114945.htmlhttp://m.tkk7.com/zellux/comments/114945.htmlhttp://m.tkk7.com/zellux/archive/2007/05/01/114945.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/114945.htmlhttp://m.tkk7.com/zellux/services/trackbacks/114945.html1. 控制器以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" />

ZelluX 2007-05-01 19:12 发表评论
]]>
Struts 学习W记(1) - 入门http://m.tkk7.com/zellux/archive/2007/04/29/114649.htmlZelluXZelluXSun, 29 Apr 2007 14:15:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/29/114649.htmlhttp://m.tkk7.com/zellux/comments/114649.htmlhttp://m.tkk7.com/zellux/archive/2007/04/29/114649.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/114649.htmlhttp://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


ZelluX 2007-04-29 22:15 发表评论
]]>
Tomcat 5.5 ?Apache 2.2 整合http://m.tkk7.com/zellux/archive/2007/04/27/114135.htmlZelluXZelluXFri, 27 Apr 2007 08:54:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/27/114135.htmlhttp://m.tkk7.com/zellux/comments/114135.htmlhttp://m.tkk7.com/zellux/archive/2007/04/27/114135.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/114135.htmlhttp://m.tkk7.com/zellux/services/trackbacks/114135.htmlzz?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>



ZelluX 2007-04-27 16:54 发表评论
]]>
实践了下Hibernate多对一映射http://m.tkk7.com/zellux/archive/2007/04/27/114126.htmlZelluXZelluXFri, 27 Apr 2007 08:27:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/27/114126.htmlhttp://m.tkk7.com/zellux/comments/114126.htmlhttp://m.tkk7.com/zellux/archive/2007/04/27/114126.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/114126.htmlhttp://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" />

ZelluX 2007-04-27 16:27 发表评论
]]>
Struts 基本配置http://m.tkk7.com/zellux/archive/2007/04/25/113614.htmlZelluXZelluXWed, 25 Apr 2007 12:40:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/25/113614.htmlhttp://m.tkk7.com/zellux/comments/113614.htmlhttp://m.tkk7.com/zellux/archive/2007/04/25/113614.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/113614.htmlhttp://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复习物理去了,?



ZelluX 2007-04-25 20:40 发表评论
]]>
[转蝲]Jakarta Commons FileUpload 用户指南http://m.tkk7.com/zellux/archive/2007/04/23/113023.htmlZelluXZelluXMon, 23 Apr 2007 11:56:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/23/113023.htmlhttp://m.tkk7.com/zellux/comments/113023.htmlhttp://m.tkk7.com/zellux/archive/2007/04/23/113023.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/113023.htmlhttp://m.tkk7.com/zellux/services/trackbacks/113023.htmlJakarta 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.");
    }
  }
};



ZelluX 2007-04-23 19:56 发表评论
]]>
Hibernate 映射一对多关系http://m.tkk7.com/zellux/archive/2007/04/23/112981.htmlZelluXZelluXMon, 23 Apr 2007 08:52:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/23/112981.htmlhttp://m.tkk7.com/zellux/comments/112981.htmlhttp://m.tkk7.com/zellux/archive/2007/04/23/112981.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/112981.htmlhttp://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


ZelluX 2007-04-23 16:52 发表评论
]]>
Java notes - 关于ArrayList.asList()Ҏhttp://m.tkk7.com/zellux/archive/2007/04/22/112784.htmlZelluXZelluXSun, 22 Apr 2007 12:26:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/22/112784.htmlhttp://m.tkk7.com/zellux/comments/112784.htmlhttp://m.tkk7.com/zellux/archive/2007/04/22/112784.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/112784.htmlhttp://m.tkk7.com/zellux/services/trackbacks/112784.html2007-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>


ZelluX 2007-04-22 20:26 发表评论
]]>Hibernate ȝ配置好了http://m.tkk7.com/zellux/archive/2007/04/22/112785.htmlZelluXZelluXSun, 22 Apr 2007 12:26:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/22/112785.htmlhttp://m.tkk7.com/zellux/comments/112785.htmlhttp://m.tkk7.com/zellux/archive/2007/04/22/112785.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/112785.htmlhttp://m.tkk7.com/zellux/services/trackbacks/112785.html2007-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" />

ZelluX 2007-04-22 20:26 发表评论
]]>
Lab 6 - W一ơ用strutshttp://m.tkk7.com/zellux/archive/2007/04/22/112786.htmlZelluXZelluXSun, 22 Apr 2007 12:26:00 GMThttp://m.tkk7.com/zellux/archive/2007/04/22/112786.htmlhttp://m.tkk7.com/zellux/comments/112786.htmlhttp://m.tkk7.com/zellux/archive/2007/04/22/112786.html#Feedback0http://m.tkk7.com/zellux/comments/commentRss/112786.htmlhttp://m.tkk7.com/zellux/services/trackbacks/112786.html2007-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>


ZelluX 2007-04-22 20:26 发表评论
]]>关于Java的范型机?/title><link>http://m.tkk7.com/zellux/archive/2007/04/22/112788.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 22 Apr 2007 12:26:00 GMT</pubDate><guid>http://m.tkk7.com/zellux/archive/2007/04/22/112788.html</guid><wfw:comment>http://m.tkk7.com/zellux/comments/112788.html</wfw:comment><comments>http://m.tkk7.com/zellux/archive/2007/04/22/112788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/zellux/comments/commentRss/112788.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/zellux/services/trackbacks/112788.html</trackback:ping><description><![CDATA[<img class=man src="http://image2.sina.com.cn/blog/tmpl/v3/theme/images/sun.gif"><span id="qs66qys" class=time>2007-04-21 11:12:29</span></td> <br> <div id="44eccem" class="sysBr500 text" id=articleText3e123f03010008qv align=left> <div>1. 前几天在水木上看到有人问</div> <div><font style="FONT-SIZE: 12px">class Demo>E<{<br>public Class getDynamicClass(){<br>Class clazz=//----------------------如何获取E的类Q?br>return clazz;<br>}<br>}</font></div> <div>貌似只能q样解决</div> <div><font style="FONT-SIZE: 12px">class Demo>E<{<br>E e;<br>public void addElement(E e){<br>this.e = e;<br>}<br>public Class getDynamicClass(){<br>Class clazz = e.getClass();<br>return clazz;<br>}<br>}</font></div> <div>一些相兌?/div> <div><font style="FONT-SIZE: 12px" color=#000000>Java的范型就是半个残?/font></div> <div><font style="FONT-SIZE: 12px; BACKGROUND-COLOR: #ffffff" color=#006699>nodQJava的范型除了防止类型{换错误以外我真想不v来有什么实质的用途?br>其是那个文中说的Q编译的时候拿掉,q行的时候再?..</font></div> <div><font style="FONT-SIZE: 12px">实没什么用Qjg老糊涂了偏要听信c++那个bs老头才有q个败笔Q我一直这么认?/font></div> <div><font style="FONT-SIZE: 12px"><font color=#006699>q个东西Ƨnq前没有搞出来</font><br>q是有点用的Q在ORM中定义多对一或者多对多关系的时?<br>List>C< numbers;<br>q时候偶q道numbers兌的是Cc,不需要在其它地方再配|了Q?/font></div> <div><font style="FONT-SIZE: 12px" color=#0099cc>为啥没用<br>否则对容器的使用q得停留在指针时?/font></div> <div><font style="FONT-SIZE: 12px">C#的泛型性能q是很好的,只是Java的实现机刉啥了炏V。?br></font></div> <div><font style="FONT-SIZE: 12px">最后有人回</font></div> <div><font style="FONT-SIZE: 12px">很多事情Q不要着急下l论。以下代码算转蝲Q不原创?br><br>-------------华丽的分割线---------------------------------<br>protected Class getDomainClass() {<br>if (domainClass == null) {<br>ParameterizedType thisType = (ParameterizedType)<br>getClass().getGenericSuperclass();<br>domainClass = (Class)<br>thisType.getActualTypeArguments()[0];<br>}<br>return domainClass;<br>}<br>-------------华丽的分割线---------------------------------</font></div> <div><font style="FONT-SIZE: 12px"><font style="FONT-SIZE: 14px">q没试过可不可以</font></font></div> <div><font style="FONT-SIZE: 12px"></font></div> <div><font style="FONT-SIZE: 14px">2. 另外一个类似的帖子的回?/font></div> <div><font style="FONT-SIZE: 12px">System.out.println(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);</font></div> <div></div> <div><font style="FONT-SIZE: 12px"><font color=#006699>试验了半?br>public class BaseClass>M<{<br>public void showType(){<br>ParameterizedType ptype = (ParameterizedType) getClass()<br>.getGenericSuperclass();<br>System.out.println(ptype.getActualTypeArguments()[0]);<br>}<br>}<br>public class ExClass>M< extends BaseClass>M<{}<br><br>new ExClass>Date<().showType(); //得到 "M" 而不是想要的 "Date" :'(</font><br></font></div> <div><font style="FONT-SIZE: 12px">我以前也惌么搞Q可是没搞成Q后来看Java关于泛型的实玎ͼ认ؓ没希望?br>前面所说的方式只有?br>public class SomeClass extends BaseClass>AnotherClass< {...}<br>q样定义的时候才能取到AnotherClass ...<br></font></div> <div><font style="FONT-SIZE: 12px"><font style="FONT-SIZE: 14px">3. 看到另一个帖子说q行期没有范?/font></font></div> </div> <img src ="http://m.tkk7.com/zellux/aggbug/112788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/zellux/" target="_blank">ZelluX</a> 2007-04-22 20:26 <a href="http://m.tkk7.com/zellux/archive/2007/04/22/112788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://c2277.com" target="_blank">ɫˬŮС˵ѿ</a>| <a href="http://266my.com" target="_blank">һëƬѲ</a>| <a href="http://cswsfz.com" target="_blank">avһۿ</a>| <a href="http://fsdyzs.com" target="_blank">޵һĻ</a>| <a href="http://ju7776.com" target="_blank">Av뾫Ʒ</a>| <a href="http://52xdc.com" target="_blank">߹ۿ</a>| <a href="http://52xdc.com" target="_blank">޾Ʒۿ91</a>| <a href="http://yamashida.com" target="_blank">ƷAò</a>| <a href="http://ahtxjk.com" target="_blank">޳aƬ߹ۿר</a>| <a href="http://nonobo.com" target="_blank">AVվþþƷ </a>| <a href="http://shulan88.com" target="_blank">3344ѲŹۿƵ</a>| <a href="http://222dv.com" target="_blank">1000ֹ߽ѹۿƵ</a>| <a href="http://xjdz8.com" target="_blank">5</a>| <a href="http://changfafangzhi.com" target="_blank">97һƷ</a>| <a href="http://0730jxpm.com" target="_blank">Ƶ</a>| <a href="http://ww99w.com" target="_blank">޾Ʒ</a>| <a href="http://youketech.com" target="_blank">޾Ʒվ</a>| <a href="http://srztw.com" target="_blank">þֻоƷ10</a>| <a href="http://czshenyue.com" target="_blank">91Ʒվ</a>| <a href="http://xingqiu1.com" target="_blank">ŮƵ77777</a>| <a href="http://wbkk88.com" target="_blank">߹ۿվ </a>| <a href="http://xzzkf.com" target="_blank">AVרӰ߹ۿ</a>| <a href="http://ww99w.com" target="_blank">޻ɫվ</a>| <a href="http://6878vip.com" target="_blank">ަ߹ۿɫ</a>| <a href="http://www52a.com" target="_blank">Ƶ2ѹۿ</a>| <a href="http://see01.com" target="_blank">һëƬ޶</a>| <a href="http://mlhcd.com" target="_blank">պAAƬѹۿ</a>| <a href="http://www676617.com" target="_blank">߹ۿƵ </a>| <a href="http://cijishiye.com" target="_blank">Ƶۿڵ</a>| <a href="http://26cgw.com" target="_blank">ҹɫһ</a>| <a href="http://wwwly6080.com" target="_blank">һƷ</a>| <a href="http://528676.com" target="_blank">õһۺϾƷ</a>| <a href="http://jjv5.com" target="_blank">߾ƷƵ</a>| <a href="http://wwwpaogou123.com" target="_blank">߹ۿ޾Ʒ</a>| <a href="http://km9c.com" target="_blank">˾Ʒձ11</a>| <a href="http://yjszhukao.com" target="_blank">72paoƵ</a>| <a href="http://zgbeian.com" target="_blank">Ƶ</a>| <a href="http://ge2hao.com" target="_blank">ɫһ߹ۿ</a>| <a href="http://aa2176.com" target="_blank">˿1ҳ</a>| <a href="http://cangtuyuan.com" target="_blank">þþžžþƷֱ</a>| <a href="http://wwkk3.com" target="_blank">ŷߴSUV</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>