<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java豆技术站点</title>
	<atom:link href="http://javadou.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://javadou.com</link>
	<description>Java</description>
	<lastBuildDate>Thu, 12 Aug 2010 09:01:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>mysql 常用日期函数整理</title>
		<link>http://javadou.com/mysql-date-644/</link>
		<comments>http://javadou.com/mysql-date-644/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 09:01:17 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[date]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=644</guid>
		<description><![CDATA[2008年11月18日 15:37 一、MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间（date + time）函数：now() mysql&62; select now(); +&8212;&8212;&8212;&8212;&8212;&8212;&8212;+ &124; now() &124; +&8212;&8212;&8212;&8212;&8212;&8212;&8212;+ &124;... ]]></description>
			<content:encoded><![CDATA[<p>2008年11月18日 15:37<br />
一、MySQL 获得当前日期时间 函数<br />
1.1 获得当前日期+时间（date + time）函数：now()<br />
mysql&gt; select now();</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| now() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-08 22:20:46 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>除了 now() 函数能获得当前的日期时间外，MySQL 中还有下面的函数：<br />
current_timestamp()<br />
,current_timestamp<br />
,localtime()<br />
,localtime<br />
,localtimestamp &#8212; (v4.0.6)<br />
,localtimestamp() &#8212; (v4.0.6)</p>
<p>这些日期时间函数，都等同于 now()。鉴于 now() 函数简短易记，建议总是使用 now() 来替代上面列出的函数。<br />
1.2 获得当前日期+时间（date + time）函数：sysdate()<br />
sysdate() 日期时间函数跟 now() 类似，不同之处在于：now() 在执行开始时值就得到了， sysdate() 在函数执行时动态得到值。看下面的例子就明白了：<br />
mysql&gt; select now(), sleep(3), now();</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| now() | sleep(3) | now() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>mysql&gt; select sysdate(), sleep(3), sysdate();</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| sysdate() | sleep(3) | sysdate() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-08 22:28:41 | 0 | 2008-08-08 22:28:44 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>可以看到，虽然中途 sleep 3 秒，但 now() 函数两次的时间值是相同的； sysdate() 函数两次得到的时间值相差 3 秒。MySQL Manual 中是这样描述 sysdate() 的：Return the time at which the function executes。<br />
sysdate() 日期时间函数，一般情况下很少用到。<br />
2. 获得当前日期（date）函数：curdate()<br />
mysql&gt; select curdate();</p>
<p>+&#8212;&#8212;&#8212;&#8212;+<br />
| curdate() |<br />
+&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-08 |<br />
+&#8212;&#8212;&#8212;&#8212;+</p>
<p>其中，下面的两个日期函数等同于 curdate()：<br />
current_date()<br />
,current_date</p>
<p>3. 获得当前时间（time）函数：curtime()<br />
mysql&gt; select curtime();</p>
<p>+&#8212;&#8212;&#8212;&#8211;+<br />
| curtime() |<br />
+&#8212;&#8212;&#8212;&#8211;+<br />
| 22:41:30 |<br />
+&#8212;&#8212;&#8212;&#8211;+</p>
<p>其中，下面的两个时间函数等同于 curtime()：<br />
current_time()<br />
,current_time</p>
<p>4. 获得当前 UTC 日期时间函数：utc_date(), utc_time(), utc_timestamp()<br />
mysql&gt; select utc_timestamp(), utc_date(), utc_time(), now()</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| utc_timestamp() | utc_date() | utc_time() | now() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11 | 2008-08-08 22:47:11 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>因为我国位于东八时区，所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候，非常有用。</p>
<p>二、MySQL 日期时间 Extract（选取） 函数。<br />
1. 选取日期时间的各个部分：日期、时间、年、季度、月、日、小时、分钟、秒、微秒<br />
set @dt = &#8217;2008-09-10 07:15:30.123456&#8242;;</p>
<p>select date(@dt); &#8212; 2008-09-10<br />
select time(@dt); &#8212; 07:15:30.123456<br />
select year(@dt); &#8212; 2008<br />
select quarter(@dt); &#8212; 3<br />
select month(@dt); &#8212; 9<br />
select week(@dt); &#8212; 36<br />
select day(@dt); &#8212; 10<br />
select hour(@dt); &#8212; 7<br />
select minute(@dt); &#8212; 15<br />
select second(@dt); &#8212; 30<br />
select microsecond(@dt); &#8212; 123456</p>
<p>2. MySQL Extract() 函数，可以上面实现类似的功能：<br />
set @dt = &#8217;2008-09-10 07:15:30.123456&#8242;;</p>
<p>select extract(year from @dt); &#8212; 2008<br />
select extract(quarter from @dt); &#8212; 3<br />
select extract(month from @dt); &#8212; 9<br />
select extract(week from @dt); &#8212; 36<br />
select extract(day from @dt); &#8212; 10<br />
select extract(hour from @dt); &#8212; 7<br />
select extract(minute from @dt); &#8212; 15<br />
select extract(second from @dt); &#8212; 30<br />
select extract(microsecond from @dt); &#8212; 123456</p>
<p>select extract(year_month from @dt); &#8212; 200809<br />
select extract(day_hour from @dt); &#8212; 1007<br />
select extract(day_minute from @dt); &#8212; 100715<br />
select extract(day_second from @dt); &#8212; 10071530<br />
select extract(day_microsecond from @dt); &#8212; 10071530123456<br />
select extract(hour_minute from @dt); &#8212; 715<br />
select extract(hour_second from @dt); &#8212; 71530<br />
select extract(hour_microsecond from @dt); &#8212; 71530123456<br />
select extract(minute_second from @dt); &#8212; 1530<br />
select extract(minute_microsecond from @dt); &#8212; 1530123456<br />
select extract(second_microsecond from @dt); &#8212; 30123456</p>
<p>MySQL Extract() 函数除了没有date(),time() 的功能外，其他功能一应具全。并且还具有选取‘day_microsecond’ 等功能。注意这里不是只选取 day 和 microsecond，而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧！<br />
MySQL Extract() 函数唯一不好的地方在于：你需要多敲几次键盘。<br />
3. MySQL dayof&#8230; 函数：dayofweek(), dayofmonth(), dayofyear()<br />
分别返回日期参数，在一周、一月、一年中的位置。<br />
set @dt = &#8217;2008-08-08&#8242;;</p>
<p>select dayofweek(@dt); &#8212; 6<br />
select dayofmonth(@dt); &#8212; 8<br />
select dayofyear(@dt); &#8212; 221</p>
<p>日期 &#8217;2008-08-08&#8242; 是一周中的第 6 天（1 = Sunday, 2 = Monday, &#8230;, 7 = Saturday）；一月中的第 8 天；一年中的第 221 天。<br />
4. MySQL week&#8230; 函数：week(), weekofyear(), dayofweek(), weekday(), yearweek()<br />
set @dt = &#8217;2008-08-08&#8242;;</p>
<p>select week(@dt); &#8212; 31<br />
select week(@dt,3); &#8212; 32<br />
select weekofyear(@dt); &#8212; 32</p>
<p>select dayofweek(@dt); &#8212; 6<br />
select weekday(@dt); &#8212; 4</p>
<p>select yearweek(@dt); &#8212; 200831</p>
<p>MySQL week() 函数，可以有两个参数，具体可看手册。 weekofyear() 和 week() 一样，都是计算“某天”是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。<br />
MySQL weekday() 函数和 dayofweek() 类似，都是返回“某天”在一周中的位置。不同点在于参考的标准， weekday：(0 = Monday, 1 = Tuesday, &#8230;, 6 = Sunday)； dayofweek：（1 = Sunday, 2 = Monday, &#8230;, 7 = Saturday）<br />
MySQL yearweek() 函数，返回 year(2008) + week 位置(31)。<br />
5. MySQL 返回星期和月份名称函数：dayname(), monthname()<br />
set @dt = &#8217;2008-08-08&#8242;;</p>
<p>select dayname(@dt); &#8212; Friday<br />
select monthname(@dt); &#8212; August</p>
<p>思考，如何返回中文的名称呢？<br />
6. MySQL last_day() 函数：返回月份中的最后一天。<br />
select last_day(&#8217;2008-02-01&#8242;); &#8212; 2008-02-29<br />
select last_day(&#8217;2008-08-08&#8242;); &#8212; 2008-08-31</p>
<p>MySQL last_day() 函数非常有用，比如我想得到当前月份中有多少天，可以这样来计算：<br />
mysql&gt; select now(), day(last_day(now())) as days;</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+<br />
| now() | days |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+<br />
| 2008-08-09 11:45:45 | 31 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;+</p>
<p>三、MySQL 日期时间计算函数<br />
1. MySQL 为日期增加一个时间间隔：date_add()<br />
set @dt = now();</p>
<p>select date_add(@dt, interval 1 day); &#8212; add 1 day<br />
select date_add(@dt, interval 1 hour); &#8212; add 1 hour<br />
select date_add(@dt, interval 1 minute); &#8212; &#8230;<br />
select date_add(@dt, interval 1 second);<br />
select date_add(@dt, interval 1 microsecond);<br />
select date_add(@dt, interval 1 week);<br />
select date_add(@dt, interval 1 month);<br />
select date_add(@dt, interval 1 quarter);<br />
select date_add(@dt, interval 1 year);</p>
<p>select date_add(@dt, interval -1 day); &#8212; sub 1 day</p>
<p>MySQL adddate(), addtime()函数，可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例：<br />
mysql&gt; set @dt = &#8217;2008-08-09 12:12:33&#8242;;</p>
<p>mysql&gt;<br />
mysql&gt; select date_add(@dt, interval &#8217;01:15:30&#8242; hour_second);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| date_add(@dt, interval &#8217;01:15:30&#8242; hour_second) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-09 13:28:03 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>mysql&gt; select date_add(@dt, interval &#8217;1 01:15:30&#8242; day_second);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_add(@dt, interval &#8217;1 01:15:30&#8242; day_second) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 2008-08-10 13:28:03 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>date_add() 函数，分别为 @dt 增加了“1小时 15分 30秒” 和 “1天 1小时 15分 30秒”。建议：总是使用 date_add() 日期时间函数来替代 adddate(), addtime()。<br />
2. MySQL 为日期减去一个时间间隔：date_sub()<br />
mysql&gt; select date_sub(&#8217;1998-01-01 00:00:00&#8242;, interval &#8217;1 1:1:1&#8242; day_second);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_sub(&#8217;1998-01-01 00:00:00&#8242;, interval &#8217;1 1:1:1&#8242; day_second) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 1997-12-30 22:58:59 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>MySQL date_sub() 日期时间函数 和 date_add() 用法一致，不再赘述。另外，MySQL 中还有两个函数 subdate(), subtime()，建议，用 date_sub() 来替代。<br />
3. MySQL 另类日期函数：period_add(P,N), period_diff(P1,P2)<br />
函数参数“P” 的格式为“YYYYMM” 或者 “YYMM”，第二个参数“N” 表示增加或减去 N month（月）。<br />
MySQL period_add(P,N)：日期加/减去N月。<br />
mysql&gt; select period_add(200808,2), period_add(20080808,-2)</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| period_add(200808,2) | period_add(20080808,-2) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 200810 | 20080806 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>MySQL period_diff(P1,P2)：日期 P1-P2，返回 N 个月。<br />
mysql&gt; select period_diff(200808, 200801);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| period_diff(200808, 200801) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| 7 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+</p>
<p>在 MySQL 中，这两个日期函数，一般情况下很少用到。<br />
4. MySQL 日期、时间相减函数：datediff(date1,date2), timediff(time1,time2)<br />
MySQL datediff(date1,date2)：两个日期相减 date1 &#8211; date2，返回天数。<br />
select datediff(&#8217;2008-08-08&#8242;, &#8217;2008-08-01&#8242;); &#8212; 7<br />
select datediff(&#8217;2008-08-01&#8242;, &#8217;2008-08-08&#8242;); &#8212; -7</p>
<p>MySQL timediff(time1,time2)：两个日期相减 time1 &#8211; time2，返回 time 差值。<br />
select timediff(&#8217;2008-08-08 08:08:08&#8242;, &#8217;2008-08-08 00:00:00&#8242;); &#8212; 08:08:08<br />
select timediff(&#8217;08:08:08&#8242;, &#8217;00:00:00&#8242;); &#8212; 08:08:08</p>
<p>注意：timediff(time1,time2) 函数的两个参数类型必须相同。</p>
<p>四、MySQL 日期转换函数、时间转换函数<br />
1. MySQL （时间、秒）转换函数：time_to_sec(time), sec_to_time(seconds)<br />
select time_to_sec(&#8217;01:00:05&#8242;); &#8212; 3605<br />
select sec_to_time(3605); &#8212; &#8217;01:00:05&#8242;</p>
<p>2. MySQL （日期、天数）转换函数：to_days(date), from_days(days)<br />
select to_days(&#8217;0000-00-00&#8242;); &#8212; 0<br />
select to_days(&#8217;2008-08-08&#8242;); &#8212; 733627</p>
<p>select from_days(0); &#8212; &#8217;0000-00-00&#8242;<br />
select from_days(733627); &#8212; &#8217;2008-08-08&#8242;</p>
<p>3. MySQL Str to Date （字符串转换为日期）函数：str_to_date(str, format)<br />
select str_to_date(&#8217;08/09/2008&#8242;, &#8216;%m/%d/%Y&#8217;); &#8212; 2008-08-09<br />
select str_to_date(&#8217;08/09/08&#8242; , &#8216;%m/%d/%y&#8217;); &#8212; 2008-08-09<br />
select str_to_date(&#8217;08.09.2008&#8242;, &#8216;%m.%d.%Y&#8217;); &#8212; 2008-08-09<br />
select str_to_date(&#8217;08:09:30&#8242;, &#8216;%h:%i:%s&#8217;); &#8212; 08:09:30<br />
select str_to_date(&#8217;08.09.2008 08:09:30&#8242;, &#8216;%m.%d.%Y %h:%i:%s&#8217;); &#8212; 2008-08-09 08:09:30</p>
<p>可以看到，str_to_date(str,format) 转换函数，可以把一些杂乱无章的字符串转换为日期格式。另外，它也可以转换为时间。“format” 可以参看 MySQL 手册。<br />
4. MySQL Date/Time to Str（日期/时间转换为字符串）函数：date_format(date,format), time_format(time,format)<br />
mysql&gt; select date_format(&#8217;2008-08-08 22:23:00&#8242;, &#8216;%W %M %Y&#8217;);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| date_format(&#8217;2008-08-08 22:23:00&#8242;, &#8216;%W %M %Y&#8217;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| Friday August 2008 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>mysql&gt; select date_format(&#8217;2008-08-08 22:23:01&#8242;, &#8216;%Y%m%d%H%i%s&#8217;);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_format(&#8217;2008-08-08 22:23:01&#8242;, &#8216;%Y%m%d%H%i%s&#8217;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 20080808222301 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>mysql&gt; select time_format(&#8217;22:23:01&#8242;, &#8216;%H.%i.%s&#8217;);</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| time_format(&#8217;22:23:01&#8242;, &#8216;%H.%i.%s&#8217;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 22.23.01 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>MySQL 日期、时间转换函数：date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。<br />
5. MySQL 获得国家地区时间格式函数：get_format()<br />
MySQL get_format() 语法：<br />
get_format(date|time|datetime, &#8216;eur&#8217;|'usa&#8217;|'jis&#8217;|'iso&#8217;|'internal&#8217;</p>
<p>MySQL get_format() 用法的全部示例：<br />
select get_format(date,&#8217;usa&#8217;) ; &#8212; &#8216;%m.%d.%Y&#8217;<br />
select get_format(date,&#8217;jis&#8217;) ; &#8212; &#8216;%Y-%m-%d&#8217;<br />
select get_format(date,&#8217;iso&#8217;) ; &#8212; &#8216;%Y-%m-%d&#8217;<br />
select get_format(date,&#8217;eur&#8217;) ; &#8212; &#8216;%d.%m.%Y&#8217;<br />
select get_format(date,&#8217;internal&#8217;) ; &#8212; &#8216;%Y%m%d&#8217;<br />
select get_format(datetime,&#8217;usa&#8217;) ; &#8212; &#8216;%Y-%m-%d %H.%i.%s&#8217;<br />
select get_format(datetime,&#8217;jis&#8217;) ; &#8212; &#8216;%Y-%m-%d %H:%i:%s&#8217;<br />
select get_format(datetime,&#8217;iso&#8217;) ; &#8212; &#8216;%Y-%m-%d %H:%i:%s&#8217;<br />
select get_format(datetime,&#8217;eur&#8217;) ; &#8212; &#8216;%Y-%m-%d %H.%i.%s&#8217;<br />
select get_format(datetime,&#8217;internal&#8217;) ; &#8212; &#8216;%Y%m%d%H%i%s&#8217;<br />
select get_format(time,&#8217;usa&#8217;) ; &#8212; &#8216;%h:%i:%s %p&#8217;<br />
select get_format(time,&#8217;jis&#8217;) ; &#8212; &#8216;%H:%i:%s&#8217;<br />
select get_format(time,&#8217;iso&#8217;) ; &#8212; &#8216;%H:%i:%s&#8217;<br />
select get_format(time,&#8217;eur&#8217;) ; &#8212; &#8216;%H.%i.%s&#8217;<br />
select get_format(time,&#8217;internal&#8217;) ; &#8212; &#8216;%H%i%s&#8217;</p>
<p>MySQL get_format() 函数在实际中用到机会的比较少。<br />
6. MySQL 拼凑日期、时间函数：makdedate(year,dayofyear), maketime(hour,minute,second)<br />
select makedate(2001,31); &#8212; &#8217;2001-01-31&#8242;<br />
select makedate(2001,32); &#8212; &#8217;2001-02-01&#8242;</p>
<p>select maketime(12,15,30); &#8212; &#8217;12:15:30&#8242;</p>
<p>五、MySQL 时间戳（Timestamp）函数<br />
1. MySQL 获得当前时间戳函数：current_timestamp, current_timestamp()<br />
mysql&gt; select current_timestamp, current_timestamp();</p>
<p>+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| current_timestamp | current_timestamp() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>2. MySQL （Unix 时间戳、日期）转换函数：<br />
unix_timestamp(),<br />
unix_timestamp(date),<br />
from_unixtime(unix_timestamp),<br />
from_unixtime(unix_timestamp,format)</p>
<p>下面是示例：<br />
select unix_timestamp(); &#8212; 1218290027<br />
select unix_timestamp(&#8217;2008-08-08&#8242;); &#8212; 1218124800<br />
select unix_timestamp(&#8217;2008-08-08 12:30:00&#8242;); &#8212; 1218169800</p>
<p>select from_unixtime(1218290027); &#8212; &#8217;2008-08-09 21:53:47&#8242;<br />
select from_unixtime(1218124800); &#8212; &#8217;2008-08-08 00:00:00&#8242;<br />
select from_unixtime(1218169800); &#8212; &#8217;2008-08-08 12:30:00&#8242;</p>
<p>select from_unixtime(1218169800, &#8216;%Y %D %M %h:%i:%s %x&#8217;); &#8212; &#8217;2008 8th August 12:30:00 2008&#8242;</p>
<p>3. MySQL 时间戳（timestamp）转换、增、减函数：<br />
timestamp(date) &#8212; date to timestamp<br />
timestamp(dt,time) &#8212; dt + time<br />
timestampadd(unit,interval,datetime_expr) &#8211;<br />
timestampdiff(unit,datetime_expr1,datetime_expr2) &#8211;</p>
<p>请看示例部分：<br />
select timestamp(&#8217;2008-08-08&#8242;); &#8212; 2008-08-08 00:00:00<br />
select timestamp(&#8217;2008-08-08 08:00:00&#8242;, &#8217;01:01:01&#8242;); &#8212; 2008-08-08 09:01:01<br />
select timestamp(&#8217;2008-08-08 08:00:00&#8242;, &#8217;10 01:01:01&#8242;); &#8212; 2008-08-18 09:01:01</p>
<p>select timestampadd(day, 1, &#8217;2008-08-08 08:00:00&#8242;); &#8212; 2008-08-09 08:00:00<br />
select date_add(&#8217;2008-08-08 08:00:00&#8242;, interval 1 day); &#8212; 2008-08-09 08:00:00</p>
<p>MySQL timestampadd() 函数类似于 date_add()。<br />
select timestampdiff(year,&#8217;2002-05-01&#8242;,&#8217;2001-01-01&#8242;); &#8212; -1<br />
select timestampdiff(day ,&#8217;2002-05-01&#8242;,&#8217;2001-01-01&#8242;); &#8212; -485<br />
select timestampdiff(hour,&#8217;2008-08-08 12:00:00&#8242;,&#8217;2008-08-08 00:00:00&#8242;); &#8212; -12</p>
<p>select datediff(&#8217;2008-08-08 12:00:00&#8242;, &#8217;2008-08-01 00:00:00&#8242;); &#8212; 7</p>
<p>MySQL timestampdiff() 函数就比 datediff() 功能强多了，datediff() 只能计算两个日期（date）之间相差的天数。</p>
<p>六、MySQL 时区（timezone）转换函数<br />
convert_tz(dt,from_tz,to_tz)</p>
<p>select convert_tz(&#8217;2008-08-08 12:00:00&#8242;, &#8216;+08:00&#8242;, &#8216;+00:00&#8242;); &#8212; 2008-08-08 04:00:00</p>
<p>时区转换也可以通过 date_add, date_sub, timestampadd 来实现。<br />
select date_add(&#8217;2008-08-08 12:00:00&#8242;, interval -8 hour); &#8212; 2008-08-08 04:00:00<br />
select date_sub(&#8217;2008-08-08 12:00:00&#8242;, interval 8 hour); &#8212; 2008-08-08 04:00:00<br />
select timestampadd(hour, -8, &#8217;2008-08-08 12:00:00&#8242;); &#8212; 2008-08-08 04:00:00</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/mysql-date-644/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache ActiveMQ（2）教程</title>
		<link>http://javadou.com/apache-activemq-2-642/</link>
		<comments>http://javadou.com/apache-activemq-2-642/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 08:08:04 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[开发框架]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[jms]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=642</guid>
		<description><![CDATA[Apache ActiveMQ教程（二） 2008-06-03 14:25 五、Point-to-Point (点对点)消息模式开发流程 1、生产者（producer）开发流程（ProducerTool.java）： 1.1 创建Connection： 根据url，user和password创建一个jms Connection。 1.2 创建Session： 在connecti... ]]></description>
			<content:encoded><![CDATA[<p>Apache ActiveMQ教程（二） 2008-06-03 14:25</p>
<p><strong>五、</strong><strong>Point-to-Point (</strong><strong>点对点</strong><strong>)</strong><strong>消息模式开发流程</strong><strong> </strong></p>
<p><strong><strong>1</strong><strong>、生产者（producer</strong><strong>）开发流程（ProducerTool.java</strong><strong>）：</strong></strong></p>
<p><strong>1.1 </strong><strong>创建</strong><strong>Connection</strong><strong>：</strong></p>
<p><strong>根据</strong><strong>url</strong><strong>，</strong><strong>user</strong><strong>和</strong><strong>password</strong><strong>创建一个</strong><strong>jms Connection</strong><strong>。</strong></p>
<p><strong>1.2 </strong><strong>创建</strong><strong>Session</strong><strong>：</strong></p>
<p><strong>在</strong><strong>connection</strong><strong>的基础上创建一个</strong><strong>session</strong><strong>，同时设置是否支持事务和</strong><strong>ACKNOWLEDGE</strong><strong>标识。</strong></p>
<p><strong>1.3 </strong><strong>创建</strong><strong>Destination</strong><strong>对象：</strong></p>
<p><strong>需指定其对应的主题（</strong><strong>subject</strong><strong>）名称，</strong><strong>producer</strong><strong>和</strong><strong>consumer</strong><strong>将根据</strong><strong>subject</strong><strong>来发送</strong><strong>/</strong><strong>接收对应的消息。</strong></p>
<p><strong>1.4 </strong><strong>创建</strong><strong>MessageProducer</strong><strong>：</strong></p>
<p><strong>根据</strong><strong>Destination</strong><strong>创建</strong><strong>MessageProducer</strong><strong>对象，同时设置其持久模式。</strong></p>
<p><strong>1.5 </strong><strong>发送消息到队列（</strong><strong>Queue</strong><strong>）：</strong></p>
<p><strong>封装</strong><strong>TextMessage</strong><strong>消息，使用</strong><strong>MessageProducer</strong><strong>的</strong><strong>send</strong><strong>方法将消息发送出去。</strong><strong><strong> </strong></strong></p>
<p><strong><strong><strong>2</strong><strong>、消费者（consumer</strong><strong>）开发流程（ConsumerTool.java</strong><strong>）：</strong></strong></strong></p>
<p><strong><strong>2.1 </strong></strong><strong><strong>实现</strong></strong><strong><strong>MessageListener</strong></strong><strong><strong>接口：</strong></strong></p>
<p><strong><strong>消费者类必须实现</strong></strong><strong><strong>MessageListener</strong></strong><strong><strong>接口，然后在</strong></strong><strong><strong>onMessage()</strong></strong><strong><strong>方法中监听消息的到达并处理。</strong></strong></p>
<p><strong><strong>2.2 </strong></strong><strong><strong>创建</strong></strong><strong><strong>Connection</strong></strong><strong><strong>：</strong></strong></p>
<p><strong><strong>根据</strong></strong><strong><strong>url</strong></strong><strong><strong>，</strong></strong><strong><strong>user</strong></strong><strong><strong>和</strong></strong><strong><strong>password</strong></strong><strong><strong>创建一个</strong></strong><strong><strong>jms Connection</strong></strong><strong><strong>，如果是</strong></strong><strong><strong>durable</strong></strong><strong><strong>模式，还需要给</strong></strong><strong><strong>connection</strong></strong><strong><strong>设置一个</strong></strong><strong><strong>clientId</strong></strong><strong><strong>。</strong></strong></p>
<p><strong><strong>2.3 </strong></strong><strong><strong>创建</strong></strong><strong><strong>Session</strong></strong><strong><strong>和</strong></strong><strong><strong>Destination</strong></strong><strong><strong>：</strong></strong></p>
<p><strong><strong>与</strong></strong><strong><strong>ProducerTool.java</strong></strong><strong><strong>中的流程类似，不再赘述。</strong></strong></p>
<p><strong><strong>2.4</strong></strong><strong><strong>创建</strong></strong><strong><strong>replyProducer</strong></strong><strong><strong>【可选】：</strong></strong></p>
<p><strong><strong>可以用来将消息处理结果发送给</strong></strong><strong><strong>producer</strong></strong><strong><strong>。</strong></strong></p>
<p><strong><strong>2.5 </strong></strong><strong><strong>创建</strong></strong><strong><strong>MessageConsumer</strong></strong><strong><strong>：</strong></strong><strong><strong> </strong></strong></p>
<p><strong><strong>根据</strong></strong><strong><strong>Destination</strong></strong><strong><strong>创建</strong></strong><strong><strong>MessageConsumer</strong></strong><strong><strong>对象。</strong></strong></p>
<p><strong><strong>2.6 </strong></strong><strong><strong>消费</strong></strong><strong><strong>message</strong></strong><strong><strong>：</strong></strong></p>
<p><strong><strong> </strong></strong><strong><strong>在</strong></strong><strong><strong>onMessage()</strong></strong><strong><strong>方法中接收</strong></strong><strong><strong>producer</strong></strong><strong><strong>发送过来的消息进行处理，并可以通过</strong></strong><strong><strong>replyProducer</strong></strong><strong><strong>反馈信息给</strong></strong><strong><strong>producer</strong></strong></p>
<p><strong><strong> </strong></strong></p>
<p><strong>if</strong> (message.getJMSReplyTo() != <strong>null</strong>) {</p>
<p>replyProducer.send(message.getJMSReplyTo(),</p>
<p>session.createTextMessage(&#8220;Reply: &#8221; + message.getJMSMessageID()));</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/apache-activemq-2-642/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActiveMQ基础笔记</title>
		<link>http://javadou.com/activemq-notebook-640/</link>
		<comments>http://javadou.com/activemq-notebook-640/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 00:06:30 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[开发框架]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[jms]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=640</guid>
		<description><![CDATA[   1. 多种语言和协议编写客户端。语言: Java, C, C++, C, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
   2. 完全支持JMS1.1和J2EE 1.4规范  (持久化,XA消息,事务)
   3. 对Spring的支持,ActiveMQ可以很容得内嵌... ]]></description>
			<content:encoded><![CDATA[<p>一.   ActiveMQ是什么?</p>
<p>ActiveMQ is the most popular and powerful open source Message Bus.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台<br />
已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。</p>
<p>下面是它的特性列表</p>
<ol>
<li>多种语言和协议编写客户端。语言: Java, C, C++,      C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS      Notification,XMPP,AMQP</li>
<li>完全支持JMS1.1和J2EE 1.4规范  (持久化,XA消息,事务)</li>
<li>对Spring的支持,ActiveMQ可以很容得内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性</li>
<li>通过了常见J2EE服务器(如 Geronimo,JBoss 4,      GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上</li>
<li>支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA</li>
<li>支持通过JDBC和journal提供高速的消息持久化</li>
<li>从设计上保证了高性能的集群,客户端-服务器,点对点</li>
<li>支持Ajax</li>
<li>支持与Axis的整合</li>
<li>可以很容易得调用内嵌JMS provider,进行测试</li>
</ol>
<p>二.   ActiveMQ的竞争者</p>
<p>1，其他开源 JMS provider(资料来自 java-source.net) :<br />
jbossmq(jboss 4)<br />
jboss messaging (jboss 5)<br />
joram-4.3.21  2006-09-22<br />
openjms-0.7.7-alpha-3.zip December 26, 2005<br />
mantamq</p>
<p>ubermq<br />
SomnifugiJMS  2005-7-27</p>
<p>开源的JMS Provider大部分都已经停止发展了,剩下的几个都是找到了东家,和某种J2EE 服务器挂钩,比如jboss mq 与jboss,joram与jonas(objectweb组织),ActiveMQ 与Geronimo(ASF APACHE基金组织),而在这3个之间，从网络底层来看,只有ActiveMQ使用了NIO,单从这个角度来看ActiveMQ在性能上会有一定的优势。</p>
<p>2.商业JMS provider<br />
IBM WebSphere MQ<br />
BEA WebLogic JMS<br />
Oracle AQ<br />
NonStop Server for Java Message Service(JMS)<br />
Sun Java System Message Queue<br />
Sonic jms<br />
TIBCO Enterprise For JMS<br />
iLinkMQ (国内)</p>
<p>现在的商业J2EE 应用服务器大部分都会有JMS Provider的实现,毕竟应用服务器都已经花费不薄,也不在乎在里面送一个JMS Provider了,当然还是有独立的比如IBM WebSphere MQ,Sonic JMS ,前者肯定是商用MQ（这个概念不仅仅是JMS Provier了，只能说JMS 只是它提供的一个应用）中间的巨无霸了。</p>
<p>从这点来看,ActiveMQ明显的竞争者并不多,因为它是作为独立的开源JMS Provider出现的,很容易被用于多种结构设计中，使用ActiveMQ作为默认JMS Provider的开源项目有ServiceMix,Geronimo.</p>
<p>三.安装ActiveMQ</p>
<p>首先去http://activemq.apache.org/download.html 下载最新版本4.1.0release， 解压apache-activemq-4.1-incubator.zip(或者apache-activemq-4.1-incubator.tar.gz)目录如下:</p>
<p>+bin       (windows下面的bat和unix/linux下面的sh)<br />
+conf      (activeMQ配置目录,包含最基本的activeMQ配置文件)<br />
+data      (默认是空的)<br />
+docs      (index,replease版本里面没有文档,-.-b不知道为啥不带)<br />
+example   (几个例子<br />
+lib       (activemMQ使用到的lib)<br />
-apache-activemq-4.1-incubator.jar  (ActiveMQ的binary)<br />
-LICENSE.txt<br />
-NOTICE.txt<br />
-README.txt<br />
-user-guide.html</p>
<p>你可以使用bin\activemq.bat(activemq) 启动,如果一切顺利,你就会看见类似下面的信息：</p>
<p style="text-align: center;"><a href="http://javadou.com/wordpress/wp-content/uploads/2010/07/jms.jpg"><img class="size-medium wp-image-641 aligncenter" title="jms" src="http://javadou.com/wordpress/wp-content/uploads/2010/07/jms-300x283.jpg" alt="" width="393" height="283" /></a></p>
<p>几个小提示</p>
<p>1. 这个仅仅是最基础的ActiveMQ的配置,很多地方都没有配置因此不要直接使用这个配置用于生产系统</p>
<p>2. 有的时候由于端口被占用,导致ActiveMQ错误,ActiveMQ可能需要以下端口1099(JMX),61616(默认的TransportConnector)</p>
<p>3. 如果没有物理网卡,或者MS的LoopBackAdpater Multicast会报一个错误</p>
<p>四.   测试你的ActiveMQ</p>
<p>由于ActiveMQ是一个独立的jms provider,所以我们不需要其他任何第三方服务器就可以马上做我们的测试了.编译example目录下面的程序ProducerTool/ConsumerTool 是JMS参考里面提到的典型应用,Producer产生消息,Consumer消费消息，而且这个例子还可以加入参数帮助你测试刚才启动的本地ActiveMQ或者是远程的ActiveMQ</p>
<p>ProducerTool [url] broker的地址,默认的是tcp://localhost:61616<br />
[true|flase] 是否使用topic,默认是false<br />
[subject] subject的名字,默认是TOOL.DEFAULT<br />
[durabl] 是否持久化消息,默认是false<br />
[messagecount] 发送消息数量,默认是10<br />
[messagesize] 消息长度,默认是255<br />
[clientID] durable为true的时候,需要配置clientID<br />
[timeToLive] 消息存活时间<br />
[sleepTime] 发送消息中间的休眠时间<br />
[transacte]  是否采用事务</p>
<p>ConsumerTool [url] broker的地址,默认的是tcp://localhost:61616<br />
[true|flase] 是否使用topic,默认是false<br />
[subject] subject的名字,默认是TOOL.DEFAULT<br />
[durabl] 是否持久化消息,默认是false<br />
[maxiumMessages] 接受最大消息数量,0表示不限制<br />
[clientID] durable为true的时候,需要配置clientID<br />
[transacte]  是否采用事务<br />
[sleepTime]  接受消息中间的休眠时间,默认是0,onMeesage方法不休眠<br />
[receiveTimeOut] 接受超时</p>
<p>我们可以这样使用:<br />
先启动activeMQ，再打开两个命令窗口，都进入D:\activemq\example，一个运行：ant consumer,一个运行：ant producer，如果成功发送/接收了消息就OK了。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/activemq-notebook-640/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache ActiveMQ (1)教程</title>
		<link>http://javadou.com/apache-activemq-1-639/</link>
		<comments>http://javadou.com/apache-activemq-1-639/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 08:02:40 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[开发框架]]></category>
		<category><![CDATA[activemq]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[jms]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=639</guid>
		<description><![CDATA[Apache ActiveMQ教程（一） 2008-06-03 11:05 一、特性及优势 1、实现JMS1.1规范，支持J2EE1.4以上 2、可运行于任何jvm和大部分web容器（ActiveMQ works great in any JVM） 3、支持多种语言客户端（java, C, C++, AJAX, ACTIONSCRIPT等等） 4、支... ]]></description>
			<content:encoded><![CDATA[<p>Apache ActiveMQ教程（一） 2008-06-03 11:05</p>
<p><strong>一、特性及优势</strong></p>
<p>1、实现JMS1.1规范，支持J2EE1.4以上</p>
<p>2、可运行于任何jvm和大部分web容器（ActiveMQ works great in any JVM）</p>
<p>3、支持多种语言客户端（java, C, C++, AJAX, ACTIONSCRIPT等等）</p>
<p>4、支持多种协议（stomp，openwire，REST）</p>
<p>5、良好的spring支持（ActiveMQ has great Spring Support）</p>
<p>6、速度很快，JBossMQ的十倍（ActiveMQ is very fast; often 10x faster than JBossMQ.）</p>
<p>7、与OpenJMS、JbossMQ等开源jms provider相比，ActiveMQ有Apache的支持，持续发展的优势明显。</p>
<p><strong>二、下载部署</strong></p>
<p>1、下载</p>
<p><a href="http://activemq.apache.org/activemq-510-release.html">http://activemq.apache.org/activemq-510-release.html</a>，下载5.1.0 Windows Distribution版本</p>
<p>2、安装</p>
<p>直接解压至任意目录（如：d:\ apache-activemq-5.1.0）</p>
<p>3、启动ActiveMQ服务器</p>
<p>方法1：</p>
<p>直接运行bin\activemq.bat</p>
<p>方法2（在JVM中嵌套启动）：</p>
<p>cd example</p>
<p>ant embedBroker</p>
<p>4、ActiveMQ消息管理后台系统：</p>
<p>http://localhost:8161/admin</p>
<p><strong>三、运行附带的示例程序</strong></p>
<p><strong>1</strong><strong>、Queue</strong><strong>消息示例：</strong></p>
<p>* 启动Queue消息消费者</p>
<p>cd example</p>
<p>ant consumer</p>
<p>* 启动Queue消息生产者</p>
<p>cd example</p>
<p>ant producer</p>
<p>简要说明：生产者（producer）发消息，消费者（consumer）接消息，发送/接收2000个消息后自动关闭</p>
<p><strong>2</strong><strong>、Topic</strong><strong>消息示例：</strong></p>
<p>* 启动Topic消息消费者</p>
<p>cd example</p>
<p>ant topic-listener</p>
<p>* 启动Topic消息生产者</p>
<p>cd example</p>
<p>ant topic-publisher</p>
<p>简要说明：重复10轮，publisher每轮发送2000个消息，并等待获取listener的处理结果报告，然后进入下一轮发送，最后统计全局发送时间。</p>
<p><strong>四、</strong><strong>Queue</strong><strong>与</strong><strong>Topic</strong><strong>的比较</strong></p>
<p><strong>1</strong><strong>、JMS Queue</strong><strong>执行load balancer</strong><strong>语义：</strong></p>
<p>一条消息仅能被一个consumer收到。如果在message发送的时候没有可用的consumer，那么它将被保存一直到能处理该message的consumer可用。如果一个consumer收到一条message后却不响应它，那么这条消息将被转到另一个consumer那儿。一个Queue可以有很多consumer，并且在多个可用的consumer中负载均衡。</p>
<p><strong>2</strong><strong>、Topic</strong><strong>实现publish</strong><strong>和subscribe</strong><strong>语义：</strong></p>
<p>一条消息被publish时，它将发到所有感兴趣的订阅者，所以零到多个subscriber将接收到消息的一个拷贝。但是在消息代理接收到消息时，只有激活订阅的subscriber能够获得消息的一个拷贝。</p>
<p><strong>3</strong><strong>、分别对应两种消息模式：</strong></p>
<p>Point-to-Point (点对点),Publisher/Subscriber Model (发布/订阅者)</p>
<p>其中在Publicher/Subscriber 模式下又有Nondurable subscription（非持久订阅）和durable subscription (持久化订阅)2种消息处理方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/apache-activemq-1-639/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>连接池泄露的问题：Timeout waiting for idle object</title>
		<link>http://javadou.com/org-apache-commons-dbcp-sqlnestedexception-cannot-get-a-connection-pool-exhausted-causejava-util-nosuchelementexcep-638/</link>
		<comments>http://javadou.com/org-apache-commons-dbcp-sqlnestedexception-cannot-get-a-connection-pool-exhausted-causejava-util-nosuchelementexcep-638/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 10:58:47 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java核心类]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Timeout waiting for idle object]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=638</guid>
		<description><![CDATA[问题描述:连接池泄露的问题：org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:java.util.NoSuchElementException: Timeout waiting for idle object 问题同样适用于其他服务器,使用spring配置文件的可以加下面的参... ]]></description>
			<content:encoded><![CDATA[<p>问题描述:<strong>连接池泄露的问题：org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:java.util.NoSuchElementException: Timeout waiting for idle object</strong><br />
问题同样适用于其他服务器,使用spring配置文件的可以加下面的参数<br />
&lt;property name=&#8221;removeAbandoned&#8221; value=&#8221;true&#8221;/&gt;<br />
&lt;property name=&#8221;removeAbandonedTimeout&#8221; value=&#8221;60&#8243;/&gt;<br />
&lt;property name=&#8221;logAbandoned&#8221; value=&#8221;true&#8221;/&gt;</p>
<p>1 问题描述<br />
Web程序在tomcat刚开始运行时速度很快，但过一段时间后发现速度变得很慢。<br />
检查日志输出，发现异常如下:<br />
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:<br />
java.util.NoSuchElementException: Timeout waiting for idle object<br />
同时在SQLServer事件探查器中发现，每执行一次sql语句都要产生Audit login事件，语句执行后产生<br />
Audit logout事件。说明每一次tomcat都是重新打开新的连接。<br />
2 问题解决<br />
tomcat 的数据源定义提供了三个参数：<br />
a. 如果设为true则tomcat自动检查恢复重新利用，没有正常关闭的Connection.（默认是false）<br />
&lt;parameter&gt;<br />
&lt;name&gt;removeAbandoned&lt;/name&gt;<br />
&lt;value&gt;true&lt;/value&gt;<br />
&lt;/parameter&gt;<br />
b. 设定连接在多少秒内被认为是放弃的连接，即可进行恢复利用。<br />
&lt;parameter&gt;<br />
&lt;name&gt;removeAbandonedTimeout&lt;/name&gt;<br />
&lt;value&gt;60&lt;/value&gt;<br />
&lt;/parameter&gt;<br />
c. 输出回收的日志，可以详细打印出异常从而发现是在那里发生了泄漏<br />
&lt;parameter&gt;<br />
&lt;name&gt;logAbandoned&lt;/name&gt;<br />
&lt;value&gt;true&lt;/value&gt;<br />
&lt;/parameter&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/org-apache-commons-dbcp-sqlnestedexception-cannot-get-a-connection-pool-exhausted-causejava-util-nosuchelementexcep-638/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery autocomplete 导致页面光标自动定位到了文本框</title>
		<link>http://javadou.com/jquery-autocomplete-page-cursor-input-635/</link>
		<comments>http://javadou.com/jquery-autocomplete-page-cursor-input-635/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 22:30:44 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=635</guid>
		<description><![CDATA[在用jquery.autocomplete 进行自动匹配查询时,发现页面加载完成后,光标就自动停留在文本框,但是我并不想要这个功能,检查发现是由于多用了一个方法: 如下: $(&8220;name&8221;).focus().autocomplete( &8220;/rule/ervicePkg.htm?method=que... ]]></description>
			<content:encoded><![CDATA[<p>在用jquery.autocomplete 进行自动匹配查询时,发现页面加载完成后,光标就自动停留在文本框,但是我并不想要这个功能,检查发现是由于多用了一个方法: 如下:</p>
<p>$(&#8220;#name&#8221;).focus().autocomplete(<br />
&#8220;/rule/ervicePkg.htm?method=queryByLikeName&#8221;, {<br />
scroll : false,<br />
width : 150<br />
});</p>
<p>改成如下即可:</p>
<p>$(&#8220;#name&#8221;).focus().autocomplete(<br />
&#8220;/rule/ervicePkg.htm?method=queryByLikeName&#8221;, {<br />
scroll : false,<br />
width : 150<br />
});</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/jquery-autocomplete-page-cursor-input-635/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hibernate C3P0连接池详细配置</title>
		<link>http://javadou.com/hibernate-c3p0-config-634/</link>
		<comments>http://javadou.com/hibernate-c3p0-config-634/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 12:30:18 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[c3p0]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=634</guid>
		<description><![CDATA[&60;c3p0-config&62; &60;default-config&62; &60;!&8211;当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 &8211;&62; &60;property name=&8221;acquireIncrement&8221;&62;3&60;/property&62; &60;!&8211;定义在从数据库获取新连接... ]]></description>
			<content:encoded><![CDATA[<p>&lt;c3p0-config&gt;<br />
&lt;default-config&gt;<br />
&lt;!&#8211;当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 &#8211;&gt;<br />
&lt;property name=&#8221;acquireIncrement&#8221;&gt;3&lt;/property&gt;</p>
<p>&lt;!&#8211;定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 &#8211;&gt;<br />
&lt;property name=&#8221;acquireRetryAttempts&#8221;&gt;30&lt;/property&gt;</p>
<p>&lt;!&#8211;两次连接中间隔时间，单位毫秒。Default: 1000 &#8211;&gt;<br />
&lt;property name=&#8221;acquireRetryDelay&#8221;&gt;1000&lt;/property&gt;</p>
<p>&lt;!&#8211;连接关闭时默认将所有未提交的操作回滚。Default: false &#8211;&gt;<br />
&lt;property name=&#8221;autoCommitOnClose&#8221;&gt;false&lt;/property&gt;</p>
<p>&lt;!&#8211;c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么<br />
属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试<br />
使用。Default: null&#8211;&gt;<br />
&lt;property name=&#8221;automaticTestTable&#8221;&gt;Test&lt;/property&gt;</p>
<p>&lt;!&#8211;获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效<br />
保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试<br />
获取连接失败后该数据源将申明已断开并永久关闭。Default: false&#8211;&gt;<br />
&lt;property name=&#8221;breakAfterAcquireFailure&#8221;&gt;false&lt;/property&gt;</p>
<p>&lt;!&#8211;当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出<br />
SQLException,如设为0则无限期等待。单位毫秒。Default: 0 &#8211;&gt;<br />
&lt;property name=&#8221;checkoutTimeout&#8221;&gt;100&lt;/property&gt;</p>
<p>&lt;!&#8211;通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。<br />
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester&#8211;&gt;<br />
&lt;property name=&#8221;connectionTesterClassName&#8221;&gt;&lt;/property&gt;</p>
<p>&lt;!&#8211;指定c3p0 libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可<br />
Default: null&#8211;&gt;<br />
&lt;property name=&#8221;factoryClassLocation&#8221;&gt;null&lt;/property&gt;</p>
<p>&lt;!&#8211;Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.<br />
（文档原文）作者强烈建议不使用的一个属性&#8211;&gt;<br />
&lt;property name=&#8221;forceIgnoreUnresolvedTransactions&#8221;&gt;false&lt;/property&gt;</p>
<p>&lt;!&#8211;每60秒检查所有连接池中的空闲连接。Default: 0 &#8211;&gt;<br />
&lt;property name=&#8221;idleConnectionTestPeriod&#8221;&gt;60&lt;/property&gt;</p>
<p>&lt;!&#8211;初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default: 3 &#8211;&gt;<br />
&lt;property name=&#8221;initialPoolSize&#8221;&gt;3&lt;/property&gt;</p>
<p>&lt;!&#8211;最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 &#8211;&gt;<br />
&lt;property name=&#8221;maxIdleTime&#8221;&gt;60&lt;/property&gt;</p>
<p>&lt;!&#8211;连接池中保留的最大连接数。Default: 15 &#8211;&gt;<br />
&lt;property name=&#8221;maxPoolSize&#8221;&gt;15&lt;/property&gt;</p>
<p>&lt;!&#8211;JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements<br />
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。<br />
如果maxStatements与maxStatementsPerConnection均为0，则缓存被关闭。Default: 0&#8211;&gt;<br />
&lt;property name=&#8221;maxStatements&#8221;&gt;100&lt;/property&gt;</p>
<p>&lt;!&#8211;maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0  &#8211;&gt;<br />
&lt;property name=&#8221;maxStatementsPerConnection&#8221;&gt;&lt;/property&gt;</p>
<p>&lt;!&#8211;c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能<br />
通过多线程实现多个操作同时被执行。Default: 3&#8211;&gt;<br />
&lt;property name=&#8221;numHelperThreads&#8221;&gt;3&lt;/property&gt;</p>
<p>&lt;!&#8211;当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0<br />
的数据源时。Default: null&#8211;&gt;<br />
&lt;property name=&#8221;overrideDefaultUser&#8221;&gt;root&lt;/property&gt;</p>
<p>&lt;!&#8211;与overrideDefaultUser参数对应使用的一个参数。Default: null&#8211;&gt;<br />
&lt;property name=&#8221;overrideDefaultPassword&#8221;&gt;password&lt;/property&gt;</p>
<p>&lt;!&#8211;密码。Default: null&#8211;&gt;<br />
&lt;property name=&#8221;password&#8221;&gt;&lt;/property&gt;</p>
<p>&lt;!&#8211;定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意：<br />
测试的表必须在初始数据源的时候就存在。Default: null&#8211;&gt;<br />
&lt;property name=&#8221;preferredTestQuery&#8221;&gt;select id from test where id=1&lt;/property&gt;</p>
<p>&lt;!&#8211;用户修改系统配置参数执行前最多等待300秒。Default: 300 &#8211;&gt;<br />
&lt;property name=&#8221;propertyCycle&#8221;&gt;300&lt;/property&gt;</p>
<p>&lt;!&#8211;因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的<br />
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable<br />
等方法来提升连接测试的性能。Default: false &#8211;&gt;<br />
&lt;property name=&#8221;testConnectionOnCheckout&#8221;&gt;false&lt;/property&gt;</p>
<p>&lt;!&#8211;如果设为true那么在取得连接的同时将校验连接的有效性。Default: false &#8211;&gt;<br />
&lt;property name=&#8221;testConnectionOnCheckin&#8221;&gt;true&lt;/property&gt;</p>
<p>&lt;!&#8211;用户名。Default: null&#8211;&gt;<br />
&lt;property name=&#8221;user&#8221;&gt;root&lt;/property&gt;</p>
<p>&lt;!&#8211;早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数<br />
允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始<br />
广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到<br />
支持，但今后可能的版本可能不支持动态反射代理。Default: false&#8211;&gt;<br />
&lt;property name=&#8221;usesTraditionalReflectiveProxies&#8221;&gt;false&lt;/property&gt;</p>
<p>&lt;property name=&#8221;automaticTestTable&#8221;&gt;con_test&lt;/property&gt;<br />
&lt;property name=&#8221;checkoutTimeout&#8221;&gt;30000&lt;/property&gt;<br />
&lt;property name=&#8221;idleConnectionTestPeriod&#8221;&gt;30&lt;/property&gt;<br />
&lt;property name=&#8221;initialPoolSize&#8221;&gt;10&lt;/property&gt;<br />
&lt;property name=&#8221;maxIdleTime&#8221;&gt;30&lt;/property&gt;<br />
&lt;property name=&#8221;maxPoolSize&#8221;&gt;25&lt;/property&gt;<br />
&lt;property name=&#8221;minPoolSize&#8221;&gt;10&lt;/property&gt;<br />
&lt;property name=&#8221;maxStatements&#8221;&gt;0&lt;/property&gt;<br />
&lt;user-overrides user=&#8221;swaldman&#8221;&gt;<br />
&lt;/user-overrides&gt;<br />
&lt;/default-config&gt;<br />
&lt;named-config name=&#8221;dumbTestConfig&#8221;&gt;<br />
&lt;property name=&#8221;maxStatements&#8221;&gt;200&lt;/property&gt;<br />
&lt;user-overrides user=&#8221;poop&#8221;&gt;<br />
&lt;property name=&#8221;maxStatements&#8221;&gt;300&lt;/property&gt;<br />
&lt;/user-overrides&gt;<br />
&lt;/named-config&gt;<br />
&lt;/c3p0-config&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/hibernate-c3p0-config-634/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【锋利的JQuery】 学习笔记,锋利的JQuery电子书pdf学习笔记</title>
		<link>http://javadou.com/feng-li-jquery-pdf-node-633/</link>
		<comments>http://javadou.com/feng-li-jquery-pdf-node-633/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 10:47:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[锋利的JQuery]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=633</guid>
		<description><![CDATA[锋利的JQuery是一本不错的JQuery书，看完后感觉总体也不错，介绍的挺全面的，列举了大量的例子，比较易懂。 加上之前学过一点CSS方面的知识，所以在看选择器这部分也比较容易理解（很多都是CSS的写法）。 总体感... ]]></description>
			<content:encoded><![CDATA[<p>锋利的JQuery是一本不错的JQuery书，看完后感觉总体也不错，介绍的挺全面的，列举了大量的例子，比较易懂。<br />
加上之前学过一点CSS方面的知识，所以在看选择器这部分也比较容易理解（很多都是CSS的写法）。<br />
总体感觉，JQuery大置分成了几大块：选择器、DOM操作、事件、动画、AJAX。<br />
本书都一一的介绍了，特别是选择器，几乎每种选择器都列举了一个例子，很容易看懂。<br />
此文为读本书的过程中，记录的一些笔记，例子不是书里面的，只是觉得自己比较容易理解，就随便写了个。<br />
如果有出错的地方，麻烦指正。</p>
<p>// 锋利的JQuery 学习笔记<br />
// dier<br />
// 2009-10-17 至 2009-11-22</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 第一章 认识JQuery &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>&amp;middot;页面加载事件（可以写多个ready()）<br />
$(document).ready(function(){<br />
alert(&#8220;hello world&#8221;);<br />
})</p>
<p>&amp;middot;链式操作：JQuery允许你在一句代码中操做任何与其相关联的元素，包括其子元素、父元素等<br />
//选择名称为myDiv的元素，为其自身添加css1的样式，然后再选择其所有子元素a，为其移除css2样式<br />
$(&#8220;#myDiv&#8221;).addClass(&#8220;css1&#8243;).children(&#8220;a&#8221;).removeClass(&#8220;css2&#8243;);</p>
<p>&amp;middot;JQuery中获得一个对象的所有子元素内容<br />
$(&#8220;#myDiv&#8221;).html()</p>
<p>&amp;middot;JQuery中的变量 与 DOM中的变量<br />
var $myVar = &#8220;&#8221;;<br />
var myVar = &#8220;&#8221;;</p>
<p>&amp;middot;DOM对象 转换成 JQuery对象<br />
var obj = documnet.getElementById(&#8220;myDiv&#8221;);<br />
var $obj = $(obj);</p>
<p>&amp;middot;JQuery对象 转换成 DOM对象<br />
var $obj = $(&#8220;#myDiv&#8221;);<br />
var obj = $obj.get(0);  //或者var obj = $obj[0];</p>
<p>&amp;middot;释放JQuery对$符号的控制权<br />
JQuery.noConflict();</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 第二章 JQuery选择器 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>&amp;middot;JQuery完善的处理机制<br />
document.getElementById(&#8220;test&#8221;).style.color = &#8220;red&#8221;; //如果test不存在，则页面出现异常<br />
$(&#8220;#test&#8221;).css(&#8220;color&#8221;,&#8221;red&#8221;); //哪怕页面没有名称为test的元素，也不会报错。它是一个JQuery对象</p>
<p>&amp;middot;判断页面是否选择的对象<br />
if( $(&#8220;.class&#8221;).length &amp;gt; 0 ){<br />
// todo something<br />
}</p>
<p>&amp;middot;基本选择器<br />
$(&#8220;#myDiv&#8221;)    //根据给定的ID选择匹配的元素，返回：单个元素<br />
$(&#8220;.myClass&#8221;) //根据给定的样式名称选择匹配的元素，返回：集合元素<br />
$(&#8220;div&#8221;) //根据给定的元素名称选择匹配的元素，返回：集合元素<br />
$(&#8220;#myDiv,div.myClass,span&#8221;) //根据给定的规则选择匹配的元素，返回：集合元素<br />
$(&#8220;*&#8221;) //选择页面所有元素，返回：集合元素</p>
<p>&amp;middot;层次选择器<br />
$(&#8220;div span&#8221;) //选择所有DIV元素下的所有SPAN元素（所有后代元素），返回：集合元素<br />
$(&#8220;div&amp;gt;span&#8221;) //选择所有DIV元素下的SPAN子元素（仅子元素），返回：集合元素<br />
$(&#8220;.myClass+div&#8221;) //选择样式名称为myClass的下一个DIV元素，返回：集合元素<br />
$(&#8220;.myClass+div&#8221;) //等价于 $(&#8220;.myClass&#8221;).next(&#8220;div&#8221;);<br />
$(&#8220;.myClass~div&#8221;) //选择样式名称为myClass之后的所有DIV元素，返回：集合元素<br />
$(&#8220;.myClass~div&#8221;) //等价于 $(&#8220;.myClass&#8221;).nextAll();<br />
$(&#8220;.myClass&#8221;).siblings(&#8220;div&#8221;) //选择样式名称为myClass的元素的所有同辈DIV元素（无论前后），返回集合元素</p>
<p>&amp;middot;过滤选择器（index从0开始）<br />
$(&#8220;div:first&#8221;) //选择所有DIV元素下的第一个DIV元素，返回：单个元素<br />
$(&#8220;div:last&#8221;) //选择所有DIV元素下的最后一个DIV元素，返回：单个元素<br />
$(&#8220;div:not(.myClass)&#8221;) //选择所有样式不包括myClass的DIV元素，返回：集合元素<br />
$(&#8220;div:even&#8221;) //选择所有索引是偶数的DIV元素，返回：集合元素<br />
$(&#8220;div:odd&#8221;) //选择所有索引是奇数的DIV元素，返回：集合元素<br />
$(&#8220;div:eq(index)&#8221;) //选择所有索引等于index的DIV元素，返回：集合元素<br />
$(&#8220;div:gt(index)&#8221;) //选择所有索引大于index的DIV元素，返回：集合元素<br />
$(&#8220;div:lt(index)&#8221;) //选择所有索引小于index的DIV元素，返回：集合元素<br />
$(&#8220;:header&#8221;) //选择所有标题元素（h1,h2,h3），返回：集合元素<br />
$(&#8220;div:animated&#8221;) //选择所有正在执行去画的DIV元素，返回：集合元素</p>
<p>&amp;middot;子元素过滤选择器（index从1开始）<br />
$(&#8220;:nth-child(index/even/odd)&#8221;) //选择每个父元素下的第index/偶数/奇数个子元素，返回：集合元素<br />
$(&#8220;:first-child&#8221;) //选择每个父元素下的第一个子元素，返回：集合元素<br />
$(&#8220;:last-child&#8221;) //选择每个父元素下的最后一个子元素，返回：集合元素<br />
$(&#8220;ul li:only-child&#8221;) //在UL元素中选择只有一个LI元素的子元素，返回：集合元素</p>
<p>&amp;middot;内容过滤选择器<br />
$(&#8220;:contains(text)&#8221;) //选择所有内容包含text的元素，返回：集合元素<br />
$(&#8220;div:empty&#8221;) //选择所有内容为空的DIV元素，返回：集合元素<br />
$(&#8220;div:has(span)&#8221;) //选择所有含有SPAN子元素的DIV元素，返回：集合元素<br />
$(&#8220;div:parent&#8221;) //选择所有含有子元素的DIV元素，返回：集合元素</p>
<p>&amp;middot;可见性选择器<br />
$(&#8220;:hidden&#8221;) //选择所有不可见的元素（type=&#8221;hidden&#8221; style=&#8221;display:none&#8221; style=&#8221;visibility:none&#8221;），返回：集合元素<br />
$(&#8220;:visible&#8221;) //选择所有可见的元素，返回：集合元素</p>
<p>&amp;middot;属性过滤选择器<br />
$(&#8220;[id]&#8220;) //选择所有含有id属性的元素，返回：集合元素<br />
$(&#8220;[class=myClass]&#8220;) //选择所有class属性值是myClass的元素，返回：集合元素<br />
$(&#8220;[class!=myClass]&#8220;) //选择所有class属性值不是myClass的元素，返回：集合元素<br />
$(&#8220;[alt^=begin]&#8220;) //选择所有alt属性值以begin开始的元素，返回：集合元素<br />
$(&#8220;[alt^=end]&#8220;) //选择所有alt属性值以end结束的元素，返回：集合元素<br />
$(&#8220;[alt*=some]&#8220;) //选择所有alt属性值含有some的元素，返回：集合元素<br />
$(&#8220;div[id][class=myClass]&#8220;) //选择所有含有id属性的并且class属性值是myClass的元素，返回：集合元素</p>
<p>&amp;middot;表单对象属性选择器<br />
$(&#8220;#myForm:enabled&#8221;) //选择ID属性为myForm的表单的所有可用元素，返回：集合元素<br />
$(&#8220;#myForm:disabled&#8221;) //选择ID属性为myForm的表单的所有不可用元素，返回：集合元素<br />
$(&#8220;#myForm:checked&#8221;) //选择ID属性为myForm的表单的所有所有被选中的元素，返回：集合元素<br />
$(&#8220;#myForm:selected&#8221;) //选择ID属性为myForm的表单的所有所有被选中的元素，返回：集合元素</p>
<p>&amp;middot;表单选择器<br />
$(&#8220;:input&#8221;) //选择所有&amp;lt;input&amp;gt; &amp;lt;select&amp;gt; &amp;lt;button&amp;gt; &amp;lt;textarea&amp;gt;元素，返回：集合元素<br />
$(&#8220;:text&#8221;) //选择所有单行文本框元素，返回：集合元素<br />
$(&#8220;:password&#8221;) //选择所有密码框元素，返回：集合元素<br />
$(&#8220;:radio&#8221;) //选择所有单选框元素，返回：集合元素<br />
$(&#8220;:checkbox&#8221;) //选择所有复选框元素，返回：集合元素<br />
$(&#8220;:submit&#8221;) //选择所有提交按钮元素，返回：集合元素<br />
$(&#8220;:image&#8221;) //选择所有图片按钮元素，返回：集合元素<br />
$(&#8220;:reset&#8221;) //选择所有重置按钮元素，返回：集合元素<br />
$(&#8220;:button&#8221;) //选择所有按钮元素，返回：集合元素<br />
$(&#8220;:file&#8221;) //选择所有上传域元素，返回：集合元素<br />
$(&#8220;:hidden&#8221;) //选择所有不可见域元素，返回：集合元素<br />
$(&#8220;:text&#8221;) //选择所有单选文本框元素，返回：集合元素</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 第三章 JQuery中的DOM操作 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>&amp;middot;查找元素节点<br />
var str = $(&#8220;#myDiv&#8221;).text(); //&amp;lt;div id=&#8221;myDiv&#8221; title=&#8221;hello&#8221;&amp;gt;123&amp;lt;/div&amp;gt;<br />
alert(str); //结果：123</p>
<p>&amp;middot;查找属性节点<br />
var str = $(&#8220;#myDiv&#8221;).attr(&#8220;title&#8221;); //&amp;lt;div id=&#8221;myDiv&#8221; title=&#8221;hello&#8221;&amp;gt;123&amp;lt;/div&amp;gt;<br />
alert(str); //结果：hello</p>
<p>&amp;middot;创建元素节点<br />
var $li1 = $(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;); //传入元素标记，自动包装并创建第一个li元素对象<br />
var $li2 = $(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;); //第二个,创建时需要遵循XHTML规则（闭合、小写）<br />
$(&#8220;#myDiv&#8221;).append($li1); //往id为myDiv的元素中添加一个元素<br />
$(&#8220;#myDiv&#8221;).append($li2); //结果：&amp;lt;div id=&#8221;myDiv&#8221;&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;</p>
<p>$(&#8220;#myDIv&#8221;).append($li1).append($li2); //客串：传说中的链式写法，省一行代码 ^_^</p>
<p>&amp;middot;创建文本节点<br />
var $li1 = $(&#8220;&amp;lt;span&amp;gt;first&amp;lt;/span&amp;gt;&#8221;);<br />
var $li2 = $(&#8220;&amp;lt;span&amp;gt;second&amp;lt;/span&amp;gt;&#8221;);<br />
$(&#8220;#myDIv&#8221;).append($li1).append($li2);<br />
//结果：&amp;lt;div id=&#8221;myDiv&#8221;&amp;gt;&amp;lt;span&amp;gt;first&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;second&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;</p>
<p>&amp;middot;创建属性节点<br />
var $li1 = $(&#8220;&amp;lt;span title=&#8221;111&#8243;&amp;gt;first&amp;lt;/span&amp;gt;&#8221;);<br />
var $li2 = $(&#8220;&amp;lt;span title=&#8221;222&#8243;&amp;gt;second&amp;lt;/span&amp;gt;&#8221;);<br />
$(&#8220;#myDIv&#8221;).append($li1).append($li2);<br />
//结果：&amp;lt;div id=&#8221;myDiv&#8221;&amp;gt;&amp;lt;span title=&#8221;111&#8243;&amp;gt;first&amp;lt;/span&amp;gt;&amp;lt;span title=&#8221;222&#8243;&amp;gt;second&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;</p>
<p>&amp;middot;插入节点<br />
$(&#8220;#myDiv&#8221;).append(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;); //往id为myDiv的元素插入span元素<br />
$(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;).appendTo(&#8220;#myDiv&#8221;); //倒过来，将span元素插入到id为myDiv的元素</p>
<p>$(&#8220;#myDiv&#8221;).prepend(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;); //往id为myDiv的元素内最前面插入span元素<br />
$(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;).prependTo(&#8220;#myDiv&#8221;); //倒过来，将span元素插入到id为myDiv的元素内的最前面</p>
<p>$(&#8220;#myDiv&#8221;).after(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;); //往id为myDiv的元素后面插入span元素（同级，不是子元素）<br />
$(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;).insertAfter(&#8220;#myDiv&#8221;); //倒过来，将span元素插入到id为myDiv的元素后面（同级，不是子元素）</p>
<p>$(&#8220;#myDiv&#8221;).before(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;); //往id为myDiv的元素前面插入span元素（同级，不是子元素）<br />
$(&#8220;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#8221;).insertBefore(&#8220;#myDiv&#8221;); //倒过来，将span元素插入到id为myDiv的元素前面（同级，不是子元素）</p>
<p>&amp;middot;删除节点<br />
$(&#8220;#myDiv&#8221;).remove(); //将id为myDiv的元素移除</p>
<p>&amp;middot;清空节点<br />
$(&#8220;#myDiv&#8221;).remove(&#8220;span&#8221;); //将id为myDiv的元素内的所有span元素移除</p>
<p>&amp;middot;复制节点<br />
$(&#8220;#myDiv span&#8221;).click( function(){ //点击id为myDiv的元素内的span元素，触发click事件<br />
$(this).clone().appendTo(&#8220;#myDiv&#8221;); //将span元素克隆，然后再添加到id为myDiv的元素内<br />
$(this).clone(true).appendTo(&#8220;#myDiv&#8221;); //如果clone传入true参数，表示同时复制事件<br />
})</p>
<p>&amp;middot;替换节点<br />
$(&#8220;p&#8221;).replaceWith(&#8220;&amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;&#8221;); //将所有p元素替换成后者 &amp;lt;p&amp;gt;您好&amp;lt;/p&amp;gt; &#8211;&amp;gt; &amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;<br />
$(&#8220;&amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;&#8221;).replaceAll(&#8220;p&#8221;); //倒过来写，同上</p>
<p>&amp;middot;包裹节点<br />
$(&#8220;strong&#8221;).wrap(&#8220;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&#8221;); //用b元素把所有strong元素单独包裹起来 &amp;lt;b&amp;gt;&amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;b&amp;gt;&amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;&amp;lt;/b&amp;gt;<br />
$(&#8220;strong&#8221;).wrapAll(&#8220;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&#8221;); //用b元素把所有strong元素全部包裹起来 &amp;lt;b&amp;gt;&amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;您好&amp;lt;/strong&amp;gt;&amp;lt;/b&amp;gt;<br />
$(&#8220;strong&#8221;).wrapInner(&#8220;&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;&#8221;); //把b元素包裹在strong元素内 &amp;lt;strong&amp;gt;&amp;lt;b&amp;gt;您好&amp;lt;/b&amp;gt;&amp;lt;/strong&amp;gt;</p>
<p>&amp;middot;属性操作<br />
var txt = $(&#8220;#myDiv&#8221;).arrt(&#8220;title&#8221;); //获取id为myDiv的元素的title属性<br />
$(&#8220;#myDiv&#8221;).attr(&#8220;title&#8221;,&#8221;我是标题内容&#8221;); //设置id为myDiv的元素的title属性的值<br />
$(&#8220;#myDiv&#8221;).attr({&#8220;title&#8221;:&#8221;我是标题内容&#8221;, &#8220;alt&#8221;:&#8221;我还是标题&#8221;); //一次性设置多个属性的值<br />
$(&#8220;#myDiv&#8221;).removeArrt(&#8220;alt&#8221;); //移除id为myDiv的元素的title属性</p>
<p>&amp;middot;样式操作<br />
var txt = $(&#8220;#myDiv&#8221;).arrt(&#8220;class&#8221;); //获取id为myDiv的元素的样式<br />
$(&#8220;#myDiv&#8221;).attr(&#8220;class&#8221;,&#8221;myClass&#8221;); //设置id为myDiv的元素的样式<br />
$(&#8220;#myDiv&#8221;).addClass(&#8220;other&#8221;); //在id为myDiv的元素中追加样式<br />
$(&#8220;#myDiv&#8221;).removeClass(&#8220;other&#8221;); //在id为myDiv的元素中移除other样式<br />
$(&#8220;#myDiv&#8221;).removeClass(&#8220;myClass other&#8221;); //在id为myDiv的元素中移除myClass和other多个样式<br />
$(&#8220;#myDiv&#8221;).removeClass(); //在id为myDiv的元素中移除所有样式<br />
$(&#8220;#myDiv&#8221;).toggleClass(&#8220;other&#8221;); //切换样式，在有other样式和没other样式之间切换<br />
$(&#8220;#myDiv&#8221;).hasClass(&#8220;other&#8221;); //判断是否有other样式</p>
<p>&amp;middot;设置和获取HTML、文本和值<br />
alert( $(&#8220;#myDiv&#8221;).html() ); //获取id为myDiv的元素的HTML代码（相当于innerHTML）<br />
$(&#8220;#myDiv&#8221;).html(&#8220;&amp;lt;span&amp;gt;hello&amp;lt;/span&amp;gt;&#8221;); //设置id为myDiv的元素的HTML代码</p>
<p>alert( $(&#8220;#myDiv&#8221;).text() ); //获取id为myDiv的元素的HTML代码（相当于innerText）<br />
$(&#8220;#myDiv&#8221;).text(&#8220;hello&#8221;); //设置id为myDiv的元素的HTML代码</p>
<p>alert( $(&#8220;#myInput&#8221;).val() ); //获取id为myDiv的元素的value值（支持文本框、下拉框、单选框、复选框等）<br />
$(&#8220;#myInput&#8221;).val(&#8220;hello&#8221;); //设置id为myDiv的元素的value值（下拉框、单选框、复选框带有选中效果）</p>
<p>&amp;middot;遍历节点<br />
var $cList = $(&#8220;#myDiv&#8221;).children(); //获取id为myDiv的元素的子元素（只考虑子元素，不考虑后代元素）<br />
var $sNext = $(&#8220;#myDiv&#8221;).next(); //获取id为myDiv的元素的下一个同辈元素<br />
var $sPrev = $(&#8220;#myDiv&#8221;).prev(); //获取id为myDiv的元素的上一个同辈元素<br />
var $sSibl = $(&#8220;#myDiv&#8221;).siblings(); //获取id为myDiv的元素的所有同辈元素<br />
var $pClos = $(&#8220;#myDiv&#8221;).closest(&#8220;span&#8221;); //获取id为myDiv的元素本身开始，最接近的span元素（向上查找）</p>
<p>&amp;middot;CSS-DOM操作<br />
$(&#8220;#myDiv&#8221;).css(&#8220;color&#8221;); //获取id为myDiv的元素的color样式的值<br />
$(&#8220;#myDiv&#8221;).css(&#8220;color&#8221;, &#8220;blue&#8221;); //设置id为myDiv的元素的color样式的值<br />
$(&#8220;#myDiv&#8221;).css({&#8220;color&#8221;:&#8221;blue&#8221;, &#8220;fontSize&#8221;:&#8221;12px&#8221;}); //设置id为myDiv的元素的color样式的值（多个）</p>
<p>$(&#8220;#myDiv&#8221;).css(&#8220;opacity&#8221;, &#8220;0.5&#8243;); //设置id为myDiv的元素的透明度（兼容浏览器）</p>
<p>$(&#8220;#myDiv&#8221;).css(&#8220;height&#8221;); //获取id为myDiv的元素的高度（单位：px，兼容浏览器）<br />
$(&#8220;#myDiv&#8221;).height(); //同上（实际高度）</p>
<p>$(&#8220;#myDiv&#8221;).css(&#8220;width&#8221;); //获取id为myDiv的元素的宽度（单位：px，兼容浏览器）<br />
$(&#8220;#myDiv&#8221;).width(); //同上（实际宽度）</p>
<p>var offset = $(&#8220;#myDiv&#8221;).offset(); //获取id为myDiv的元素在当前窗口的相对偏移量<br />
alert( offset.top + &#8220;|&#8221; + offset.left );</p>
<p>var offset = $(&#8220;#myDiv&#8221;).position(); //获取id为myDiv的元素相对于最近一个position设置为relative或absolute的父元素的相对偏移量<br />
alert( offset.top + &#8220;|&#8221; + offset.left );</p>
<p>$(&#8220;#txtArea&#8221;).scrollTop(); //获取id为txtArea的元素滚动条距离顶端的距离<br />
$(&#8220;#txtArea&#8221;).scrollLeft(); //获取id为txtArea的元素滚动条距离左侧的距离<br />
$(&#8220;#txtArea&#8221;).scrollTop(100); //设置id为txtArea的元素滚动条距离顶端的距离<br />
$(&#8220;#txtArea&#8221;).scrollLeft(100); //设置id为txtArea的元素滚动条距离左侧的距离</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- 第四章 JQuery中的事件和动画 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>&amp;middot;加载DOM<br />
$(window).load() 等价于 window.onload 事件</p>
<p>$(document).ready() 相当于window.onload事件，但有些区别：<br />
(1)执行时机：<br />
window.onload 是在网页中所有元素（包括元素的所有关联文件）完全加载后才执行<br />
$(document).ready() 是在DOM完全就绪时就可以被调用，此时，并不意味着这些元素关系的文件都已经下载完毕</p>
<p>(2)多次使用：可以在同一个页面注册多个$(document).ready()事件<br />
(3)简写方式：可以缩写成 $(function(){ })  或  $().ready()</p>
<p>&amp;middot;事件绑定<br />
当文档装载完成后，可以通过bind()方法，为特定的元素进行事件的绑定，可重复多次使用<br />
bind( type, [data, ] fn );<br />
type：指事件的类型:<br />
blur（失去焦点）、focus（获得焦点）<br />
load（加载完成）、unload（销毁完成）<br />
resize（调整元素大小）、scroll（滚动元素）<br />
click（单击元素事件）、dbclick（双击元素事件）<br />
mousedown（按下鼠标）、mouseup（松开鼠标）<br />
mousemove（鼠标移过）、mouseover（鼠标移入）、mouseout（鼠标移出）<br />
mouseenter（鼠标进入）、mouseleave（鼠标离开）<br />
change（值改变）、select（下拉框索引改变）、submit（提交按钮）<br />
keydown（键盘按下）、keyup（键盘松开）、keypress（键盘单击）<br />
error（异常）<br />
data：指事件传递的属性值，event.data 额外传递给对象事件的值<br />
fn：指绑定的处理函数，在此函数体内，$(this)指携带相应行为的DOM元素</p>
<p>&amp;middot;合并事件<br />
hover(enter,leave)：鼠标移入执行enter、移出事件执行leave<br />
$(&#8220;#myDiv&#8221;).hover( function(){<br />
$(this).css(&#8220;border&#8221;, &#8220;1px solid black&#8221;);0<br />
}, function(){<br />
$(this).css(&#8220;border&#8221;, &#8220;none&#8221;);<br />
});</p>
<p>toggle(fn1,fn2,&#8230;fnN)：鼠标每点击一次，执行一个函数，直到最后一个后重复<br />
$(&#8220;#myDiv&#8221;).toggle( function(){<br />
$(this).css(&#8220;border&#8221;, &#8220;1px solid black&#8221;);0<br />
}, function(){<br />
$(this).css(&#8220;border&#8221;, &#8220;none&#8221;);<br />
});</p>
<p>&amp;middot;事件冒泡<br />
下面的例子，BODY元素下有DIV元素，DIV元素下有SPAN元素，分别将三种元素都注册click事件。<br />
那么，click事件会按照DOM的层次结构，像水泡一样不断向上直到顶端，所以称之为事件冒泡。<br />
&amp;lt;body&amp;gt;&amp;lt;div&amp;gt;&amp;lt;span&amp;gt;我是SPAN我怕谁&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;<br />
$(&#8220;span&#8221;).bind(&#8220;click&#8221;, function(){ alert(&#8216;span click&#8217;); });<br />
$(&#8220;div&#8221;).bind(&#8220;click&#8221;, function(){ alert(&#8216;div click&#8217;); });<br />
$(&#8220;body&#8221;).bind(&#8220;click&#8221;, function(){ alert(&#8216;body click&#8217;); });</p>
<p>&amp;middot;阻止冒泡<br />
解决这个问题的办法是：在SPAN执行完click事件后，停止事件冒泡。<br />
$(&#8220;span&#8221;).bind(&#8220;click&#8221;, function(event){<br />
alert(&#8216;span click&#8217;);<br />
event.stopPropagation(); //停止冒泡<br />
});</p>
<p>&amp;middot;阻止默认行为<br />
提交按钮在提交前做相应的逻辑判断，当不满足时<br />
$(&#8220;#btnSubmit&#8221;).bind(&#8220;click&#8221;, function(event){<br />
event.preventDefault(); //阻止默认行为 相当于return false;<br />
});</p>
<p>&amp;middot;事件对象的属性<br />
$(&#8220;#myDiv&#8221;).bind(&#8220;click&#8221;, function(event){ });<br />
event.type() //返回：click<br />
event.target() //获取当前元素<br />
event.relatedTarget() //引发事件的元素<br />
event.pageX()/event.pageY() //获取鼠标相对于页面的X和Y坐标<br />
event.which() //在单击事件中获取到对应的按键 鼠标左中右分别是123<br />
event.metaKey() //获取操作中的相关功能键（ctrl/alt/shift）</p>
<p>&amp;middot;移除事件<br />
$(&#8220;#myDiv&#8221;).bind(&#8220;click&#8221;, fn1 = function(){<br />
alert(&#8220;function1&#8243;);<br />
}).bind(&#8220;click&#8221;, fn2 = function(){<br />
alert(&#8220;function2&#8243;);<br />
}).bind(&#8220;click&#8221;, fn3 = function(){<br />
alert(&#8220;function3&#8243;);<br />
});<br />
$(&#8220;#myDiv&#8221;).unbind(); //移除id为myDiv的元素的所有事件<br />
$(&#8220;#myDiv&#8221;).unbind(&#8220;click&#8221;); //移除id为myDiv的元素的所有click事件<br />
$(&#8220;#myDiv&#8221;).unbind(&#8220;click&#8221;,fn1); //移除id为myDiv的元素的名称为fn1的click事件</p>
<p>&amp;middot;一次性事件：绑定的事件执行一次后自动移除<br />
$(&#8220;#myDiv&#8221;).one(&#8220;click&#8221;, [data], function(){<br />
alert(&#8220;function1&#8243;);<br />
});</p>
<p>&amp;middot;触发事件<br />
$(&#8220;#btn&#8221;).trigger(&#8220;click&#8221;, [data]); //代码方式触发click事件<br />
$(&#8220;#btn&#8221;).click(); //另一种简写方式</p>
<p>&amp;middot;事件命名空间<br />
$(&#8220;#myDiv&#8221;).bind(&#8220;click.hello&#8221;, function(){<br />
alert(&#8220;function1&#8243;);<br />
});<br />
$(&#8220;#myDiv&#8221;).bind(&#8220;click&#8221;, function(){<br />
alert(&#8220;function1&#8243;);<br />
})<br />
$(&#8220;div&#8221;).unbind(&#8220;click&#8221;); //两个事件都被移除<br />
$(&#8220;div&#8221;).unbind(&#8220;.hello&#8221;); //只移除第一个<br />
$(&#8220;div&#8221;).unbind(&#8220;click!&#8221;); //只移除第二个（注意感叹号，指没有名字空间的）</p>
<p>&amp;middot;JQuery中的动画<br />
$(&#8220;div&#8221;).hide(); //隐藏所有DIV元素，相当于sytle=&#8221;display:none&#8221;<br />
$(&#8220;div&#8221;).show(); //显示所有DIV元素</p>
<p>$(&#8220;div&#8221;).hide(1000); //一秒内隐藏所有DIV元素，其它参数还有：slow(600) normal(400) fast(200)<br />
$(&#8220;div&#8221;).show(1000); //一秒内显示所有DIV元素</p>
<p>$(&#8220;div&#8221;).fadeOut(); //降低元素的不透明度，直至消失（支持速度参数，不会改变宽高）<br />
$(&#8220;div&#8221;).fadeIn(); //升高元素的不透明度，直至显示</p>
<p>$(&#8220;div&#8221;).slideUp(); //由下至上收缩元素，直至消失（支持速度参数）<br />
$(&#8220;div&#8221;).slideDown(); //由上至下展开元素，直至显示</p>
<p>&amp;middot;自定义动画animate<br />
$(elem).animate(params, speed, callback);<br />
params：样式属性及值的映射 {protected:&#8221;value&#8221;, protected:&#8221;value&#8221;}<br />
speed: 速度参数<br />
callback: 动画完成后执行函数，可选</p>
<p>$(&#8220;#myDiv&#8221;).animate({left:&#8221;500px&#8221;}, 2000); //两秒内ID为myDiv的元素移至左边距500px的位置<br />
$(&#8220;#myDiv&#8221;).animate({left:&#8221;+=500px&#8221;}, 2000); //同上，支持累加、累减<br />
$(&#8220;#myDiv&#8221;).animate({top:&#8221;200px&#8221;, left:&#8221;+=500px&#8221;}, 2000); //同上，多重动画，同时执行</p>
<p>$(&#8220;#myDiv&#8221;).animate({opacity:&#8221;0.5&#8243;}, 1000) //先变成50%透明<br />
.animate({top:&#8221;500px&#8221;}, 500) //移至离顶端500px<br />
.animate({left:&#8221;500px&#8221;}, 500) //移至离左边500px<br />
.fadeOut(1000); //显示出来 （四个动作为队列，一步步执行）</p>
<p>$(&#8220;#myDiv&#8221;).stop([cleanQuene] [,gotuEnd]); //停止动画，参数为boolean</p>
<p>$(&#8220;#myDiv&#8221;).is(&#8220;:animate&#8221;) //判断元素是否在执行动画</p>
<p>&amp;middot;其它动画<br />
$(&#8220;#myDiv&#8221;).toggle(); //显示与隐藏元素<br />
$(&#8220;#myDiv&#8221;).slideToggle(); //展开与收缩元素<br />
$(&#8220;#myDiv&#8221;).fadeTo(1000, 0.2); //一秒内将元素透明度调整到20%</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 第五章 JQuery对表单、表格的操作及更多应用 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>&amp;middot;单选文本框应用（获得焦点时，加了个特殊的样式，失去焦点时还原，兼容所有浏览器）<br />
$(&#8220;:input&#8221;).focus(function(){ this.addClass(&#8220;inputFocus&#8221;); })<br />
.blur(function(){ this.removeClass(&#8220;inputFocus&#8221;); });</p>
<p>&amp;middot;多行文本框的应用（放大、缩小多行文本框的高度，限制最大500px，兼容所有浏览器）<br />
var $txt = $(&#8220;#textArea&#8221;);<br />
$(&#8220;.bigger&#8221;).click(function(){<br />
if( $txt.height() &amp;lt; 500) $txt.height( $txt.height() + 50 );<br />
//if( $txt.height() &amp;lt; 500) $txt.animate({height:&#8221;+=50&#8243;}, 500 );<br />
});<br />
$(&#8220;.smaller&#8221;).click(function(){<br />
if( $txt.height() &amp;gt; 100) $txt.height( $txt.height() &#8211; 50 );<br />
//if( $txt.height() &amp;lt; 500) $txt.animate({height:&#8221;-=50&#8243;}, 500 );<br />
});</p>
<p>&amp;middot;复选框的应用（实现全选、全不选、反选）<br />
$(&#8220;#btnCheckedAll&#8221;).click(function(){ //全选<br />
$(&#8220;[name=items]:checkbox&#8221;).attr(&#8220;checked&#8221;, true);<br />
});<br />
$(&#8220;#btnCheckedNone&#8221;).click(function(){ //全不选<br />
$(&#8220;[name=items]:checkbox&#8221;).attr(&#8220;checked&#8221;, false);<br />
});<br />
$(&#8220;#btnCheckedRev&#8221;).click(function(){ //反选<br />
$(&#8220;[name=items]:checkbox&#8221;).each(function(){<br />
$(this).attr(&#8220;checked&#8221;, !$(this).attr(&#8220;checked&#8221;));<br />
//this.checked = !this.checked;<br />
}<br />
});</p>
<p>&amp;middot;下拉框的应用（将一个下拉列表的选中项搬至另一个下拉列表）<br />
$(&#8220;#btnAdd&#8221;).click(function(){ //将选中选项搬过去<br />
$(&#8220;#mySelect1 option:selected&#8221;).appendTo(&#8220;#mySelect2&#8243;);<br />
});<br />
$(&#8220;#btnAddAll&#8221;).click(function(){ //将全部选项搬过去<br />
$(&#8220;#mySelect1 option&#8221;).appendTo(&#8220;#mySelect2&#8243;);<br />
});<br />
$(&#8220;#mySelect1&#8243;).dblclick(function()[ //双击项搬过去<br />
$("#mySelect1 option:selected").appendTo("#mySelect2");<br />
}</p>
<p>&amp;middot;表单验证<br />
&amp;lt;form&amp;gt;<br />
&amp;lt;div&amp;gt;<br />
&amp;lt;label&amp;gt;用户名：&amp;lt;/label&amp;gt;<br />
&amp;lt;input type="text" id="txtUid" value="" /&amp;gt;<br />
&amp;lt;/div&amp;gt;<br />
&amp;lt;/form&amp;gt;<br />
$("form :input.required").each(function(){ //往每个class有required样式的input元素后面添加*号<br />
$(this).parent().append( $("&amp;lt;span class='star'&amp;gt;*&amp;lt;/span&amp;gt;") );<br />
});<br />
$("form :input.required").blur(function(){ //失去焦点时验证域<br />
if( this.value == "" ){<br />
$(this).parent().append( $("&amp;lt;span class='error'&amp;gt;必填字段&amp;lt;/span&amp;gt;") );<br />
}<br />
else{<br />
$(this).parent().append( $("&amp;lt;span class='success'&amp;gt;验证正确&amp;lt;/span&amp;gt;") );<br />
$(this).parent().find(".error").remove();<br />
}<br />
}).keyup(function(){ //用户每点一个键触发<br />
$(this).triggerHandler("blur");<br />
}).focus(function(){ //控制有焦点时触发<br />
$(this).triggerHandler("blur");<br />
});<br />
$("#btnSubmit").click(function(){<br />
$("form :input.required").trigger("blur"); //让所有需要验证的域失去焦点<br />
var errNum = $("form .error").length;<br />
if( errNum ){<br />
alert("有验证字段失败，请重新填写");<br />
return false;<br />
}<br />
});</p>
<p>&amp;middot;表格应用<br />
$("tr:odd").addClass("oddTr"); //给奇数行添加oddTr样式<br />
$("tr:even").addClass("evenTr"); //给偶数行添加evenTr样式</p>
<p>$("tr:contains('王五')").addClass("highlightTr"); //查找包含&amp;ldquo;王五&amp;rdquo;的行，添加highlightTr样式</p>
<p>$("tr").click(function(){<br />
$(this).addClass("selectedTr") //给当前行添加选中样式<br />
.siblings().removeClass("selectedTr") //反选移除选中样式<br />
.end() //结束，返回$(this)，否则则是反选的行<br />
.find(':radio").attr("checked",true); //在当前行查找单选框，选中它<br />
});</p>
<p>//-------------------- 第六章 JQuery与Ajax的应用 ------------------------</p>
<p>&amp;middot;load( url [,data] [,callback] )方法<br />
url：要请求的页面的地址<br />
data：要发送的相关参数<br />
callback：回调函数</p>
<p>$(&#8220;#myDiv&#8221;).load(&#8220;hello.html&#8221;); //向myDiv元素加载hello.html的内容<br />
$(&#8220;#myDiv&#8221;).load(&#8220;hello.html .myClass&#8221;); //筛选，只加载hello.html中myClass样式的内容</p>
<p>$(&#8220;#myDiv&#8221;).load(&#8220;hello.html&#8221;, function(){} ); //没参数的，使用GET方式<br />
$(&#8220;#myDiv&#8221;).load(&#8220;hello.html&#8221;, {id:&#8217;123&#8242;, name:&#8217;dier&#8217;}, function(){} ); //有参数的，使用POST方式</p>
<p>$(&#8220;#myDiv&#8221;).load(&#8220;hello.html&#8221;, function(responseText, textStatus, XMLHttpRequest){ //回调函数<br />
//responseText : 请求返回的内容<br />
//textStatus : 请求状态 success error notmodified timeout<br />
//XMLHttpRequest : Ajax对象<br />
});</p>
<p>&amp;middot;$.get( url [,data] [,callback] [,type])和$.post( url [,data] [,callback] [,type])方法<br />
url：要请求的页面的地址<br />
data：要发送的相关参数<br />
callback：回调函数<br />
type：指定服务器返回内容的格式 xml html script json text _default</p>
<p>$.get( &#8220;test.aspx&#8221;, {id:&#8221;123&#8243;, name:&#8221;dier&#8221;}, function(data,textStatus){ //回调函数只有当状态是success才触发<br />
//data : 请求返回的内容<br />
//textStatus : 请求状态 success error notmodified timeout</p>
<p>//当data是HTML时，直接加载<br />
$(&#8220;#myDiv&#8221;).html(data);</p>
<p>//当data是XML时，可筛选 &amp;lt;user id=&#8221;123&#8243; name=&#8221;dier&#8221; age=&#8221;27&#8243; /&amp;gt;<br />
var age = $(data).find(&#8220;user&#8221;).attr(&#8220;age&#8221;);</p>
<p>//当data是JSON时，可直接点出属性来 {id:&#8221;123&#8243;, name:&#8221;dier&#8221;, age:&#8221;27&#8243;}<br />
var age = data.age;<br />
});</p>
<p>&amp;middot;getScript(url [,callback])方法<br />
$(function(){ //动态加载JS脚本<br />
$.getScript(&#8220;test.js&#8221;);</p>
<p>$.getScript(&#8220;test.js&#8221;, function(){ //回调函数<br />
//do something..<br />
});<br />
});</p>
<p>&amp;middot;getJSON(url [,callback])方法<br />
$(function(){ //动态加载JS脚本<br />
$.getJSON(&#8220;test.js&#8221;);</p>
<p>$.getJSON(&#8220;test.js&#8221;, function(data){ //回调函数<br />
//do something..<br />
//data : 返回的数据<br />
$.each( data, function(index, item){ //遍历，相当于foreach<br />
//index : 索引<br />
//item : 当前项内容<br />
//return false; 退出循环<br />
});<br />
});<br />
});</p>
<p>&amp;middot;ajax(options)方法<br />
url : 请求的地址<br />
type : 请求的方式 GET POST 默认为GET<br />
timeout : 请求超时时间(单位：毫秒）<br />
data : 请求时发送的参数（String,Object）<br />
dataType : 预期返回的数据类型 xml html script json jsonp text<br />
bdforeSend : 发送请求前触发事件，如果return false则取消发送 function(XmlHttpRequest){}<br />
complete : 请求完成后触发事件，不管成功与否 function(XmlHttpRequest, textStatus){}<br />
success : 请求完成并且成功时触发事件 function(data, textStatus){}<br />
error : 请求完成并且失败时触发事件 function(XmlHttpRequest, textStatus, errorThrown){}<br />
global : 是否为全局请求，默认为true，可使用AjaxStart、AjaxStop控制各种事件</p>
<p>$.ajax({<br />
url : &#8220;test.aspx&#8221;,<br />
type : &#8220;POST&#8221;,<br />
timeout : &#8220;3000&#8243;,<br />
data : {id:&#8221;123&#8243;, name:&#8221;dier&#8221;},<br />
dataType : &#8220;HTML&#8221;,<br />
success : function(data,textStatus){<br />
$(&#8220;#myDiv&#8221;).html( data );<br />
}<br />
error : function(XmlHttpRequest, textStatus, errThrown){<br />
$(&#8220;#myDiv&#8221;).html( &#8220;请求失败：&#8221; + errThrown );<br />
}<br />
});</p>
<p>&amp;middot;序列化字符串 serialize()<br />
$.get( &#8220;test.aspx&#8221;, $(&#8220;#form1&#8243;).serialize(), function(data,textStatus){<br />
//将form1整个表单中的所有域序列化成提交的参数，支持自动编码<br />
});</p>
<p>&amp;middot;序列化数组 serializeArray()<br />
var arr = $(&#8220;:checkbox, :radio&#8221;).serializeArray();</p>
<p>&amp;middot;对象序列化 param()<br />
var obj = {id:&#8221;123&#8243;, name:&#8221;dier&#8221;, age:&#8221;27&#8243;};<br />
var kv = $.param(obj); //id=123&amp;amp;name=dier&amp;amp;age=27</p>
<p>&amp;middot;JQuery中的全局Ajax事件<br />
ajaxStart(callback) //请求开始时触发<br />
ajaxStop(callback) //请求结束时触发<br />
ajaxComplete(callback) //请求完成时触发<br />
ajaxSuccess(callback) //请求成功时触发<br />
ajaxError(callback) //请求失败时触发<br />
ajaxSend(callback) //请求发送前触发</p>
<p>$(&#8220;#loading&#8221;).ajaxStart(function(){ //当有AJAX请求时显示，完成时隐藏<br />
$(this).show();<br />
}.ajaxStop(function(){<br />
$(this).hide();<br />
}<br />
);</p>
<p>//第七章是插件的使用及编写 第八章则是一个实例 此处忽略</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/feng-li-jquery-pdf-node-633/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>让firefox支持javascript中的innerText</title>
		<link>http://javadou.com/firefox-javascript-innertext-632/</link>
		<comments>http://javadou.com/firefox-javascript-innertext-632/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 09:47:47 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=632</guid>
		<description><![CDATA[运行该段HTML文件： &60;script type=&8221;text/javascript&8221;&62;// &60;![CDATA[ function test() { alert(document.getElementById("div1").innerText); } // ]]&62;&60;/script&62; &60;div id=&8221;div1&8243;&62;Hello world!&60;/div&62; &60;input onclick=&8221;test... ]]></description>
			<content:encoded><![CDATA[<p>运行该段HTML文件：<br />
&lt;script type=&#8221;text/javascript&#8221;&gt;// &lt;![CDATA[<br />
function test() { alert(document.getElementById("div1").innerText); }<br />
// ]]&gt;&lt;/script&gt;<br />
&lt;div id=&#8221;div1&#8243;&gt;Hello world!&lt;/div&gt;<br />
&lt;input onclick=&#8221;test();&#8221; type=&#8221;button&#8221; value=&#8221;OK&#8221; /&gt;</p>
<p>在IE下，正常弹出“Hello world!”；而在firefox中，弹出的是“undefined”的未定义错误；</p>
<p>现在用javascript编写这样的一段代码：<br />
try{<br />
HTMLElement.prototype.__defineGetter__<br />
(<br />
&#8220;innerText&#8221;,<br />
function ()<br />
{<br />
var anyString = &#8220;&#8221;;<br />
var childS = this.childNodes;<br />
for(var i=0; i<br />
{<br />
if(childS[i].nodeType==1)<br />
anyString += childS[i].tagName==&#8221;BR&#8221; ? &#8216;&#8221;n&#8217; : childS[i].innerText;<br />
else if(childS[i].nodeType==3)<br />
anyString += childS[i].nodeValue;<br />
}<br />
return anyString;<br />
}<br />
);<br />
}<br />
catch(e){}</p>
<p>在运行该段HTML文件，即可正常弹出“Hello world！”了。﻿</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/firefox-javascript-innertext-632/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java学习 loadrunner license的设置</title>
		<link>http://javadou.com/loadrunner-license-java-2-598/</link>
		<comments>http://javadou.com/loadrunner-license-java-2-598/#comments</comments>
		<pubDate>Wed, 05 May 2010 13:23:02 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Java基础]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=598</guid>
		<description><![CDATA[初学loadrunner，今天准备用这个工具测试一下手头的一个cs服务器，想用java Vuser来调用。边学边用吧，先简单写了一个脚本，就是打印“HelloWorld”，然后在脚本编辑器里面运行是通过了，但在场景控制器里面并发运... ]]></description>
			<content:encoded><![CDATA[<p><span>初学loadrunner，今天准备用这个工具测试一下手头的一个cs服务器，想用java Vuser来调用。边学边用吧，先简单写了一个脚本，就是打印“HelloWorld”，然后在脚本编辑器里面运行是通过了，但在场景控制器里面并发运行这个脚本，报如下错误：<br />
“You do not have a for this Vuser type.Please contact Mercury Interactive to renew your license.”</p>
<p>目前用的loadrunner是最新的9.0版本，具体的破解方式请google，基本原来是利用8.1版本的破解方式（同样感谢HP公司的大度！）。使用的License也就是目前网络上比较通用的两个：<br />
global 100user<br />
AEAMAUIK-YAFEKEKJJKEEA-BCJGI<br />
10000 web clients<br />
AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB</p>
<p>但是使用java Vuser时，还是发现出现了没有License的情况，经过一番折腾，发现是自己的设置不对，google了一下发现很多人似乎犯了和我类似的错误，整理一下分享出来，避免后来人继续犯错。</p>
<p>具体说，是loadrunner的License管理器，只支持一个License，我先后输入了上面的两个License，最后实际生效的只有最后一个 10000 web clients的。而loadrunner的不同协议是要求不同的License的，上面的10000 web clients是不能用于java Vuser的（估计其他协议也会遇到同样问题）。因此必须将License修改为global 100user，这样java Vuser就可以跑起来了。注意修改License后要关闭现有的loadrunner程序然后再重新打开，否则License依然无效。如果需要测试不同的协议，则视具体需要自己动手设置不同的License了，没有办法，买不起啊，loadrunner的license简直是天价。</p>
<p>这样就出现一个问题，如果要测试100以上的java Vuser就没有办法了，google一遍网络没有发现更大更好的License，只能使用这个，限制在100了。好在最常用的 web clients有10000，怎么也够用了。</p>
<p>补充：刚google到一个500 VU的LoadRunner 8.0 Global licence，尽管已经过期，但是可以通过修改机器时间来正常使用。我将机器时间设置为2003年2月，可以输入这个license，虽然 loadrunner给出警告，但是重起后可以正常使用。我试了一下200vu可以跑java vuser，看来这也是一个突破100vu限制的办法，虽然修改时间的方法恶心了点。<br />
licence:<br />
BGAUGLIX-AJGI-AEIEKEKJJKEAFJP-BDFHW<br />
Valid until 31. 十月 2003 </span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/loadrunner-license-java-2-598/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>java设计模式之Decorator模式</title>
		<link>http://javadou.com/decorator-java-590/</link>
		<comments>http://javadou.com/decorator-java-590/#comments</comments>
		<pubDate>Tue, 04 May 2010 22:24:08 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[设计模式]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=590</guid>
		<description><![CDATA[一、Decorator模式的定义： “Decorator”一词在英文中的意思是“装饰工”的意思，在设计模式中“Decorato模式”的作用也是“动态地给对象增加一些职责”。请注意：这句话中有2个重点的地方： ·动态：也就是说无法... ]]></description>
			<content:encoded><![CDATA[<p><span>一、Decorator模式的定义：</p>
<p>“Decorator”一词在英文中的意思是“装饰工”的意思，在设计模式中“Decorato模式”的作用也是“动态地给对象增加一些职责”。请注意：这句话中有2个重点的地方：</p>
<p>·动态：也就是说无法预先在编译阶段就知道职责的具体内容和添加时机，什么时候添加什么功能完全由客户在运行时刻规定。</p>
<p>·增加：“Decorator模式”往往用于在现有功能的基础上针对不同的对象，添加一些不同的功能，实际上我们还可以改变行为的流程。</p>
<p>二、Decorator模式的好处：</p>
<p>我们知道，有时候在同一个运行环境下，由于不同对象具有不同的特性导致了它们在执行同一种类型操作时，可能存在一些细小的差别，这些差别可能体现在：</p>
<p>第一 参数不同</p>
<p>第二 过程不同</p>
<p>第三 方式不同</p>
<p>那么针对这三种情况我们可以采取的解决方法有两种：</p>
<p>第一 采用继承的方式。定义一个父类的抽象方法，由不同的子类各自实现不同的操作，但一旦子类一多势必带来类的数量膨胀的问题，难以管理；其次如果只是一些局部的细微差别而导致了必须重写整个过程或方法，那么必将导致出现大量的重复代码(即功能相同部分的代码)。我曾经看过一些项目，里面存在了大量的重复代码，到处都是“Copy-Paste”.只是修改了某处的关键参数而已。</p>
<p>而“Duplicate code”正是《重构-改善既有代码的设计》一书中提到的首要“异味”，这意味着一旦公共部分的功能改变了，那么你有可能需要重新编译几个甚至十几个子类。</p>
<p>第二 采用“Decorator模式”。首先将功能分解，分成若干个小块，这是为了后面我们可以动态地重组。其次将功能部分抽取出来成为一个接口，通过一个实现了接口的基类完成基本的共有功能。一旦我们需要在基类的功能基础上添加或改变流程，我们就可以通过“Decorator类”实现接口，在接口的实现方法中增加、改变方法的功能或流程。</p>
<p>比较上面这两种做法，我们可以看到使用了“Decorator模式”后，代码更加简洁了，可重用性和可扩展性更高了。其次由于可以在构造 “Decorator类”的过程中传递参数，我们可以动态的增加、改变原有的功能、流程，而相同部分的功能则委托给基类去完成。最后由于“油漆工”在“被油漆物”外面刷了一层油漆，里面怎么改变对外界来说是透明的。</p>
<p>三、Decorator模式的适应场合：</p>
<p>Decrator模式的适用场合：<br />
1).在运行时刻由用户动态决定加入的方式和时机，无法在编译期间决定<br />
2).需要改变的行为太多，用继承会导致复杂性的增加</p>
<p>四、Decorator模式与Adapater、Builder模式的区别：</p>
<p>Adapter和Decorator模式的区别：<br />
1).前者关注的是如何将两个本来互不相关的类糅合到一起，后者关注的是如何在原来功能的基础上做一些小的调整</p>
<p>Builder和Decorator模式的区别：<br />
1).前者关注的是对象的构建，后者关注的是对象功能的添加、个性化<br />
2).前者主要用于GUI界面构建对象的场合、后者主要用于动态添加功能、改变流程的场合</p>
<p><a href="http://www.java125.cn/article.asp?id=2680" target="_blank">设计模式之Decorator模式2-java学习</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/decorator-java-590/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java数据连接池 dbcp配置中文文档-java学习</title>
		<link>http://javadou.com/apache-dbcp-java-581/</link>
		<comments>http://javadou.com/apache-dbcp-java-581/#comments</comments>
		<pubDate>Mon, 03 May 2010 23:20:10 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Java基础]]></category>
		<category><![CDATA[应用服务器]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[dbcp]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=581</guid>
		<description><![CDATA[dbcp配置中文版本，翻译自apache 官方文档，原文请见http://commons.apache.org/dbcp/configuration.html。 参数    描述 username     传递给JDBC驱动的用于建立连接的用户名 password     传递给JDBC驱动的用于建立连接的密码 ur... ]]></description>
			<content:encoded><![CDATA[<p><span>dbcp配置中文版本，翻译自apache 官方文档，原文请见<a href="http://commons.apache.org/dbcp/configuration.html" target="_blank">http://commons.apache.org/dbcp/configuration.html</a>。</p>
<p>参数    描述<br />
username     传递给JDBC驱动的用于建立连接的用户名<br />
password     传递给JDBC驱动的用于建立连接的密码<br />
url     传递给JDBC驱动的用于建立连接的URL<br />
driverClassName     使用的JDBC驱动的完整有效的java 类名<br />
connectionProperties     当建立新连接时被发送给JDBC驱动的连接参数，格式必须是 [propertyName=property;]*<br />
注意：参数user/password将被明确传递，所以不需要包括在这里。</p>
<p>参数    默认值    描述<br />
defaultAutoCommit     true     连接池创建的连接的默认的auto-commit状态<br />
defaultReadOnly     driver default     连接池创建的连接的默认的read-only状态. 如果没有设置则setReadOnly方法将不会被调用. (某些驱动不支持只读模式,比如:Informix)<br />
defaultTransactionIsolation     driver default     连接池创建的连接的默认的TransactionIsolation状态. 下面列表当中的某一个: (参考javadoc)</p>
<p>* NONE<br />
* READ_COMMITTED<br />
* READ_UNCOMMITTED<br />
* REPEATABLE_READ<br />
* SERIALIZABLE</p>
<p>defaultCatalog<br />
连接池创建的连接的默认的catalog</p>
<p>参数    默认值    描述<br />
initialSize     0     初始化连接:连接池启动时创建的初始化连接数量,1.2版本后支持<br />
maxActive     8     最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 如果设置为非正数则表示不限制<br />
maxIdle     8     最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制<br />
minIdle     0     最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建<br />
maxWait     无限     最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,如果设置为-1表示无限等待</p>
<p>参数    默认值    描述<br />
validationQuery<br />
SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL Select并且必须返回至少一行记录<br />
testOnBorrow     true     指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.<br />
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串<br />
testOnReturn     false     指明是否在归还到池中前进行检验<br />
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串<br />
testWhileIdle     false     指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.<br />
注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串<br />
timeBetweenEvictionRunsMillis     -1     在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程<br />
numTestsPerEvictionRun     3     在每次空闲连接回收器线程(如果有)运行时检查的连接数量<br />
minEvictableIdleTimeMillis     1000 * 60 * 30     连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值，单位毫秒</p>
<p>参数    默认值    描述<br />
poolPreparedStatements     false     开启池的prepared statement 池功能<br />
maxOpenPreparedStatements     不限制     statement池能够同时分配的打开的statements的最大数量, 如果设置为0表示不限制</p>
<p>这里可以开启PreparedStatements池. 当开启时, 将为每个连接创建一个statement池,并且被下面方法创建的PreparedStatements将被缓存起来:<br />
* public PreparedStatement prepareStatement(String sql)<br />
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)<br />
注意: 确认连接还有剩余资源可以留给其他statement</p>
<p>参数    默认值    描述<br />
accessToUnderlyingConnectionAllowed     false     控制PoolGuard是否容许获取底层连接</p>
<p>如果容许则可以使用下面的方式来获取底层连接:<br />
Connection conn = ds.getConnection();<br />
Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();<br />
&#8230;<br />
conn.close();</p>
<p>默认false不开启, 这是一个有潜在危险的功能, 不适当的编码会造成伤害.(关闭底层连接或者在守护连接已经关闭的情况下继续使用它).请谨慎使用,并且仅当需要直接访问驱动的特定功能时使用.<br />
注意: 不要关闭底层连接, 只能关闭前面的那个.</p>
<p>参数    默认值    描述<br />
removeAbandoned     false     标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制.如果设置为true, 连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout. 设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接.<br />
removeAbandonedTimeout     300     泄露的连接可以被删除的超时值, 单位秒<br />
logAbandoned     false     标记当Statement或连接被泄露时是否打印程序的stack traces日志。被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,因为需要生成stack trace。</p>
<p>如果开启&#8221;removeAbandoned&#8221;,那么连接在被认为泄露时可能被池回收. 这个机制在(getNumIdle() &lt; 2) and (getNumActive() &gt; getMaxActive() - 3)时被触发.<br />
举例当maxActive=20, 活动连接为18,空闲连接为1时可以触发&#8221;removeAbandoned&#8221;.但是活动连接只有在没有被使用的时间超过 &#8221;removeAbandonedTimeout&#8221;时才被删除,默认300秒.在resultset中游历不被计算为被使用.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/apache-dbcp-java-581/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java一些设计模式的学习心得</title>
		<link>http://javadou.com/some-she-ji-mo-shi-592/</link>
		<comments>http://javadou.com/some-she-ji-mo-shi-592/#comments</comments>
		<pubDate>Sun, 02 May 2010 22:15:36 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[设计模式]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=592</guid>
		<description><![CDATA[本来打算在sourceforge申请一个项目后再将Tbuy1.2源代码放出来!刚好这两天打开sourceforge的网站速度如蜗牛般慢！所以也就搁了下来,顺便打算把项目重构一下之后再申请,发现自己的作品一直在重构,每一次重构都是一个... ]]></description>
			<content:encoded><![CDATA[<p><span>本来打算在sourceforge申请一个项目后再将Tbuy1.2源代码放出来!刚好这两天打开sourceforge的网站速度如蜗牛般慢！所以也就搁了下来,顺便打算把项目重构一下之后再申请,发现自己的作品一直在重构,每一次重构都是一个进步。</p>
<p>Tbuy这个项目开放源码后得到很多朋友的帮助与建议!学到了不少知识，真的非常感谢，虽然普遍认为国内缺乏开源土壤, 但开源可以学到更多更深的知识,所以打算一直开源下去。继续整理了1.2的代码，把源码放出来，喜欢JSF的人可以自由下载，</p>
<p>按照计划,Tbuy1.2是完整重构前的最后一个版本,1.2 的程序放出后一直在打算重构一下,尽管之前做过不少重构!但到最近一直都不满意!特别是在最近几次看了一些UML设计图之后,觉得需要从整体上重构一下! 使结构更加清晰,层次更加分明,合理!所以最近在翻看一些UML的相关资料学习一下,netbeans上也有uml的相关插件,功能很强大!即使不使用 UML,随便写一个流程草图,也能使你的程序清晰可见! 呵呵,学习编程还是不能满足于只会写代码!学习一下Java的设计模式,更好的构建项目确实很重要!顺便谈一下关于设计模式。</p>
<p>每个人都有自己的一些心得体会,Java还学得不深,不敢妄谈!随便写一点自己的心得.如果Java基础不是很好,或者看看还可以,看完之后效果也不是很好!有时候真的能看懂,并且能理解,但之后却不知道应该如何用它,或者觉得自己的项目好像不需要,或不知把它用在哪里&#8230;&#8230;因为缺乏一些项目经验的问题.实际上我觉得学习设计模式还是要自己单独去开发一些项目,不要刻意去看!</p>
<p>在项目的不断完善-重构-再完善-再重构&#8230;往复的过程中学习. 因为在用心完善你的项目的时候一定会遇到很多问题.然后会偿试找更好的方法去改善,有时候我们解决问题的方法就已经是一种设计模式了,随着问题与知识的积累,再看看一些设计模式的书,然后会有较好的收获.<br />
有时间看看一些开源代码会很不错. 很多好的开发框架都会包含很多设计模式的例子,JSF这个框架的源代码真的很好,里面的代码我看了一些,理解的不多,嘿嘿!但也有很多收获.有时候能够对我们有一些启发也就足够了,有些设计方法可能几年都不一定能学得到!或许这就是为什么有那么多程序员喜欢开源的原因吧！</p>
<p>不过话说回来,实际上设计模式也就那么回事,也就是帮助我们解决问题的通用方法,加了个好听的名词就是&#8221;设计模式&#8221; 主要还是能不能帮我们解决问题,一个例子举得好&#8221;在一张白纸上随便画几下,再用相机&#8217;咔嚓&#8217;一下,一张UML图示就出来了&#8221;.<br />
二十几个设计模式,并不完全适合我们,所以并不是模式用得越多越好,用得不档就可能变成了反模式,不过对于自己的学习项目,还是要大胆偿试.<br />
Tbuy作为我学习JavaEE的一个BBS项目,每一次学web编程我总是喜欢写一个BBS项目, 第一次学asp也是从书里的一个留言板例子写起,最后被一个分页问题整得很惨,嘿嘿! 学PHP的时候也是从留言板写起.学Java也是, 因为对于一个BBS来说,里面包含大部分WEB编程需要面对的问题,如:注册,登录,文件上传,授权验证,分页&#8230;.等等,“麻雀虽小,但五脏俱全”基本上大部分的问题都可能会遇到,而且BBS比较通用,作为检验自己的WEB编程再适合不过了.</p>
<p>顺便制定Tbuy的下一步计划，使用hibernate可能更好一点，并且能够更好的支持多种数据库，在多数据库下遇到了一些问题! 结构上再重新调整，然后至少画一张流程草图出来。或者再写一些设计心得！甚至有空的话，再写整个程序的分析过程。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/some-she-ji-mo-shi-592/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax ext 的event学习-自定义事件与浏览器事件</title>
		<link>http://javadou.com/ajax-ext-event-manager-619/</link>
		<comments>http://javadou.com/ajax-ext-event-manager-619/#comments</comments>
		<pubDate>Sat, 01 May 2010 21:13:07 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=619</guid>
		<description><![CDATA[事件无疑是AJAX应用中最重要的部分，EXT将事件分为了两种：自定义事件与浏览器事件。 自定义事件 按字面意思就是用户自己定义的事件，这个事件通常与组件相关。并且需要用户根据组件的状态自己触发。相关的... ]]></description>
			<content:encoded><![CDATA[<p><span>事件无疑是AJAX应用中最重要的部分，EXT将事件分为了两种：自定义事件与浏览器事件。</p>
<p>自定义事件<br />
按字面意思就是用户自己定义的事件，这个事件通常与组件相关。并且需要用户根据组件的状态自己触发。相关的类Ext.util.Observable 、Ext.util.Event（Observable.js）。Ext.util.Observable是所有组件（component）的父类，它使得所有的组件都可以任意的添加自定义事件，它的events属性对事件进行维护，这些事件实际都是Ext.util.Event对象， Ext.util.Event对象里的listeners属性对与该事件相关的处理器进行维护。Observable给所有的子类提供了一个统一的接口来发布事件以及管理事件，这一特性对于组件来说是至关重要的。</p>
<p>浏览器事件<br />
即传统意义上的鼠标单击、移动等等事件，这些事件是由浏览器根据用户的动作自己触发的，与页面元素紧密关联。相关的类Ext.Element 、Ext.EventManager、Ext.EventObject、Ext.lib.Event 。Element包含了常见的DOM方法和属性，提供一个快捷的、统一的、跨浏览器的接口，内置了常用的DOM节点的动作，并且是跨浏览器的定位的位置、大小、动画、拖放等等。对事件的处理，Element实际将这一处理委托给了EventManager，由EventManager对页面所有的浏览器事件进行管理，例如增加事件处理器、移除事件处理器等等，另外EventManager还定义了几个很重要的方法：onDocumentReady、 onWindowResize、onTextResize。其中onDocumentReady尤为重要，通常在页面需要通过它来启动我们的AJAX程序，它会在页面document渲染完毕而图片等还未下载时调用我们的启动函数。至于EventObject，它则是对原始的浏览器事件进行了封装，提供给事件处理器一个统一一致的事件接口。Ext.lib.Event呢？EventManager的很多功能其实是调用它完成的，它的listeners、 unloadListeners维护着所有的事件处理器。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-ext-event-manager-619/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ajax性能优化 把ajax性能提高10倍</title>
		<link>http://javadou.com/ajax-youhua-612/</link>
		<comments>http://javadou.com/ajax-youhua-612/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 22:11:38 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=612</guid>
		<description><![CDATA[EasyJWeb中已经有了一个Ajax远程脚本调用引擎，这是很早的事情了。但由于一直存在一些性能问题，所以一直没有给大家推荐，直到最近m3发布，通过对Ajax远程脚本调用引擎进行完善，把处理复杂对象的返回进行的简... ]]></description>
			<content:encoded><![CDATA[<p><span>EasyJWeb中已经有了一个Ajax远程脚本调用引擎，这是很早的事情了。但由于一直存在一些性能问题，所以一直没有给大家推荐，直到最近m3发布，通过对Ajax远程脚本调用引擎进行完善，把处理复杂对象的返回进行的简化，通过在以前的几个应用中进行了测试，发现性能一下子提升了至少10倍以上，并且运行比较稳定，因此在这里给大家推荐推荐。</p>
<p>EasyJWeb是一个提供了对Ajax远程脚本调用功能支持的框架，他帮助你完成Ajax远程脚本调用中的大多数细节工作，你基本上不用写额外的代码就能非常轻松的使用javascript来调用服务器的业务组件的相关方法，这些业务组件可以是任何java对象，比如EJB、EasyJWeb 容器中的Bean、Spring容器中的Bean等等。使用EasyJWeb的Ajax远程脚本调用，需要下面的几个步骤：<br />
1、 在EasyJWeb容器或子容器中配置供客户端脚本调用的业务组件。比如，在easyjweb的配置文件中像下面的方式配置Bean：</p>
<p>&lt;bean name=&#8221;PersonService&#8221; class=&#8221;easyjweb.demo.service.impl.PersonServiceImpl&#8221; /&gt;</p>
<p>PersonServiceImpl的代码如下：</p>
<p>package easyjweb.demo.service.impl;<br />
import java.util.Date;<br />
import java.util.List;<br />
import java.util.Map;<br />
public class PersonServiceImpl {<br />
/**<br />
* 得到服务器当前时间<br />
* @return<br />
*/<br />
public Date getTime() {<br />
return new Date();<br />
}<br />
}</p>
<p>2、 在EasyJWeb的配置文件，配置要把容器中的哪些业务组件及具体方法暴露给客户端进行远程脚本调用。内容大致如下：</p>
<p>&lt;ajax&gt;<br />
&lt;services allowName=&#8221;*&#8221;&gt;<br />
&lt;service name=&#8221;PersonService&#8221; /&gt;<br />
&lt;/services&gt;<br />
&lt;/ajax&gt;</p>
<p>上面的ajax配置信息表示暴PersonService的所有public方法供客户端使用javascript调用。<br />
只需要上面的两步，就完成了服务器端的相关工作。服务器端不再需要写任何Action，EasyJWeb会自动处理客户端发送来的Ajax远程脚本调用，下面我们进一步看看客户端的程序。<br />
3、为了能够在客户端页面中直接使用javascript进行对PersonService业务组件的Ajax远程脚本调用，我们需要在页面中引入下面三个js。</p>
<p>&lt;script src=&#8221;ejf/easyajax/prototype.js&#8221; type=&#8221;text/javascript&#8221;&gt;&lt;/script&gt;<br />
&lt;script src=&#8221;ejf/easyajax/engine.js&#8221; type=&#8221;text/javascript&#8221;&gt;&lt;/script&gt;<br />
&lt;script src=&#8221;ejf/easyajax/PersonService.js&#8221; type=&#8221;text/javascript&#8221;&gt;&lt;/script&gt;</p>
<p>其中第一个ejf/easyajax/prototype.js引入的是prototype.js，这是一个javascript的基础库，提供很多对基础javascript类的扩展，并提供了ajax相关的实用组件，EasyJWeb的远程脚本调用引擎是基于prototype.js构建的。<br />
第二个ejf/easyajax/engine.js是EasyJWeb的远程脚本调用支持引擎，他负责处理Ajax远程脚本调用的相关的细节，如参数处理、回调处理等，同时提供了一些实用工具如EasyAjaxUtil等供客户端使用。<br />
第三个ejf/easyajax/PersonService.js是PersonService对象，PersonService.js的内容是根据服务器端的容器中名为PersonService的Bean及EasyJWeb的ajax配置信息生成的。只要引入了 PersonService.js，我们就可以直接在页面中调用PersonService的相关方法了。<br />
上面的三个js文件都是服务器端动态生成的，需要我们在web.xml文件把所有/ejf/*的URL都交由EasyJWeb来处理。因此，需要在Web.xml的url中增加如下的映射内容：</p>
<p>&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;easyjf&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/ejf/*&lt;/url-pattern&gt;&lt;!&#8211;所有/ejf/开头的url都由easyjweb来处理&#8211;&gt;<br />
&lt;/servlet-mapping&gt;</p>
<p>4、 在页面中使用javascript调用服务器的相关方法</p>
<p>&lt;script&gt;<br />
function showServerTime(){<br />
PersonService.getTime(showTime) ;<br />
function showTime(ret){<br />
alert(&#8220;服务器端时间: &#8221;+ret) ;<br />
}<br />
}<br />
&lt;/script&gt;</p>
<p>怎么样，一切都是如此简单，不需要写任何PersonService的代码，不需要写任何Action，只需要进行非常简单的配置，就能让我们服务器上的业务组件支持Ajax远程脚本调用。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-youhua-612/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SpringMVC数据绑定xx.yy.zz 时的yy对象初始化</title>
		<link>http://javadou.com/springmvc-xx-yy-zz-init-java-599/</link>
		<comments>http://javadou.com/springmvc-xx-yy-zz-init-java-599/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 22:09:32 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=599</guid>
		<description><![CDATA[SpringMVC数据绑定xx.yy.zz 时的yy对象初始化 Spring Mvc 中的SimpleFormController是专门负责数据绑定的Controller ，当做深层绑定时，xx.yy.zz  如果yy 对象为null 就会抛出空指针.我在前期用如下代码进行初始化 Article article = ... ]]></description>
			<content:encoded><![CDATA[<p>SpringMVC数据绑定xx.yy.zz 时的yy对象初始化<br />
<span>Spring Mvc 中的SimpleFormController是专门负责数据绑定的Controller ，当做深层绑定时，xx.yy.zz  如果yy 对象为null<br />
就会抛出空指针.我在前期用如下代码进行初始化<br />
Article article = new Article();<br />
MainType articleType = new MainType();<br />
article.setMainType(articleType);<br />
显尔易见这段代码繁琐的，经过摸索，利用java 反射机制，编写了一个公共方法进行初始化<br />
package com.allcom.base.commons;</p>
<p>import java.lang.reflect.Field;<br />
import java.lang.reflect.Method;</p>
<p>import com.allcom.vvgoo.persist.Merchant;<br />
/** *//** *//** *//**<br />
* 初始化对像的属性 ,对于日期型数据将自动填充当前日期<br />
*<br />
* */<br />
public class AutoView {</p>
<p>public static void AutoView(Object command){<br />
if(null!=command){<br />
Class classType = command.getClass();<br />
Field fields[]  = classType.getDeclaredFields();<br />
for(int i=0;i&lt;fields.length;i++){<br />
Field field = fields[i];<br />
String fieldName = field.getName();<br />
String typeName =field.getType().getName();<br />
String firstLetter = fieldName.substring(0,1).toUpperCase();</p>
<p>String getMethodName = &#8221;get&#8221;+firstLetter+fieldName.substring(1);<br />
String setMethodName = &#8221;set&#8221;+firstLetter+fieldName.substring(1);</p>
<p>try {<br />
Method setMethod = classType.getMethod(setMethodName,new Class[]{field.getType()});<br />
Class clazz = Class.forName(typeName);<br />
Object value = clazz.newInstance();<br />
if (null!=value){<br />
setMethod.invoke(command,new Object[]{value});<br />
}<br />
} catch (Exception e) {</p>
<p>}</p>
<p>}<br />
}<br />
}</p>
<p>public static void main(String[] arg){<br />
Merchant merchant = new Merchant();<br />
AutoView view = new AutoView();<br />
view.AutoView(merchant);<br />
System.out.print(Util.dateToString(merchant.getCreateDate(), &#8221;yyyy-MM-dd&#8221;));</p>
<p>}</p>
<p>}</p>
<p>其中 Merchant 是任意的一个javaBean，在使用该方法处理后，其中xx.yy.zz 中的yy 对象会自动填充该对象全新的实例</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/springmvc-xx-yy-zz-init-java-599/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ajax入门 ajax使用方式3-java学习</title>
		<link>http://javadou.com/ajax-ajax-jquery-dwr-613/</link>
		<comments>http://javadou.com/ajax-ajax-jquery-dwr-613/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 13:08:24 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=613</guid>
		<description><![CDATA[4、使用DWR进行ajax开发 DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样... ]]></description>
			<content:encoded><![CDATA[<p><span>4、使用DWR进行ajax开发</p>
<p>DWR(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它的最新版本 DWR0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-logging日记操作官方，本文版本是DWR2.0 ,具体详情请访问DWR官方网站。</p>
<p>4.1、业务需求</p>
<p>通过一个简单的二级菜单来说明DWR的使用</p>
<p>4.2、业务实现</p>
<p>前台页面：</p>
<p>1一级菜单:<br />
2        &lt;select id=&#8221;tct&#8221; onchange=&#8221;findSub2()&#8221;&gt;<br />
3            &lt;option&gt;<br />
4                0001<br />
5            &lt;/option&gt;<br />
6            &lt;option&gt;<br />
7                0002<br />
8            &lt;/option&gt;<br />
9        &lt;/select&gt;<br />
10        二级菜单:<br />
11        &lt;select name=&#8221;subCode&#8221; id=&#8221;subName&#8221;&gt;&lt;/select&gt;<br />
12<br />
13</p>
<p>js脚本：</p>
<p>1    &lt;script src=&#8221;${ctx}/dwr/interface/ExamDictionaryManager.js&#8221;&gt;&lt;/script&gt;<br />
2        &lt;script type=&#8221;text/javascript&#8221;&gt;<br />
3function findSub2(){<br />
4ExamDictionaryManager.findSubNameList(dwr.util.getValue(&#8220;tct&#8221;),function(obj){<br />
5dwr.util.removeAllOptions(&#8220;subCode&#8221;);<br />
6dwr.util.addOptions(&#8220;subCode&#8221;,obj,&#8217;subCode&#8217;,'subName&#8217;);<br />
7});<br />
8}<br />
9&lt;/script&gt;</p>
<p>上面引用的${ctx}/dwr/interface/ExamDictionaryManager.js是后台操作的业务类，在这需要声明<br />
findSub2()方法是触发一级菜单的值传到后台业务方法进行处理并返回<br />
dwr.util.removeAllOptions(&#8220;subCode&#8221;);是把二级菜单subCode值先清空<br />
dwr.util.addOptions(&#8220;subCode&#8221;,obj,&#8217;subCode&#8217;,'subName&#8217;);是把二级菜单名称是subCode的以subCode为value，subName为text</p>
<p>提示：DWR2.0与DWR1.1的区别,是传入参数和回调函数顺序不同</p>
<p>DWR2.0:</p>
<p>红色字体是表明是参数在前，回调函数在后<br />
1ExamDictionaryManager.findSubNameList(dwr.util.getValue(&#8220;tct&#8221;),function(obj){<br />
2dwr.util.removeAllOptions(&#8220;subCode&#8221;);<br />
3dwr.util.addOptions(&#8220;subCode&#8221;,obj,&#8217;subCode&#8217;,'subName&#8217;);<br />
4});<br />
5</p>
<p>DWR1.1:</p>
<p>红色字体表明是回调函数在前，参数在后</p>
<p>1ExamDictionaryManager.findSubNameList(function(obj){<br />
2dwr.util.removeAllOptions(&#8220;subCode&#8221;);<br />
3dwr.util.addOptions(&#8220;subCode&#8221;,obj,&#8217;subCode&#8217;,'subName&#8217;);<br />
4},dwr.util.getValue(&#8220;tct&#8221;));<br />
5}</p>
<p>dwr.xml文件</p>
<p>1&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
2&lt;!DOCTYPE dwr PUBLIC<br />
3    &#8221;-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN&#8221;<br />
4    &#8221;<a href="http://www.getahead.ltd.uk/dwr/dwr20.dtd" target="_blank">http://www.getahead.ltd.uk/dwr/dwr20.dtd</a>&#8220;&gt;<br />
5<br />
6&lt;dwr&gt;<br />
7<br />
8  &lt;create creator=&#8221;spring&#8221; javascript=&#8221;ExamDictionaryManager&#8221;&gt;<br />
9      &lt;param name=&#8221;beanName&#8221; value=&#8221;examDictionaryManager&#8221;/&gt;<br />
10    &lt;/create&gt;<br />
11&lt;/dwr&gt;</p>
<p>spring配置文件</p>
<p>&lt;bean id=&#8221;examDictionaryManager&#8221;<br />
class=&#8221;com.gresoft.sanitation.service.examapply.ExamDictionaryManager&#8221; /&gt;</p>
<p>web.xml配置</p>
<p>1&lt;!&#8211; DWR servlet,生产环境应该Debug为false &#8211;&gt;<br />
2    &lt;servlet&gt;<br />
3        &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br />
4        &lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt;<br />
5        &lt;init-param&gt;<br />
6            &lt;param-name&gt;debug&lt;/param-name&gt;<br />
7            &lt;param-value&gt;true&lt;/param-value&gt;<br />
8        &lt;/init-param&gt;<br />
9        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
10    &lt;/servlet&gt;<br />
11<br />
12    &lt;servlet-mapping&gt;<br />
13        &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br />
14        &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;<br />
15    &lt;/servlet-mapping&gt;</p>
<p>业务方法：</p>
<p>1public List findSubNameList(String typeCode) {<br />
2<br />
3        String hql = &#8221;select distinct new map(d.subCode as subCode,d.subName as subName) from ExamDictionary as d &#8221;<br />
4                + &#8221;where d.typeCode =:typeCode&#8221;;<br />
5        return createQuery(hql).setString(&#8220;typeCode&#8221;, typeCode).list();<br />
6    }<br />
7</p>
<p>通过前台js脚本传入的参数返回查询的数据集合</p>
<p>页面显示效果：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/2395b_dwr.JPG" border="0" alt="" /><br />
至此，二级级联菜单功能已经完成，通过上述例子，可以发现DWR框架为我们处理我们之前用XML或JSON进行数据转换<br />
的功能，大大提高了开发者开发效率。</p>
<p><a href="http://www.java125.cn/article.asp?id=2565" target="_blank">ajax入门 ajax使用方式2-ajax基础</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-ajax-jquery-dwr-613/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jquery ajax入门 ajax使用方式1-ajax基础</title>
		<link>http://javadou.com/ajax-base-ajax-jquery-615/</link>
		<comments>http://javadou.com/ajax-base-ajax-jquery-615/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 00:07:17 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=615</guid>
		<description><![CDATA[一、基本文本内容(Text方式） 二、xml方式 三、json方式 四、DWR等开源框架 1、Text方式是ajax开发中最为简单的一种方式。它返回就是一段普通的文本内容，主要是在操作过程中一些信息提示使用 比较常见的是在用户注... ]]></description>
			<content:encoded><![CDATA[<p><span>一、基本文本内容(Text方式）</p>
<p>二、xml方式</p>
<p>三、json方式</p>
<p>四、DWR等开源框架</p>
<p>1、Text方式是ajax开发中最为简单的一种方式。它返回就是一段普通的文本内容，主要是在操作过程中一些信息提示使用</p>
<p>比较常见的是在用户注册中新增用户判断用户名是否存在。</p>
<p>2.xml方式是ajax方式使用最多的一种方式，它的数据表达更丰富，本文以一个自动提示的例子为原型介绍，</p>
<p>大家都知道大名鼎鼎的google,它里面强大的自动提示功能使很多人为之倾倒。<br />
表结构：</p>
<p>后台表结结构如下：</p>
<p>1列                             类型      类型<br />
2名称                           模式      名称               长度     小数位  NU<br />
3L<br />
4&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8211; &#8212;&#8211; &#8212;-<br />
5-<br />
6ID                             SYSIBM    INTEGER                   4     0 否<br />
7<br />
8LOGINID                        SYSIBM    VARCHAR                  20     0 是<br />
9<br />
10NAME                           SYSIBM    VARCHAR                  80     0 否<br />
11<br />
12PASSWD                         SYSIBM    VARCHAR                 255     0 否<br />
13<br />
14EMAIL                          SYSIBM    VARCHAR                 255     0 是<br />
15<br />
16STATUS                         SYSIBM    VARCHAR                   2     0 否<br />
17<br />
18DESCN                          SYSIBM    VARCHAR                 255     0 是<br />
在这里测试主要是获取LOGINID和NAME两列值，如上述页面显示第一位置是LOGINID(test1),第二个位置是NAME(test)</p>
<p>前台页面：</p>
<p>1 &lt;form name=&#8221;main&#8221; method=&#8221;post&#8221; &gt;<br />
2&lt;tr&gt;<br />
3  &lt;td height=&#8221;10&#8243; width=&#8221;170&#8243; align=&#8221;left&#8221;&gt;&lt;nobr&gt;input your name<br />
4 &amp;nbsp;&lt;input type=&#8221;text&#8221; name=&#8221;in_section_office_content&#8221; size=&#8221;28&#8243;&gt;<br />
5 &lt;input type=text name=&#8221;in_section_office&#8221;&gt;<br />
6  &lt;script language=&#8221;Javascript&#8221;&gt;<br />
7    new AutoSuggest(document.getElementById(&#8216;in_section_office_content&#8217;),<br />
8  new ACClient(&#8220;${ctx}/autosuggest.do?method=query_xml&amp;username=&#8221;, &#8221;160px&#8221;,<br />
9  document.main.in_section_office,&#8221;USERNAME&#8221; ));<br />
10   &lt;/script&gt;<br />
11   &lt;/td&gt;<br />
12 &lt;/tr&gt;</p>
<p>ACClient脚本：</p>
<p>1this.objInput.value        =    node.getAttribute(disvalue);<br />
2            document.main.in_section_office_content.value = node.getAttribute(&#8220;USERNAME&#8221;);</p>
<p>上面的代码主要是在前台页面中两个输入框需要显示具体表字段信息，objInput是第二个文本域要显示的内容（业务是需要USERNAME节点），in_section_office_content是第一个文本框显示的内容(在这里是test)</p>
<p>生成的xml格式如下：</p>
<p>1  &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br />
2- &lt;earnet&gt;<br />
3  &lt;object LOGINID=&#8221;admin&#8221; USERNAME=&#8221;admin&#8221; fullcontent=&#8221;[admin][admin]&#8220; /&gt;<br />
4  &lt;object LOGINID=&#8221;test1&#8243; USERNAME=&#8221;test&#8221; fullcontent=&#8221;[test1][test]&#8220; /&gt;<br />
5  &lt;/earnet&gt;</p>
<p>控制层方法如下：<br />
1public void query_xml(ActionMapping mapping, ActionForm form,<br />
2            HttpServletRequest request, HttpServletResponse response) {<br />
3        renderDOM(response,autoSuggestService.getAutoSuggestStr(&#8220;autosuggesttest&#8221;,request.getParameter( &#8221;username&#8221; ).trim(), 7));<br />
4    }</p>
<p>1 /** *//**<br />
2     *使用JDom方式<br />
3     * @param response<br />
4     * @param text<br />
5     */<br />
6    protected void renderDOM(HttpServletResponse response, Document doc) {<br />
7        render(response, doc, &#8221;text/xml;charset=UTF-8&#8243;);<br />
8    }</p>
<p>业务方法如下：<br />
1public Document getAutoSuggestStr(String queryCode,String queryValue,int pageSize) {<br />
2        Element root = new Element(&#8220;earnet&#8221;);<br />
3        Document doc = new Document(root);<br />
4        int nMaxCount = pageSize;<br />
5<br />
6        int nCount = 0;<br />
7        List namelist = jdbcTemplate.queryForList(xmlService.get(<br />
8                queryCode, queryValue));<br />
9<br />
10        for (Iterator it = namelist.iterator(); it.hasNext();) {<br />
11            ListOrderedMap listOrderdMap = (ListOrderedMap) it.next();<br />
12<br />
13            Element ele = new Element(&#8220;object&#8221;);<br />
14            StringBuffer sb = new StringBuffer();<br />
15            if (listOrderdMap != null &amp;&amp; !listOrderdMap.isEmpty()) {<br />
16                Set set = listOrderdMap.keySet();<br />
17                for (Object key : set) {<br />
18                    String value = (String) listOrderdMap.get(key);<br />
19                    if (StringUtils.isNotBlank(value)) {<br />
20                        ele.setAttribute((String)key, value);<br />
21                        sb.append(&#8220;[").append(value).append("]&#8220;);<br />
22                    }<br />
23                }<br />
24            }<br />
25            ele.setAttribute(&#8220;fullcontent&#8221;, sb.toString());<br />
26            root.addContent(ele);<br />
27<br />
28            nCount++;<br />
29            if (nCount &gt;= nMaxCount)<br />
30                break;<br />
31        }<br />
32        return doc;<br />
33    }<br />
主要是从后台数据库进行数据查询并组装成xml格式</p>
<p>这样就达到了使用xml方式完成自动提示功能，今天先总结到这里，以后陆续更新</p>
<p><a href="http://www.java125.cn/article.asp?id=2565" target="_blank">ajax入门 ajax使用方式2-ajax基础</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-base-ajax-jquery-615/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ajax开发的聊天室源代码</title>
		<link>http://javadou.com/ajax-on-line-chat-java-616/</link>
		<comments>http://javadou.com/ajax-on-line-chat-java-616/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 23:05:41 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=616</guid>
		<description><![CDATA[个基于Ajax的网上聊天室示例应用，该系统涉及到多线程、支持多聊天室、支持聊天室管理、用户管理、聊天日志记录等多个功能。由于这个系统是很早以前做的，很多地方存在不足，这周末心情好，把这个应用翻了... ]]></description>
			<content:encoded><![CDATA[<p><span>个基于Ajax的网上聊天室示例应用，该系统涉及到多线程、支持多聊天室、支持聊天室管理、用户管理、聊天日志记录等多个功能。由于这个系统是很早以前做的，很多地方存在不足，这周末心情好，把这个应用翻了出来，把系统进行了重新调整，使用EJS(EasyJWeb+JPA+Spring)构架，使用EasyJWeb的自动代码生成及ajax支持等功能开发。在此推荐给对于JPA、Spring2、EasyJWeb及Ajax技术感兴趣的朋友们，欢迎一起交流。</p>
<p>该系统的演示地址：<a href="http://easyjweb.demo.easyjf.com/chatroom/" target="_blank">http://easyjweb.demo.easyjf.com/chatroom/</a><br />
系统源码下载地址：<a href="ftp://ftp1.easyjf.com/easyjweb/demo/chatroom.rar" target="_blank">ftp://ftp1.easyjf.com/easyjweb/demo/chatroom.rar</a><br />
系统的SVN地址：<a href="http://svn.easyjf.com/repos/easyjwebdemo/trunk/chatroom" target="_blank">http://svn.easyjf.com/repos/easyjwebdemo/trunk/chatroom</a> 由于还存在不少问题，因此我们会根据大家的反馈进行不断调整，所以SVN中的代码一般是最新的。</p>
<p>系统演示：<br />
聊天室主界面<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/0200e_chatroom4.JPG" border="0" alt="" /><br />
房间管理<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/d9eca_chatroom3.JPG" border="0" alt="" /><br />
日志列表<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/124a0_chatroom5.JPG" border="0" alt="" /><br />
显示会议记录<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/6cd12_chatroom6.JPG" border="0" alt="" /></span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-on-line-chat-java-616/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OPENAJAX HUB</title>
		<link>http://javadou.com/openajax-hub-611/</link>
		<comments>http://javadou.com/openajax-hub-611/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 00:03:54 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=611</guid>
		<description><![CDATA[OpenAjax Hub（“Hub”）主要用来处理Web应用开发者需要在同一个应用中同时使用多个AJAX运行库的情况。它提供标准的JavaScript，当被包含在AJAX驱动的Web应用里时，它使得多个AJAX工具包能够在同一个页面里一起协同工作... ]]></description>
			<content:encoded><![CDATA[<p><span>OpenAjax Hub（“Hub”）主要用来处理Web应用开发者需要在同一个应用中同时使用多个AJAX运行库的情况。它提供标准的JavaScript，当被包含在AJAX驱动的Web应用里时，它使得多个AJAX工具包能够在同一个页面里一起协同工作。</span></p>
<p>AJAX应用开发者在开发中的需求往往存在着巨大的差异，这导致了如今市场上存在超过200个各种各样的AJAX产品，同时这些产品的架构和特性也存在巨大的差异。对一些开发者来说，他们认为开发中最重要的因素是找到一个能提供与后端服务器强大集成能力的AJAX工具包。</p>
<p>而对其他一些开发者来说，最重要的因素则是能否应用特殊的客户端组件（例如，富数据网格组件或交互式的图表组件）。结果，AJAX生态系统发展到现在，开发者在大部分时间里都能找到满足他们每个特殊需求的AJAX工具包，但是也存在问题，他们往往必须在同一个Web应用里混合和匹配使用多个AJAX工具包才能满足所有的需求。</p>
<p>Hub应用的一个重要场合是门户和内容糅合，这里，应用开发者创建一个页面，页面里松散组装预先包装好的应用组件。Hub实际上是保证这些AJAX驱动的应用组件能够使用多个不同的AJAX工具包创建。</p>
<p>主要特性：Hub 的发布/订阅管理器</p>
<p>Hub的主要特性是它的发布/订阅管理器（“pub/sub管理器”）。 pub/sub管理器允许内容糅合的一个部分能够传播其他应用组件所订阅的事件。例如，假设存在一个日历组件，该组件允许用户能够选取一个特定的日期。内容糅合里可能存在多个UI组件，这些组件都需要根据新选择的日历日期而更新它们的视觉外观。在这种情况下，日历组件将发布一个“新日历日期”的事件，而其他可视化组件将订阅这个事件。因此，pub/sub管理器的通用消息的优点是给由不同AJAX工具包所构建的组件之间提供了一个关键的集成机制。</p>
<p>Hub的pub/sub管理器提供各种各样的先进特性，例如对事件名称通配符的强大支持，在下面的例子里并没有展示这个特性。</p>
<p>范例</p>
<p>让我们假设现在有这样一个商务智能应用，该应用使用下面的AJAX运行库：</p>
<p>■ UTILS.js, 对浏览器的JavaScript环境提供非常有用的扩展，例如XMLHttpRequest的APIs。</p>
<p>■ CALENDAR.js,提供一个日历组件</p>
<p>■ CHARTS.js, 提供一个图表组件</p>
<p>■     DATAGRID.js,提供一个交互式的数据网格组件</p>
<p>该应用有一个唯一的日历组件，用户可以以图表组件的形式（例如，每日情形、每周情形、每月情形和每年情形的柱状图）和数据网格组件的形式（例如，地方数据与全国数据，两种数据都以用户选择的感兴趣的列展示）选择其中的一些数据视图当一个新的日期在日历组件里被选择时，各个用户指定的可视化组件（例如，图表和/或数据网格组件）都需要被更新。</p>
<p>实现该应用的一个方法是在加载其他AJAX库之前加载OpenAjax Hub的JavaScript。例如：<br />
&lt;html&gt;</p>
<p>&lt;head&gt;</p>
<p>&lt;script type=”text/javascript” src=”OpenAjax.js”/&gt;</p>
<p>&lt;script type=”text/javascript” src=”UTILS.js”/&gt;</p>
<p>&lt;script type=”text/javascript” src=”CALENDAR.js”/&gt;</p>
<p>&lt;script type=”text/javascript” src=”CHARTS.js”/&gt;</p>
<p>&lt;script type=”text/javascript” src=”DATAGRID.js”/&gt;</p>
<p>&lt;/head&gt;</p>
<p>一些AJAX运行库包含OpenAjax Hub，将Hub作为它们标准发布的一部分，在这种情况下，只要特定的AJAX运行期的JavaScript（译注：这里特定的JavaScript指的就是包含OpenAjax Hub的AJAX运行库的代码）在其他兼容OpenAjax的运行库之前被加载，那么则没有必要为OpenAjax.js使用一个单独的&lt;script&gt;元素。</p>
<p>要使应用工作，开发者需要注册一个回调函数，当用户在日历组件里选择一个新的日期时调用该函数。这个回调函数接着使用OpenAjax Hub的publish()函数传播这个新日期事件：<br />
&lt;script type=”text/javascript”&gt;</p>
<p>function MyCalendarCallback() {</p>
<p>OpenAjax.hub.publish(“myapp.newdate”, newdate);</p>
<p>}</p>
<p>&lt;/script&gt;</p>
<p>接着开发者需要开发这样一些代码：所有的图表组件和数据网格组件都要订阅这个新日期事件，并要提供一个回调函数。各个回调函数将相应地更新特定的可视化组件：</p>
<p>&lt;script type=”text/javascript”&gt;</p>
<p>function NewDateCallback(eventname, publisherData,</p>
<p>subscriberData) {</p>
<p>更新特定的可视化组件</p>
<p>}</p>
<p>OpenAjax.hub.subscribe(“myapp.newdate”, NewDateCallback);</p>
<p>&lt;/script&gt;</p>
<p>未来支持OpenAjax Hub的工具包</p>
<p>OpenAjax联盟正与工业界一起合作，达到对OpenAjax Hub的广泛支持。一个特殊的AJAX工具包可以像下面这样支持OpenAjax Hub：</p>
<p>■ AJAX工具包可以包含Hub（最好的方式）。Hub可以被小于3K的JavaScript实现，所以一些AJAX工具包简单地捆绑Hub，将它作为它们工具包的一个标准组件。</p>
<p>■ 如果Hub在运行环境里可用则使用它。其他一些AJAX工具包可能决定在它们的发布中并不包含Hub，它们会检查Hub是否早先已经被加载了，如果已经加载，它们则直接使用Hub的服务。</p>
<p>■第三方的开发者可以开发适配器。对大多数工具包来说，它们可能允许第三方的开发者编写少量的JavaScript使得自己能够支持Hub。</p>
<p>当AJAX工具包包含内置对Hub的支持时，应用开发者的工作将更加容易，但是通过查找或编写适配器的方式，Hub依然可以被那些并未实现支持Hub的工具包所使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/openajax-hub-611/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery插件开发</title>
		<link>http://javadou.com/jquery-plugin-2-595/</link>
		<comments>http://javadou.com/jquery-plugin-2-595/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 23:02:14 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=595</guid>
		<description><![CDATA[jQuery官方文档上推荐开发插件时要按下面格式来写，我第一次看源代码时看到这样的写法，被郁闷了好半天。 (function($) { // Code goes here })(jQuery); 下面将记录为什么这样写，这样写具体有哪些好处。 其实上面这种... ]]></description>
			<content:encoded><![CDATA[<p><span>jQuery官方文档上推荐开发插件时要按下面格式来写，我第一次看源代码时看到这样的写法，被郁闷了好半天。</p>
<p>(function($) {<br />
// Code goes here<br />
})(jQuery);</p>
<p>下面将记录为什么这样写，这样写具体有哪些好处。</p>
<p>其实上面这种方式等价于下面这种定义方式, 不过上面的方式更安全.与JAVA里面的隐藏类有点类似，这样定义之后，很大程序上毕免了第三方的误操作，从而破坏封装性。</p>
<p>上面的代码等价于下面的代码，我想这样写大家都能看明白了吧。<br />
var jQueryFucntion=function($) {<br />
// Code goes here<br />
//本文首发于 <a href="http://b.xfuse.cn" target="_blank">http://b.xfuse.cn</a><br />
}<br />
jQueryFucntion(jQuery);</p>
<p>(function($) {<br />
// Code goes here<br />
})<br />
上面定义了一个jQuery函数,形参是$</p>
<p>(function($) {<br />
// Code goes here<br />
})(jQuery);<br />
这个就是调用之前定义的函数,然后把jQuery这个实参传递进去.</p>
<p>这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.</p>
<p>如果不通过上面这种方式定义,而end-use又使用了prototype, 那么就会形成无法调和的矛盾了.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/jquery-plugin-2-595/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>什么是ocx控件Javascript调用OCX控件</title>
		<link>http://javadou.com/ocx-javascript-ocx-620/</link>
		<comments>http://javadou.com/ocx-javascript-ocx-620/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 01:00:58 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=620</guid>
		<description><![CDATA[什么是ocx控件？ 对象链接和嵌入用户控件（OCX）是一种可以由在微软的Windows系统中运行的应用软件创建使用的特殊用途的程序。 想知道究竟的可以看看这个帖子。 http://www.tososo.com/html/software-learning/20070829/3710.html 偶... ]]></description>
			<content:encoded><![CDATA[<p><span>什么是ocx控件？</p>
<p>对象链接和嵌入用户控件（OCX）是一种可以由在微软的Windows系统中运行的应用软件创建使用的特殊用途的程序。</p>
<p>想知道究竟的可以看看这个帖子。</p>
<p><a href="http://www.tososo.com/html/software-learning/20070829/3710.html" target="_blank">http://www.tososo.com/html/software-learning/20070829/3710.html</a></p>
<p>偶用的VC6，顺手开发了一个简单的ocx控件，具体怎么写的就不显了。</p>
<p>做好了以后，才是我今天要记下的东西——通过Javascript调用ocx控件。</p>
<p>这里的调用基本上可以分这几步：</p>
<p>1.找出相关信息</p>
<p>首先我们的给这个ocx起个名字，起什么名字通过最后生成的ocx控件的文件名决定。<br />
第二，我们的找到这个ocx的编号值,将ocx提取出来，我采用Microsoft Control Pad来编辑，得到ocx控件的classid, 然后我们做下面的工作。</p>
<p>2.注册ocx控件</p>
<p>注册ocx控件使用RegSvr32.exe。<br />
使用RegSvr32.exe(在System目录下)注册，语法为：<br />
RegSvr32  ocxname.ocx<br />
如果注册成功将显示一个成功的消息框。</p>
<p>如果不希望看到这个对话框，也可以使用/s选项，如<br />
RegSvr32 /s your.ocx<br />
如果取消注册，可以使用/u选项，如<br />
RegSvr32 /u your.ocx</p>
<p>3.加载ocx控件</p>
<p>注册成功后，我们就得写一个html页面，通过&lt;OBJECT&gt;来加载这个控件了。具体如下：</p>
<p>&lt;OBJECT id=&#8221;ocx文件名&#8221; codeBase=&#8221;ocx控件的相对位置#version=1,0,0,0&#8243;<br />
data=&#8221;data:application/xoleobject;base64,mRHW/Ifh3UqI5ZryOEhtERAHAAD/KgAAYSQAAA==&#8221;</p>
<p>classid=&#8221;CLSID:通过MCP找到的classid&#8221; VIEWASTEXT&gt;<br />
&lt;/OBJECT&gt;</p>
<p>4.调用</p>
<p>先要定义调用事件</p>
<p>&lt;a href=&#8221;javascript:IOStart()&#8221; &gt;short IOStart()&lt;/a&gt;</p>
<p>接下来写调用方法</p>
<p>function IOStart()</p>
<p>{</p>
<p>TestOcx.IOStart();</p>
<p>}</p>
<p>说明：TestOcx对应于&lt;OBject&gt;中的id属性。IOStart()是在ocx中定义的方法。</p>
<p>好了，这里通过Javascript调用ocx就完成了。</p>
<p>其实还有一部分内容就是通过javascript捕获ocx事件，这个问题以后在来说明。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ocx-javascript-ocx-620/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>应用blazeDS实录项目开发</title>
		<link>http://javadou.com/blazeds-596/</link>
		<comments>http://javadou.com/blazeds-596/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 00:49:36 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Java基础]]></category>
		<category><![CDATA[blazeDS]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=596</guid>
		<description><![CDATA[前两天看到有人介绍blazeDS，就去下载了下来，读了读文档。读的比较厌烦，所以今天下午就把mysql安装上，下载了tomcat6,跑一个项目。 本人虽然看了一阶段的flex，但是还没有写mxml和as的习惯（很大部分是不知道怎么... ]]></description>
			<content:encoded><![CDATA[<p><span>前两天看到有人介绍blazeDS，就去下载了下来，读了读文档。读的比较厌烦，所以今天下午就把mysql安装上，下载了tomcat6,跑一个项目。<br />
本人虽然看了一阶段的flex，但是还没有写mxml和as的习惯（很大部分是不知道怎么写），于是就把 flex第一步 这本书中的notebook的代码拿出来。准备用blazeds跑一下。<br />
今天上班前，把那本书找了出来，翻了一下，发现他讲解的是lcds实现思路。<br />
第一步就是把tomcat配置成可以支持flex的，当然这个是可选的。配置方法见blazeds的resources\security\tomcat 下的readme.txt,或者参考我前一篇博客 <a href="http://www.blogjava.net/lanfanss/archive/2008/02/17/180321.html" target="_blank">http://www.blogjava.net/lanfanss/archive/2008/02/17/180321.html</a><br />
接下来打开myeclipse,建立一个webproject,建立好以后把blazeds.war的解压后的web_inf拷贝到webroot下。这样我们新建这个web Project就可以支持romoting了。将notebook的JavaSource下的源码放到src下边，将remoting- config.xml中的内容拷贝到web-info/flex中相应文件中。接下来启动tomcat就可以了。这样子，服务端就搞定了。<br />
接下来是客户端部分了，打开flex builder。新建一个flex project。截图分别如下：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/33fa7_1.GIF" border="0" alt="" /><br />
接下来配置data server：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/456be_2.JPG" border="0" alt="" /><br />
点击下一步后，请将source floder的路径选择成notebook本身，不要是默认的src目录。然后，点击完成。<br />
结果发现不能够编译，说是   Server SDK: Directory does not contain a Flex SDK<br />
在到一个ext+flex群里询问无果后，自己尝试修改flex compiler（在项目上双击右键，选择property），将sdk version选择成第二个（use sprcial&#8230;）.然后，clean整个的项目，发现开始编译。<br />
然后访问：<br />
<a href="http://localhost:8080/notebook/notebook-debug/noteBook.html" target="_blank">http://localhost:8080/notebook/notebook-debug/noteBook.html</a><br />
得到的结果是：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/4d3ab_flex_error2.JPG" border="0" alt="" /><br />
说是我使用的channel有问题，思考了几分钟后直接到server-config.xml中将{server.port}修改成了8080。<br />
再次访问，成功。</p>
<p>ok,到此为止，记录自己第一次运行flex romoting程序。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/blazeds-596/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaSript的RIA客户端数据处理 下</title>
		<link>http://javadou.com/javasript-ria-627/</link>
		<comments>http://javadou.com/javasript-ria-627/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 01:47:25 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=627</guid>
		<description><![CDATA[一、引子 上一篇讨论了关于客户端数据处理的一些问题，以简单的用例场景的方式描述了出来。很明显，要想实现一个功能完整的Rich客户端的话，必须能够满足上述用例场景的需求。能否根据这些需求做出合理的设... ]]></description>
			<content:encoded><![CDATA[<p><span>一、引子<br />
上一篇讨论了关于客户端数据处理的一些问题，以简单的用例场景的方式描述了出来。很明显，要想实现一个功能完整的Rich客户端的话，必须能够满足上述用例场景的需求。能否根据这些需求做出合理的设计，是一个挑战。尤其对于设计而言，不同的人有着不同的风格，而且由于背景不同，也会有不同的见解。本文中，我只是陈述出自己的一些想法和设想，更多的是希望能够抛砖引玉，通过在这个方面的讨论也能增进我的理解。呵呵。</p>
<p>很显然，blog的形式更适合作为思路的介绍以及探讨的平台，而不是详细设计的文档。而且很明显这一篇文章是承载不了所有的详细设计的。我争取把我在各个细化的方面的想法在后续的文章里面发出来。如果时间允许的话，整理出初始的文档和代码，建立一个小的开源项目未尝不可（因为如此，所有的JS都是采用英文来注释──其实还有一个原因是练习英文 :)）。这都是后话了。</p>
<p>二、缩略语</p>
<p>1.</p>
<p>RIA：Rich Internet Application的缩写。RIA是拥有传统本地应用的功能和效果的Web应用。RIA一般把UI相关的处理交给了Web客户端，但是大量的数据（包括应用的状态、数据等）还是交给服务端处理<br />
2.</p>
<p>Ajax：又写为AJAX，是&#8221;Asynchronous JavaScript and XML&#8221;的缩写。是一种使用浏览器技术进行RIA开发的技术<br />
3. Prototype：开源的优雅的Ajax以及JavaScript基础扩展框架。由于被Rails采用而闻名，使用相当广泛<br />
4. jQuery：功能类似Prototype + script.aculo.us的开源Ajax框架。据我所知，Google用得比较多<br />
5. Ext：对YUI的一个扩展的UI构件库。经过改进后，可以使用jQuery或者Prototype作为基础。目前好像正在完善自身的基础Ext base。以优秀的构件闻名。虽然目前仍然属于商业构件库，但是License相对宽松，一般的商业应用可以免费使用<br />
6.</p>
<p>dojo：由dojo foundation管理的一个开源JavaScript框架。提供了很好的JavaScript扩展，目前被IBM和Sun等大公司支持和使用<br />
7.</p>
<p>Json： JavaScript Object Notation的缩写。它是一种纯文本的数据对象传输协议，在Ajax的应用中被广泛采用<br />
8.</p>
<p>CRUD：Create（创建）、Retrieve（获取）、Update（更新）和Delete（删除）这四种简单的数据操作的缩写<br />
9.</p>
<p>Form：本文中的Form指的是经过Ajax扩展的简单的HTML电子表单。表单内部可以拥有很多如ComboBox、TextBox等构件。一般来说，一个表单对应着一个业务的数据对象<br />
10.</p>
<p>Tree：树形显示结构化数据的构件，由于数据是高度结构化的，往往可以采用懒加载等技术来提高性能<br />
11.</p>
<p>Grid：以表格形式显示和编辑数据的UI构件。一般分为表头（标题栏）、表身（数据列表）和表尾（合计、状态显示等）三个部分。其中，表头可以是复合的表头，而表身可以是复合的格式（Tree、Grid、ComboBox、CheckBox等）。一个Grid可以有一个复杂的Grid定义<br />
12.</p>
<p>Enhanced Grid：下面简称为EGrid，是Grid的扩展。在Grid的功能基础之上提供了数据获取和数据持久化的能力，可以大大的减少开发应用的时间（Ext中的Grid可以认为是一个简化了的EGrid）<br />
13.</p>
<p>CodeList：代码表，一般用在下拉列表数据处，在系统的实现中，由于性能以及标准的要求，下拉列表一般都是采用代码保存数据，但是用户在填写表单的时候需要看到正常的文字而不是代码，这就需要系统通过CodeList进行文字和代码的转换<br />
14.</p>
<p>LRU：Least Recent Used的缩写，是一种简单的缓存策略，如果缓存已满，那么就释放最近最少使用的那个缓存数据<br />
15.</p>
<p>REST：是REpresentational State Transfer的缩写，是一种基于轻量级WebService协议<br />
16. JDBC：是Java DataBase Connectivity对缩写，是基于Java的数据库连接规范。</p>
<p>三、基础<br />
既然决定采用Ajax，就最好采用一个基础，在这个有很多优秀的Ajax框架可供选择的时代，谁要是还要赤手空拳的来写Ajax应用，就未免有点儿过于勇敢，而近于鲁莽了。这篇文章不是Ajax框架对比文章，我不打算在这里一一列举各个流行的Ajax框架的优缺点，我只拿下面几个进行讨论，dojo、 Prototype、jQuery、Ext。</p>
<p>先提需求，框架应该：</p>
<p>1. 以一种形式支持面向对象（毕竟开发人员多数都是Java程序员，更有可能的是，他/她只对Java熟悉）<br />
2. 以一种方式来支持命名空间和分包机制（开发企业应用与开发网站不同，复杂的不是技术而是业务。没有命名空间和分包支持，对于大型应用，基本不可控制。──设想一下如果Java没有package关键字会怎样）<br />
3. 有完善的模块封装与管理规范或者最佳实践，能够自动处理模块间的依赖则更好（模块的定义不在这里解释了，一个例子说明吧，一个Jar就是一个模块。模块化和构件化是实现、维护和管理大型应用的重要手段）<br />
4. 提供丰富的调优选项，使得对复杂的应用调优是可能的（这一点对于UI层尤为重要，因为它直接面对使用者）<br />
5. 便于调试（这一点对于开发者致关重要）</p>
<p>综合上面几点，我选择dojo作为基础。Sorry Prototype。</p>
<p>四、整体构架</p>
<p>整体构架如下图所示（为了便于理解UI构件与其对关系，我把需要数据处理的UI构件也加了上去，图中蓝背景色的部分就是）：</p>
<p><img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/134a8_File?id=acwm5hqq3nw_17fj2rd6tm" border="0" alt="" /><br />
一目了然，整个客户端数据处理由3个部分构成，DataSource、DataSet和DataStore。下面分别进行简单的介绍。</p>
<p>五、DataSet<br />
DataSet的概念很简单，就是数据对象的集合。它的构架如下图所示（注意：DataSet只是一套标准的API，可以有不同的实现——比如XML形式的）：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/e84a8_File?id=acwm5hqq3nw_18db5q4mcn" border="0" alt="" /><br />
如图所示，DataSet由四个部分构成，Record Set（数据集合）、Change Tracker（数据变更追踪）、Meta Data（数据对象源信息）和Cursors（游标API）。</p>
<p>分别介绍如下：</p>
<p>1. Record Set：Record Set就是Record的集合，一个Record就是一个数据对象，它由一系列的属性（Property）构成，属性是一个简单的字符串，其对应的值可以是任意类型。Record提供属性读写的方法，可以直接在Record上对属性进行读写，并且，Record会为写操作提供一个事件。Record Set内部的元素必须是Record，Record Set支持对内部Record的CRUD操作。并且会有相应的事件触发<br />
2. Change Tracker：ChangeTracker为DataSet提供所有写操作的追踪，可以通过配置选择Change Tracker是否记录修改，如果记录修改，采用的是针对每一个Record记录增加、删除以及针对每一个属性记录First和Last修改的策略<br />
3. Meta Data：提供DataSet中Record的元数据（属性名、属性对应类型、其他自定义数据——校验、Form Label信息、表头信息等）以及DataSet的元数据（在全部数据中的位置等）。<br />
4. Cursors： Cursor其实就是Record的迭代器，可以通过对dataset查询（一般都是非常简单的filter或者range）得到，推荐通过Cursor 进行Record访问，而不是通过Index，因为通过迭代器访问Record，DataSet拥有更多的能力。虽然通过Cursor完全可以访问所有的 Record及其中的数据，但是由于DataSet拥有MetaData，所以还是采用DataSet作为数据绑定的主体</p>
<p>DataSet是整个客户端数据处理构架的核心，所有的数据访问都应该通过DataSet的API。这样客户端的数据处理才是统一的一个整体。</p>
<p>解决的用例问题：</p>
<p>* 数据绑定：Form绑定、Grid绑定<br />
* 数据变更追踪：Grid变更提示、数据集合变更追踪、Form修改的追踪<br />
* 数据访问：数据对象元数据信息访问、数据写操作的统一事件定义、统一的数据读取方式</p>
<p>六、DataSource<br />
DataSource的功能是提供对数据进行查询以及数据的持久化（持久化到客户端或者服务器端）。与DataSet一样，不同的格式数据就会有不同的 DataSource，一种DataSource代表了一种客户端与服务端的数据传输协议。但是由于DataSource的逻辑与结构过于复杂（事实上， DataSet的实现也完全依赖DataSource的实现，可以类比JDBC），不应该对每一种格式都重新实现一个DataSource，由此， DataSource不应该是一套标准的API，而是使用了Adapter模式，来满足不同的数据来源，其构架如下图所示：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/e84a8_File?id=acwm5hqq3nw_19dnjdh7gp" border="0" alt="" /><br />
看上去很简单？实际上这是最复杂的部分，关于这个部分，至少可以再写3篇文章来详细探讨，在本文中，就不过度讨论了。:)</p>
<p>如图所示，DataSource由Cache、Query、Persist以及Providers构成，分别介绍如下：</p>
<p>1. Cache：Cache的概念在前面已经阐述了，不在这里多说了。在这里简单的介绍一下客户端Cache的策略以及技术，由于基于浏览器的数据缓存技术非常重要，拟在后续的文档《客户端的缓存策略与相关技术》中对其进行详细讨论<br />
* 缓存策略（这一方面客户端数据的缓存与服务端的数据缓存考虑的问题应该是类似的，唯一的区别是，客户端的数据缓存不必考虑集群支持。:)）<br />
o LRU：基础的Cache算法，如果缓存已满时，根据最近很少使用算法来确定哪些对象需要被清除<br />
o Priority：按照优先级高低来清理缓存空间的策略，当缓存已满时，按照优先级高低来确定哪些对象需要被清除，可以与LRU算法共存<br />
o Refreshable：有时效性的数据，或者在运行时有可能会被修改需要同步或者刷新的数据。可以设置数据过期时间，到时间则数据处于stale状态，再度访问该数据时，如果不能重新获得该数据，则报错<br />
o Expireable：临时性数据，可以设置失效时间，到时间则数据失效，在缓存需要清理时，缓存会清理掉这些失效的对象<br />
* 缓存持久化（属于高级的缓存策略，依赖客户端基于JavaScript的数据存储技术）<br />
o Save（持久化）：把缓存当中的数据持久化到本地或者服务端，其用处如下<br />
+ 通过把数据持久化可以增加Cache的容量<br />
+ 数据本地缓存提供了离线表单填写的能力<br />
o Retrieve、Delete：对缓存中数据的基本操作<br />
o Sync：离线缓存的本地数据，可以与远程服务端进行同步，从而实现离线表单提交以及实现离线CodeList等功能<br />
* 缓存技术<br />
o Client<br />
+ 内存引用<br />
+ Cookie<br />
+ Google Gear<br />
o Server（服务端协助客户端做一些缓存，这在传统的B/S下是匪夷所思的设计，在RIA的情况下却未尝不是一种手段）<br />
+ WebService或者REST<br />
+ Post + Get<br />
2. Query：其实Query只是一个方法，由于有可能会向服务端发XmlHttpRequest，所以这个方法需要回调方法。其参数应该是一个Query对象，一个配置对象，有一些事件的关键字（onBegin、onError、onSuccess等）。Query对象以及配置对象的格式在本文中就不详细说明了，留给以后慢慢说（因为这个部分是我最喜欢的部分）。很明显，如果查询成功，查询的结果应该是DataSet，一般来说，DataSource是DataSet 来源。不同的DataSource，查询的语言未必相同。不一定所有的查询对象都支持SQL语法（比如可以支持HQL或者XQuery啊），而且我最推荐采用的是服务端提供一个服务抽象层，接受Json格式的查询请求，并返回Json格式的数据<br />
3. Persist：数据持久化。只是Save和Update两个方法。接受DataSet和配置对象作为参数（这两个方法也应该是异步的）。如果DataSet里面没有足够的元数据信息，需要在配置对象里面提供这些信息。这个部分不比Query部分复杂<br />
4. Providers：数据的来源，提供了Query和Persist API的实现，是DataSource的底层实现，它使DataSource的实现可以跨不同协议而使用。给DataSource提供不同的 Provider，DataSource就可以支持不同的数据传输协议。</p>
<p>DataSource是数据查询和持久化的核心，所有的客户端的数据查询和持久化基本都应该采用DataSource，从而获得DataSource提供的强大而灵活的特性。</p>
<p>解决的用例问题：</p>
<p>* 数据缓存：离线运行的CodeList、离线表单填写、性能考虑<br />
* 数据查询：样本查询、模糊查询、Range查询、逻辑查询、自定义查询<br />
* 数据处理：数据处理事件、过滤、排序</p>
<p>七、DataStore<br />
DataStore基于DataSource和DataSet的实现，实现了dojo的data api。这样既实现了对需要dojo api的dojo构件的支持，又满足了类似Tree、EGrid这种既需要绑定又需要数据来源的高级构件的要求。总体来说，DataStore只是薄薄的一层接口，实际的实现完全依赖于DataSource。</p>
<p>解决的用例问题：</p>
<p>* 数据绑定、查询、处理：Tree绑定、ComboBox数据源、EGrid绑定</p>
<p>八、待讨论的问题<br />
客户端的数据处理事实上要比我想象得还要复杂，我还有一些设计决策没有确定，列举下来以供讨论吧。<br />
8.1 客户端的事务处理？<br />
由于很多数据处理都放在了客户端。客户端的数据处理操作相应增多而且复杂，是否应该在DataSource中添加写事务的处理？以便对数据操作进行更细粒度的管理，而不是仅仅停留在Query、Save和Track阶段？<br />
8.2 权限数据的来源<br />
如果可以连接到服务端，用户在向服务端登录后，服务端会返回用户的权限信息列表。客户端接收后，可以相应的提供权限控制。但是，如果客户端离线运行，用户无法向服务的登录，权限信息列表无从获得，怎么提供权限控制？</p>
<p>探讨方案1：离线客户端无须登录，由于没有权限控制列表，默认拥有系统最低权限（固定的配置在客户端），由系统开发人员决定用户在离线时可以进行何种操作。用户在线提交数据的时候，服务端也要根据相应的权限进行验证以防止越权的数据操作</p>
<p>探讨方案2：离线客户端仍须登录，权限控制列表使用用户在线登录时缓存的数据。其余与在线方式相同。如果用户没有在线登录过，那么离线应用无法使用。<br />
8.3 跨域数据的来源<br />
由于浏览器的安全性策略，JavaScript无法向除本身域之外的其他服务器发送请求。也就是说，对于JavaScript而言，所有的数据必须来源于同一个域的服务器。对客户端进行集成非常不利。</p>
<p>探讨方案1：服务端提供一个服务接入层，接受如Spring Bean、EJB、JMS、WebService等形式的服务，并且把所有的服务都转化成为一种固定格式的协议与客户端交互。所有的服务集成与协议转化都交给服务端，对客户端完全透明。</p>
<p>探讨方案2：服务端提供一个简单的Proxy，通过一定的协议把请求和回复转发给客户端，处理交给客户端来做<br />
九、小结<br />
虽然到了这里，但是对于基于JavaScript的RIA客户端数据处理的讨论却才刚刚开始，还需要很多后续的展开讨论。但是，上午已经过去了，需要去吃午饭了。</p>
<p><a href="http://www.java125.cn/article.asp?id=2334" target="_blank">JavaSript的RIA客户端数据处理</a><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/javasript-ria-627/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jquery水平动画导航条jquery插件</title>
		<link>http://javadou.com/jquery-menu-plugin-631/</link>
		<comments>http://javadou.com/jquery-menu-plugin-631/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 02:21:53 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=631</guid>
		<description><![CDATA[table .image {height:95px;overflow-y:hidden;} jQuery Multi Level Menu Style 11 (Black) jQuery Multi Level Menu Style 11 (Steel Blue) jQuery Multi Level Menu Style 11 (Saddle Brown) jQuery Multi Level Menu Style 11 (Yellow Green) jQuery Multi Level Menu Style 11 (Peru) jQuery Multi Le... ]]></description>
			<content:encoded><![CDATA[<style>
table .image {height:95px;overflow-y:hidden;}
</style>
<table>
<tr>
<td><a class="item" href="http://apycom.com/menus/11-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Multi Level Menu Style 11 (Black)</span><br />
			<span class="img"><img alt="jQuery Multi Level Menu Style 11 (Black)" src="http://apycom.com/ssc-data/items/11/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/11-steel-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Multi Level Menu Style 11 (Steel Blue)</span><br />
			<span class="img"><img alt="jQuery Multi Level Menu Style 11 (Steel Blue)" src="http://apycom.com/ssc-data/items/11/4682b4/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/11-saddle-brown.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Multi Level Menu Style 11 (Saddle Brown)</span><br />
			<span class="img"><img alt="jQuery Multi Level Menu Style 11 (Saddle Brown)" src="http://apycom.com/ssc-data/items/11/8b4513/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/11-yellow-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Multi Level Menu Style 11 (Yellow Green)</span><br />
			<span class="img"><img alt="jQuery Multi Level Menu Style 11 (Yellow Green)" src="http://apycom.com/ssc-data/items/11/9acd32/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/11-peru.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Multi Level Menu Style 11 (Peru)</span><br />
			<span class="img"><img alt="jQuery Multi Level Menu Style 11 (Peru)" src="http://apycom.com/ssc-data/items/11/cd853f/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/11-dark-olive-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Multi Level Menu Style 11 (Dark Olive Green)</span><br />
			<span class="img"><img alt="jQuery Multi Level Menu Style 11 (Dark Olive Green)" src="http://apycom.com/ssc-data/items/11/556b2f/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/10-deep-sky-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Navigation Menu Style 10 (Deep Sky Blue)</span><br />
			<span class="img"><img alt="jQuery Navigation Menu Style 10 (Deep Sky Blue)" src="http://apycom.com/ssc-data/items/10/00bfff/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/10-olive-drab.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Navigation Menu Style 10 (Olive Drab)</span><br />
			<span class="img"><img alt="jQuery Navigation Menu Style 10 (Olive Drab)" src="http://apycom.com/ssc-data/items/10/6b8e23/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/10-lawn-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Navigation Menu Style 10 (Lawn Green)</span><br />
			<span class="img"><img alt="jQuery Navigation Menu Style 10 (Lawn Green)" src="http://apycom.com/ssc-data/items/10/7cfc00/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/10-gainsboro.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Navigation Menu Style 10 (Gainsboro)</span><br />
			<span class="img"><img alt="jQuery Navigation Menu Style 10 (Gainsboro)" src="http://apycom.com/ssc-data/items/10/dcdcdc/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/10-orange.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Navigation Menu Style 10 (Orange)</span><br />
			<span class="img"><img alt="jQuery Navigation Menu Style 10 (Orange)" src="http://apycom.com/ssc-data/items/10/ffa500/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/10-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Navigation Menu Style 10 (Black)</span><br />
			<span class="img"><img alt="jQuery Navigation Menu Style 10 (Black)" src="http://apycom.com/ssc-data/items/10/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/9-medium-slate-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Slide Style 09 (Medium Slate Blue)</span><br />
			<span class="img"><img alt="jQuery Menu Slide Style 09 (Medium Slate Blue)" src="http://apycom.com/ssc-data/items/9/7b68ee/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/9-slate-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Slide Style 09 (Slate Gray)</span><br />
			<span class="img"><img alt="jQuery Menu Slide Style 09 (Slate Gray)" src="http://apycom.com/ssc-data/items/9/708090/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/9-green-yellow.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Slide Style 09 (Green Yellow)</span><br />
			<span class="img"><img alt="jQuery Menu Slide Style 09 (Green Yellow)" src="http://apycom.com/ssc-data/items/9/adff2f/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/9-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Slide Style 09 (Black)</span><br />
			<span class="img"><img alt="jQuery Menu Slide Style 09 (Black)" src="http://apycom.com/ssc-data/items/9/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/9-deep-sky-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Slide Style 09 (Deep Sky Blue)</span><br />
			<span class="img"><img alt="jQuery Menu Slide Style 09 (Deep Sky Blue)" src="http://apycom.com/ssc-data/items/9/00bfff/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/9-dark-goldenrod.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Slide Style 09 (Dark Goldenrod)</span><br />
			<span class="img"><img alt="jQuery Menu Slide Style 09 (Dark Goldenrod)" src="http://apycom.com/ssc-data/items/9/b8860b/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/8-black.html"><br />
		<span class="image"><br />
			<span class="overlay">Animated jQuery Menu Style 08 (Black)</span><br />
			<span class="img"><img alt="Animated jQuery Menu Style 08 (Black)" src="http://apycom.com/ssc-data/items/8/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/8-dim-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">Animated jQuery Menu Style 08 (Dim Gray)</span><br />
			<span class="img"><img alt="Animated jQuery Menu Style 08 (Dim Gray)" src="http://apycom.com/ssc-data/items/8/696969/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/8-orange-red.html"><br />
		<span class="image"><br />
			<span class="overlay">Animated jQuery Menu Style 08 (Orange Red)</span><br />
			<span class="img"><img alt="Animated jQuery Menu Style 08 (Orange Red)" src="http://apycom.com/ssc-data/items/8/ff4500/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/8-white-smoke.html"><br />
		<span class="image"><br />
			<span class="overlay">Animated jQuery Menu Style 08 (White Smoke)</span><br />
			<span class="img"><img alt="Animated jQuery Menu Style 08 (White Smoke)" src="http://apycom.com/ssc-data/items/8/f5f5f5/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/8-deep-sky-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">Animated jQuery Menu Style 08 (Deep Sky Blue)</span><br />
			<span class="img"><img alt="Animated jQuery Menu Style 08 (Deep Sky Blue)" src="http://apycom.com/ssc-data/items/8/00bfff/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/8-yellow-green.html"><br />
		<span class="image"><br />
			<span class="overlay">Animated jQuery Menu Style 08 (Yellow Green)</span><br />
			<span class="img"><img alt="Animated jQuery Menu Style 08 (Yellow Green)" src="http://apycom.com/ssc-data/items/8/9acd32/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/7-royal-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Plugin Style 07 (Royal Blue)</span><br />
			<span class="img"><img alt="jQuery Menu Plugin Style 07 (Royal Blue)" src="http://apycom.com/ssc-data/items/7/4169e1/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/7-orange.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Plugin Style 07 (Orange)</span><br />
			<span class="img"><img alt="jQuery Menu Plugin Style 07 (Orange)" src="http://apycom.com/ssc-data/items/7/ffa500/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/7-lime.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Plugin Style 07 (Lime)</span><br />
			<span class="img"><img alt="jQuery Menu Plugin Style 07 (Lime)" src="http://apycom.com/ssc-data/items/7/00ff00/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/7-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Plugin Style 07 (Gray)</span><br />
			<span class="img"><img alt="jQuery Menu Plugin Style 07 (Gray)" src="http://apycom.com/ssc-data/items/7/808080/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/7-fire-brick.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Plugin Style 07 (Fire Brick)</span><br />
			<span class="img"><img alt="jQuery Menu Plugin Style 07 (Fire Brick)" src="http://apycom.com/ssc-data/items/7/b22222/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/7-white.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Plugin Style 07 (White)</span><br />
			<span class="img"><img alt="jQuery Menu Plugin Style 07 (White)" src="http://apycom.com/ssc-data/items/7/ffffff/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/6-gainsboro.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery CSS Menu Style 06 (Gainsboro)</span><br />
			<span class="img"><img alt="jQuery CSS Menu Style 06 (Gainsboro)" src="http://apycom.com/ssc-data/items/6/dcdcdc/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/6-midnight-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery CSS Menu Style 06 (Midnight Blue)</span><br />
			<span class="img"><img alt="jQuery CSS Menu Style 06 (Midnight Blue)" src="http://apycom.com/ssc-data/items/6/191970/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/6-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery CSS Menu Style 06 (Black)</span><br />
			<span class="img"><img alt="jQuery CSS Menu Style 06 (Black)" src="http://apycom.com/ssc-data/items/6/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/6-maroon.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery CSS Menu Style 06 (Maroon)</span><br />
			<span class="img"><img alt="jQuery CSS Menu Style 06 (Maroon)" src="http://apycom.com/ssc-data/items/6/800000/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/6-light-sea-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery CSS Menu Style 06 (Light Sea Green)</span><br />
			<span class="img"><img alt="jQuery CSS Menu Style 06 (Light Sea Green)" src="http://apycom.com/ssc-data/items/6/20b2aa/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/6-forest-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery CSS Menu Style 06 (Forest Green)</span><br />
			<span class="img"><img alt="jQuery CSS Menu Style 06 (Forest Green)" src="http://apycom.com/ssc-data/items/6/228b22/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/5-dark-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Horizontal Menu Style 05 (Dark Green)</span><br />
			<span class="img"><img alt="jQuery Horizontal Menu Style 05 (Dark Green)" src="http://apycom.com/ssc-data/items/5/006400/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/5-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Horizontal Menu Style 05 (Gray)</span><br />
			<span class="img"><img alt="jQuery Horizontal Menu Style 05 (Gray)" src="http://apycom.com/ssc-data/items/5/808080/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/5-steel-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Horizontal Menu Style 05 (Steel Blue)</span><br />
			<span class="img"><img alt="jQuery Horizontal Menu Style 05 (Steel Blue)" src="http://apycom.com/ssc-data/items/5/4682b4/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/5-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Horizontal Menu Style 05 (Black)</span><br />
			<span class="img"><img alt="jQuery Horizontal Menu Style 05 (Black)" src="http://apycom.com/ssc-data/items/5/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/5-red.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Horizontal Menu Style 05 (Red)</span><br />
			<span class="img"><img alt="jQuery Horizontal Menu Style 05 (Red)" src="http://apycom.com/ssc-data/items/5/ff0000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/5-white.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Horizontal Menu Style 05 (White)</span><br />
			<span class="img"><img alt="jQuery Horizontal Menu Style 05 (White)" src="http://apycom.com/ssc-data/items/5/ffffff/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/4-steel-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Drop Down Style 04 (Steel Blue)</span><br />
			<span class="img"><img alt="jQuery Menu Drop Down Style 04 (Steel Blue)" src="http://apycom.com/ssc-data/items/4/4682b4/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/4-forest-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Drop Down Style 04 (Forest Green)</span><br />
			<span class="img"><img alt="jQuery Menu Drop Down Style 04 (Forest Green)" src="http://apycom.com/ssc-data/items/4/228b22/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/4-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Drop Down Style 04 (Gray)</span><br />
			<span class="img"><img alt="jQuery Menu Drop Down Style 04 (Gray)" src="http://apycom.com/ssc-data/items/4/808080/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/4-red.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Drop Down Style 04 (Red)</span><br />
			<span class="img"><img alt="jQuery Menu Drop Down Style 04 (Red)" src="http://apycom.com/ssc-data/items/4/ff0000/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/4-dim-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Drop Down Style 04 (Dim Gray)</span><br />
			<span class="img"><img alt="jQuery Menu Drop Down Style 04 (Dim Gray)" src="http://apycom.com/ssc-data/items/4/696969/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/4-blue-violet.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Drop Down Style 04 (Blue Violet)</span><br />
			<span class="img"><img alt="jQuery Menu Drop Down Style 04 (Blue Violet)" src="http://apycom.com/ssc-data/items/4/8a2be2/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/3-olive-drab.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Dropdown Menu Style 3 (Olive Drab)</span><br />
			<span class="img"><img alt="jQuery Dropdown Menu Style 3 (Olive Drab)" src="http://apycom.com/ssc-data/items/3/6b8e23/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/3-dark-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Dropdown Menu Style 3 (Dark Gray)</span><br />
			<span class="img"><img alt="jQuery Dropdown Menu Style 3 (Dark Gray)" src="http://apycom.com/ssc-data/items/3/a9a9a9/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/3-deep-sky-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Dropdown Menu Style 3 (Deep Sky Blue)</span><br />
			<span class="img"><img alt="jQuery Dropdown Menu Style 3 (Deep Sky Blue)" src="http://apycom.com/ssc-data/items/3/00bfff/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/3-orange-red.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Dropdown Menu Style 3 (Orange Red)</span><br />
			<span class="img"><img alt="jQuery Dropdown Menu Style 3 (Orange Red)" src="http://apycom.com/ssc-data/items/3/ff4500/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/3-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Dropdown Menu Style 3 (Black)</span><br />
			<span class="img"><img alt="jQuery Dropdown Menu Style 3 (Black)" src="http://apycom.com/ssc-data/items/3/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/3-white.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Dropdown Menu Style 3 (White)</span><br />
			<span class="img"><img alt="jQuery Dropdown Menu Style 3 (White)" src="http://apycom.com/ssc-data/items/3/ffffff/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/2-dim-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Drop Down Menu Style 2 (Dim Gray)</span><br />
			<span class="img"><img alt="jQuery Drop Down Menu Style 2 (Dim Gray)" src="http://apycom.com/ssc-data/items/2/696969/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/2-brown.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Drop Down Menu Style 2 (Brown)</span><br />
			<span class="img"><img alt="jQuery Drop Down Menu Style 2 (Brown)" src="http://apycom.com/ssc-data/items/2/a52a2a/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/2-dark-olive-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Drop Down Menu Style 2 (Dark Olive Green)</span><br />
			<span class="img"><img alt="jQuery Drop Down Menu Style 2 (Dark Olive Green)" src="http://apycom.com/ssc-data/items/2/556b2f/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/2-white-smoke.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Drop Down Menu Style 2 (White Smoke)</span><br />
			<span class="img"><img alt="jQuery Drop Down Menu Style 2 (White Smoke)" src="http://apycom.com/ssc-data/items/2/f5f5f5/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/2-steel-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Drop Down Menu Style 2 (Steel Blue)</span><br />
			<span class="img"><img alt="jQuery Drop Down Menu Style 2 (Steel Blue)" src="http://apycom.com/ssc-data/items/2/4682b4/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/2-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Drop Down Menu Style 2 (Black)</span><br />
			<span class="img"><img alt="jQuery Drop Down Menu Style 2 (Black)" src="http://apycom.com/ssc-data/items/2/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/1-yellow-green.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Style 01 (Yellow Green)</span><br />
			<span class="img"><img alt="jQuery Menu Style 01 (Yellow Green)" src="http://apycom.com/ssc-data/items/1/9acd32/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/1-deep-sky-blue.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Style 01 (Deep Sky Blue)</span><br />
			<span class="img"><img alt="jQuery Menu Style 01 (Deep Sky Blue)" src="http://apycom.com/ssc-data/items/1/00bfff/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
<tr>
<td><a class="item" href="http://apycom.com/menus/1-black.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Style 01 (Black)</span><br />
			<span class="img"><img alt="jQuery Menu Style 01 (Black)" src="http://apycom.com/ssc-data/items/1/000000/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/1-white-smoke.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Style 01 (White Smoke)</span><br />
			<span class="img"><img alt="jQuery Menu Style 01 (White Smoke)" src="http://apycom.com/ssc-data/items/1/f5f5f5/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/1-orange-red.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Style 01 (Orange Red)</span><br />
			<span class="img"><img alt="jQuery Menu Style 01 (Orange Red)" src="http://apycom.com/ssc-data/items/1/ff4500/icon.gif"></span><br />
		</span><br />
	</a></td>
<td><a class="item" href="http://apycom.com/menus/1-dim-gray.html"><br />
		<span class="image"><br />
			<span class="overlay">jQuery Menu Style 01 (Dim Gray)</span><br />
			<span class="img"><img alt="jQuery Menu Style 01 (Dim Gray)" src="http://apycom.com/ssc-data/items/1/696969/icon.gif"></span><br />
		</span><br />
	</a></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/jquery-menu-plugin-631/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用js搜索网页表格内容</title>
		<link>http://javadou.com/js-table-data-javascript-621/</link>
		<comments>http://javadou.com/js-table-data-javascript-621/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 00:46:18 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[table]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=621</guid>
		<description><![CDATA[表格在网页中应用十分广泛，一个表格的使用涉及到多种操作技术，各种灵活的操作可以形成一个功能强大的表格，而这些操作大都是基于javascript来完成的，下面就是使用javascript来实现对一个表格的所在列进行搜索... ]]></description>
			<content:encoded><![CDATA[<p><span>表格在网页中应用十分广泛，一个表格的使用涉及到多种操作技术，各种灵活的操作可以形成一个功能强大的表格，而这些操作大都是基于javascript来完成的，下面就是使用javascript来实现对一个表格的所在列进行搜索，分别完成模糊搜索和绝对搜索功能。<br />
以下为模糊搜索并将搜索到的内容所在的行跳到当前面前中.<br />
1 &lt;script&gt;<br />
2   function   sousuo(table,vstr){<br />
3   var   t=false;<br />
4   var   maxrow=table.rows.length;<br />
5   var   maxcol=table.rows[0].cells.length;<br />
6   var   tdcon;<br />
7<br />
8   for(i=0;i&lt;maxrow;i++){<br />
9   for(j=0;j&lt;maxcol;j++)<br />
{<br />
10   tdcon   =   table.rows[i].cells[j];<br />
11   if(tdcon.innerHTML.indexOf(vstr)&gt;=0){<br />
13   table.rows[i].scrollIntoView();<br />
14   t=true;<br />
15   }<br />
16  }<br />
17   }<br />
18   if(t){<br />
19   }<br />
20   else   alert(&#8220;没找到：“&#8221;   +   vstr   +   &#8221;”，请重新输入！&#8221;);<br />
21   }<br />
22 &lt;/script&gt;</p>
<p>以下为对一个表格中第一列中的数据进行绝对搜索，同样把所对应的内容所在行跳至当前页面。<br />
1 &lt;script&gt;<br />
2   function   she(table,vstr){<br />
3   var   t=false;<br />
4   var   maxrow=table.rows.length;<br />
5   var   maxcol=table.rows[0].cells.length;<br />
6   var   tdcon;<br />
7<br />
8   for(i=0;i&lt;maxrow;i++){<br />
9<br />
10   tdcon   =   table.rows[i].cells[0];<br />
11   if(tdcon.innerHTML==vstr){<br />
13   table.rows[i].scrollIntoView();<br />
14   t=true;<br />
15   }<br />
16<br />
17   }<br />
18   if(t){<br />
19   }<br />
20   else   alert(&#8220;没找到：“&#8221;   +   vstr   +   &#8221;”，请重新输入！&#8221;);<br />
21   }<br />
22 &lt;/script&gt; </span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/js-table-data-javascript-621/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>spring annotation注解 详细介绍</title>
		<link>http://javadou.com/spring-annotation-630/</link>
		<comments>http://javadou.com/spring-annotation-630/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 00:50:05 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[注解]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=630</guid>
		<description><![CDATA[1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现： Java代码 public class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } &8230; } public cl... ]]></description>
			<content:encoded><![CDATA[<p>1. 使用Spring注解来注入属性<br />
1.1. 使用注解以前我们是怎样注入属性的<br />
类的实现：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>public class UserManagerImpl implements UserManager {</li>
<li> private UserDao userDao;</li>
<li> public void setUserDao(UserDao userDao) {</li>
<li> this.userDao = userDao;</li>
<li> }</li>
<li> &#8230;</li>
<li>}</li>
</ol>
</div>
<pre>public class UserManagerImpl implements UserManager {
 private UserDao userDao;
 public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }
 ...
}</pre>
<p>配置文件：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>&lt;bean id=&#8221;userManagerImpl&#8221; class=&#8221;com.kedacom.spring.annotation.service.UserManagerImpl&#8221;&gt;</li>
<li> &lt;property name=&#8221;userDao&#8221; ref=&#8221;userDao&#8221; /&gt;</li>
<li>&lt;/bean&gt;</li>
<li>&lt;bean id=&#8221;userDao&#8221; class=&#8221;com.kedacom.spring.annotation.persistence.UserDaoImpl&#8221;&gt;</li>
<li> &lt;property name=&#8221;sessionFactory&#8221; ref=&#8221;mySessionFactory&#8221; /&gt;</li>
<li> &lt;/bean&gt;</li>
</ol>
</div>
<pre>&lt;bean id="userManagerImpl"&gt;
 &lt;property name="userDao" ref="userDao" /&gt;
&lt;/bean&gt;
&lt;bean id="userDao"&gt;
 &lt;property name="sessionFactory" ref="mySessionFactory" /&gt;
&lt;/bean&gt;</pre>
<p>1.2. 引入@Autowired注解（不推荐使用，建议使用@Resource）<br />
类的实现（对成员变量进行标注）</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>public class UserManagerImpl implements UserManager {</li>
<li> <span style="color: #646464;">@Autowired</span></li>
<li> private UserDao userDao;</li>
<li> &#8230;</li>
<li>}</li>
</ol>
</div>
<pre>public class UserManagerImpl implements UserManager {
 @Autowired
 private UserDao userDao;
 ...
}</pre>
<p>或者（对方法进行标注）</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>public class UserManagerImpl implements UserManager {</li>
<li> private UserDao userDao;</li>
<li> <span style="color: #646464;">@Autowired</span></li>
<li> public void setUserDao(UserDao userDao) {</li>
<li> this.userDao = userDao;</li>
<li> }</li>
<li> &#8230;</li>
<li>}</li>
</ol>
</div>
<pre>public class UserManagerImpl implements UserManager {
 private UserDao userDao;
 @Autowired
 public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }
 ...
}</pre>
<p>配置文件</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>&lt;bean id=&#8221;userManagerImpl&#8221; class=&#8221;com.kedacom.spring.annotation.service.UserManagerImpl&#8221; /&gt;</li>
<li>&lt;bean id=&#8221;userDao&#8221; class=&#8221;com.kedacom.spring.annotation.persistence.UserDaoImpl&#8221;&gt;</li>
<li> &lt;property name=&#8221;sessionFactory&#8221; ref=&#8221;mySessionFactory&#8221; /&gt;</li>
<li> &lt;/bean&gt;</li>
</ol>
</div>
<pre>&lt;bean id="userManagerImpl" /&gt;
&lt;bean id="userDao"&gt;
 &lt;property name="sessionFactory" ref="mySessionFactory" /&gt;
&lt;/bean&gt;</pre>
<p>@Autowired可以对成员变量、方法和构造函数进行标注，来完成自动装配的工作。以上两种不同实现方式中，@Autowired的标注位置不同，它 们都会在Spring在初始化userManagerImpl这个bean时，自动装配userDao这个属性，区别是：第一种实现中，Spring会直 接将UserDao类型的唯一一个bean赋值给userDao这个成员变量；第二种实现中，Spring会调用setUserDao方法来将 UserDao类型的唯一一个bean装配到userDao这个属性。</p>
<p>1.3. 让@Autowired工作起来<br />
要使@Autowired能够工作，还需要在配置文件中加入以下代码</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>&lt;bean class=&#8221;org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor&#8221; /&gt;</li>
</ol>
</div>
<pre>&lt;bean /&gt;</pre>
<p>1.4. @Qualifier<br />
@Autowired是根据类型进行自动装配的。在上面的例子中，如果当Spring上下文中存在不止一个UserDao类型的bean时，就会抛出 BeanCreationException异常；如果Spring上下文中不存在UserDao类型的bean，也会抛出 BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。<br />
1. 可能存在多个UserDao实例</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li><span style="color: #646464;">@Autowired</span></li>
<li>public void setUserDao(<span style="color: #646464;">@Qualifier</span>(&#8220;userDao&#8221;) UserDao userDao) {</li>
<li> this.userDao = userDao;</li>
<li>}</li>
</ol>
</div>
<pre>@Autowired
 public void setUserDao(@Qualifier("userDao") UserDao userDao) {
  this.userDao = userDao;
 }</pre>
<p>这样，Spring会找到id为userDao的bean进行装配。<br />
2. 可能不存在UserDao实例</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li><span style="color: #646464;">@Autowired</span>(required = false)</li>
<li>public void setUserDao(UserDao userDao) {</li>
<li> this.userDao = userDao;</li>
<li>}</li>
</ol>
</div>
<pre>@Autowired(required = false)
 public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }</pre>
<p>1.5. @Resource（JSR-250标准注解，推荐使用它来代替Spring专有的@Autowired注解）<br />
Spring 不但支持自己定义的@Autowired注解，还支持几个由JSR-250规范定义的注解，它们分别是@Resource、@PostConstruct以及@PreDestroy。<br />
@Resource的作用相当于@Autowired，只不过@Autowired按byType自动注入，而@Resource默认按byName自动 注入罢了。@Resource有两个属性是比较重要的，分别是name和type，Spring将@Resource注解的name属性解析为bean的 名字，而type属性则解析为bean的类型。所以如果使用name属性，则使用byName的自动注入策略，而使用type属性时则使用byType自 动注入策略。如果既不指定name也不指定type属性，这时将通过反射机制使用byName自动注入策略。<br />
@Resource装配顺序</p>
<ol>
<li>如果同时指定了name和type，则从Spring上下文中找到唯一匹配的bean进行装配，找不到则抛出异常</li>
<li>如果指定了name，则从上下文中查找名称（id）匹配的bean进行装配，找不到则抛出异常</li>
<li>如果指定了type，则从上下文中找到类型匹配的唯一bean进行装配，找不到或者找到多个，都会抛出异常</li>
<li> 如果既没有指定name，又没有指定type，则自动按照byName方式进行装配（见2）；如果没有匹配，则回退为一个原始类型（UserDao）进行匹配，如果匹配则自动装配；</li>
</ol>
<p>1.6. @PostConstruct（JSR-250）<br />
在方法上加上注解@PostConstruct，这个方法就会在Bean初始化之后被Spring容器执行（注：Bean初始化包括，实例化Bean，并装配Bean的属性（依赖注入））。<br />
它的一个典型的应用场景是，当你需要往Bean里注入一个其父类中定义的属性，而你又无法复写父类的属性或属性的setter方法时，如：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>public class UserDaoImpl extends HibernateDaoSupport implements UserDao {</li>
<li> private SessionFactory mySessionFacotry;</li>
<li> <span style="color: #646464;">@Resource</span></li>
<li> public void setMySessionFacotry(SessionFactory sessionFacotry) {</li>
<li> this.mySessionFacotry = sessionFacotry;</li>
<li> }</li>
<li> <span style="color: #646464;">@PostConstruct</span></li>
<li> public void injectSessionFactory() {</li>
<li> super.setSessionFactory(mySessionFacotry);</li>
<li> }</li>
<li> &#8230;</li>
<li>}</li>
</ol>
</div>
<pre>public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
 private SessionFactory mySessionFacotry;
 @Resource
 public void setMySessionFacotry(SessionFactory sessionFacotry) {
  this.mySessionFacotry = sessionFacotry;
 }
 @PostConstruct
 public void injectSessionFactory() {
  super.setSessionFactory(mySessionFacotry);
 }
 ...
}</pre>
<p>这里通过@PostConstruct，为UserDaoImpl的父类里定义的一个sessionFactory私有属性，注入了我们自己定义的 sessionFactory（父类的setSessionFactory方法为final，不可复写），之后我们就可以通过调用 super.getSessionFactory()来访问该属性了。</p>
<p>1.7. @PreDestroy（JSR-250）<br />
在方法上加上注解@PreDestroy，这个方法就会在Bean初始化之后被Spring容器执行。由于我们当前还没有需要用到它的场景，这里不不去演示。其用法同@PostConstruct。</p>
<p>1.8. 使用&lt;context:annotation-config /&gt;简化配置<br />
Spring2.1添加了一个新的context的Schema命名空间，该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。我们 知道注释本身是不会做任何事情的，它仅提供元数据信息。要使元数据信息真正起作用，必须让负责处理这些元数据的处理器工作起来。<br />
AutowiredAnnotationBeanP</p>
<div>ostProcessor和CommonAnnotationBeanPostProcessor 就是处理这些注释元数据的处理器。但是直接在Spring配置文件中定义这些Bean显得比较笨拙。Spring为我们提供了一种方便的注册这些 BeanPostProcessor的方式，这就是&lt;context:annotation-config /&gt;：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>&lt;beans xmlns=&#8221;http://www.springframework.org/schema/beans&#8221; xmlns:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221; xmlns:context=&#8221;http://www.springframework.org/schema/context&#8221;</li>
<li> xsi:schemaLocation=&#8221;http://www.springframework.org/schema/beans</li>
<li> http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</li>
<li> http://www.springframework.org/schema/context</li>
<li> http://www.springframework.org/schema/context/spring-context-2.5.xsd&#8221;&gt;</li>
<li> &lt;context:annotation-config /&gt;</li>
<li> &lt;/beans&gt;</li>
</ol>
</div>
<pre>&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

 http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;
 &lt;context:annotation-config /&gt;
&lt;/beans&gt;</pre>
<p>&lt;context:annotationconfig /&gt;将隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor以及RequiredAnnotationBeanPostProcessor这4个BeanPostProcessor。</p>
<p>2. 使用Spring注解完成Bean的定义<br />
以上我们介绍了通过@Autowired或@Resource来实现在Bean中自动注入的功能，下面我们将介绍如何注解Bean，从而从XML配置文件中完全移除Bean定义的配置。</p>
<p>2.1. @Component（不推荐使用）、@Repository、@Service、@Controller<br />
只需要在对应的类上加上一个@Component注解，就将该类定义为一个Bean了：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li><span style="color: #646464;">@Component</span></li>
<li>public class UserDaoImpl extends HibernateDaoSupport implements UserDao {</li>
<li> &#8230;</li>
<li>}</li>
</ol>
</div>
<pre>@Component
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
 ...
}</pre>
<p>使用@Component注解定义的Bean，默认的名称（id）是小写开头的非限定类名。如这里定义的Bean名称就是userDaoImpl。你也可以指定Bean的名称：<br />
@Component(&#8220;userDao&#8221;)<br />
@Component是所有受Spring管理组件的通用形式，Spring还提供了更加细化的注解形式：@Repository、@Service、 @Controller，它们分别对应存储层Bean，业务层Bean，和展示层Bean。目前版本（2.5）中，这些注解与@Component的语义 是一样的，完全通用，在Spring以后的版本中可能会给它们追加更多的语义。所以，我们推荐使用@Repository、@Service、 @Controller来替代@Component。</p>
<p>2.2. 使用&lt;context:component-scan /&gt;让Bean定义注解工作起来</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>&lt;beans xmlns=&#8221;http://www.springframework.org/schema/beans&#8221; xmlns:xsi=&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221; xmlns:context=&#8221;http://www.springframework.org/schema/context&#8221;</li>
<li> xsi:schemaLocation=&#8221;http://www.springframework.org/schema/beans</li>
<li> http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</li>
<li> http://www.springframework.org/schema/context</li>
<li> http://www.springframework.org/schema/context/spring-context-2.5.xsd&#8221;&gt;</li>
<li> &lt;context:component-scan base-package=&#8221;com.kedacom.ksoa&#8221; /&gt;</li>
<li> &lt;/beans&gt;</li>
</ol>
</div>
<pre>&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/context

 http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;
 &lt;context:component-scan base-package="com.kedacom.ksoa" /&gt;
&lt;/beans&gt;</pre>
<p>这里，所有通过&lt;bean&gt;元素定义Bean的配置内容已经被移除，仅需要添加一行&lt;context:component-scan /&gt;配置就解决所有问题了——Spring XML配置文件得到了极致的简化（当然配置元数据还是需要的，只不过以注释形式存在罢了）。&lt;context:component-scan /&gt;的base-package属性指定了需要扫描的类包，类包及其递归子包中所有的类都会被处理。<br />
&lt;context:component-scan /&gt;还允许定义过滤器将基包下的某些类纳入或排除。Spring支持以下4种类型的过滤方式：</p>
<ul>
<li>过滤器类型 表达式范例 说明</li>
<li>注解 org.example.SomeAnnotation 将所有使用SomeAnnotation注解的类过滤出来</li>
<li>类名指定 org.example.SomeClass 过滤指定的类</li>
<li>正则表达式 com\.kedacom\.spring\.annotation\.web\..* 通过正则表达式过滤一些类</li>
<li>AspectJ表达式 org.example..*Service+ 通过AspectJ表达式过滤一些类</li>
</ul>
<p>以正则表达式为例，我列举一个应用实例：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li>&lt;context:component-scan base-package=&#8221;com.casheen.spring.annotation&#8221;&gt;</li>
<li> &lt;context:exclude-filter type=&#8221;regex&#8221; expression_r=&#8221;com\.casheen\.spring\.annotation\.web\..*&#8221; /&gt;</li>
<li> &lt;/context:component-scan&gt;</li>
</ol>
</div>
<pre>&lt;context:component-scan base-package="com.casheen.spring.annotation"&gt;
  &lt;context:exclude-filter type="regex" expression_r="com\.casheen\.spring\.annotation\.web\..*" /&gt;
 &lt;/context:component-scan&gt;</pre>
<p>值得注意的是&lt;context:component-scan /&gt;配置项不但启用了对类包进行扫描以实施注释驱动Bean定义的功能，同时还启用了注释驱动自动注入的功能（即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor），因此当使用&lt;context:component-scan /&gt;后，就可以将&lt;context:annotation-config /&gt;移除了。</p>
<p>2.3. 使用@Scope来定义Bean的作用范围<br />
在使用XML定义Bean时，我们可能还需要通过bean的scope属性来定义一个Bean的作用范围，我们同样可以通过@Scope注解来完成这项工作：</p>
<div>
<div>
<div>Java代码</div>
</div>
<ol>
<li><span style="color: #646464;">@Scope</span>(&#8220;session&#8221;)</li>
<li><span style="color: #646464;">@Component</span>()</li>
<li>public class UserSessionBean implements Serializable {</li>
<li> &#8230;</li>
<li>}</li>
</ol>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/spring-annotation-630/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl  Ruby一段小程序（Perl vs. Ruby)</title>
		<link>http://javadou.com/perl-vs-ruby-625/</link>
		<comments>http://javadou.com/perl-vs-ruby-625/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 00:45:12 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[recommend]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=625</guid>
		<description><![CDATA[读《Perl语言入门》（第四版，我买的书，网上有个翻译质量很高的电子版）的第10章的习题，人见人爱的猜数游戏，用perl写出来大概这样： $num=int (1 + rand 100); print &8221;I have a number,guess it?:\n&8221;; while(&60;&62... ]]></description>
			<content:encoded><![CDATA[<p>读《Perl语言入门》（第四版，我买的书，网上有个翻译质量很高的电子版）的第10章的习题，人见人爱的猜数游戏，用perl写出来大概这样：<br />
$num=int (1 + rand 100);<br />
print &#8221;I have a number,guess it?:\n&#8221;;<br />
while(&lt;&gt;)<br />
{<br />
chomp;<br />
next unless /\d+/;<br />
$_&gt;$num? print &#8221;Too high\n&#8221; :<br />
$_==$num? last :print &#8221;Too low\n&#8221;;<br />
}   题外话：玩Perl的高人们别鄙视我，我是perl新手啊，如果写的不够“perl”，多多指点。</p>
<p>这段代码转成ruby，可以这样写：</p>
<p>$num=rand 101<br />
puts &#8221;I have a number guess it?&#8221;<br />
while(true)<br />
gets.chomp<br />
next unless ~/\d+/<br />
$_.to_i&gt;$num?begin print &#8221;Too high\n&#8221; end:<br />
$_.to_i==$num? begin break end:begin print &#8221;Too low\n&#8221; end</p>
<p>end<br />
看出来了吧，两者何其相似啊，包括perl里面人见人爱的$_，ruby也是支持的，唯一那么一点不同的地方就是last换成了break，然后是正则表达式左边多了个~，你完全可以将这个符号去掉，不过会有警告，最后就是Ruby中的要执行的表达式得放在begin&#8230;end里面，这一点让我琢磨了一段时间，还以为Ruby不支持呢。读《Perl语言入门》最大的乐趣除了妙趣横生的语言、古灵精怪的符号之外，就是寻找Ruby中的Perl痕迹，哦哦，那个味道相当重——骆驼的味道。不过现在Ruby不鼓励这样的写法，毕竟，程序是给人读的，因此可以改写一下：<br />
$num=rand 101<br />
puts &#8221;I have a number guess it?&#8221;<br />
while(true)<br />
guess=STDIN.gets<br />
next unless guess=~/\d+/<br />
if(guess.to_i&gt;$num)<br />
puts &#8221;Too high&#8221;<br />
elsif(guess.to_i==$num)<br />
break<br />
else<br />
puts &#8221;Too low&#8221;<br />
end<br />
end</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/perl-vs-ruby-625/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>json介绍 json使用 ajax入门 ajax使用方式</title>
		<link>http://javadou.com/ajax-json-ajax-614/</link>
		<comments>http://javadou.com/ajax-json-ajax-614/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 00:43:22 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=614</guid>
		<description><![CDATA[3、JSON方式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写，比xml有更好的易用性json中文网站 JSON具有以下这些形式： 对象是一个无序的“‘名称/值’对”集合。一个对象以“{”（左括... ]]></description>
			<content:encoded><![CDATA[<p><span>3、JSON方式</p>
<p>JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写，比xml有更好的易用性json中文网站</p>
<p>JSON具有以下这些形式：</p>
<p>对象是一个无序的“‘名称/值’对”集合。一个对象以“{”（左括号）开始，“}”（右括号）结束。每个“名称”后跟一个“:”（冒号）；“‘名称/值’ 对”之间使用“,”（逗号）分隔。<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/2395b_object.gif" border="0" alt="" /><br />
数组是值（value）的有序集合。一个数组以“[”（左中括号）开始，“]”（右中括号）结束。值之间使用“,”（逗号）分隔。<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/2395b_array.gif" border="0" alt="" /><br />
值（value）可以是双引号括起来的字符串（string）、数值(number)、true、false、 null、对象（object）或者数组（array）。这些结构可以嵌套。<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/2395b_value.gif" border="0" alt="" /><br />
字符串（string）是由双引号包围的任意数量Unicode字符的集合，使用反斜线转义。一个字符（character）即一个单独的字符串（character string）。<br />
字符串（string）与C或者Java的字符串非常相似。<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/2395b_string.gif" border="0" alt="" /><br />
数值（number）也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/2395b_number.gif" border="0" alt="" /><br />
以下是以自己在项目中实际使用到JSON为原型进行举例</p>
<p>1、业务描述：</p>
<p>根据前台搜索信息进行搜索，并把后台查询出来的数据集合封装成JSON的方式展现在前台</p>
<p>前台页面搜索：</p>
<p>1        &lt;div id=&#8221;brandId&#8221;&gt;<br />
2        &lt;form id=&#8221;form1&#8243;&gt;<br />
3            &lt;p&gt;<br />
4                预约挂号反馈资源管理<br />
5            &lt;/p&gt;<br />
6            &lt;p&gt;<br />
7                &lt;label&gt;<br />
8                    开始日期<br />
9                    &lt;input type=&#8221;text&#8221; name=&#8221;operate_date1&#8243; /&gt;<br />
10                &lt;/label&gt;<br />
11                &lt;label&gt;<br />
12                    结束日期<br />
13                    &lt;input type=&#8221;text&#8221; name=&#8221;operate_date2&#8243; /&gt;<br />
14                &lt;/label&gt;<br />
15                &lt;label&gt;<br />
16                    病人姓名<br />
17                    &lt;input type=&#8221;text&#8221; name=&#8221;name1&#8243; /&gt;<br />
18                &lt;/label&gt;<br />
19                &lt;label&gt;<br />
20                    科室<br />
21                    &lt;input type=&#8221;text&#8221; name=&#8221;name2&#8243; /&gt;<br />
22                &lt;/label&gt;<br />
23                &lt;input type=&#8221;button&#8221; onclick=&#8221;aa()&#8221; value=&#8221;搜索&#8221; /&gt;<br />
24            &lt;/p&gt;<br />
25&lt;/form&gt;<br />
26        &lt;/div&gt;<br />
27        &lt;div id=&#8221;pp&#8221;&gt;<br />
28        &lt;/div&gt;</p>
<p>js脚本，在这里用到Prototype开源组件，意在规避ajax底层操作prototype官方网站</p>
<p>1function aa(){<br />
2<br />
3        var url = &#8217;${ctx}/registerresult.do?method=listFor1&#8242;;<br />
4        var name22=$F(&#8220;name2&#8243;);<br />
5        var myAjax = new Ajax.Request(<br />
6        url,<br />
7        {<br />
8            method: &#8217;post&#8217;,<br />
9            parameters:Form.serialize(&#8216;form1&#8242;),<br />
10<br />
11            evalScripts: true,<br />
12<br />
13            onComplete:reportError<br />
14        });<br />
15}<br />
16 function reportError(originalRequest){<br />
17      var myobj = originalRequest.responseText.evalJSON(true);<br />
18      var tdate = new Date;<br />
19      var tmonth =tdate.getMonth()+1;<br />
20      var tday=tdate.getDate();<br />
21      if(tmonth&lt;10)<br />
22         tmonth=&#8221;0&#8243;+tmonth;<br />
23       if(tday&lt;10)<br />
24            tday=&#8221;0&#8243;+tday;<br />
25      var ymdate = tdate.getYear()+&#8221;"+tmonth+&#8221;"+tday;<br />
26      var str=&#8221;&lt;table&gt;&#8221;;<br />
27      str=str+&#8221;&lt; tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;确认号&lt;/td&gt;&lt;td&gt;反馈结果&lt; /td&gt;&lt;td&gt;申请单号&lt;/td&gt;&lt;td&gt;申请日期&lt;/td&gt;&lt;td&gt;病人编号 &lt;/td&gt;&lt;td&gt;病人姓名&lt;/td&gt;&lt;td&gt;科室名&lt;/td&gt;&lt;/tr&gt;&#8221;;<br />
28      myobj.each(function(myobj1){<br />
29<br />
30      if(ymdate==myobj1[4]){<br />
31      str=str+&#8221;&lt;tr&gt;&#8221;;<br />
32      str = str+&#8221;&lt;td&gt;&lt;input type=&#8217;checkbox&#8217; name=&#8217;idd&#8217; value=&#8221;+myobj1[0]+&#8221; /&gt;&lt;/td&gt;&#8221;;<br />
33      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[1]+&#8221;&lt;/td&gt;&#8221;;<br />
34      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[2]+&#8221;&lt;/td&gt;&#8221;;<br />
35      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[3]+&#8221;&lt;/td&gt;&#8221;;<br />
36      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[4]+&#8221;&lt;/td&gt;&#8221;;<br />
37      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[5]+&#8221;&lt;/td&gt;&#8221;;<br />
38      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[6]+&#8221;&lt;/td&gt;&#8221;;<br />
39      str = str+&#8221;&lt;td style=&#8217;color:red&#8217;&gt;&#8221;+myobj1[7]+&#8221;&lt;/td&gt;&#8221;;<br />
40      str=str+&#8221;&lt;/tr&gt;&#8221;;<br />
41<br />
42    }else{<br />
43      str=str+&#8221;&lt;tr&gt;&#8221;;<br />
44      str = str+&#8221;&lt;td&gt;&lt;input type=&#8217;checkbox&#8217; name=&#8217;idd&#8217; value=&#8221;+myobj1[0]+&#8221; /&gt;&lt;/td&gt;&#8221;;<br />
45      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[1]+&#8221;&lt;/td&gt;&#8221;;<br />
46      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[2]+&#8221;&lt;/td&gt;&#8221;;<br />
47      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[3]+&#8221;&lt;/td&gt;&#8221;;<br />
48      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[4]+&#8221;&lt;/td&gt;&#8221;;<br />
49      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[5]+&#8221;&lt;/td&gt;&#8221;;<br />
50      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[6]+&#8221;&lt;/td&gt;&#8221;;<br />
51      str = str+&#8221;&lt;td&gt;&#8221;+myobj1[7]+&#8221;&lt;/td&gt;&#8221;;<br />
52      str=str+&#8221;&lt;/tr&gt;&#8221;;<br />
53      }<br />
54      });<br />
55    str=str+&#8221;&lt;/table&gt;&#8221;;<br />
56    $(&#8220;pp&#8221;).innerHTML=str;<br />
57<br />
58     }<br />
此脚本中aa()是获得前台form1表单中查询数据并调用后台方法；reportError()方法是获得封装后的JSONArray进行遍历并进在<br />
前台进行展示</p>
<p>控制层代码如下：</p>
<p>1/** *//**<br />
2     * 此为ajax测试,把查询结果list使用JSON方式返回<br />
3     *<br />
4     * @param<br />
5     *<br />
6     */<br />
7    public void listFor1(ActionMapping mapping, ActionForm form,<br />
8            HttpServletRequest request, HttpServletResponse response)<br />
9            throws Exception {<br />
10        String operate_date1 = request.getParameter(&#8220;operate_date1&#8243;);<br />
11<br />
12        String operate_date2 = request.getParameter(&#8220;operate_date2&#8243;);<br />
13        String name1 = request.getParameter(&#8220;name1&#8243;);<br />
14        String name2 = request.getParameter(&#8220;name2&#8243;);<br />
15        log.info(&#8220;开放日期:&#8221; + operate_date1);<br />
16        List list = registerresultManager.queryApply(registerresultManager<br />
17                .registerResult(operate_date1, operate_date2, name1, name2),<br />
18                getListPage(request, Constant.COUNT));<br />
19<br />
20<br />
21        JSONArray resultArray = new JSONArray();<br />
22        JSONObject jsonObject = new JSONObject();<br />
23        for (int i = 0; i &lt; list.size(); i++) {<br />
24            Object[] d = (Object[]) list.get(i);<br />
25            jsonObject = registerresultManager.getJSON(d);<br />
26            resultArray.put(jsonObject);<br />
27        }<br />
28<br />
29        // 调用基类方法，转化成json方式<br />
30        renderJson(response, resultArray.toString());<br />
31            }<br />
32<br />
此代码是根据查询条件查询出符合条件数据集合，并把集合转化成JSONObject,并把此对象放入JSONArray</p>
<p>转化成JSONObject方法如下：</p>
<p>1/** *//**<br />
2     * 转换成JSON格式<br />
3     * @param domain<br />
4     *                 是要进行转化的实体对象<br />
5     * @return JSONObject<br />
6     */<br />
7    public JSONObject getJSON(Object[] domain) {<br />
8        JSONObject jsonObject = new JSONObject();<br />
9        for (int i = 0; i &lt; domain.length; i++) {<br />
10            if(domain[i]==null)<br />
11                domain[i]=&#8221;";<br />
12            jsonObject.put(String.valueOf(i), domain[i]);<br />
13        }<br />
14<br />
15        return jsonObject;<br />
16    }<br />
这样整个功能完成</p>
<p>页面效果如下：<br />
<img src="http://javadou.com/wordpress/wp-content/plugins/wp-o-matic/cache/8e30c_json.JPG" border="0" alt="" /><br />
总结：<br />
JSON比XML在ajax方面一些优势：<br />
1、易于解读，易于编写，与java中Map集合类似，更易于被开发人员接受<br />
2、节省解析过程，不用象xml需要用JDom等方式解析xml</p>
<p><a href="http://www.java125.cn/article.asp?id=2566" target="_blank">ajax入门 ajax使用方式1-ajax基础</a><br />
</span> <a href="http://www.java125.cn/article.asp?id=2564" target="_blank">ajax入门 ajax使用方式3-ajax基础</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-json-ajax-614/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript中常见的location和URL变量</title>
		<link>http://javadou.com/javascript-location-url%e5%8f%98-629/</link>
		<comments>http://javadou.com/javascript-location-url%e5%8f%98-629/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 02:42:05 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=629</guid>
		<description><![CDATA[alert(location); alert(location.href); alert(location.search); alert(location.pathname); 上面四个分别得到下面四个结果 http://www.baidu.com/s/abc/d?ie=gb2312&38;bs=baseURL&38;sr=&38;z=&38;cl=3&38;f=8&38;wd=baseURL+IE+FF&38;ct=0 http://www.baidu.com/s/abc/d?ie=gb23... ]]></description>
			<content:encoded><![CDATA[<p><span>alert(location);<br />
alert(location.href);<br />
alert(location.search);<br />
alert(location.pathname);</p>
<p>上面四个分别得到下面四个结果</p>
<p><a href="http://www.baidu.com/s/abc/d?ie=gb2312" target="_blank"></a><a href="http://www.baidu.com/s/abc/d?ie=gb2312" target="_blank">http://www.baidu.com/s/abc/d?ie=gb2312</a>&amp;bs=baseURL&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=baseURL+IE+FF&amp;ct=0<br />
<a href="http://www.baidu.com/s/abc/d?ie=gb2312" target="_blank"></a><a href="http://www.baidu.com/s/abc/d?ie=gb2312" target="_blank">http://www.baidu.com/s/abc/d?ie=gb2312</a>&amp;bs=baseURL&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=baseURL+IE+FF&amp;ct=0<br />
?ie=gb2312&amp;bs=baseURL&amp;sr=&amp;z=&amp;cl=3&amp;f=8&amp;wd=baseURL+IE+FF&amp;ct=0<br />
/s/abc/d</span></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/javascript-location-url%e5%8f%98-629/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
