2007-10-18

囚���囡囚�� -- 收藏中国方块字

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

囚���囡囚��
-------------------------------
囡囚�囚��
囚���囡囚��
�囹�,囚��,四囡团,�困圊圊,囝�因圉
团因回囝囡囟��园围困囤����囵囫囱�����囱国固
��囹图���囿�圃圄�圆��圊圉国囵圈��围��囚四��� 囡囝囫�
固囚�, 囡囚�囚��
圉�图�����国������囵圊��图���
�囝���园围�圜囿������圜囝�����
��国团囡�固囹�圄圉团囡�园围�圄困团囡��
��圜囿������圜圉���固囹��囝���
����圉������囵困固囹��圈�圜困团囡
����圜困����圈�圜国���图��圄国固
囹��圈�圄囿圈�����圄囿�������囿
�������困团团囡���圜囿�������
困�������囿园围因���囵困������
圜圆园围因���圜困����圈�圄圆���图圈
�圄国固囹��圈�圄圆�������国����
囫��囿���图���国����囫��囿团囡园
围囹�圜圉����囫��

囚���囡囚�� -- 收藏中国方块字

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

囚���囡囚��
-------------------------------
囡囚�囚��
囚���囡囚��
�囹�,囚��,四囡团,�困圊圊,囝�因圉
团因回囝囡囟��园围困囤����囵囫囱�����囱国固
��囹图���囿�圃圄�圆��圊圉国囵圈��围��囚四��� 囡囝囫�
固囚�, 囡囚�囚��
圉�图�����国������囵圊��图���
�囝���园围�圜囿������圜囝�����
��国团囡�固囹�圄圉团囡�园围�圄困团囡��
��圜囿������圜圉���固囹��囝���
����圉������囵困固囹��圈�圜困团囡
����圜困����圈�圜国���图��圄国固
囹��圈�圄囿圈�����圄囿�������囿
�������困团团囡���圜囿�������
困�������囿园围因���囵困������
圜圆园围因���圜困����圈�圄圆���图圈
�圄国固囹��圈�圄圆�������国����
囫��囿���图���国����囫��囿团囡园
围囹�圜圉����囫��

2007-10-10

JavaBeans 程序开发从入门到精通教程

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

[转贴] 转自http://www.java-cn.com

JavaBeans 程序开发从入门到精通教程

JavaBeans的属性

JavaBeans的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设
计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。在
JavaBeans设计中,按照属性的不同作用又细分为四类:Simple, Index, Bound与
Constrained属性。

1. Simple属性

一个简单属性表示一个伴随有一对get/set方法(C语言的过程或函数在Java程序中
称为"方法")的变量。属性名与和该属性相关的 get/set方法名对应。例如:如果
有setX和getX方法,则暗指有一个名为"X"的属性。如果有一个方法名为isX,则通
常暗指"X"是一个布尔属性(即X的值为true或false)。例如在下面这个程序中:

public class alden1 extends Canvas {
string ourString= "Hello"; //属性名为ourString,类型为字符串
public alden1(){     //alden1()是alden1的构造函数,
与C++中构造函数的意义相同
setBackground(Color.red);
setForeground(Color.blue);
}
/* "set"属性*/
public void setString(String newString) {
ourString=newString;
}
/* "get"属性 */
public String getString() {
return ourString;
}
}

2. Indexed属性

一个Indexed属性表示一个数组值。使用与该属性对应的set/get方法可取得数组中
的数值。该属性也可一次设置或取得整个数组的值。例:

public class alden2 extends Canvas {
int[] dataSet={1,2,3,4,5,6}; // dataSet是一个indexed属性
public alden2() {
setBackground(Color.red);
setForeground(Color.blue);
}
/* 设置整个数组 */
public void setDataSet(int[] x){
dataSet=x;
}
/* 设置数组中的单个元素值 */
public void setDataSet(int index, int x){
dataSet[index]=x;
}
/* 取得整个数组值 */
public int[] getDataSet(){
return dataSet;
}
/* 取得数组中的指定元素值 */
public int getDataSet(int x){
return dataSet[x];
}
}

3. Bound属性

一个Bound属性是指当该种属性的值发生变化时,要通知其它的对象。每次属性值
改变时,这种属性就点火一个 PropertyChange事件(在Java程序中,事件也是一个
对象)。事件中封装了属性名、属性的原值、属性变化后的新值。这种事件是传递
到其它的 Beans,至于接收事件的Beans应做什么动作由其自己定义。当
PushButton的background属性与Dialog的 background属性bind时,若PushButton
的background属性发生变化时,Dialog的background属性也发生同样的变化。 例:

public class alden3 extends Canvas{
String ourString= "Hello";
//ourString是一个bound属性
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
/** 注:Java是纯面向对象的语言,
如果要使用某种方法则必须指明是要使用哪个对象的方法,
在下面的程序中要进行点火事件的操作,
这种操作所使用的方法是在PropertyChangeSupport类中的。
所以上面声明并实例化了一个changes对象,
在下面将使用changes的firePropertyChange方法来点火ourString的属性改变事
件。*/

public void setString(string newString){
String oldString = ourString;
ourString = newString;
/* ourString的属性值已发生变化,于是接着点火属性改变事件 */
changes.firePropertyChange("ourString",oldString,newString);
}
public String getString(){
return ourString;
}
/** 以下代码是为开发工具所使用的。
我们不能预知alden3将与哪些其它的Beans组合成为一个应用,
无法预知若alden3的ourString属性发生变化时有哪些其它的组件与此变化有关,
因而alden3这个Beans要预留出一些接口给开发工具,
开发工具使用这些接口,
把其它的JavaBeans对象与alden3挂接。*/

public void addPropertyChangeListener(PropertyChangeLisener l){
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}

通过上面的代码,

开发工具调用changes的addPropertyChangeListener方法

把其它JavaBeans注册入ourString属性的监听者队列l中,

l是一个Vector数组,可存储任何Java对象。

开发工具也可使用changes的removePropertyChangeListener方法,

从l中注销指定的对象,

使alden3的ourString属性的改变不再与这个对象有关。

当然,当程序员手写代码编制程序时,

也可直接调用这两个方法,

把其它Java对象与alden3挂接。

4. Constrained属性

一个JavaBeans的constrained属性,是指当这个属性的值要发生变化时,与这个属
性已建立了某种连接的其它Java对象可否决属性值的改变。constrained属性的监
听者通过抛出PropertyVetoException来阻止该属性值的改变。例:下面程序中的
constrained属性是PriceInCents。

public class JellyBeans extends Canvas{
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
private VetoableChangeSupport Vetos=new VetoableChangeSupport(this);
/*与前述changes相同,
可使用VetoableChangeSupport对象的实例Vetos中的方法,
在特定条件下来阻止PriceInCents值的改变。*/

......
public void setPriceInCents(int newPriceInCents) throws
PropertyVetoException {
/*方法名中throws PropertyVetoException的作用是当有
其它Java对象否决PriceInCents的改变时,
要抛出例外。*/
/* 先保存原来的属性值*/

int oldPriceInCents=ourPriceInCents;
/**点火属性改变否决事件*/
vetos.fireVetoableChange("priceInCents",new Integer(OldPriceInCents),
new Integer(newPriceInCents));

/**若有其它对象否决priceInCents的改变,
则程序抛出例外,不再继续执行下面的两条语句,
方法结束。若无其它对象否决priceInCents的改变,
则在下面的代码中把ourPriceIncents赋予新值,
并点火属性改变事件*/

ourPriceInCents=newPriceInCents;
changes.firePropertyChange("priceInCents",
new Integer(oldPriceInCents),
new Integer(newPriceInCents));
}

/**与前述changes相同,
也要为PriceInCents属性预留接口,
使其它对象可注册入PriceInCents否决改变监听者队列中,
或把该对象从中注销

public void addVetoableChangeListener(VetoableChangeListener l)
{ vetos.addVetoableChangeListener(l);
}
public void removeVetoableChangeListener(VetoableChangeListener l){
vetos.removeVetoableChangeListener(l);
}
......
}

从上面的例子中可看到,一个constrained属性有两种监听者:属性变化监听者和
否决属性改变的监听者。否决属性改变的监听者在自己的对象代码中有相应的控制
语句,在监听到有constrained属性要发生变化时,在控制语句中判断是否应否决
这个属性值的改变。

总之,某个Beans的constrained属性值可否改变取决于其它的Beans或者是Java对
象是否允许这种改变。允许与否的条件由其它的 Beans或Java对象在自己的类中进
行定义。

JavaBeans的事件

事件处理是JavaBeans体系结构的核心之一。通过事件处理机制,可让一些组件作
为事件源,发出可被描述环境或其它组件接收的事件。这样,不同的组件就可在构
造工具内组合在一起,组件之间通过事件的传递进行通信,构成一个应用。从概念
上讲,事件是一种在"源对象"和"监听者对象"之间,某种状态发生变化的传递机
制。事件有许多不同的用途,例如在Windows系统中常要处理的鼠标事件、窗口边
界改变事件、键盘事件等。在Java和 JavaBeans中则是定义了一个一般的、可扩充
的事件机制,这种机制能够:

对事件类型和传递的模型的定义和扩充提供一个公共框架,并适合于广泛的应用。

与Java语言和环境有较高的集成度。

事件能被描述环境捕获和点火。

能使其它构造工具采取某种技术在设计时直接控制事件,以及事件源和事件监听者
之间的联系。

事件机制本身不依赖于复杂的开发工具。特别地,还应当:

能够发现指定的对象类可以生成的事件。

能够发现指定的对象类可以观察(监听)到的事件。

提供一个常规的注册机制,允许动态操纵事件源与事件监听者之间的关系。

不需要其它的虚拟机和语言即可实现。

事件源与监听者之间可进行高效的事件传递。

能完成JavaBeans事件模型与相关的其它组件体系结构事件模型的中立映射。

JavaBeans事件模型的主要构成有:事件从事件源到监听者的传递是通过对目标监
听者对象的Java方法调用进行的。对每个明确的事件的发生,都相应地定义一个明
确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这
个接口要继承java.util.EventListener。实现了事件监听者接口中一些或全部方
法的类就是事件监听者。伴随着事件的发生,相应的状态通常都封装在事件状态对
象中,该对象必须继承自java.util.EventObject。事件状态对象作为单参传递给
应响应该事件的监听者方法中。发出某种特定事件的事件源的标识是:遵从规定的
设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。
有时,事件监听者不能直接实现事件监听者接口,或者还有其它的额外动作时,就
要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例,来建立它
们之间的联系。

事件状态对象(Event State Object)

与事件发生有关的状态信息一般都封装在一个事件状态对象中,这种对象是
java.util.EventObject的子类。按设计习惯,这种事件状态对象类的名应以Event
结尾。例如:

public class MouseMovedExampleEvent extends java.util.EventObject

{ protected int x, y;
/* 创建一个鼠标移动事件MouseMovedExampleEvent */
 MouseMovedExampleEvent(java.awt.Component source, Point location) {
super(source);
x = location.x;
y = location.y;
}
/* 获取鼠标位置*/
public Point getLocation() {
return new Point(x, y);
}}

事件监听者接口(EventListener Interface)与事件监听者

由于Java事件模型是基于方法调用,因而需要一个定义并组织事件操纵方法的方
式。JavaBeans中,事件操纵方法都被定义在继承了 java.util.EventListener类
的EventListener接口中,按规定,EventListener接口的命名要以 Listener结
尾。任何一个类如果想操纵在EventListener接口中定义的方法都必须以实现这个
接口方式进行。这个类也就是事件监听者。例如:

/*先定义了一个鼠标移动事件对象*/
  public class MouseMovedExampleEvent
extends java.util.EventObject {
// 在此类中包含了与鼠标移动事件有关的状态信息
     ...
  }
  /*定义了鼠标移动事件的监听者接口*/
  interface MouseMovedExampleListener
extends java.util.EventListener {
/*在这个接口中定义了鼠标移动事件监听者所应支持的方法*/
void mouseMoved(MouseMovedExampleEvent mme);
}

在接口中只定义方法名,
方法的参数和返回值类型。
如:上面接口中的mouseMoved方法的
具体实现是在下面的ArbitraryObject类中定义的。

class ArbitraryObject implements MouseMovedExampleListener {
   public void mouseMoved(MouseMovedExampleEvent mme)
  { ... }

ArbitraryObject就是MouseMovedExampleEvent事件的监听者。

事件监听者的注册与注销

为了各种可能的事件监听者把自己注册入合适的事件源中,建立源与事件监听者间
的事件流,事件源必须为事件监听者提供注册和注销的方法。在前面的bound 属性
介绍中已看到了这种使用过程,在实际中,事件监听者的注册和注销要使用标准的
设计格式:

public void add< ListenerType>(< ListenerType> listener);
public void remove< ListenerType>(< ListenerType> listener);

例如:

首先定义了一个事件监听者接口:

public interface
ModelChangedListener extends java.util.EventListener {
void modelChanged(EventObject e);
}

接着定义事件源类:

public abstract class Model {
private Vector listeners = new Vector(); // 定义了一个储存事件监听者的数组

/*上面设计格式中的< ListenerType>在此处即是下面的ModelChangedListener*/

public synchronized void addModelChangedListener(ModelChangedListener mcl)
  { listeners.addElement(mcl); }//把监听者注册入listeners数组中
public synchronized void removeModelChangedListener(ModelChangedListener
mcl)
    { listeners.removeElement(mcl); //把监听者从listeners中注销
    }
  /*以上两个方法的前面均冠以synchronized,
是因为运行在多线程环境时,
可能同时有几个对象同时要进行注册和注销操作,
使用synchronized来确保它们之间的同步。
开发工具或程序员使用这两个方法建立源与监听者之间的事件流*/

protected void notifyModelChanged() {
/**事件源使用本方法通知监听者发生了modelChanged事件*/
    Vector l;
    EventObject e = new EventObject(this);
/* 首先要把监听者拷贝到l数组中,
冻结EventListeners的状态以传递事件。
这样来确保在事件传递到所有监听者之前,
已接收了事件的目标监听者的对应方法暂不生效。*/
    synchronized(this) {
      l = (Vector)listeners.clone();
    }
    for (int i = 0; i < l.size(); i++) {
     /* 依次通知注册在监听者队列中的每个监听者发生了modelChanged事件,
     并把事件状态对象e作为参数传递给监听者队列中的每个监听者*/
((ModelChangedListener)l.elementAt(i)).modelChanged(e);
    }
    }
   }

在程序中可见事件源Model类显式地调用了接口中的modelChanged方法,实际是把
事件状态对象e作为参数,传递给了监听者类中的 modelChanged方法。

适配类

适配类是Java事件模型中极其重要的一部分。在一些应用场合,事件从源到监听者
之间的传递要通过适配类来"转发"。例如:当事件源发出一个事件,而有几个事件
监听者对象都可接收该事件,但只有指定对象做出反应时,就要在事件源与事件监
听者之间插入一个事件适配器类,由适配器类来指定事件应该是由哪些监听者来响
应。

适配类成为了事件监听者,事件源实际是把适配类作为监听者注册入监听者队列
中,而真正的事件响应者并未在监听者队列中,事件响应者应做的动作由适配类决
定。目前绝大多数的开发工具在生成代码时,事件处理都是通过适配类来进行的。

JavaBeans用户化

JavaBeans开发者可以给一个Beans添加用户化器(Customizer)、属性编辑器
(PropertyEditor)和 BeansInfo接口来描述一个Beans的内容,Beans的使用者可
在构造环境中通过与Beans附带在一起的这些信息来用户化Beans的外观和应做的动
作。一个Beans不必都有BeansCustomizer、PrpertyEditor和BeansInfo,根据实际
情况,这些是可选的,当有些Beans较复杂时,就要提供这些信息,以Wizard的方
式使Beans的使用者能够用户化一个Beans。有些简单的Beans可能这些信息都没
有,则构造工具可使用自带的透视装置,透视出Beans的内容,并把信息显示到标
准的属性表或事件表中供使用者用户化Beans,前几节提到的Beans 的属性、方法
和事件名要以一定的格式命名,主要的作用就是供开发工具对Beans进行透视。当
然也是给程序员在手写程序中使用Beans提供方便,使他能观其名、知其意。

用户化器接口(Customizer Interface)

当一个Beans有了自己的用户化器时,在构造工具内就可展现出自己的属性表。在
定义用户化器时必须要实现java.Beanss.Customizer 接口。例如,下面是一个"按
钮"Beans的用户化一器:

public class OurButtonCustomizer
extends Panel implements Customizer {
... ...
/*当实现象OurButtonCustomizer这样的常规属性表时,
一定要在其中实现addProperChangeListener
和removePropertyChangeListener,这样,
构造工具可用这些功能代码为属性事件添加监听者。*/
... ...
private PropertyChangeSupport changes=new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
public void removePropertyChangeListener(PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
... ...

属性编辑器接口(PropertyEditor Interface)

一个JavaBeans可提供PropertyEditor类,为指定的属性创建一个编辑器。这个类
必须继承自 java.Beanss.PropertyEditorSupport类。构造工具与手写代码的程序
员不直接使用这个类,而是在下一小节的 BeansInfo中实例化并调用这个类。例:

public class MoleculeNameEditor extends java.Beanss.PropertyEditorSupport {
public String[] getTags() {
String resule[]={
"HyaluronicAcid","Benzene","buckmisterfullerine",
"cyclohexane","ethane","water"};
return resule;}
}

上例中是为Tags属性创建了属性编辑器,在构造工具内,可从下拉表格中选择
MoleculeName的属性应是"HyaluronicAid"或是 "water"。

BeansInfo接口

每个Beans类也可能有与之相关的BeansInfo类,在其中描述了这个Beans在构造工
具内出现时的外观。BeansInfo中可定义属性、方法、事件,显示它们的名称,提
供简单的帮助说明。 例如:

public class MoleculeBeansInfo extends SimpleBeansInfo {
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor pd=new
PropertyDescriptor("moleculeName",Molecule.class);
/*通过pd引用了上一节的MoleculeNameEditor类,取得并返回moleculeName属性*/
pd.setPropertyEditorClass(MoleculeNameEditor.class);
PropertyDescriptor result[]={pd};
return result;
} catch(Exception ex) {
System.err.println("MoleculeBeansInfo: unexpected exeption: "+ex);
return null;
}
}
}

JavaBeans持久化

当一个JavaBeans在构造工具内被用户化,并与其它Beans建立连接之后,它的所有
状态都应当可被保存,下一次被load进构造工具内或在运行时,就应当是上一次修
改完的信息。为了能做到这一点,要把Beans的某些字段的信息保存下来,在定义
Beans时要使它实现 java.io.Serializable接口。例如:

public class Button
implements java.io.Serializable {
}

实现了序列化接口的Beans中字段的信息将被自动保存。若不想保存某些字段的信
息则可在这些字段前冠以transient或 static关键字,transient和static变量的
信息是不可被保存的。通常,一个Beans所有公开出来的属性都应当是被保存的,
也可有选择地保存内部状态。 Beans开发者在修改软件时,可以添加字段,移走对
其它类的引用,改变一个字段的private/protected/public状态,这些都不影响类
的存储结构关系。然而,当从类中删除一个字段,改变一个变量在类体系中的位
置,把某个字段改成transient/static,或原来是 transient/static,现改为别
的特性时,都将引起存储关系的变化。

JavaBeans的存储格式

JavaBeans组件被设计出来后,一般是以扩展名为jar的Zip格式文件存储,在jar中
包含与JavaBeans有关的信息,并以MANIFEST文件指定其中的哪些类是JavaBeans。
以jar文件存储的JavaBeans在网络中传送时极大地减少了数据的传输数量,并把
JavaBeans运行时所需要的一些资源捆绑在一起,本章主要论述了JavaBeans的一些
内部特性及其常规设计方法,参考的是JavaBeans规范1.0A版本。随着世界各大ISV
对JavaBeans越来越多的支持,规范在一些细节上还在不断演化,但基本框架不会
再有大的变动。

【转】最强烈推荐-我的java收藏夹(内有国内最好的java论坛)

最强烈推荐-我的java收藏夹(内有国内最好的java论坛)
国内:
www.chinajavaworld.com -论坛人很多,高手也多,不过好像都在潜水  
www.cn-java.com -也很不错,文章很好,但是就是商业性浓了点。  
www.chinaitlab.com-非 常有系统性,而且推出的java远程教育是中国最全面的scjp远程教育。 www.huihoo.com -灰狐动力,有个jfox,而且很多关于企业级应用的东西  
www.matrix.org.cn -Matrix技术,不少java文章和资源,论坛牛人多,人气略差。
www.javastudy.org -java学习可下载资料不少,论坛人气也一般。  
www.javaresearch.org -很多好文章,而且有出书。      
www.jdon.com -很多java设计模式的资料。          
www.java-cn.com -很多资料和书籍下载,文摘也有不少,就是下载要扣分。
www.java.com.cn -论坛不错,人气够旺,不过有时候老上不去。  
www.javapub.com -还可以。我去的较少。        
www.javajia.com -同上。             国内:  
www.chinajavaworld.com -论坛人很多,高手也多,不过好像都在潜水
www.cn-java.com -也很不错,文章很好,但是就是商业性浓了点。  
www.chinaitlab.com-非 常有系统性,而且推出的java远程教育是中国最全面的scjp远程教育。
www.huihoo.com -灰狐动力,有个jfox,而且很多关于企业级应用的东西  
www.matrix.org.cn -Matrix技术,不少java文章和资源,论坛牛人多,人气略差。  
www.javastudy.org -java学习可下载资料不少,论坛人气也一般。  
www.javaresearch.org -很多好文章,而且有出书。      
www.jdon.com -很多java设计模式的资料。          
www.java-cn.com -很多资料和书籍下载,文摘也有不少,就是下载要扣分。
www.java.com.cn -论坛不错,人气够旺,不过有时候老上不去。  
www.javapub.com -还可以。我去的较少。          
www.javajia.com -同上。            
http://www-900.ibm.com/developerWorks/cn/index.shtml -ibm非常不错,里面的好文章层出不穷啊。                  
tech.ccidnet.com -赛迪还算比较有特色,原创很多。      
www.zdnet.com.cn -zdnet也不错哦,精彩。      
水木清华java版 -很多大牛,真的很多,呵呵。      
www.yesky.com -很多好文章,原创比较多。        
国外:
www.sun.com -不用多说吧。
www.apache.org -apache很多开源项目,无论是拿来用还是看源代码都很不错
www.onjava.com -orielly的,java资源很多
www.javaworld.com-很 多java文章和tips 
www.jguru.com -很多文章,还有论坛
www.theseverside.com -关于应用的比较多,比如服务器
www.sourceforge.net -开源之祖啊。 以上站点都是很8错。每个我都经常去。
学习java以及相关技术,我建议你这些站点有空都可以去看看
http://www-900.ibm.com/developerWorks/cn/index.shtml -ibm非常不错,里面的好文章层出不穷啊。                  
tech.ccidnet.com -赛迪还算比较有特色,原创很多。      
www.zdnet.com.cn -zdnet也不错哦,精彩。          
水木清华java版 -很多大牛,真的很多,呵呵。      
www.yesky.com -很多好文章,原创比较多。        
国外:
www.sun.com -不用多说吧。  
www.apache.org -apache很多开源项目,无论是拿来用还是看源代码都很不错
www.onjava.com -orielly的,java资源很多
www.javaworld.com-很 多java文章和tips e 
www.jguru.com -很多文章,还有论坛
www.theseverside.com -关于应用的比较多,比如服务器
www.sourceforge.net -开源之祖啊。
以上站点都是很不错。每个我都经常去。  
学习java以及相关技术,我建议你这些站点有空都可以去看看

【转】12种求职方式成功率排行榜

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

人人都有自己找工作的经验,但其实我们知道的并不多。很多人以为找工作就三
样东西:简历,招聘广告和劳务中介。其实,找工的方式有12种,它们的有效率用
百分比来表示:
1. 利用互联网来看公司网站,中介网站,或者把自己的简历贴在网站上等人来
看。(1%)
2. 随意地挑选报纸,电话簿上的公司,寄出自己的简历。(7%)
3. 应聘自己行内发行的专业杂志,新闻简报上的招聘广告。(7%)
4. 应聘登载在本地报纸上的招工广告。 (5-24% 取决于工资要求)
5. 通过私人的就业中介。 (5-24% 取决于工资要求)
6. 参加招聘会,和雇主直接见面,当面由雇主挑选。(8%)
7. 和以前的老师,教授联系,看有没有门路。(12%)
8. 通过当地政府人力资源部就业辅助中心寻求机会。(14%)
9. 向朋友,旧同事,老乡,亲戚打听,看他们有没有好介绍。(33%)
10. 不管对方有没有空缺,有没有登广告,直接找那些你感兴趣的企业,亲自上门
看有没有机会。(47%)
11. 翻开电话簿,找到那些你认为可以的企业,打电话去看他们是否在招你这样的
人。(69%)
12. 和一群找工的人,大家一起看电话簿打电话给潜在雇主。(84%)
看完以上部分,你可能发现一些有趣的事实:找工花功夫越多的方式,越难堪看起
来越不可能的方式,成功率越大。更重要的是,不要只限于一种方式,同时用几
种,机会就大多了。

【转】人才招聘中的笔迹分析

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

笔迹分析的基本内容主要包括以下七个方面:
1、书面整洁情况:书面干净整洁者,书写者举止高雅,穿着较讲究,性喜干净整
齐,较注重自己的仪表和形象,并多有较强的自尊心和荣誉感。如书面有多处涂抹
现象,说明书写者可能有着穿着随便,不修边幅,不拘小节等性格特征。
2、字体大小情况:字体大,不受格线的限制,说明书写者性格趋于外向,待人热
情,兴趣广泛、思维开阔,做事有大刀阔斧之风,但多有不拘小节,缺乏耐心,不
够精益求精等不足。字体小,性格偏于内向,有良好的专注力和自控力,做事耐
心、谨慎,看问题比较透彻,但心胸不够开阔,遇事想不开。字体大小不一,说明
书写者随机应变能力较强,处事灵活,但缺乏自制力。
3、字体结构情况:结构严谨,书写者有较强的逻辑思维能力,性格笃实,思虑周
全,办事认真谨慎,责任心强,但容易循规蹈矩。结构松散,书写者发散思维能力
较强,思维有广度。为人热情大方,心直口快,心胸宽阔,不斤斤计较,并能宽容
他人的过失,但往往不拘小节。
4、笔压轻重情况:笔压重,书写者精力比较充沛,为人有主见,个性刚强,做事
果断,有毅力,有开拓能力,但主观性强,固执。笔压轻,书写者缺乏自信,意志
薄弱,有依赖性,遇到困难容易退缩。笔压轻重不一,书写者想象思维能力较强,
但情绪不稳定,做事犹豫不决。
5、书写速度情况:如全篇文字连笔较多,速度较快,说明书写者思维敏捷,动作
迅速,效率较高,但有时性急,容易感情冲动。如笔速较慢,说明书写者头脑反应
不是很快,行动较慢,但性情和蔼,富于耐心,办事讲究准确性。
6、字行平直情况:字行平直,书写者做事有主见,只要自己认定的事,一般不为
他人所左右。字行上倾,书写者积极向上,有进取精神。这种人常常雄心勃勃,有
远大的抱负,并常能以较大的热情付诸实践。如字行过分上倾,书写者除有上述特
征之外,还往往非常固执。字行下倾,书写者看问题非常实际,有消极心理,遇到
问题看阴暗面、消极面太多,容易悲观失望。字行忽高忽低,情绪不稳定,常常随
着生活中的高兴事或烦恼事或兴奋或悲伤,心理调控能力较弱。
7、通篇布局情况:这要看左右留边空白大小及行与行之间排列是否整齐。左边空
白大,书写者有把握事物全局的能力,能统筹安排,并为人和善、谦虚,能注意倾
听他人意见,体察他人长处。右边空白大,书写者凭直觉办事,不喜欢推理,性格
比较固执,做事易走极端,遇到困难容易消极。左右不留空白,书写者有着很强的
占有欲和控制欲,比较自私。行与行之间排列整齐,书写者有良好的教养,正直,
不搞邪门歪道。头脑清晰,做事有条不紊,讲究计划性、系统性和程序性。有较强
的自尊心、责任感和荣誉感。行与行之间排列不整齐,说明书写者头脑比较简单,
条理性较差,做事马马虎虎,缺乏责任感。

如何发传真

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

第一步、正确放纸,将纸翻过来,文字朝下,放到入纸口卡住;
第二步、拿起电话,拨通电话,让对方给信号(如果是人工的,就对他说,请给一
个传真信号。如果是自动的,就会听见"滴"的声音);
第三步、听到长声"滴"后按启动键,一般启动键是最大的那个,绿色的;
第四步、挂回电话;
第五步、如果要传多页,在前一页快完后,及时将后页放到入纸口;

solaris10下加载iso文件

begin:vcard
fn;quoted-printable:=E5=88=98=E6=9C=AC=E6=99=96
n;quoted-printable;quoted-printable:=E5=88=98;=E6=9C=AC=E6=99=96
email;internet:liubenhui@boco.com.cn
tel;quoted-printable;work:=E4=BA=BF=E9=98=B3=E4=BF=A1=E9=80=9A=E5=B9=BF=E8=A5=BF=E5=88=86=E5=85=AC=E5=
=8F=B8
tel;cell:13978687037
x-mozilla-html:FALSE
version:2.1
end:vcard

用lofiadm/mount命令做虚拟光驱
步骤为:
1、# lofiadm -a /wind/solaris10/sol-10-GA-x86-v2-iso.iso
把iso文件export为块设备,参数-a表示add,这个命令的output是/dev/lofi/1。
2、# mount -F hsfs -o ro /dev/lofi/1 /mnt/cdrom
把设备/dev/lofi/1 mount到文件系统/mnt/cdrom目录下。


卸载iso文件
1、# umount /mnt/cdrom/
2、# lofiadm -d /dev/lofi/1