<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>just4you</title>
    <description></description>
    <link>http://just4you.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>PL/SQL笔记（二）</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/228794" style="color:red;">http://just4you.javaeye.com/blog/228794</a>&nbsp;
          发表时间: 2008年08月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>数据类型</strong></p>
<p><strong></strong></p>
<ol>
<li>标量类型</li>
<li>复合类型</li>
<li>引用类型</li>
<li>LOB类型</li>
</ol>
<p><strong>标量类型</strong></p>
<p>&nbsp;</p>
<pre name="code" class="sql">	1.numeric：存放整数，实数，浮点数
		包括：
			1.binary_integer 存储带符号整数，pls_integer和binary_interger值比nuber值占用较少存储空间，但binary_integer操作比pls_integer慢。
				子类：
					1.natural:存储非负整数
					2.naturaln:存储非负整数,不能为空
					3.positive:存储正整数
					4.positive:存储正整数，不能为空
					5.signtype:存储-1,0,1
			2.number存储定点数，浮点数
				1.定点数：nubmer(precision,scale)
				2.整型数：number(precision)
				3.浮点数：number 数度为38为的十进制浮点数
			3.pls_integer 存储带符号整数，范围同binary_integer，两者不完全兼容。比nubmer和binary_integer类型快。
	2.character：存放字符串
		包括：
			1.char 存放固定长度字符数据。
				char[(max_length)]
				最大长度（字节单位），缺省为1,最大32767。
				如果char(n)类型的变量用于存储多字节字符，则最大长度小于n个字符，如果不满n个字符，则末尾用空格填充。数据库char类型列的最大长度为2000字符，所以不能把长度大于2000的char类型值插入到数据库中，但可插入到类型为varchar2或long的表列中。
			2.varchar2 变长字符类型，数据内部表示取决于当前数据库的字符集
				varchar2(max_length)
				1&lt;=max_length=&lt;32767
				如存储多字节字符，则最大长度小于n个字符。varchar2类型列的最大长度为4000字符，所以 不能把长度大于 4000的varchar类型值插入到数据库中，可插入到long的表列中。
			3.long 存储变长字符数据。最大长度2G
			4.nchar 存储固定长度的nls字符数据
				nchar(max_length)
				1&lt;=max_length&lt;=32767
			5.nvarchar2 存储可变长度的nls字符数据。
				nvarchar2(max_length)
				1&lt;=max_length&lt;32767
	3.raw类
		包括：
			1.raw 存放固定长度的二进制数据
				raw(max_length)
				1&lt;=max_length&lt;32767
			2.long raw
	4.rowid类
		rowid伪列，用于存储行标识符(rowid)，行标识符是固定长度的16进制字符串，用来表示 一条记录的存储地址。行标识符不能由PLSQL生成，可以从一个表的rowid伪列中得到 。
	5.date类
		日期缺省值为当月的第一天，时间的缺省值为午夜12：00。
		PLSQL中的date变量与数据库中的date类型列相同。包括世纪、年、月、日、小时、分钟、秒。一个date变量占七个字节，分别表示世纪、年、月、日、小时、分钟、秒。
		缺省的日期格式由oracle初始化参数NLS_DATA_FOMRAT决定。使用to_date内嵌函数可以将characte类型的值转换成date类型。使用to_char将date转换成character。
	6.boolean类
		用于存储逻辑值。true,false,null
		null用来表示一个错误的，不合适 的或不确定的值。
		boolean类型的变量只能用在逻辑操作中，且只能将true,false,null赋给该类型的变量。不能将boolean类型的值插入到数据库中，也不能将数据库中的数据赋给boolean类型的变量。
	7.trusted类
		mlslabel类型的变量被用来在trusted oracle中存储变长 的二进制标签。</pre>
<p style="PADDING-LEFT: 30px">&nbsp;<strong>数据类型之间的转换</strong></p>
<pre name="code" class="sql">	1.强制类型转换
		通过使用函数来完成不同类型之间的转换。这些函数也可以是标准SQL中的数据类型转换函数
		to_char：numeric|date -&gt;varchar2
		to_date：character -&gt; date
		to_number： character -&gt; number
		rawtohex： raw  -&gt;16进制
		hextoraw： 将用character类型描述的16进制转换成二进制数
		chartorowid：用character类型描述的rowid转换成二进制数
		rowidtochar：将二进制形式的rowid转换成18个字符的行标识符
		如：
		declare
			v_birthdate date;
			v_show varchar2(20);
		begin
			select birthdate
			into v_birthdate
			form auths
			where name='王达琳';
			v_show := to_char(v_birthdate);
			DBMS_OUTPUT.PUT_LINE('王达琳的出生日期为'||v_show);
		end;
	2.自动类型转换
		declare
			v_salary varchar2(15);
		begin
			select salary
			 into v_salary
			 from auths
			 where author_code='A00003';
		end;
		数据库中salary列为number(8,2)，但是v_salary类型为varchar2(15)。PLSQL能将numeric类数据自动转换成字符串并赋给character类的变量。</pre>
<p><span style="background-color: #fafafa;"><strong>复合类型</strong><br />具有内部成员的类型。该成员可以被单独操作。通常该类型的变量由一个或多个标量类型组成</span></p>
<p><strong>1.记录：与预定义的标量类型不同，在使用复合类型之前用户 必须先定义该复合类型。</strong></p>
<pre name="code" class="sql">type record_type is record(
			field1 type1 [not null] [:=expr1],
			field2 type2 [not null] [:=expr2],
			...
			fieldn typen [not null] [:=exprn]
		);
		record_type表示记录类型的名字。
		field表示记录里域的名字。
			域的声明与记录外的变量声明类似，可以有not null约束和初始值。如果没有被赋值，则系统自动赋值为null。在赋初值时":="可以用DEFAULT代替。
		type表示记录里域的类型。
		expr表示为域赋的初始值。</pre>
<p>&nbsp;</p>
<p><strong>例如：</strong></p>
<pre name="code" class="java">type record_type is record(
			field1 type1 [not null] [:=expr1],
			field2 type2 [not null] [:=expr2],
			...
			fieldn typen [not null] [:=exprn]
		);
		record_type表示记录类型的名字。
		field表示记录里域的名字。
			域的声明与记录外的变量声明类似，可以有not null约束和初始值。如果没有被赋值，则系统自动赋值为null。在赋初值时":="可以用DEFAULT代替。
		type表示记录里域的类型。
		expr表示为域赋的初始值。</pre>
<p>&nbsp;</p>
<p>也可以用select语句来为记录赋值，记录中域的类型一定要和select列表中域的类型一致。</p>
<pre name="code" class="sql">declare
			--定义一个记录，他的域和auths表中的一些域类型相同。
			type t_AuthRec is record(
				AuthorCode auths.author_code%type,
				Name auths.name%type,
				Birthdate auths.birthdate%type,
				EntryDateTime auths.entry_date_time%type
			);
			--声明一个记录类型来接收数据
			v_Author t_AuthRec;
		begin
			select author_code,name,birthdate,entry_date_time
			into v_Author
			from auths
			where author_code='A00009';
		end;</pre>
<p>&nbsp;</p>
<p>在PLSQL中声明一个与数据库表中各列类型相同的记录，可以用%rowtype操作符。类似于%type，%rowtype返回一个记录类型。</p>
<pre name="code" class="sql">declare
			v_Article article%rowtype;</pre>
<p>&nbsp;</p>
<p>使用%rowtype声明的记录不包括数据库表中的not null约束，但包括varchar2列和char列的长度，number列的精度和标度。当表定义 发生改变时，由%rowtype声明 的记录也发生相应的改变。</p>
<p><strong>2.表</strong></p>
<p><strong>定义表：</strong></p>
<pre name="code" class="sql">Type tabletype_name is table of type index by binary_integer
		Tabletype_name：表类型名
		type：预定义的标量类型或通过%type引用的标量类型。表的索引是binary_integer类型。当定义了表类型后，就可以声明该类型的变量</pre>
<p>&nbsp;例如：</p>
<pre name="code" class="sql">declare
			--定义表类型t_NameTable，其元素类型是auths数据库表中的name列的类型。
			type t_NameTalbe is talbe of auths.name%type index by binary_integer;
			--定义表类型t_address，其元素类型是auths表中的address列的类型。
			type t_AddressTable is talbe of auths.address%type index by binary_integer;
			--声明两个表类型变量
			v_name t_NameTable;
			v_Address t_AddressTable;
		begin
			--引用PLSQL表中的元素
			--tablename(index)
			--index是表的索引，用binary_integer类型的变量或是能转换成binary_integer类型的表达式表示。
			v_Name(2) := 'Wang';
			v_Address(-3) :='street 1';
		end;</pre>
<p>&nbsp;</p>
<p>例如：</p>
<pre name="code" class="sql">declare
			type t_AuthorRecord is table of auths%rowtype index by binary_integer;
			--每一个元素 都是一条记录
			v_auths t_authorRecord;
		begin
			--检索作家代码是A00009的作家，并存放到v_Auths(00009)中。
			select *
			into v_auths(00009)
			from auths
			where authors_code='A00009';
			--v_Auths表中的每个元素都是记录，可以通过如下语法引用记录
			--table(index).field
			v_Auths(00009).name := 'Join';
			DBMS_OUTPUT.PUT_LINE(v_Auths(00009).name);
		end;</pre>
<p>&nbsp;</p>
<p>PLSQL表中元素无特定顺序，因为表中元素 不像数组一样被连续地存储在一个空间内。</p>
<p>PLSQL表中的KEY不必是连续的，任意binary_integer类型的值或是表达式都可用作表的索引（KEY列）。<br />当向一个PLSQL表中插入一个元素时，就为该表分配 了用以存放该元素存储空间，PLSQL表的大小是没有限制的。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/228794#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Aug 2008 23:00:38 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/228794</link>
        <guid>http://just4you.javaeye.com/blog/228794</guid>
      </item>
      <item>
        <title>PL/SQL笔记（一）</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/228788" style="color:red;">http://just4you.javaeye.com/blog/228788</a>&nbsp;
          发表时间: 2008年08月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>读了本PL／SQL，抄了点代码。</p>
<p><strong>1.根据姓名查询作家，如果是女滴，就查询发表文章的数量。</strong></p>
<pre name="code" class="sql">DECLARE
	v_Sex NUMBER;
	v_AuthorCode CHAR(6);
	v_Arcount NUMBER;
BEGIN
	select author_code,sex
	into v_AuthorCode, v_Sex
	from auths
	where name='王达琳';

	IF v_Sex = 0 THEN
		select count(article_code)
		into v_Arcount
		from article
		where author_code = v_AuthorCode;
	END IF;
END;</pre>
<p><strong>&nbsp;2.声明PLSQL变量</strong></p>
<pre name="code" class="sql">DECLARE
	v_Name varchar2(10);
	v_CurrentDate DATE;
	v_Salary NUMBER(8,2);
	v_LoopCounter BINARY_INTEGER;
	v_CurrentlyRegistered BOOLEAN;</pre>
<p><strong>&nbsp;3.创建PL/SQL用户自定义类型（例如：PL/SQL表和记录）</strong></p>
<pre name="code" class="sql">DECLARE
	--创建一个记录类型
	TYPE Au_Record IS RECORD(
		Author_code char(6),
		Name varchar2(10),
		sex NUMBER(1)
	);
	--声明一个Au_Record记录类型的变量
	v_Author Au_Record;</pre>
<p><strong>&nbsp;4.创建对象类型，可以存储在数据库表中</strong></p>
<pre name="code" class="sql">create or replace type AuthorOb as object(
	--创建一个对象类型
	Author_code char(6),
	Name varchar2(10),
	Sex number(1),
	birthdate date,
	address varchar2(30)
),</pre>
<p><strong>&nbsp;5.定义常量</strong></p>
<p>常量定义与变量的定义类似，只是在定义时必须增加一个关键字constant， 并同时给它一个值，这民后就不能再给常量进行赋值了。</p>
<pre name="code" class="sql">declare
	sex_male constant int := 1;
	sex_female constant int := 0;</pre>
<p><strong>&nbsp;6.循环</strong></p>
<p>有数据表结构为：</p>
<pre name="code" class="java">create table Table_A(
	num_col number,
	char_col varchar2(60)
);</pre>
<p>&nbsp;循环将数字1到100插入到table_a表中</p>
<pre name="code" class="sql">declare
	v_LoopCounter binary_integer := 1;
begin
	loop
		insert into table_a(num_col)
		values (v_LoopCounter);
		v_Loopcounter := v_LoopCounter + 1;
		exit when v_LoopCounter &gt; 100;
	end loop;
end;</pre>
<p>&nbsp;</p>
<p>For循环实现相同的功能</p>
<pre name="code" class="sql">declare
	v_LoopCounter binary_integer := 1;
begin
	for v_LoopCounter in 1..50 loop
		insert into table_a(num_col)
		values (v_LoopCounter);
	end loop;
end;</pre>
<p>&nbsp;</p>
<p><strong>7.游标</strong></p>
<p>游标用来查询数据库中的数据（例如select语句返回的记录），并对查询结果进行处理。游标分&ldquo;显示&rdquo;和&ldquo;隐式&rdquo;。通过游标，可对查询结果中的数据一条条进行处理。</p>
<p>下例中，通过游标查询数据库表auths中所有作家的姓名和工资，并将每条记录的值依次传给变量v_Name和v_Salary</p>
<pre name="code" class="sql">declare
	v_Name varchar2(10);
	v_Salary number(8,2);
	--游标定义
	cursor c_auths is 
		select name, salary
		from auths;
begin
	open c_auths;
	loop
		--检索一条记录
		fetch c_auths into v_Name, v_Salary;
		--当所有的记录都被检索出后退出循环
		exit when c_auths%notfound;
		/*对检索出的数据进行处理*/
	end loop;
	--结束处理，关闭游标
	close c_auths;
end;</pre>
<p>&nbsp;</p>
<p><strong>8.块</strong></p>
<p>组成PL/SQL程序的基本单元，一个块可嵌套多个子块。一般一个块用来解决一个问题或一个子问题。<br />标准的块由如下三个独立部分组成：<br /><strong>定义部分（可有可无）：</strong>声明块中所用到的变量，游标，类型。也可声明局部的存储过程和函数。这些过程和函数只在定义它的块中有效。<br /><strong>执行部分（必须）：</strong>由SQL语句和过程性语句构成。<br /><strong>异常处理部分（可有可无）：</strong>处理程序中的错误。错误发生时执行。在PLSQL中，警告或错误信息被称为异常。</p>
<pre name="code" class="sql">结构一：
declare
	定义部分
begin
	可执行部分，在块中必不可少
exception
	异常部分
end;
结构二：
begin
	可执行部分
end;
结构三：
declare
	定义部分
begin
	可执行部分
end;
结构四：
begin
	可执行部分
exception	
	异常处理部分
end;</pre>
<p>&nbsp;<strong>9.变量标识符</strong></p>
<p>字母开头，不超过30字符，不能有空格。<br />带引号的标识符可以有空格，引号不算在30个字符内。</p>
<pre name="code" class="sql">declare
	"author's age" number;
begin
	"author's age" := 21;
	DBMS_OUTPUT.PUT_LINE("author's age");
end;</pre>
<p>变量名不能是保留字。<br />如果使用带绰号的标识符，则可以使用保留字。</p>
<pre name="code" class="sql">declare
	"LOOP" number;</pre>
<p>&nbsp;</p>
<p><strong>10.变量命名习惯</strong></p>
<pre name="code" class="sql">v_variableName 程序变量
e_exceptionName 用户自定义异常
t_typeName 用户自定义类型变量
p_parameterName 存储过程或函数参数变量
c_constantValue 用constant关键字限制的变量</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/228788#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Aug 2008 22:32:47 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/228788</link>
        <guid>http://just4you.javaeye.com/blog/228788</guid>
      </item>
      <item>
        <title>javascript的prototype继承</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/212645" style="color:red;">http://just4you.javaeye.com/blog/212645</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>基本的用法：</p>
<p>把ClassA的一个实例赋值给ClassB ClassB就继承了ClassA的所有属性</p>
<pre name="code" class="js">&lt;script&gt;   
function ClassA(){   
    this.a='a';   
}   
function ClassB(){   
    this.b='b';   
}   
ClassB.prototype=new ClassA();   
var objB=new ClassB();   
for(var p in objB)document.write(p+"&lt;br&gt;");   
&lt;/script&gt;   
</pre>
<p>&nbsp;</p>
<p>从原型继承理论的角度去考虑，js的原型继承是引用原型，不是复制原型，所以，修改原型会导致所有B的实例的变化。</p>
<pre name="code" class="js">&lt;script&gt;   
function ClassA(){   
    this.a='a';   
}   
function ClassB(){   
    this.b='b';   
}   
ClassB.prototype=new ClassA();   
var objB=new ClassB();   
alert(objB.a);   //yx:弹出a
ClassB.prototype.a='changed!!';  //yx:修改原型会导致所有B的实例的变化。 
alert(objB.a);   //yx:弹出changed!!
&lt;/script&gt;   
</pre>
<p>然而，子类对象的写操作只访问子类对象中成员，它们之间不会互相影响。因此，写是写子类，读是读原型（如果子类中没有的话）。 </p>
<pre name="code" class="js">&lt;script&gt;   
function ClassA(){   
    this.a='a';   
}   
function ClassB(){   
    this.b='b';   
}   
ClassB.prototype=new ClassA();   
var objB1=new ClassB();   
var objB2=new ClassB();   
objB1.a='!!!';   //yx:子类对象的写操作只访问子类对象中成员，它们之间不会互相影响。
alert(objB1.a);  //yx:写操作访问子类对象objB1的成员a,将其值修改为!!!，不会对objB2有影响。弹出!!!
alert(objB2.a);  //yx:弹出a
&lt;/script&gt;   
</pre>
<p>每个子类对象都执有同一个原型的引用，所以子类对象中的原型成员实际是同一个。 </p>
<pre name="code" class="js"><pre name="code" class="js">&lt;script&gt;   
function ClassA(){   
    this.a=function(){alert();};   
}   
function ClassB(){   
    this.b=function(){alert();};   
}   
ClassB.prototype=new ClassA();   
var objB1=new ClassB();   
var objB2=new ClassB();  
//yx:每个子类对象都执有同一个原型的引用，所以子类对象中的原型成员实际是同一个。
//yx:子类对象objB1和objB2的原型都为new ClassA()
alert(objB1.a==objB2.a);  //yx:弹出true
//yx:属性b为子类属性
alert(objB1.b==objB2.b);  //yx:弹出false
&lt;/script&gt; </pre>
&nbsp;  
</pre>
<p>构造子类时，原型的构造函数不会被执行&nbsp;。</p>
<pre name="code" class="js">&lt;script&gt;   
function ClassA(){   
    alert("a");   
    this.a=function(){alert('ClassA');};   
}   
function ClassB(){   
    alert("b");   
    this.b=function(){alert('ClassB');};   
}   
ClassB.prototype=new ClassA();  //yx:弹出a 
var objB1=new ClassB();   //yx:只弹出b
var objB2=new ClassB();   //yx:只弹出b
&lt;/script&gt;   
</pre>
<p>接下来是致命的，在子类对象中访问原型的成员对象：</p>
<pre name="code" class="js">&lt;script&gt;   
function ClassA(){   
    this.a=[];   
}   
function ClassB(){   
    this.b=function(){alert('ClassB');};   
}   
ClassB.prototype=new ClassA();   
ClassB.prototype=new ClassA();   
var objB1=new ClassB();   
var objB2=new ClassB();   
objB1.a.push(1,2,3);   //yx:在子类对象中访问原型的成员对象
alert(objB2.a);   //yx:弹出1,2,3
alert(objB1.a);   //yx:弹出1,2,3
//所有b的实例中的a成员全都变了！！（yx:不知为何会“致命”）  
&lt;/script&gt;   </pre>
<p>&nbsp;</p>
<p>所以，在prototype继承中，原型类中<span style="color: #ff0000;">不能有成员对象</span>！所有成员必须是<span style="color: #ff0000;">值类型数据（string也可以）</span>。用prototype继承有执行效率高，不会浪费内存，为父类动态添置方法后子类中马上可见等的优点。 </p>
<p><span style="color: #ff0000;">prototype继承是通过把子类的原型对象（prototype）设置成父类的一个实例来进行继承的。</span></p>
<p>只简单的这样设置继承的确有不少缺点。</p>
<p>总的来说有四个缺点： 　　</p>
<p style="padding-left: 30px;"><strong>缺点一：</strong>父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的，而是在设置继承的时候执行的，并且只执行一次。这往往不是我们希望的，特别是父类的构造函数中有一些特殊操作的情况下。 　　</p>
<p style="padding-left: 30px;"><strong>缺点二：</strong>由于父类的构造函数不是在子类进行实例化时执行，在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于Javascript中继承只发生在&ldquo;获取&rdquo;属性的值时，对于属性的值是String，Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。　　</p>
<p style="padding-left: 30px;"><strong>缺点三：</strong>如果父类的构造函数需要参数，我们就没有办法了。 　　</p>
<p style="padding-left: 30px;"><strong>缺点四：</strong>子类原本的原型对象被替换了，子类本身的constructor属性就没有了。在类的实例取它的constructor属性时，取得的是从父类中继承的constructor属性，从而constructor的值是父类而不是子类。 </p>
<p>我也曾经为了这四个缺点头疼过，于是对prototype继承进行改造。我试了几种方法，下面是我觉得最好的一种。我把它写成Function对象的一个方法，这样用的时候方便。方法如下：</p>
<pre name="code" class="js">//yx:好像和ext里的extend差不多：）   
Function.prototype.Extends = function (parentClass){   
var Bs = new Function();   
Bs.prototype = parentClass.prototype;   
this.prototype = new Bs();   
this.prototype.Super = parentClass;   
this.prototype.constructor = this;   
}   
</pre>
<p>&nbsp;http://www.div-css.com/html/x1/javascript/0224850.html</p>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/212645#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 11:00:38 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/212645</link>
        <guid>http://just4you.javaeye.com/blog/212645</guid>
      </item>
      <item>
        <title>排队等车</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/116713" style="color:red;">http://just4you.javaeye.com/blog/116713</a>&nbsp;
          发表时间: 2007年08月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          头天晚上下班，六点半左右的样子，计划坐362路，就在车站牌下等，这362车比较少，所以有不少人在排队，至少看着像是在排队。因为有一排栅栏挡在前面。<br />车来了。<br />麻辣个B的，一个刚刚到的小伙子动作真是迅速，他从栅栏的旁边绕过了栅栏，抢到了第一或第二或第三的位子到车门口。<br />因为这362车比较少，车上的座位也不多，这时候车上已经没有位子了。真不明白这人还都抢前面干什么，有空座位，你抢先到车门也就罢了，没有，也抢？<br />就不能像我一样，冒充一下有素质的人吗：）着什么急呢，反正早一步上车晚一步上车都是得站着啊。<br />给我的感觉就像是饿了十天半个月的疯狗终于看到了上好的肉。年轻轻的，第一次坐车？<br /><br />唉，不是我没素质，而是谁有素质谁吃亏，我排的好好的，车一来，那没素质的冲上去，嗯，有座，他有份我没份，凭什么我排队还没个座？<br />TNND，我也没素质，我也挤去。<br />在“有素质，上车没座”和“没素质，有个座位”这两者之间，我选择后者。<br />有素质也给逼的没有素质了。<br />要不大家都有素质，只要一个没素质的人在，其他的人也就没素质了。<br />呵呵，就像闯红灯一样，我是闯了，可我不是第一个闯的，我也是看有人闯我也有样学样嘛。<br /><br />PS：362车很省油，倒不是因为这车多高档，而是因为不开空调，下午早早就把空调关了。一车人啊，那个热啊。<br />不如717,我晚上7点，8点回家，都会有空调。<br />鄙视362！<br /><br />咦，外面好像下雨了，不是说没雨嘛。<br />妈妈打电话说石家庄也下的很大。可天气预报上说啥也没有。现在什么有准呢。<br /><br />多年的朋友生孩子了。这算喜事不。只是我不喜欢小孩子。<img src="/images/smiles/icon_cool.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/116713#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 26 Aug 2007 01:05:10 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/116713</link>
        <guid>http://just4you.javaeye.com/blog/116713</guid>
      </item>
      <item>
        <title>备忘：JSP动作</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/111485" style="color:red;">http://just4you.javaeye.com/blog/111485</a>&nbsp;
          发表时间: 2007年08月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          面试遇到的不会的题，很奇怪，现在开发中这些东西还有用的吗？<img src="/images/smiles/icon_cool.gif"/><br /><br />在JSP中的动作指令包括：Include、 Forward、 UseBean、 GetProperty、 SetProperty、 Plugin。 <br /><br />一、Include指令 <br /><br />&lt;jsp:include>标签表示包含一个静态的或者动态的文件。 <br /><br />语法： <br />&lt;jsp:include page="path" flush="true" /> <br />or <br />&lt;jsp:include page="path" flush="true"> <br />&lt;jsp:param name="paramName" value="paramValue" /> <br />&lt;/jsp:include> <br /><br />注： <br />1、page="path" 为相对路径，或者代表相对路径的表达式。 <br />2、flush="true" 必须使用flush为true，它默认值是false。 <br />3、&lt;jsp:param>子句能让你传递一个或多个参数给动态文件，也可在一个页面中使用多个&lt;jsp:param>来传递多个参数给动态文件。 <br /><br />二、Forward指令 <br /><br />&lt;jsp:forward>标签表示重定向一个静态html/jsp的文件，或者是一个程序段。 <br /><br />语法： <br />&lt;jsp:forward page="path"} /> <br />or <br />&lt;jsp:forward page="path"} > <br />&lt;jsp:param name="paramName" value="paramValue" />…… <br />&lt;/jsp:forward> <br /><br />注： <br />1、page="path" 为一个表达式，或者一个字符串。 <br />2、&lt;jsp:param> name 指定参数名，value指定参数值。参数被发送到一个动态文件，参数可以是一个或多个值，而这个文件却必须是动态文件。要传递多个参数，则可以在一个JSP文件中使用多个&lt;jsp:param>将多个参数发送到一个动态文件中。 <br /><br />三、UseBean指令 <br /><br />&lt;jsp:useBean>标签表示用来在JSP页面中创建一个BEAN实例并指定它的名字以及作用范围。 <br /><br />语法： <br />&lt;jsp:useBean id="name" scope="page | request | session | application" typeSpec /> <br />其中typeSpec有以下几种可能的情况： <br />class="className" | class="className" type="typeName" | beanName="beanName" type="typeName" | type="typeName" | <br /><br />注： <br />你必须使用class或type，而不能同时使用class和beanName。beanName表示Bean的名字，其形式为“a.b.c”。 <br /><br />四、GetProperty指令 <br /><br />&lt;jsp:getProperty>标签表示获取BEAN的属性的值并将之转化为一个字符串，然后将其插入到输出的页面中。 <br /><br />语法： <br />&lt;jsp:getProperty name="name" property="propertyName" /> <br /><br />注： <br />1、在使用&lt;jsp:getProperty>之前，必须用&lt;jsp:useBean>来创建它。 <br />2、不能使用&lt;jsp:getProperty>来检索一个已经被索引了的属性。 <br />3、能够和JavaBeans组件一起使用&lt;jsp:getProperty>，但是不能与Enterprise Java Bean一起使用。 <br /><br />五、SetProperty指令 <br /><br />&lt;jsp:setProperty>标签表示用来设置Bean中的属性值。 <br /><br />语法： <br />&lt;jsp:setProperty name="beanName" prop_expr /> <br />其中prop_expr有以下几种可能的情形： <br />property="*" | property="propertyName" | property="propertyName" param="parameterName" | property="propertyName" value="propertyValue" <br /><br />注： <br />使用 jsp:setProperty 来为一个Bean的属性赋值；可以使用两种方式来实现。 <br />1、在jsp:useBean后使用jsp:setProperty： <br />&lt;jsp:useBean id="myUser" … /> <br />… <br />&lt;jsp:setProperty name="user" property="user" … /> <br />在这种方式中，jsp:setProperty将被执行。 <br />2、jsp:setProperty出现在jsp:useBean标签内： <br />&lt;jsp:useBean id="myUser" … > <br />… <br />&lt;jsp:setProperty name="user" property="user" … /> <br />&lt;/jsp:useBean> <br />在这种方式中，jsp:setProperty只会在新的对象被实例化时才将被执行。 <br /><br />* 在&lt;jsp:setProperty>中的name值应当和&lt;jsp:useBean>中的id值相同。 <br /><br />六、Plugin指令 <br /><br />&lt;jsp:plugin>标签表示执行一个applet或Bean，有可能的话还要下载一个Java插件用于执行它。 <br /><br />语法： <br />&lt;jsp:plugin <br />type="bean | applet" <br />code="classFileName" <br />codebase="classFileDirectoryName" <br />[ name="instanceName" ] <br />[ archive="URIToArchive, ..." ] <br />[ align="bottom | top | middle | left | right" ] <br />[ height="displayPixels" ] <br />[ width="displayPixels" ] <br />[ hspace="leftRightPixels" ] <br />[ vspace="topBottomPixels" ] <br />[ jreversion="JREVersionNumber | 1.1" ] <br />[ nspluginurl="URLToPlugin" ] <br />[ iepluginurl="URLToPlugin" ] > <br />[ &lt;jsp:params> <br />[ &lt;jsp:param name="parameterName" value="{parameterValue | &lt;%= expression %>}" /> ]+ <br />&lt;/jsp:params> ] <br />[ &lt;jsp:fallback> text message for user &lt;/jsp:fallback> ] <br />&lt;/jsp:plugin> <br /><br />注： <br />&lt;jsp:plugin>元素用于在浏览器中播放或显示一个对象（典型的就是applet和Bean),而这种显示需要在浏览器的java插件。 <br />当Jsp文件被编译，送往浏览器时，&lt;jsp:plugin>元素将会根据浏览器的版本替换成&lt;object>或者&lt;embed>元素。注意，&lt;object>用于HTML 4.0 ，&lt;embed>用于HTML 3.2。 <br />一般来说，&lt;jsp:plugin>元素会指定对象是Applet还是Bean,同样也会指定class的名字，还有位置，另外还会指定将从哪里下载这个Java插件。
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/111485#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Aug 2007 21:36:19 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/111485</link>
        <guid>http://just4you.javaeye.com/blog/111485</guid>
      </item>
      <item>
        <title>hibernate二级缓存攻略 </title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/110851" style="color:red;">http://just4you.javaeye.com/blog/110851</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate二级缓存也就是听说，可项目中从来没用过 :(所以也不知道效果如何。 <br />找到一篇文章，看着写的挺复杂的，先记下， 有时间得看看这个，可以去骗人<img src="/images/smiles/icon_biggrin.gif"/><br /><br />内容如下：<br />很多人对二级缓存都不太了解，或者是有错误的认识，我一直想写一篇文章介绍一下hibernate的二级缓存的，今天终于忍不住了。 <br />我的经验主要来自hibernate2.1版本，基本原理和3.0、3.1是一样的，请原谅我的顽固不化。<br /><br />hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。<br /><br />二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是 <br />hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider <br />如果使用查询缓存，加上 <br />hibernate.cache.use_query_cache=true<br /><br />缓存可以简单的看成一个Map，通过key在缓存里面找value。<br /><br />Class的缓存 <br />对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置： <br />&lt;cache usage="read-write"/> <br />如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml <br />&lt;cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /> <br />其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。 <br />每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。 <br />当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。 <br />这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为iterate没有什么用，总是会有1+N的问题。 <br />（题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择若干字段，比iterate第一条select id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是list快。） <br />如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了<br /><br />查询缓存 <br />首先需要配置hibernate.cache.use_query_cache=true <br />如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了 <br />&lt;cache name="net.sf.hibernate.cache.StandardQueryCache" <br />maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600" <br />timeToLiveSeconds="7200" overflowToDisk="true"/> <br />&lt;cache name="net.sf.hibernate.cache.UpdateTimestampsCache" <br />maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/> <br />然后 <br />query.setCacheable(true);//激活查询缓存 <br />query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选 <br />第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它： <br />&lt;cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /> <br />如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache<br /><br />对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。 <br />比如hql： <br />from Cat c where c.name like ? <br />生成大致如下的sql： <br />select * from cat c where c.name like ? <br />参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）： <br />select * from cat c where c.name like ? , parameter:tiger% <br />这样，保证了同样的查询、同样的参数等条件下具有一样的key。 <br />现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 <br />可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。 <br />这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是list方法也可能遇到1+N的问题！相同条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意了。<br /><br />另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。<br /><br />当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？ <br />hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。 <br />当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。 <br />可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。<br /><br />Collection缓存 <br />需要在hbm的collection里面设置 <br />&lt;cache usage="read-write"/> <br />假如class是Cat，collection叫children，那么ehcache里面配置 <br />&lt;cache name="com.xxx.pojo.Cat.children" <br />maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" <br />overflowToDisk="true" /> <br />Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。 <br />这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。<br /><br />缓存策略 <br />只读缓存（read-only）：没有什么好说的 <br />读/写缓存（read-write）:程序可能要的更新数据 <br />不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好 <br />事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过<br /><br />读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。 <br />在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。 <br />不严格读写缓存不锁定缓存中的数据。<br /><br />使用二级缓存的前置条件 <br />你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的，但是据说3.1已经解决了这个问题。 <br />这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。 <br />SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是： <br />void evict(Class persistentClass) <br />Evict all entries from the second-level cache. <br />void evict(Class persistentClass, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictCollection(String roleName) <br />Evict all entries from the second-level cache. <br />void evictCollection(String roleName, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictQueries() <br />Evict any query result sets cached in the default query cache region. <br />void evictQueries(String cacheRegion) <br />Evict any query result sets cached in the named query cache region. <br />不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用evictQueries(String cacheRegion)移除了3个查询缓存，然后用evict(Class persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？<br /><br />----------------------------------------------------<br /><br />总结： <br />不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。 <br />如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。 <br />在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。<br /><br />终于写完了，好累……<br /><br /> <br /><br /><br />Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1653308
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/110851#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Aug 2007 13:39:25 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/110851</link>
        <guid>http://just4you.javaeye.com/blog/110851</guid>
      </item>
      <item>
        <title>CSS盒模型</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/109855" style="color:red;">http://just4you.javaeye.com/blog/109855</a>&nbsp;
          发表时间: 2007年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CSS2中的盒模型是关系到我们排版定位的关键，例如&lt;div>就遵循盒模型规范。盒模型定义的margin，background-color，background-image，padding ，content，border，初学者经常会搞不清楚它们之间的层次、关系和相互影响。<br /><br />width应该是指从border的外边框开始计算的宽度，margin的宽度不计算在width内。好像有时候也不准:(<br /><img src="http://www.w3cn.org/article/tips/2004/images/cssbox3d.gif" /><br /><img src="http://www.blue1000.com/upload/2006_04/060407213789391.png" />
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/109855#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 07 Aug 2007 21:27:30 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/109855</link>
        <guid>http://just4you.javaeye.com/blog/109855</guid>
      </item>
      <item>
        <title>javascript数字全角转半角</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/105817" style="color:red;">http://just4you.javaeye.com/blog/105817</a>&nbsp;
          发表时间: 2007年07月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先放上。<br /><pre name="code" class="js">
&lt;!doctype html public "-//w3c//dtd html 4.0 transitional//en">
&lt;html>
 &lt;head>
  &lt;title> new document &lt;/title>
  &lt;meta name="generator" content="editplus">
  &lt;meta name="author" content="">
  &lt;meta name="keywords" content="">
  &lt;meta name="description" content="">
 &lt;/head>

 &lt;body>

 &lt;script>
	function convertNum(fullNum){
		var fullNums = "０１２３４５６７８９";
		var halfNums = "0123456789";
		var index;
		alert("fullNum is " + fullNum);
		if ((index = halfNums.indexOf(fullNum))>0){
			alert("I am a half num! and I will return directly");
			return fullNum;
		}
		if ((index = fullNums.indexOf(fullNum))>0){
			alert("I am a full numm! and I will return after convert");
			return halfNums.charAt(index);
		}
		return NaN;
	}

	function checkNum(str,len){
		alert("In checkNum ,str is " + str);
		var result = "";
		for(var i=0;i&lt;str.length;i++){
			alert("str[" + i + "] is " + str.charAt(i));
			result +=convertNum(str.charAt(i));
		}
		alert("result is " + result + "result length is " + result.length);
		var pattern = "/\\d{" + len + "}/";
		alert("pattern is " + pattern);
		if (null == result.match(eval(pattern))){
			return false;
		}
		return true;
	}
	
	function doCheck(){
		var num = document.getElementById("nn").value;
		alert("In doCheck,num is " + num);
		if(!checkNum(num,8)){
			alert("Not a num!!!!");
		} else {
			alert("Is a num!!!!");
		}
	}
 &lt;/script>
  &lt;input type="text" value="" id="nn" maxLength="8">
 &lt;input type="button" value="doCheck" onclick="doCheck();">
 &lt;/body>
&lt;/html>
</pre><br /><br />检查输入的时间是否是正确的时间，输入格式为（YYYYMMDD）<br /><pre name="code" class="js">
&lt;!doctype html public "-//w3c//dtd html 4.0 transitional//en">
&lt;html>
 &lt;head>
  &lt;title> new document &lt;/title>
  &lt;meta name="generator" content="editplus">
  &lt;meta name="author" content="">
  &lt;meta name="keywords" content="">
  &lt;meta name="description" content="">
 &lt;/head>

 &lt;body>
  &lt;input type="text" value="" id="dd">
  &lt;input type="button" onclick="checkDate();">
  &lt;script>

	function checkDate(){
		var inputDate = document.getElementById("dd").value;
		var y = parseInt(inputDate.substring(0,4),10);
		var m = parseInt(inputDate.substring(4,6),10) - 1;		
		var d = parseInt(inputDate.substring(6,8),10);
		var dt = new Date(y,m,d);
		if(dt.getFullYear() != y || dt.getMonth() != m || dt.getDate() != d){
			alert("wrong");
			return false;
		}
		alert("current");
		return true;
	}
  &lt;/script>
 &lt;/body>
&lt;/html>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/105817#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jul 2007 17:24:38 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/105817</link>
        <guid>http://just4you.javaeye.com/blog/105817</guid>
      </item>
      <item>
        <title>备忘：oracle的rownum及分页</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/77599" style="color:red;">http://just4you.javaeye.com/blog/77599</a>&nbsp;
          发表时间: 2007年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          程序里常常会遇到分页的问题，因为用hibernate，所以一直就是用setMaxResult(),setFirstResult()之类的来搞定，可万一不让用hibernate怎么办？直接用SQL怎么搞定呢？<br />网上找找呗<img src="/images/smiles/icon_biggrin.gif"/><br />以下为找到的东东<img src="/images/smiles/icon_lol.gif"/><br /><br /><strong>解析oracle的rownum</strong> <br />对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号，返回的第一行分配的是1，第二行是2，依此类推，这个伪字段可以用于限制查询返回的总行数，而且rownum不能以任何表的名称作为前缀。<br /> 举例说明：<br />例如表：student(学生)表，表结构为：<br /><pre name="code" class="sql">
ID　　　    char(6)　　　　　 --学号
name　　　　VARCHAR2(10)　　　--姓名 
create table student (ID char(6), name VARCHAR2(100));
insert into sale values('200001',‘张一’);
insert into sale values('200002',‘王二’);
insert into sale values('200003',‘李三’);
insert into sale values('200004',‘赵四’);
commit;
</pre><br /><strong>(1) rownum 对于等于某值的查询条件</strong><br />如果希望找到学生表中第一条学生的信息，可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息，使用rownum=2结果查不到数据。因为rownum都是从1开始，但是1以上的自然数在rownum做等于判断是时认为都是false条件，所以无法查到rownum = n（n>1的自然数）。<br /><pre name="code" class="sql">
SQL> select rownum,id,name from student where rownum=1;（可以用在限制返回记录条数的地方，保证不出错，如：隐式游标）
SQL> select rownum,id,name from student where rownum=1;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         1 200001 张一
SQL> select rownum,id,name from student where rownum =2; 
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
</pre><br /><strong>(2)rownum对于大于某值的查询条件</strong><br />   如果想找到从第二行记录以后的记录，当使用rownum>2是查不出记录的，原因是由于rownum是一个总是从1开始的伪列，Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立，所以查不到记录<br /><pre name="code" class="sql">
SQL> select rownum,id,name from student where rownum >2;
ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
</pre><br />那如何才能找到第二行以后的记录呀。可以使用以下的子查询方法来解决。注意子查询中的rownum必须要有别名，否则还是不会查出记录来，这是因为rownum不是某个表的列，如果不起别名的话，无法知道rownum是子查询的列还是主查询的列。<br /><pre name="code" class="sql">
SQL>select * from(select rownum no ,id,name from student) where no>2;
        NO ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         4 200004 赵四
SQL> select * from(select rownum,id,name from student)where rownum>2;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
</pre><br /><strong>(3)rownum对于小于某值的查询条件</strong><br />如果想找到第三条记录以前的记录，当使用rownum&lt;3是能得到两条记录的。显然rownum对于rownum&lt;n（(n>1的自然数）的条件认为是成立的，所以可以找到记录。<br /><pre name="code" class="sql">
SQL> select rownum,id,name from student where rownum &lt;3;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
        1 200001 张一
        2 200002 王二
</pre><br />综上几种情况，可能有时候需要查询rownum在某区间的数据，那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的，rownum对于大于某值的查询条件直接认为是false的，但是可以间接的让它转为认为是true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据，包括第二行和第三行数据，那么我们只能写以下语句，先让它返回小于等于三的记录行，然后在主查询中判断新的rownum的别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。<br /><pre name="code" class="sql">
SQL> select * from (select rownum no,id,name from student where rownum&lt;=3 ) where no >=2;
        NO ID     NAME
---------- ------ ---------------------------------------------------
         2 200002 王二
         3 200003 李三
</pre><br /><strong>(4)rownum和排序</strong><br />Oracle中的rownum的是在取数据的时候产生的序号，所以想对指定排序的数据去指定的rowmun行数据就必须注意了。<br /><pre name="code" class="sql">
SQL> select rownum ,id,name from student order by name;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         2 200002 王二
         1 200001 张一
         4 200004 赵四
</pre><br />可以看出，rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号，rowid也是顺序分配的。为了解决这个问题，必须使用子查询<br /><pre name="code" class="sql">
SQL> select rownum ,id,name from (select * from student order by name);
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         1 200003 李三
         2 200002 王二
         3 200001 张一
         4 200004 赵四
</pre><br />这样就成了按name排序，并且用rownum标出正确序号（有小到大）<br /><br /><strong>一个例子</strong><br />取出100-150条记录,<br /><pre name="code" class="sql">
select tname,tabtype from (
   select tname,tabtype,rownum rn from tab where rownum &lt;= 150
)
where rn >= 100;
</pre><br />如果按某一列排序的话，好像就又复杂一些。<br /><pre name="code" class="sql">
select tname,tabtype from (select tname,tabtype,rownum rn from(select * from tab order by tname)where rownum &lt;=150) where rn>=100;
</pre><br />要点就是要把数据先处理完成，再用rownum来处理。
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/77599#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 May 2007 22:25:31 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/77599</link>
        <guid>http://just4you.javaeye.com/blog/77599</guid>
      </item>
      <item>
        <title>备忘：JSP 中的隐含对象</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/77380" style="color:red;">http://just4you.javaeye.com/blog/77380</a>&nbsp;
          发表时间: 2007年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一共9个，不太常用，一般都用JSTL什么的了，不过还是记一下吧。<br />面试题中就出现了，而且我正好不会，郁闷<img src="/images/smiles/icon_sad.gif"/><br />隐含对象　　　　　　　　　　　　　类型<br />request　　　　　　　　　　javax.servlet.HttpServletRequest<br />response　　　　　　　　　 javax.servlet.HttpServletResponse<br />pageContext　　　　　　　　javax.servlet.jsp.PageContext<br />application　 　　　　　　　javax.servlet.ServletContext<br />out 　　　　　　　　　　　　javax.servlet.jsp.JspWriter<br />config　　　　　　　　　　　javax.servlet.ServletConfig<br />page　　　　　　　　　　　　java.lang.Object（相当于Java中的this关键字）<br />session　　　　　　　　　　javax.servlet.http.HttpSession<br />exception	　　　　　　　　　java.lang.Exception
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/77380#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 May 2007 16:34:21 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/77380</link>
        <guid>http://just4you.javaeye.com/blog/77380</guid>
      </item>
      <item>
        <title>备忘：Tomcat笔记</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/77374" style="color:red;">http://just4you.javaeye.com/blog/77374</a>&nbsp;
          发表时间: 2007年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>基础的东东：</strong><br />Tomcat作为servlet容器，负责处理客户请求，把请求传送给Servlet并把结果返回给客户。<br />当客户请求访问茉个Servlet时，Servlet容器将创建一个servletRequest对象和servletResponse对象。在ServletRequest对象中封装了客户请求信息，然后Servlet容器把servletRequest对象和servletResponse对象付给客户所请求的servlet。servlet把响应结果写到servletResponse中，然后由servlet容器把响应结果传给客户。<br />tomcat由一系列可配置组件构成。核心组件是Catalina Servlet容器，它是所有其他组件的顶层容器。tomcat组件可在&lt;CATALINA_HOME>/conf/server.xml文件中配置。每个组件对应server.xml中的一种配置元素。<br />server.xml结构：<br /><pre name="code" class="xml">
&lt;!-- &lt;Server>元素：代表整个Catalina Servlet容器，是Tomcat实例的顶层元素。可包含一个或多个&lt;Service>元素。-->
&lt;Server>
	&lt;!-- &lt;Service>元素：包含一个&lt;Engine>元素，以及一个或多个&lt;Connector>元素，这些&lt;Connector>元素共享同一个&lt;Engine>元素。-->
	&lt;Service>
		&lt;!-- &lt;Connector>元素：代表和客户程序实际交互的组件，负责接收客户请求，以及向客户返回响应结果。-->
		&lt;Connector/>
		&lt;!-- &lt;Engine>元素：每个&lt;Service>只能包含一个&lt;Engine>元素。&lt;Engine>元素处理在同一个&lt;Service>中所有&lt;Connector>元素接收到的客户请求。-->
		&lt;Engine>
			&lt;!-- &lt;Host>元素：一个&lt;Engine>元素中可包含多个&lt;Host>元素，每个&lt;Host>元素定义一个虚拟主机，它可以包含一个或多个WEB应用。-->
			&lt;Host>
				&lt;!-- &lt;Context>元素：使用最频繁的元素。每个&lt;context>元素代表了运行在虚拟主机上的单个WEB应用，一个&lt;Host>可包含多个&lt;Context>元素。-->
				&lt;Context>&lt;/Context>
			&lt;/Host>
		&lt;/Engine>
	&lt;/Service>
&lt;/Server>
</pre><br /><br /><strong>Linux中安装tomcat</strong><br />安装JDK。假定JDK安装在/home/java/j2sdk1.4.2目录下。<br />解压Tomcat，假定解压到/home/tomcat目录下。<br />设定环境变量：JAVA_HOME和CATALINA_HOME。<br />JAVA_HOME=/home/java/j2sdk1.4.2;export JAVA_HOME<br />CATALINA_HOME=/home/tomcat;export CATALINA_HOME<br /><br /><strong>修改HTTP端口</strong><br />tomcat采用的HTTP端口为“8080”，想采用HTTP端口“80”，修改&lt;CATALINA_HOME>/conf/server.xml，将&lt;Connector>元素的port属性值改为“80”，重启tomcat。<br /><br /><strong>Tomcat目录</strong><br />/server/lib下的JAR文件只可被tomcat服务器访问<br />/shared/lib 下的JAR文件可被所有的WEB应用访问，不能被tomcat访问<br />/common/lib 下的JAR文件可被tomcat和所有WEB应用访问<br />在WEB应用的WEB-INF下也可建立lib目录，放各种JAR文件，这些文件只能被当前WEB应用访问。<br /><br /><strong>Tomcat配置虚拟主机</strong><br />server.xml中，Host元素代表虚拟主机。同一个Engine元素下可配置多个虚拟主机。<br />如：两个公司的WEB应用都发布在同一个tomcat下，可为每家公司分别创建一个虚拟主机，主机名分别为：<br />www.mycompany1.com，www.mycompany2.com。<br />当用户 访问以上两个WEB应用时，就好像这两个应用分别拥有各自的主机。还可以建立虚拟主机的别名。如希望客户访问www.mycompany1.com或mycompany1.com都能连接到同一个WEB，就可以把mycompany1.com做为虚拟主机的别名来处理。<br />配置www.mycompany1.com虚拟主机<br /><strong>1.</strong>打开server.xml文件，在&lt;Engine>下有一个名为localhost的&lt;Host>元素，在&lt;/Host>后加入新的&lt;Host>元素。<br /><pre name="code" class="xml">
&lt;Host name="www.mycompany1.com" debug="0" appBase="c:\mycompany1" unpackWAR="true" autoDeploy="true">	
	&lt;alias>mycompany1.com&lt;/alias>
	&lt;alias>mycompany1&lt;/alias>
	&lt;Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true"/>
&lt;/Host>
</pre><br />Host属性<br />name：虚拟主机名字<br />debug：日志级别<br />appBase：虚拟主机目录，可指定绝对目录，也可相对于&lt;CATALINA_HOME>根目录，无设定则默认为&lt;CATALINA_HOME>/webapps<br />unpackWAR：是否先展开为目录结构后再运行<br />aotuDeply：自动发布<br />alias：虚拟主机别名，可指定多个别名<br />deployOnStartup：默认值为true。为true的话，则tomcat在启动上会自动发布appBase下的所有WEB应用。如果WEB应用在server.xml中没有相应的&lt;Context>元素，则采用默认的Context配置。<br /><strong>2.</strong>把WEB应用复制到appBase指定的目录下。<br /><strong>3.</strong>在DNS服务器上注册以上的虚拟主机名和别名。使IP地址都指向tomcat所在的机器。注册以下名字：<br />www.mycompany1.com<br />mycompany1.com<br />mycompany1<br /><strong>4.</strong>重启tomcat<br /><br />孙卫琴.Tomcat与Java.Web开发技术详解
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/77374#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 May 2007 15:06:25 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/77374</link>
        <guid>http://just4you.javaeye.com/blog/77374</guid>
      </item>
      <item>
        <title>备忘：SimpleDateFormat类</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/77007" style="color:red;">http://just4you.javaeye.com/blog/77007</a>&nbsp;
          发表时间: 2007年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="/images/smiles/icon_sad.gif"/>无聊的五一做无聊的事。<br />这个类的用法总是忘记，写一下，应该不要再忘了吧。<br />老了，这么简单的东西都记不住<img src="/images/smiles/icon_cry.gif"/><br />很简单的东东，也是很无聊，唉，没办法。<br /><pre name="code" class="java">
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
SimpleDateFormat函数语法：

G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符 
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区
*/


public class FormatDateTime {

	public static final String LONG_DATE_STRING = "yyyy年MM月dd日 a HH时mm分ss秒 E ";
	
	public static final String SHORT_DATE_STRING = "yy年MM月dd日 HH时mm分";
	
	public static final String LONG_TIME_STRING = "HH mm ss SSSS";
	
	public static final String SHORT_TIME_STRING = "yy/MM/dd HH:mm";
	
	public static String toLongDateString(){
		return toLongDateString(new Date());
	}

	public static String toLongDateString(Date d){		
		return dateToString(d,LONG_DATE_STRING);		
	}
	
	public static String toShortDateString(){
		return toShortDateString(new Date());
	}
	
	public static String toShortDateString(Date d){
		return dateToString(d,SHORT_DATE_STRING);
	}
	
	public static String toLongTimeString(){
		return toLongTimeString(new Date());
	}
	
	public static String toLongTimeString(Date d){
		return dateToString(d, LONG_TIME_STRING);
	}
	
	public static String toShortTimeString(){
		return toShortTimeString(new Date());
	}
	public static String toShortTimeString(Date d){
		return  dateToString(d, SHORT_TIME_STRING);
	}
	
	public static String dateToString(String pattern){
		return dateToString(new Date(),pattern);
	}
	
	public static String dateToString(Date d, String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(d);
	}
	
	public static Date stringToDate(String s,String pattern){
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		Date d = null;
		try {
			d = sdf.parse(s);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return d;
	}
	
	public static void main(String[] args){
		System.out.println(FormatDateTime.toLongDateString());
		System.out.println(FormatDateTime.dateToString("yyyy-MM-dd"));
		System.out.println(FormatDateTime.dateToString(FormatDateTime.SHORT_DATE_STRING));
	
		System.out.print("DATE -> STRING......");
		Date now = new Date();
		System.out.println("Date is " + now.toString());
		String ds = FormatDateTime.dateToString(now, FormatDateTime.LONG_DATE_STRING);
		System.out.println(ds);
		System.out.print("STRING -> DATE......");
		Date d = FormatDateTime.stringToDate(ds,FormatDateTime.LONG_DATE_STRING);
		System.out.println("Date is " + d.toString());
	}
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/77007#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 May 2007 21:22:57 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/77007</link>
        <guid>http://just4you.javaeye.com/blog/77007</guid>
      </item>
      <item>
        <title>备忘：显示时间的JS</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/76966" style="color:red;">http://just4you.javaeye.com/blog/76966</a>&nbsp;
          发表时间: 2007年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="/images/smiles/icon_sad.gif"/>无聊的五一做无聊的事。<br /><pre name="code" class="js">
&lt;html>
&lt;head>
&lt;title> 显示年月日还有时间 &lt;/title>
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312">
&lt;script>
function date(){
	//arguments JS自带的变量
	this.length = arguments.length;
	for(var  i= 0; i &lt; this.length; i ++){
		this[i] = date.arguments[i];
	}
}

function displaytime(){	
	var d  = new Date();
	var h = d.getHours();
	var m = d.getMinutes();
	var s = d.getSeconds();
	//无聊，所以把时间分的细一点，看着比较专业：）
	//0-2 午夜 2-5 凌晨 5-9 早上 9-12 上午 12-14 中午 14-18 下午 18-24 晚上	
	var ampm = "上午";
	if (h >= 0 && h &lt; 2) ampm = "午夜";
	if (h >= 2 && h &lt; 5) ampm = "凌晨";
	if (h >= 5 && h &lt; 9) ampm = "早上";
	if (h >= 9 && h &lt; 12) ampm = "上午";
	if (h >= 12 && h &lt; 14) ampm = "中午";
	if (h >= 14 && h &lt; 18) ampm = "下午";
	if (h >= 18) ampm = "晚上";
	//12小时制
	if (h >12) h -= 12;
	//补0
	if (m &lt; 10) m = "0" + m;
	//补0
	if (s &lt; 10) s = "0" + s;
	var time = ampm + h + ":" + m + ":" + s;
	//年月日和星期
	var day  = new date("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
	var ymd = d.getYear() + "年" + (d.getMonth() + 1) + "月" + d.getDate() + "日" +  day[d.getDay()];
	//取得显示位置
	var tiemarea = document.getElementById("timearea");
	timearea.innerHTML = ymd + "  "  + time;

	setTimeout("displaytime()",1000);
}
//setInterval("displaytime()",1000);
//上面的setInterval作用同setTimeout，使用setTimeout的话需要在body处onload="displaytime();"
//5.21修改：用setInterval的话，在页面下载完JS后便会执行，可此时&lt;div id="timeare"/>还没有被载入，getElementById("timearea")会找不到对象，所以还是用setTimeout()和onload吧。
//在onload时调用setInterval()应该也可以，不过没有试用
&lt;/script>
&lt;style type="text/css">
#timearea{
	font-size:14px;
	color:red;
	font-weight:bold;
}
&lt;/style>
&lt;/head>
&lt;body onload="displaytime();">
&lt;div id="timearea">time&lt;/div>
&lt;/body>
&lt;/html>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/76966#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 May 2007 12:27:46 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/76966</link>
        <guid>http://just4you.javaeye.com/blog/76966</guid>
      </item>
      <item>
        <title>导航菜单竖排</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/76769" style="color:red;">http://just4you.javaeye.com/blog/76769</a>&nbsp;
          发表时间: 2007年05月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是昨天的导航菜单的继续，改了改样式表，HTML里的DIV布局没有动，只对导航文字有一点点的修改，就能竖排了：）<br />就只贴HTML吧，JS和原来一样，不贴了。<br /><pre name="code" class="js">
&lt;html>
&lt;head>
&lt;title> 仿chinaz导航 &lt;/title>
&lt;script type="text/javascript" src="myjs.js">&lt;/script>
&lt;style type="text/css">
.global_nav{
	margin:0;
	border:1px solid #ccc;
	width:750px;
	height:240px;
	/*overflow:hidden;*/
}
.nav_main{
	float:left;
	width:80px;
	height:240px;
	margin:0px;
	/*overflow:hidden;*/
}
.nav_main ul{
	margin:0px;
}
.nav_main li{
	float:left;
	text-align:center;
	list-style:none;
}
.nav_current{
	border-top:1px solid black;
	border-left:1px solid black;
	border-bottom:1px solid black;
	display:block;
	font-size:14px;
	font-weight:bold;
	color:green;
	width:80px;
	height:30px;
	margin:0px 0px 0px 0px;
	padding:7px 0px 0px 0px;	
	text-decoration:none;
	background-color:#e6e6e6;
	overflow:hidden;
}
.nav_link{
	display:block; /*目前不能理解其内涵:(*/
	border-right:1px solid black;
	font-size:14px;
	width:80px;
	height:30px;
	padding:7px 0px 0px 0px;
	margin:0px 0px 0px 0px;
	text-decoration:none;
}
.nav_sub{
	float:left;
	width:80px;
	height:260px;
	text-align:left;
	font-size:12px;
}
.sub_box{
	float:left;
	width:80px;
	height:240px;
	margin:0px;
	border-top:1px solid black;
	border-right:1px solid black;
	border-bottom:1px solid black;
	background-color:#E6E6E6;
}
.nav_sub li{
	float:left;
	height:20px;
	width:74px;
	margin:3px 0px 3px 0px;
	padding:0px 5px 0px 5px;
	text-align:center;
	list-style:none;
}
.nav_sub ul{
	margin:5px 0px 0px 0px;
}
.dis{
	display:block;
}
.undis{
	display:none;
}
.nav_current a:link,.nav_current a:visited{
	color:green;
	text-decoration:none;
}
.nav_current a:hover{
	color:red;
	text-decoration:none;
}
.nav_link a:link,.nav_link a:visited,.nav_link a:hover{
	color:blue;
	text-decoration:none;
}
.nav_sub li a:link,.nav_sub li a:visited,{
	color:blue;
	text-decoration:none;
}
.nav_sub li a:hover{
	color:blue;
	text-decoration:none;
	/*background-color:red;*/
}
&lt;/style>
&lt;/head>

&lt;body>
&lt;a href="#">link&lt;/a>
&lt;div class="global_nav">
	&lt;div class="nav_main">
		&lt;ul>
			&lt;li>&lt;span id="nav1" class="nav_current" onmouseover="doClick(this);">&lt;a href="#">首 页&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav2" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">站长在线&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav3" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">网站运营&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav4" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">联盟资讯&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav5" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">新闻资讯&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav6" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">设计在线&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav7" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">网络编程&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav8" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">服 务 器&lt;/a>&lt;/span>&lt;/li>
		&lt;/ul>
	&lt;/div>
	&lt;div class="nav_sub">
		&lt;div class="sub_box dis" id="sub1">
			&lt;ul>
				 &lt;li>&lt;strong>热点通告&lt;/strong>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub2">
			&lt;ul>
				&lt;li>&lt;a href="#">好站推荐&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">站长聚会&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">站长访谈&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">站长茶馆&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">网站排行&lt;/a>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub3">
			&lt;ul>
				&lt;li>&lt;a href="#">建站经验&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">策划盈利&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">搜索优化&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">网站推广&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">免费资源&lt;/a>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub4">
			&lt;ul>
				&lt;li>&lt;a href="#">联盟新闻&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">联盟介绍&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">联盟点评&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">网赚技巧&lt;/a>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub5">
			&lt;ul>
				&lt;li>&lt;a href="#">业界动态&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">收购融资&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">门户动态&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">搜索引擎&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">网络游戏&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">电子商务&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">广告传媒&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">厂商开发&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub6">
			&lt;ul>
				&lt;li>&lt;a href="#">酷站推荐&lt;/a> &lt;/li>
				&lt;li>&lt;a href="#">网页设计&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">WEB标准&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">视频处理&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">设计活动&lt;/a>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub7">
			&lt;ul>
				&lt;li>&lt;a href="#">Asp编程&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Php编程&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">.Net编程&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Xml编程&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Access&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Mssql&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Mysql&lt;/a>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub8">
			&lt;ul>
				&lt;li>&lt;a href="#">Web服务器&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Ftp服务器&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Mail服务器&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Dns服务器&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Win服务器&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">Linux服务器&lt;/a>&lt;/li>
				&lt;li>&lt;a href="#">安全防护&lt;/a>&lt;/li>
			&lt;/ul>
		&lt;/div>
	&lt;/div>
&lt;/div>
&lt;/body>
&lt;/html>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/76769#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 May 2007 10:33:19 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/76769</link>
        <guid>http://just4you.javaeye.com/blog/76769</guid>
      </item>
      <item>
        <title>导航菜单横排</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/76533" style="color:red;">http://just4you.javaeye.com/blog/76533</a>&nbsp;
          发表时间: 2007年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          “五一”不能闲着，看有什么东东就整理一下吧。<br />老了，脑袋什么也记不住了，写下来，想不起来的时候也有个参考：（<br />这是抄来的“中国站长站”的导航栏，记下，说不定什么时候用到。<br />看着人家的代码，我基本上是手写了一遍，不过还是有一点点点的收获的：）<br />不过也有不足，导航的大类和小类之间的线不知道怎么除去，难道只能用图片了吗：（<br />PS：5.2晚上没睡的时候想了想，修改了一下CSS，线除去了，呵呵，也算小小的收获：）<br /><br /><pre name="code" class="js">
&lt;html>
&lt;head>
&lt;title> 仿chinaz导航 &lt;/title>
&lt;script type="text/javascript" src="myjs.js">
&lt;/script>
&lt;style type="text/css">
.global_nav{
	margin:0;
	border:1px solid #ccc;
	width:750px;
	height:60px;
	/*overflow:hidden;*/
}
.nav_main{
	width:720px;
	height:30px;
	margin:0px 0px 0px 15px;
	overflow:hidden;	
}
.nav_main ul{
	margin:0px;
}
.nav_main li{
	float:left;
	text-align:center;
	list-style:none;
}
.nav_current{
	border-top:1px solid black;
	border-left:1px solid black;
	border-right:1px solid black;
	display:block;
	font-size:14px;
	font-weight:bold;
	color:green;
	width:90px;
	height:28px;/*5.2修改*/
	margin:4px 0 0px 0;
	padding:5px 0 3px 0;	
	text-decoration:none;
	background-color:#e6e6e6;
	overflow:hidden;
}
.nav_link{
	border-bottom:1px solid black;
	font-size:14px;
	width:90px;
	height:26px;/*5.2修改*/
	padding:5px 0 2px 0;
	margin:4px 0 0 0;
	text-decoration:none;
}
.nav_sub{
	height:30px;
	text-align:left;
	font-size:12px;
	margin:0 0 0 15px;	
}
.sub_box{
	float:left;
	width:720px;
	height:30px;
	margin:0 0 0 0;
	border-left:1px solid black;/*5.2修改*/
	border-right:1px solid black;/*5.2修改*/
	border-bottom:1px solid black;/*5.2修改*/
	background-color:#E6E6E6;
}
.nav_sub li{
	float:left;
	display:inline;
	height:20px;
	margin:0;
	padding:0px 5px 0px 5px;
	list-style:none;	
}
.nav_sub ul{
	margin:10px 0 0 0;
}
.dis{
	display:block;
}
.undis{
	display:none;
}
.nav_current a:link{
	color:green;
	text-decoration:none;
}
.nav_current a:visited{
	color:green;
	text-decoration:none;
}
.nav_current a:hover{
	color:red;
	text-decoration:none;
}
.nav_link a:link,.nav_link a:visited,.nav_link a:hover{
	color:blue;
	text-decoration:none;
}
.nav_sub li a:link,.nav_sub li a:visited,{
	color:blue;
	text-decoration:none;
}
.nav_sub li a:hover{
	color:blue;
	text-decoration:none;
	/*background-color:red;*/
}
&lt;/style>
&lt;/head>
&lt;body>
&lt;a href="#">link&lt;/a>
&lt;div class="global_nav">
	&lt;div class="nav_main">
		&lt;ul>
			&lt;li>&lt;span id="nav1" class="nav_current" onmouseover="doClick(this);">&lt;a href="#">首 页&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav2" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">站长在线&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav3" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">网站运营&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav4" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">联盟资讯&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav5" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">新闻资讯&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav6" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">设计在线&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav7" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">网络编程&lt;/a>&lt;/span>&lt;/li>
			&lt;li>&lt;span id="nav8" class="nav_link" onmouseover="doClick(this);">&lt;a href="#">服 务 器&lt;/a>&lt;/span>&lt;/li>
		&lt;/ul>
	&lt;/div>
	&lt;div class="nav_sub">
		&lt;div class="sub_box dis" id="sub1">
			&lt;ul>
				 &lt;li>&lt;strong>热点通告：&lt;/strong>&lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub2">
			&lt;ul>
				&lt;li>&lt;a href="#">好站推荐&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">站长聚会&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">站长访谈&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">站长茶馆&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">网站排行&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub3">
			&lt;ul>
				&lt;li>&lt;a href="#">建站经验&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">策划盈利&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">搜索优化&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">网站推广&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">免费资源&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub4">
			&lt;ul>
				&lt;li>&lt;a href="#">联盟新闻&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">联盟介绍&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">联盟点评&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">网赚技巧&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub5">
			&lt;ul>
				&lt;li>&lt;a href="#">业界动态&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">收购融资&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">门户动态&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">搜索引擎&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">网络游戏&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">电子商务&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">广告传媒&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">厂商开发&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub6">
			&lt;ul>
				&lt;li>&lt;a href="#">酷站推荐&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">网页设计&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">WEB标准&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">视频处理&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">设计活动&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub7">
			&lt;ul>
				&lt;li>&lt;a href="#">Asp编程&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Php编程&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">.Net编程&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Xml编程&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Access&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Mssql&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Mysql&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
		&lt;div class="sub_box undis" id="sub8">
			&lt;ul>
				&lt;li>&lt;a href="#">Web服务器&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Ftp服务器&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Mail服务器&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Dns服务器&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Win服务器&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">Linux服务器&lt;/a>　| &lt;/li>
				&lt;li>&lt;a href="#">安全防护&lt;/a> &lt;/li>
			&lt;/ul>
		&lt;/div>
	&lt;/div>
&lt;/div>
&lt;/body>
&lt;/html>
</pre><br />myjs.js文件<br /><pre name="code" class="js">
function doClick(o){
	//变量o指向触发monseover事件的对象，这里是&lt;span/>元素
	//修改&lt;span/>元素的class属性
	 o.className="nav_current";
	 var j;
	 var id;
	 var e;
	 for(var i=1;i&lt;=8;i++){
	   id ="nav"+i;
	   //取得元素
	   j = document.getElementById(id);
	   //取得子栏目的元素
	   e = document.getElementById("sub"+i);
	   //循环，如果id值与当前&lt;span/>元素的id属性值不同，就修改对应元素的class属性值，同时把对应的sub栏目的可见性设置为none
	   if(id != o.id){
	   	 j.className="nav_link";
	   	 e.style.display = "none";
	   }else{
			e.style.display = "block";
	   }
	 }
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/76533#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 May 2007 17:39:37 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/76533</link>
        <guid>http://just4you.javaeye.com/blog/76533</guid>
      </item>
      <item>
        <title>花点时间搞清top、postop、scrolltop、scrollHeight、offsetHeight </title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/76201" style="color:red;">http://just4you.javaeye.com/blog/76201</a>&nbsp;
          发表时间: 2007年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. top<br /><br />此属性仅仅在对象的定位(position)属性被设置时可用。否则，此属性设置会被忽略。<br /><br /><pre name="code" class="java">
&lt;div style="background-color:red; position:absolute; width:100px; height:100px;">
&lt;p style="background-color:silver; position:absolute; top:-5px;">测试top&lt;/p>
&lt;/div>
</pre><br /><br />上面是一个段落P包含在一个DIV内，可以看到P的top设置为-5px后，它的上边距超过了容器DIV的上边距，超过的这段距离就是设置的5px。<br /><span style="color: red"><strong>需要注意的是，DIV和P这一对包含元素，都需要设置position为absolute才能得到想要的结果，假如父元素不设置，则子元素的参照将是更上层定义过position的元素，直到整个文档。</strong></span><br /><br />2. posTop <br /><br />posTop的数值其实和top是一样的，但区别在于，<span style="color: red"><strong>top固定了元素单位为px，而posTop只是一个数值</strong></span>(这一点可以通过alert("top="+id.style.top)和alert("posTop="+id.style.posTop)来证明)，因此一般使用posTop来进行运算。<br /><br /><pre name="code" class="java">
&lt;div style="background-color:red; position:absolute; width:100px; height:100px;">
&lt;p id="test" style="background-color:silver; position:absolute;">测试posTop&lt;/p>
&lt;/div>
&lt;script>
test.style.posTop = 15+8;
alert("top="+test.style.top);
alert("posTop="+test.style.posTop);
&lt;/script>
</pre><br /><br />无论你使用top或posTop来赋值，最后的结果都是一致的。<br /><br />3. scrollTop<br /><br /><pre name="code" class="java">
&lt;div id="container" style="background-color:silver; width:100px; height:100px; overflow:auto;">
&lt;p style="background-color:red;">
别再做情人 做只猫 做只狗 不做情人 做只宠物至少可爱迷人 和你相交不浅无谓明日会被你憎&lt;/p>
&lt;/div>
&lt;script>
container.scrollTop = 12;
&lt;/script>
</pre><br /><br />这一段文本在这个100*100的DIV内无法完全显示，所以设置了<u>overflow为auto</u>，它会出现一个上下方向的滑动框，假如没有设置id.scrollTop属性的话，<u>默认情况下滑块位置在顶端</u>。而<u>设置了scrollTop值为12后，滑块的位置改变了，默认显示是卷过了12个象素的文本。如果设置overflow为hidden，则将会无法显示顶部12个象素的文本。</u><br /><span style="color: red"><strong>注意设置方式是id.scrollTop，而不是id.style.scrollTop。</strong></span><br /><br />4. scrollHeight 与 offsetHeight<br /><u>offsetHeight是自身元素的高度，scrollHeight是 自身元素的高度+隐藏元素的高度。</u><br /><br /><pre name="code" class="java">
&lt;div id="container" style="background-color:silver; width:100px; height:100px; overflow:auto;">
&lt;p style="background-color:red; height:250px; ">
别再做情人 做只猫 做只狗 不做情人 做只宠物至少可爱迷人 和你相交不浅无谓明日会被你憎&lt;/p>
&lt;/div>
&lt;script>
alert(container.offsetHeight);
alert(container.scrollHeight);
&lt;/script>
</pre><br /><br />将依次输出100，250。因为已经指定了元素的height为100px，所以offsetHeight始终为100px；内部元素为250px，而容器元素只有100px，那么还有150px的内容它无法显示出来，但它却是实际存在的，所以scrollHeight值为100+150=250。<br /><br /><br /><em>http://www.cnblogs.com/hushuan/articles/625543.html</em>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/76201#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Apr 2007 21:00:01 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/76201</link>
        <guid>http://just4you.javaeye.com/blog/76201</guid>
      </item>
      <item>
        <title>JS浮动广告脚本</title>
        <author>just4you</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://just4you.javaeye.com">just4you</a>&nbsp;
          链接：<a href="http://just4you.javaeye.com/blog/76189" style="color:red;">http://just4you.javaeye.com/blog/76189</a>&nbsp;
          发表时间: 2007年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工作的时候要用到的，就网上找了一下，顺便做个备份，下次不用再找了：）<br />做好记录。<br />还有的变量名称不知道是什么意思：（<br /><pre name="code" class="js">
&lt;script for=window event=onload language="jscript"> 	
	//载入页面后，调用函数initAd() 
	initAd();
 &lt;/script> 
 &lt;script language="JScript"> 
 &lt;!-- 
 function initAd() { 
	 //设置onLoad事件激发以后，广告层相对于固定后的y方向位置 
	 document.all.AdLayer.style.posTop = -200;
	//设置层为可见 
	 document.all.AdLayer.style.visibility = 'visible';
	//调用函数MoveLayer() 
	 MoveLayer('AdLayer');
 } 
 function MoveLayer(layerName) { 
	//浮动广告层固定于浏览器的x方向位置
	 var x = 3; 
	 //浮动广告层固定于浏览器的y方向位置
	 var y = 30; 
    //0.40是速度，在0到1之间，数值越大，浮动广告动作越慢。实现广告由远及近，由快到慢的效果，可总是不太明白这样的写法，晕：（
    //scrollTop:滚动条的顶部，无单位
    //posTop:同top,无px单位
	 var diff = (document.body.scrollTop + y - document.all.AdLayer.style.posTop)*.40; 
	 var y = document.body.scrollTop + y - diff; 
	//移动广告层
	 eval("document.all." + layerName + ".style.posTop = y"); 
	 eval("document.all." + layerName + ".style.posLeft = x"); 
	 //设置20毫秒后再调用函数MoveLayer()
	 setTimeout("MoveLayer('AdLayer');", 20);	  
 } 
 //--> 
 &lt;/script> 

 &lt;body>  　　 
 &lt;!--下面为一个ID为AdLayer的层（如ID名不为AdLayer，上面MoveLayer()内的AdLayer也要作相应修改），包括一张带链接的图片--> 
&lt;div id=AdLayer style='position:absolute; width:111px; height:36px; z-index:20; visibility:hidden;; left: 3px; top: 30px'> 
&lt;a href="http://www.163.com">&lt;img src='http://images.163.com/homepage/logo.gif' border="0" height="36px" width="111px">&lt;/a> 
&lt;/div> 
&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>
&lt;/body>
</pre><br />把图片广告换成flash，flash广告名称为“1b.swf”。<br />"div"标签中的width和height设置的小了，嵌入的flash比较大，在嵌入的flash中设置了原始大小。<br /><pre name="code" class="java">
&lt;div id=AdLayer style='position:absolute; width:111px; height:36px; z-index:20; visibility:hidden;; left: 3px; top: 30px'> 
&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="750" height="500">
    &lt;param name="movie" value="1b.swf" />
    &lt;param name="quality" value="high" />
    &lt;embed src="1b.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="750" height="500">&lt;/embed>
  &lt;/object> 
&lt;/div> 
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://just4you.javaeye.com/blog/76189#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Apr 2007 19:56:30 +0800</pubDate>
        <link>http://just4you.javaeye.com/blog/76189</link>
        <guid>http://just4you.javaeye.com/blog/76189</guid>
      </item>
  </channel>
</rss>