摆渡人,外婆桥!
            ----只要路选对了,就不怕有多远!

2005年12月28日

IE对select的处理,又一怪现象:innerHTML竟然不起作用。

我们用select来选取一个国家,当我辛辛苦苦拼凑字符串,然后把这个字符串赋值给select的innerHTML,运行,在firefox下能显示出所有的国家。但是在IE下却什么都没有显示。刚开始我还以为是我拼凑的字符串有问题,仔细检查没有啊。后台到google上search了下,发现是ie处理select的一个bug。于是做了一个简单的测试。

 1<html>
 2<head>
 3<title>test</title>
 4<script language="javascript">
 5function test(){
 6    var elem=document.getElementById("testS");    
 7    elem.innerHTML="<option value=1>aa</option>";
 8}

 9
10
</script>
11</head>
12<body>
13<input type=button value=test onclick='test()'>
14<div>
15    <select id='testS'></select>
16</div>
17</body>
18</html>

点击test按钮,在IE下,select框没有任何的内容。怪异啊!
于是不得不利用Option对象来增加select的内容。
posted @ 2007-09-12 10:43 swingboat 阅读(1192) | 评论 (0) | 编辑 收藏
 
在IE下,页面只有一个text的时候,回车将自动submit。
真是一个很怪的缺省操作啊!

 1<html>
 2<head>
 3<title>test</title>
 4<script language="javascript">
 5</script>
 6</head>
 7<body>
 8<form name="test" method="post" action="test.htm">
 9<input type='button' value='test' onclick="javascript:test()"> 
10<input type="text"   name="textfield"   class="input">
11</form>
12</body>
13</html>

运行上面的html文件,在text中输入内容,然后回车,这个页面将会自动提交表单。即使我在这个页面中增加file,checkbox,hidden等的控件,这个页面还是会自动提交。这是IE的一个缺省操作。如果想改变这个缺省操作,我们可以再增加一个text,然后隐藏这个text。

If you have a Web Form with just one single-line text input (even if there are additional input fields, like CheckBoxLists, RadioButtonLists, DropDownLists, and so on), hitting enter in the text input will not cause the Button Web control's Click event to fire when using Internet Explorer
posted @ 2007-08-28 16:47 swingboat 阅读(1847) | 评论 (3) | 编辑 收藏
 
设置input的内容居中?

让input的内容在纵向居中,首先我使用了vertical-align样式,没有任何的效果。
后来google了一把,发现需要设置line-height样式,设置后运行,果然如此!
.input   {  
  FONT-SIZE:   12px;    
  height:100px; 
  line-height:100px;
}  
以下是引用内容(http://topic.csdn.net/t/20050722/20/4162420.html):
实际上,一个Box中由很多行很多元素组成,vertical-align只作用于在同一行内的元素,它的垂直并不是相对于整个Box而言的。前面那个   span定义了一个60px的高度,但是这个span的Box中存在很多行,那段文本并不能对齐到span的中央。因此希望那段文本对齐span的中行,   需要给它定义一个line-height的属性,让line-height为60px,作用于一行的vertical-align就按你的想法工作了

posted @ 2007-08-24 16:02 swingboat 阅读(2674) | 评论 (1) | 编辑 收藏
 
可恶的“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”对话框?

今天解决了一个困扰我们很久的一个问题(说是很久,但一直没有花时间去research,想想不影响功能使用,没什么啊。而真正解决问题,也就那二十来分钟,哎!人已经懒惰成这样了)。
问题描述:
我们利用ajax做了一套系统,但通过https访问的时候,IE总会弹出下面的对话框:

而在我们的代码中所有的访问都是通过https的,怎么会有不安全的元素呢?在网上google了一下,有人提到可能是iframe的问题。而在我们系统中确实用到了很多的iframe。修改code,去掉所有的iframe。再次run,上面的对话框没有了,终于找到原因了。但是我们的系统中是需要iframe啊?请看下面的code:

1var iframe=document.createElement("iframe");
2        iframe.style.zIndex=-1;
3        iframe.style.position="absolute";
4        iframe.style.left=0;
5        iframe.style.top=0;
6        iframe.style.width=menu.getSize().x-2;
7        iframe.style.height=menu.getSize().y-4;
8        menu.getHtmlElement().appendChild(iframe);

从上面的code,可以看出代码中没有指定src属性,这样IE是没有办法知道这个iframe将引用的是安全内容还是不安全内容呢。所以会弹出上面的对话框。增加src属性,修改code:

var iframe=document.createElement("<iframe src='blank.html'>");//src是个只读属性,不能直接赋值,black.html是个空的静态页面。

再次run,对话框没有了,问题解决。

附录:

在IE下,如果div悬浮在select上面。select会透过div显示出来。这非常影响视觉效果。网上有很多的解决办法,其中一个就是在div中增加iframe。我们就是通过这个方法的,但又产生了这个问题。

posted @ 2007-08-15 16:15 swingboat 阅读(11093) | 评论 (7) | 编辑 收藏
 
利用JGroups同步两台server之间的cache。
     摘要: 一、需求前段时间做了一个项目,在后台有很多的数据都放入到了cache中了,而且还会对cache中的数据进行更新。如果只有一台server没有任何问题,但是如果考虑到集群负载平衡,连接多个server的时候,就有问题出现了,怎么样才能保证多个server之间cache的同步呢?请看下面的部署图。 二、引入JGroupsJGroups是一个可靠的组间通讯工具,进程可以加入一个通讯组,给组内所有的成员...  阅读全文
posted @ 2007-07-16 14:21 swingboat 阅读(6606) | 评论 (0) | 编辑 收藏
 
有关“+”和“_”的search。
        今天下午QA给我报了一个bug,说输入“f+f”或者“f_f”能够搜索出“f f”的结果。看着这bug的描述,心里还想着怎么会呢,模糊查询也不会出现这样的结果啊!赶紧自己输入“f+f”和“f_f”验证下,结果两次都输出了“f f”。由于查询的条件是通过URL后的参数输入的,当我输入“f+f”时,发现参数传入到服务端后变成了“f f”了,如果是这样,那search的结果是正确的。但为什么输入的参数“f+f”怎么会变成了“f f”呢?而且在输入参数都通过escape进行编码了。于是上网google了一下,发现escape函数是不会对“+”进行编码的,但请求时,web服务器会过滤掉“+”这个字符。所以我们必须手工对“+”进行编码,把所有的“+”都改变为“%2b”。修改代码测试,再次输入“f+f”,结果不能搜索出“f f”的结果了。
而对输入“f_f”搜索出“f f”的结果,主要原因是这个是模糊查询的一种。“f_f”表示搜索出含有两个“f”字符而且中间有一个字符分隔的,“f  f”正好满足这个条件,于是被搜索出了。
posted @ 2007-05-24 23:28 swingboat 阅读(386) | 评论 (0) | 编辑 收藏
 
synchronized的作用
     摘要: synchronized的作用 一、同步方法public synchronized void methodAAA(){ //…. }锁定的是调用这个同步方法的对象 测试:a、不使用这个关键字修饰方法,两个线程调用同一个对象的这个方法。目标类: 1public class TestThread {2   &nb...  阅读全文
posted @ 2007-05-08 11:02 swingboat 阅读(16408) | 评论 (18) | 编辑 收藏
 
HTML的特殊字符

学习BPEL,有个有名的开源引擎ActiveBEPL(http://www.active-endpoints.com),于是进入这个站点搜索些资料。在浏览中发现网页上有很多这种字符“ActiveBPEL™”,这个TM的样式非常的怪,是怎么实现的呢?我用firebug查看了下它的代码,也仅仅是“TM”两个字符。我又用IE Inspector查看了,是“? ”。这就更怪了,竟然不一样。后来又在一页的title上发现了这些字符,于是查看了下源代码。“ActiveBPEL&trade;”&trade;是什么,google一下。呵呵,原来是HTML的一个特殊字符而已。写了这么多年的HTML,竟然不知道,惭愧啊!

想表达的意图 处理方式
(回车换行) <br>
 (空格符) &nbsp;
&(AND符号) &amp;
<(左尖括号、小于号) &lt;
>(右尖括号、大于号) &gt;
°(度) &deg;
•(间隔符) •
´ &acute;
" &quot;
“ &ldquo;
” &rdquo;
‰ &permil;
← &larr;
↑ &uarr;
→ &rarr;
↓ &darr;
↔ &harr;
√ &radic;
∝ &prop;
∞ &infin;
∠ &ang;
∧ &and;
∨ &or;
∩ &cap;
∪ &cup;
Ø &Oslash;
∫ &int;
∴ &there4;
≈ &asymp;
¥(RMB) &yen;

想表达的意图 处理方式
≠ &ne;
≡ &equiv;
≤ &le;
≥ &ge;
⊕ &oplus;
λ &lambda;
μ &mu;
ν &nu;
ξ &xi;
ν &nu;
ξ &xi;
∏ &prod;
∑ &sum;
¥ &yen;
… …
¹(一次方符号) &sup1;
²(平方符号) &sup2;
³(立方符号) &sup3;
nr(上标情形) n<sup>r</sup>
Ci(下标情形) C<sub>i</sub>
加粗 <b>加粗</b>
斜体 <i>斜体</i>
下划线 <u>下划线</u>
±(加减符号) &plusmn;
×(乘法符号) &times;
÷(除法符号) &divide;
©(版权所有) &copy;
®(注册商标) &reg;
™(商标符号) &trade;
—(破折号) —

posted @ 2007-04-23 15:16 swingboat 阅读(717) | 评论 (0) | 编辑 收藏
 
不同时区之间,时间的转换?
一、问题描述
   当软件需要国际化的时候,我们不得不考虑时间的问题。不同的地方有不同的时区,从而显示的时间是不一样的。而且很多国家在某一段时间还可能会实行夏令时,显示的时间又不一样。为了保证时间的正确性,必须有统一的基线,从而不得不考虑下列时间之间的转换。
   a、long timeToUTC(time,timezone)                //把给定的时间根据给定的时区转化为UTC
   b、String UTCToTime(long,timezone)              //把给定的UTC转化为制定时区的时间
   c、timeToTime(time,timezone1,timezone2)         //把给定的时间根据制定的时区转化为另指定时区的时间
   //考虑到数据的存储,还必须考虑数据库对于时间字段的格式。

二、解决方法
   显示时间的不同,主要原因的是时区不同。如果不考虑自定义时区的问题,JODA包就能很好解决上面的问题,但是如果考虑自定义时区(很多软件由于考虑夏令时,从而增加了自定义时区的功能来设置夏令时),则我们必须自己来写转换函数。
   a、JODA
 1public long timeToUTC(String theSourceTime, int sourceWbxTZID)
 2        throws Exception {
 3        DateTime targDate;        
 4        if (sourceWbxTZID == (-1)) {  //UTC
 5            //mdyFormatter:org.joda.time.format.DateTimeFormatter
 6            targDate = mdyFormatter.withZone(DateTimeZone.UTC).parseDateTime(theSourceTime);//
 7        }
 else {
 8            targDate = mdyFormatter.withZone(
 9                DateTimeZone.forID(convertTimezone(sourceWbxTZID)))
10                .parseDateTime(theSourceTime);
11        }

12        return targDate.getMillis();
13    }
   
14    public String UTCToTime(long theUTCTime, int targetWbxTZID)
15        throws Exception {
16        DateTime theSourceTime = new DateTime(theUTCTime);
17        if (targetWbxTZID == (-1)) {
18            return mdyFormatter.withZone(DateTimeZone.UTC).print(theSourceTime);
19        }
 else {
20            return mdyFormatter.withZone(
21                DateTimeZone.forID(convertTimezone(targetWbxTZID))).print(
22                theSourceTime);
23        }

24    }

   b、自编写
 1/** *//**
 2   *sourceDate:需要转换的日期,此日期必须是居于GMT的时间。
 3   *timezone:
 4   *gMT:是否是GMT时间
 5   *isConsiderDayLight:是否考虑夏令时
 6   */

 7  private long convert(Date sourceDate, Timezone timezone, boolean gMT, boolean isConsiderDayLight) throws Exception {
 8    int gMTOffSet = (int) timezone.getGmtOffset();//获取偏移量
 9    long sourceTime = sourceDate.getTime();
10    if (gMT) {
11        targetTime = sourceTime + gMTOffSet * 60 * 1000;
12    }
 else {
13        targetTime = sourceTime + ( -1) * gMTOffSet * 60 * 1000;//北京偏移8个小时,如是:-8*60*1000
14    }

15    //下面是考虑夏令时
16    
17    return targetTime;
18    
19  }

20  public long timeToUTC(String theSourceTime, int sourceWbxTZID)
21        throws Exception {
22        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");        
23        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
24        Date date=sdf.parse(theSourceTime);                
25        Timezone timezone=(Timezone)keyedByWbxTZID.get(String.valueOf(sourceWbxTZID));//此函数主要是获取Timezone相关的数据
26        return convert(date,timezone,false,true);        
27  }
 
28  public String UTCToTime(long theUTCTime, int targetWbxTZID)
29        throws Exception {
30        Date date=new Date();
31        date.setTime(theUTCTime);
32        Timezone timezone=(Timezone)keyedByWbxTZID.get(String.valueOf(targetWbxTZID));//此函数主要是获取Timezone相关的数据
33        long time=convert(date,timezone,true,true); 
34        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
35        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
36        return sdf.format(new Date(time));
37  }


三、相关的一些时间概念 
GMT:就是格林威治标准时间的英文缩写,格林威治是伦敦泰晤士河南岸的一个地方,由于从19世纪开始,因为世界各国来往频繁,而欧洲大陆、美洲大陆和亚洲大陆都有各自的时区,所以为免混乱,各国的代表就在1884 年在美国华盛顿召开了国际大会,通过协议选出伦敦的格林威治,作为全球时间的中心点,格林威治标准时间因而诞生。所以有GMT功能的腕表就是说腕表拥有其中的小时表盘可以显示GMT时间。

UTC:短波传送很远,可能经过许多国家、许多不同时区,所以需要有一统时间作标准, 这个标准时间Co-ordinated Universal Time 缩写UTC 或称 UT。过去称为格林威治时间(GMT),虽然有些地方有冬令时间或夏令时间,但UTC时间是不会改的,大家都以它为标准。

DST:Daylight saving time .(夏令时,各个国家开始和结束时间的计算方法是不一样的)
美国,加拿大夏令时起止时间:每年3月份第二个星期天到11月份第一个星期天(亚利桑那州、夏威夷、波多黎各、维尔京群岛和美属萨摩亚除外)。

德国、意大利等多数欧洲国家夏令时起止时间:每年3月份最后一个星期天到10月份最后一个星期天。


MST:Mountain Standard Time
PST:Pacific Standard Time
EST:Eastern Standard Time

很多朋友对于美剧官方网站上的时间表达方式不是很理解。
这里说明一下,以Prison Break为例:Monday 8/7c
它指的是:星期一 东部时间8点 中部时间7点。两地同时播放,不过因为时差问题,钟表上显示的时间有一个小时的差别。
尽管官网的播放时间对于美国以外的朋友来说意义不大,不过如果你愿意查出相对应的北京时间,可以使用http://www.worldtimeserver.com 的服务,我相信国内也有很多类似的时间转换网站,包括google,百度都可以,这里就不再罗嗦了。至少目前来说,美东时间和北京时间相差12小时,也就是说,我们比美东快12个小时。Prison Break的播放时间就是北京时间第二天的早上8点,也就是星期二 8:00AM.

相对于美国,我们国家的时区划分相对简单很多,特别是取消夏令时后,不出国,我们基本上不用考虑时差问题。

美国本土大陆地区采用的时区自东向西为:
东岸标准时区 (Eastern Standard Time; EST; UTC-5; R区),包括大西洋沿岸各州、墨西哥湾及密西西比河以东地区。
中部标准时区 (Central Standard Time; CST; UTC-6; S区),包括密西西比河沿岸以及以西州份的大部份。
山部标准时区 (Mountain Standard Time; MST; UTC-7; T区), 沿大陆分水岭—洛矶山一线的州份、大盆地及科罗拉多河流淢。
太平洋标准时区 (Pacific Standard Time; PST; UTC-8; U区),包括太平洋沿岸地区及内华达州。

美国本土大陆地区以外地区采用的时区
阿拉斯加标准时区 (Alaska Standard Time; AKST; UTC-9; V区) 包括阿拉斯加州大部份地区。
夏威夷—阿留申时区 (Hawaii-Aleutian Standard Time,非正式:夏威夷标准时 Hawaii Standard Time; HST; UTC-10; W区),包括夏威夷州及169°30'W以西的阿留申群岛。

美国属土采用的时区
大西洋标准时区 (Atlantic Standard Time; AST, UTC-4; Q区) 包括波多黎各及美属处女岛。
萨摩亚时区 (Samoa Standard Time; UTC-11, X区)包括美属萨摩亚。
查莫罗时区 (Chamorro Standard Time; UTC+10, Zone K)包括关岛及北马里亚纳群岛。

中国的时区:我们使用北京时间,以前称中原标准时间,现在台湾依然使用这个名称,是中国大陆、香港、澳門和台湾的标准时间。在时区划分上,属东八区,比世界协调时早8小时,记为UTC+8。

严格地讲,北京时间并不是北京(东经116°)地方的时间,而是东经120°度地方的地方时间。而北京时间也不是在北京确定的,而是由位于中国版图几何中心位置陕西临潼的中国科学院国家授时中心的9台铯原子钟和2台氢原子钟组通过精密比对和计算实现,并通过卫星与世界各国授时部门进行实时比对。

清光绪28年(公元1902年),中国海关曾制定海岸时,以东经120度之时刻为标准。公元1912年,位于北京的中央观象台将全国分为五个时区,民国28年3月9日中华民国内政部召集标准时间会议,确认1912年划分之时区为中华民国标准时区。分别为:
1昆仑时区 UTC+5.5 新疆西部与部分西藏
2新藏时区 UTC+6 新疆及西藏
3陇蜀时区 UTC+7 中国中部
4中原标准时区 UTC+8 中国海岸
5长白时区 UTC+9 中国东北
1949年之后,中国大陆将“中原标准时间”改称“北京时间”,并在全国统一使用该时间作为标准时间。台湾则维持“中原标准时间”之名称,也有称“台北时间”或“国家标准时间”。

由于中国大陆全境都采用北京时间作为标准时,因此在中国西部的陕西、甘肃、新疆等省和自治区造成了生活不便,比如在乌鲁木齐,北京时间比当地时间提前两个小时,北京时间早8时30分(中国大陆公务机关通行的上班时间)相当于当地时间早晨6时30分。作为解决措施,一些新疆地区居民使用乌鲁木齐时间,即东六区(UTC+6)时间。

2005年,一些中华人民共和国全国人民代表大会代表提出将中国大陆时区加以细分的建议,提议分为以北京时间为基础的东部时间(UTC+8)、以陕西地区时间为基础的中部时间(UTC+7)和以新疆、西藏地区时间为基础的西部时间(UTC+6)。后又将该提议改为分为两个时区,即UTC+8和UTC+7两个时区,陕西、四川、重庆、贵州、云南及以西各省采用UTC+7的西部时间。但该提案尚未赴诸表决。

posted @ 2007-04-20 16:24 swingboat 阅读(7455) | 评论 (3) | 编辑 收藏
 
javascript在IE和Firefox中的区别1
1.调用appendChild方法增加input对象,设置type属性的位置
   
 1  <html>
 2    <head>
 3    <title>test</title>
 4    <script language="javascript">
 5    function test(){
 6        var tbodyElement=document.getElementById("tbody1");
 7        var trElement=document.createElement("tr");
 8        var idTDElement=document.createElement("td");
 9        
10        idTDElement.innerHTML=1;
11        var nameTDElement=document.createElement("td");
12        
13        var inputElement=document.createElement("input");
14        nameTDElement.appendChild(inputElement);
15        inputElement.type="button";  
16        //在IE中,这句话将会抛出异常,但在firefox能正常运行,如果type为text或者不设置type属性,也都能正常运行
17        inputElement.value="Invoke";
18        /**//*
19        修改成下面的语句就能正常运行:
20        var inputElement=document.createElement("input");
21        inputElement.type="button";
22        nameTDElement.appendChild(inputElement);
23        */

24        
25        tbodyElement.appendChild(trElement);
26        trElement.appendChild(idTDElement);
27        trElement.appendChild(nameTDElement);
28    }

29    
</script>
30    </head>
31    <body>
32        <input type="button" value="insert" onclick='test()'>
33        <table cellpadding="0" cellspacing="0" border="1">
34            <tbody id='tbody1'>
35                <tr>
36                    <td width="50">ID</td>
37                    <td width="200">name</td>
38                </tr>
39            </tbody>
40        </table>
41    </body>
42  </html> 
 
2.appendChild一个radio对象,设置该对象的name属性
 1  var nameTDElement=document.createElement("td");  
 2  var radioElement=document.createElement("input");
 3  radioElement.type="radio";
 4  nameTDElement.appendChild(inputElement);
 5  radioElement.name="testRadioName";  //这句话在firefox是起作用的,但在IE下是不起作用的
 6  /**//*解决的办法是
 7  var radioElement=document.createElement("<input name='testRadioName'>");
 8  radioElement.type="radio";
 9  nameTDElement.appendChild(inputElement);
10  */

3.对select控件增加和删除Option
 1  <html>
 2    <head>
 3    <title>test</title>
 4    <script language="javascript">
 5    function deleteRow(){
 6        var selectElement=document.getElementById("select1");
 7        selectElement.options.remove(1);  //IE:OK        Firefox:Failure
 8        selectElement.remove(1);          //IE:OK        Firefox:OK
 9    }

10    function insertRow(){
11        var selectElement=document.getElementById("select1");
12        var option=new Option("eeee",5);        
13        selectElement.add(option);        //IE:OK        Firefox:Failure
14        selectElement.options.add(option);//IE:OK        Firefox:OK
15    }

16    
</script>
17    </head>
18    <body>
19    <input type="button" value="Delete" onclick='deleteRow()'>
20    <input type="button" value="Insert" onclick='insertRow()'>
21    <select id="select1">
22        <option  value="1">aaa</option>
23        <option  value="2">bbb</option>
24        <option  value="3">ccc</option>
25        <option  value="4">ddd</option>
26    </select>
27    </body>
28  </html>    

   
posted @ 2007-04-11 16:33 swingboat 阅读(2321) | 评论 (6) | 编辑 收藏
 
利用div进行页面的布局2(position属性)

一、请看下面的HTML代码

 1<HTML>
 2<HEAD>
 3<TITLE>Position </TITLE>
 4</HEAD>
 5<BODY>
 6<table border=1>
 7    <tr>
 8        <td >
 9            <textarea id="textareaInput" style="font-family: Tahoma; font-size: 11px;" cols="35" rows="3"/></textarea>
10        </td>
11        <td width='300' align='right' >
12            <DIV id=senddiv  style="WIDTH: 70px; HEIGHT: 41px;">
13                <IMG id=btnSendOut style="WIDTH: 70px; POSITION: absolute; HEIGHT: 41px" src="windows_button_bg.gif">
14                <div id=divSendOut style="WIDTH: 70px; POSITION: absolute; HEIGHT: 41px;line-height:41px" align='center' >Send</div>
15            </DIV>
16        </td>
17    </tr>
18</table>
19</div>
20</BODY>
21</HTML>

二、运行的结果

 三、问题
     为什么img(id为btnSendOut)和文字div(id为divSendOut)出现在table外了呢?
四、原因
    img和文字div都用的绝对(position:absolute)位置,但都没有设置left和top属性,这样会根据当前的HTML位置来确定left和top属性。上级容器是个div(id为senddiv)中,此div延续上级td的align属性,这样当前位置应在div的右边。于是img和文字div从div(id为senddiv)的右边开始显示,由于都是绝对的,脱离HTML的显示,所以都会超出table外。
五、解决方案
      找到了原因,解决起来就容易了。我们只需要把div(id为senddiv)的align属性设置为left就可以了。因为img,div(id为divSendOut),div(id为senddiv)的大小都是一样的。

六、另外的问题(层的居中问题)
      对于把字符串"Send"居中在div(id为divSendOut)中间,我们可以设置div的line-height属性(注意该属性的单位)和height属性一样就可以了。但是如果需要居中的不是文字,而且其它的对象,例如另一个div,则就需要利用脚本来控制了。
posted @ 2007-04-11 15:23 swingboat 阅读(1394) | 评论 (0) | 编辑 收藏
 
利用div进行页面的布局1(float&clear属性)

请看下面的代码:

 1 < html >
 2 < head >
 3 < script  language ="javascript" >
 4 </ script >
 5 < style  type ="text/css" >
 6 </ style >
 7 </ head >
 8 < body >
 9 < div  style ="position:absolute;top:100px;left:100px;width:300;height:300;background-color:#99FF00" >
10      < div  style ="float:left;width:100;height:100;background-color:red" ></ div >
11      < div  style ="clear:right;height:100;background-color:blue;" ></ div >
12 </ div >
13 </ body >
14 </ html >

 
float : none | left |right
 
参数:
 
none :  对象不浮动
left :  对象浮在左边
right :  对象浮在右边
 
说明:
该属性的值指出了对象是否及如何浮动。
当该属性不等于none引起对象浮动时,对象将被视作块对象(block-level),即display属性等于block。也就是说,浮动对象的display特性将被忽略。
对应的脚本特性为styleFloat。

clear : none | left |right | both
 
参数:
 
none :  允许两边都可以有浮动对象
both :  不允许有浮动对象
left :  不允许左边有浮动对象
right :  不允许右边有浮动对象
 
说明:
 
该属性的值指出了不允许有浮动对象的边。
对应的脚本特性为clear。
posted @ 2007-03-25 16:22 swingboat 阅读(781) | 评论 (0) | 编辑 收藏
 
javascript转换日期字符串为Date对象
把一个日期字符串如“2007-2-28 10:18:30”转换为Date对象:
1:
1var   strArray=str.split("   ");   
2var   strDate=strArray[0].split("-");   
3var   strTime=strArray[1].split(":");   
4var   a=new   Date(strDate[0],(strDate[1]-parseInt(1)),strDate[2],strTime[0],strTime[1],strTime[2])   

2:
1var   s   =   "2005-12-15   09:41:30";   
2var   d   =   new   Date(Date.parse(s.replace(/-/g,   "/")));   
3

第二种方法真是简单啊!
posted @ 2007-02-28 10:21 swingboat 阅读(47715) | 评论 (4) | 编辑 收藏
 
Table中table-layout:fixed样式的作用。
请看下面的html
<html>
    
<body>
        
<TABLE cellSpacing="0" cellPadding="0" width="100%" border="1" >
            
<TBODY>
                
<TR height="30">
                    
<TD style="WIDTH: 12px"></TD>
                    
<TD class="BigCaption" style="WIDTH: 150px">Web Domain :&nbsp;<SPAN class="WarningDescription">*</SPAN>
                    
</TD>
                    
<TD>
                        
<SELECT id="DWT189WebDomain"/>
                    
</TD>
                
</TR>
                
<TR>
                    
<TD></TD>
                    
<TD vAlign="top" colSpan="2">
                        asfdassdgsdgfsdgfsdgfsdfffffffffffffffffffffffffffffffffffffffffffffsdgfsdfgsdgsdgfsdgfsdgsdg
                    
</TD>
                
</TR>
            
</TBODY>
        
</TABLE>
    
</body>
</html>

显示这个页面,含有Web Domain的TD的实际长度绝对大于150px的。因为受第二行的colSpan的属性影响了
<html>
    
<body>
        
<TABLE cellSpacing="0" cellPadding="0" width="100%" border="1" style="table-layout:fixed" >
            
<TBODY>
                
<TR height="30">
                    
<TD style="WIDTH: 12px"></TD>
                    
<TD class="BigCaption" style="WIDTH: 150px">Web Domain :&nbsp;<SPAN class="WarningDescription">*</SPAN>
                    
</TD>
                    
<TD>
                        
<SELECT id="DWT189WebDomain"/>
                    
</TD>
                
</TR>
                
<TR>
                    
<TD></TD>
                    
<TD vAlign="top" colSpan="2">
                        asfdassdgsdgfsdgfsdgfsdfffffffffffffffffffffffffffffffffffffffffffffsdgfsdfgsdgsdgfsdgfsdgs
                    
</TD>
                
</TR>
            
</TBODY>
        
</TABLE>
    
</body>
</html>

这才是我要的效果!呵呵!
posted @ 2006-12-19 13:44 swingboat 阅读(2291) | 评论 (0) | 编辑 收藏
 
maven2使用问题集(命令篇)!
  1. 显示一个插件所有的goal
  2. 创建一个基于模版的项目,eclipse项目
     //创建标准目录模板
     mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons 
    //创建web项目
     mvn archetype:create -DgroupId=com.mycompany.app    -DartifactId=my-webapp       -DarchetypeArtifactId=maven-archetype-web
  3. 查看一个插件所用的版本
    mvn -Dplugin=groupId:artifactId help:describe
  4. 忽略编译test
    mvn -Dmaven.test.skip=true
  5. 一个jar文件,它是maven的一个插件,怎么安装到本地库。
       mvn install:install-file
           -Dfile=<path-to-file>
        -DgroupId=<group-id>
        -DartifactId=<artifact-id>
        -Dversion=<version>
        -Dpackaging=<packaging>
        -DgeneratePom=true
  6. maven的生命周期
        validate,验证工程是否正确,所有需要的资源是否可用。
        compile,编译项目的源代码。
        test-compile,编译项目测试代码。
        test,使用已编译的测试代码,测试已编译的源代码。
        package,已发布的格式,如jar,将已编译的源代码打包。
        integration-test,在集成测试可以运行的环境中处理和发布包。
        verify,运行任何检查,验证包是否有效且达到质量标准。
        install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
       deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。  
       generate-sources,产生应用需要的任何额外的源代码,如xdoclet。
  7. Dependency Scope
     compile,缺省值,适用于所有阶段,会随着项目一起发布。
     provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
     runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
     test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
     system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它
     eg:
     <dependency>
        <groupId>hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.0.3</version>
        <scope>test</scope>
     </dependency>
posted @ 2006-11-13 15:30 swingboat 阅读(2151) | 评论 (2) | 编辑 收藏
 
同步(synchronized)对程序性能的影响!
在使用多线程时,可能会访问一些全局的数据,这时必然会使用同步机制来使程序按照一定顺序来执行,这样程序的性能也会下降。所以一定要慎用同步,正确用同步。看下面的程序
        int curIndex = 0;
        AuditQueueEntry aqe;
        
synchronized (localCriticalSection) {      
            
while (curIndex < theList.size()) {
                aqe 
= (AuditQueueEntry) theList.get(curIndex);
                
if (aqe.getTrailId() == theTrailId) {
                    theList.remove(curIndex);
                }
 else {
                    curIndex
++;
                }

            }

        }

localCriticalSection做为一个信号量来控制程序对类成员变量theList的访问,从而保证了theList在同一时间只有一个程序访问。运行程序,这个函数花费了将近4秒钟。同步是很耗时间的。
在java.util.Collections中提供了很多方法来保证集合(数组)的同步访问。
我们修改类成员变量theList的实例化方法:
theList = Collections.synchronizedList(new LinkedList());

再修改处理函数:
        int curIndex = 0;
        AuditQueueEntry aqe;
//        synchronized (localCriticalSection) {
        synchronized(theList) {    
            
while (curIndex < theList.size()) {
                aqe 
= (AuditQueueEntry) theList.get(curIndex);
                
if (aqe.getTrailId() == theTrailId) {
                    theList.remove(curIndex);
                }
 else {
                    curIndex
++;
                }

            }

        }

再运行,这个函数才花费将近一秒钟的时间!
在Collections中提供了很多这类的方法。
posted @ 2006-11-10 12:37 swingboat 阅读(1338) | 评论 (2) | 编辑 收藏
 
Tomcat5.5.x的JNDI配置(jakarta-tomcat-5.5.7)。


jakarta-tomcat-5.5.7
1.web.xml的设置
<resource-ref>
  <description>OPDB JNDI for TOMCAT</description>
  <res-ref-name>jdbc/opdb</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>

2.cof/server.xml的配置(eg:C:\jakarta-tomcat-5.5.7\conf)。

<Resource name="jdbc/opdb" auth="Steve" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@172.16.208.190:1522:opdb" username="test" password="oracle" maxActive="20" maxIdle="10" maxWait="10000"/> 

3.web/META-INF/content.xml的配置。

<?xml version='1.0' encoding='utf-8'?>
<Context>
 <!-- note: the following resource name is set up to use the inet jdbc driver.  If you are
  using a different driver, then you will have to change the driverClassName.
  You will have to change the url (the ip and db identifier part), username and password
  entries for your environment.
  -->
 <Resource name="jdbc/opdb" auth="Container" type="javax.sql.DataSource" username="test" password="oracle"
  driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@172.16.208.190:1522:opdb" maxActive="20" maxIdle="10"
  maxWait="-1" validationQuery="SELECT 1 FROM DUAL"/>
</Context>
说明:我的tomcat版本是5.5.7。好像必须配置content.xml文件,但是配了这个文件,server.xml中的设置不起作用了。下面是各参数的说明:
driveClassName:JDBC驱动类的完整的名称;
maxActive:同时能够从连接池中被分配的可用实例的最大数;
maxIdle:可以同时闲置在连接池中的连接的最大数;
maxWait:最大超时时间,以毫秒计;
password:用户密码;
url:到JDBC的URL连接;
user:用户名称;
validationQuery:用来查询池中空闲的连接。

posted @ 2006-10-25 10:09 swingboat 阅读(856) | 评论 (0) | 编辑 收藏
 
网站图标
找了很久,偶然间知道了,唉!
<link rel="SHORTCUT ICON" href="http://www.ibm.com/favicon.ico"/>
posted @ 2006-08-28 15:48 swingboat 阅读(252) | 评论 (0) | 编辑 收藏
 
页面中DOCTYPE的作用。
前几天,在做一个页面时,引入了样式文件,但是不起作用。后来跟踪发现竟然是DOCTYPE的设置问题。例如下面的HTML:
<div class="testDiv">test
   <table>
      <tr>
         <td>Table Content</td>
      </tr>
   </table>
</div>
在testDiv中设置了字体的样式,但是浏览时(IE6和FireFox1.5),发现test文本已经显示了testDiv中规定的样式,但Table Content却没有。去掉页面中的"http://www.w3.org/TR/html4/loose.dtd"设置后,两文本都按testDiv的样式显示了。下面引入一篇对DOCTYPE详细解释的文章。

原文作者: 周靖 译

虽然大多数Web文档的顶部都有doctype声明,但很多人都没有注意它。它是在你新建一个文档时,由Web创作软件草率处理的众多细节之一。

虽然doctype被许多人忽视,但在遵循标准的任何Web文档中,它都是一项必需的元素。doctype会影响代码验证,并决定了浏览器最终如何显示你的Web文档。


doctype的作用
doctype声明指出阅读程序应该用什么规则集来解释文档中的标记。在Web文档的情况下,“阅读程序”通常是浏览器或者校验器这样的一个程序,“规则”则是W3C所发布的一个文档类型定义(DTD)中包含的规则。

每个DTD都包括一系列标记、attributes和properties,它们用于标记Web文档的内容;此外还包括一些规则,它们规定了哪些标记能出现在其他哪些标记中。每个Web建议标准(比如HTML 4 Frameset和XHTML 1.0 Transitional)都有自己的DTD。

假如文档中的标记不遵循doctype声明所指定的DTD,这个文档除了不能通过代码校验之外,还有可能无法在浏览器中正确显示。对于标记不一致的问题,浏览器相较于校验器来说更宽容。但是,不正确的doctype声明经常导致网页不正确显示,或者导致它们根本不能显示。


选择正确的doctype
为了获得正确的doctype声明,关键就是让DTD与文档所遵循的标准对应。例如,假定文档遵循的是XHTML 1.0 Strict标准,文档的doctype声明就应该引用相应的DTD。另一方面,如果doctype声明指定的是XHTML DTD,但文档包含的是旧式风格的HTML标记,就是不恰当的;类似地,如果doctype声明指定的是HTML DTD,但文档包含的是XHTML 1.0 Strict标记,同样是不恰当的。

有的时候,也可以根本不使用一个doctype声明。如果没有指定有效的doctype声明,大多数浏览器都会使用一个内建的默认DTD。在这种情况下,浏览器会用内建的DTD来试着显示你所指定的标记。对于一些临时性的、匆忙拼凑的文档(这种文档有许多),你确实可以考虑省略doctype声明,并接受浏览器的默认显示。

完全可以从头编写一个doctype声明,并让它指向自己选择的一个DTD。然而,由于大多数Web文档都需要遵循由W3C发布的某个国际公认的Web标准,所以那些文档通常都要包含以下标准doctype声明之一:

HTML 2:



HTML 3.2:



HTML 4.01 Strict:

"http://www.w3.org/TR/html4/strict.dtd">

HTML 4.01 Transitional:

"http://www.w3.org/TR/html4/loose.dtd">

HTML 4.01 Frameset:

"http://www.w3.org/TR/html4/frameset.dtd">

XHTML 1.0 Strict:

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional:

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML 1.0 Frameset:

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

XHTML 1.1:

"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

XHTML 1.1 plus MathML plus SVG:

"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">

除了上面列出的doctype声明,具有特殊要求的一些文档还使用了其他几种声明。

doctype声明通常是文档的第一行,要在标记以及其他文档内容之前。注意,在XHTML文档中,doctype的前面偶尔会出现一条XML处理指令(也称为XML prolog):



为了确保网页正确显示和顺利通过验证,使用正确的doctype是关键。与内容相反的、不正确的或者形式错误的doctype是大量问题的罪魁祸首。在未来的专栏文章中,我还会具体解释如何诊断及纠正这些问题。

用DW设计网页时,新建一个文件,看代码最前面总要出现一个下面的东东,
"http://www.w3.org/TR/html4/loose.dtd">
这个是DW自动在网页文件页增加了DTD信息.可以删.
删除后,浏览器会使用的默认DTD.


posted @ 2006-04-11 11:37 swingboat 阅读(1499) | 评论 (1) | 编辑 收藏
 
javascript对象使用总结(1)
1.javascript类的定义
  function Person(name,age,sex){
   var self=this;
   this.name=name;
   this.age=age;
   this.sex=sex;
   
   toString=function(){
    alert(self.name);
   }
   
   this.getName=function(){
    return this.name;
   }  
  }
 
  使用:
  var person=new Person("yhp",28,1);
  person.getName();//可以访问getName函数
  person.toString();//不可以访问toString函数
 
  利用prototype.js也可以这么定义
  var Person=Class.create();
  必须定义Person的构造函数:
  Person.prototype.initialize=function(name,age,sex){
   this.name=name;
   this.age=age;
   this.sex=sex;
  }
 
2.在上面的Person类中,toString函数是不能直接访问this.name的.
  解决方法:可以定义变量self,把this赋值给它,在toString中利用self来访问this.name.
  var self=this;
  toString(){
   alert(self.name);
  }
  应用:定义一个类,有个成员变量number,在构造函数中传入一个容器,在容器中创建一个div,div中绑定onclick,在onclick中访问number
  var Module=function(container){
 var self=this;
 this.container=container;
 this.build=function(){
  this.number=Math.random();
  var div=document.createElement("div");
  div.innerHTML="module";
  div.style.cursor="pointer";
  div.onclick=function(){
   alert(self.number);//在此处是不能访问this.number的.
  }
  this.container.appendChild(div);
  test();
 }
  }
 
3.对于下面代码:
  while(count>=0){
    var div=document.createElement("div");
 div.className="number";        
 div.innerHTML=count+1;
 div.style.cursor="pointer";
 div.onclick=function(e){
  alert(count);
 }      
  }
 
  当触发div的onclick的时候,每次alert显示都是-1;也就是最后count的值.但需要每次alert的都是innerHTML中值.
  获取innerHTML的方法: 
     对于事件,获取触发该事件的对象:
     IE     : window.Event.srcElement
     Firefox:e.target   //e是函数传入的事件参数
  获取触发事件的对象的InnerHTML:
  getClickPageNumber=function(e){
   return Try.these(
    function() {return window.event.srcElement.innerHTML},
    function() {return e.target.innerHTML}
 ) ;
  }
  修改onclick:
  div.onclick=function(e){
   alert(getClickPageNumber(e));
  }
 
4.清除html的table中tbody中的内容.
  <tbody id="tBody">
   <tr>
    <td>a</td>
    <td>b</td>
   </tr> 
  </tbody>
  代码:
  $("tBody").innerHTML="";
  上面的代码在IE中是没有效果的.
  修改:
  while (tBody.rows.length > 0) {
 tBody.deleteRow(0);
  }
posted @ 2006-03-13 17:32 swingboat 阅读(450) | 评论 (0) | 编辑 收藏
 
netstat -an命令
netstat -an命令可以显示出激活的连接信息.如果你要查看1433端口是否被监听.可以利用这个命令查看没有显示 0.0.0.0:1433 .

详细的netstat命令,可参考:
http://study.chyangwa.com/IT/AIX/aixcmds4/netstat.htm
posted @ 2006-03-02 15:21 swingboat 阅读(392) | 评论 (0) | 编辑 收藏
 
javascript中event详解

event代表事件的状态,例如触发event对象的元素、鼠标的位置及状态、按下的键等等。
event对象只在事件发生的过程中才有效。
event的某些属性只对特定的事件有意义。比如,fromElement 和 toElement 属性只对 onmouseover 和 onmouseout 事件有意义。
例子

下面的例子检查鼠标是否在链接上单击,并且,如果shift键被按下,就取消链接的跳转。
code<HTML>
<HEAD><TITLE>Cancels Links</TITLE>
<SCRIPT LANGUAGE="JScript">
function cancelLink() {
    if (window.event.srcElement.tagName == "A" && window.event.shiftKey)
    window.event.returnValue = false;
}
</SCRIPT>
<BODY onclick="cancelLink()">


下面的例子在状态栏上显示鼠标的当前位置。
code<BODY onmousemove="window.status = 'X=' + window.event.x + ' Y=' + window.event.y">


属性:

altKey, button, cancelBubble, clientX, clientY, ctrlKey, fromElement, keyCode, offsetX, offsetY, propertyName, returnValue, screenX,
screenY, shiftKey, srcElement, srcFilter, toElement, type, x, y

1.altKey
描述:
检查alt键的状态。

语法:
event.altKey

可能的值:
当alt键按下时,值为 TRUE ,否则为 FALSE 。只读。


2.button
描述:
检查按下的鼠标键。

语法:
event.button

可能的值:
0 没按键
1 按左键
2 按右键
3 按左右键
4 按中间键
5 按左键和中间键
6 按右键和中间键
7 按所有的键

这个属性仅用于onmousedown, onmouseup, 和 onmousemove 事件。对其他事件,不管鼠标状态如何,都返回 0(比如onclick)。

3.cancelBubble
描述:
检测是否接受上层元素的事件的控制。

语法:
event.cancelBubble[ = cancelBubble]

可能的值:
这是一个可读写的布尔值:

TRUE 不被上层原素的事件控制。
FALSE 允许被上层元素的事件控制。这是默认值。

例子:
下面的代码片断演示了当在图片上点击(onclick)时,如果同时shift键也被按下,就取消上层元素(body)上的事件onclick所引发的showSrc()函数。

code<SCRIPT LANGUAGE="JScript">
function checkCancel() {
    if (window.event.shiftKey)
    window.event.cancelBubble = true;
}
function showSrc() {
    if (window.event.srcElement.tagName == "IMG")
    alert(window.event.srcElement.src);
}
</SCRIPT>
<BODY onclick="showSrc()">
<IMG onclick="checkCancel()" SRC="sample.gif">

 

4.clientX
描述:
返回鼠标在窗口客户区域中的X坐标。

语法:
event.clientX

注释:
这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。


5.clientY
描述:
返回鼠标在窗口客户区域中的Y坐标。

语法:
event.clientY

注释:
这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。


6.ctrlKey
描述:
检查ctrl键的状态。

语法:
event.ctrlKey

可能的值:
当ctrl键按下时,值为 TRUE ,否则为 FALSE 。只读。


7.fromElement
描述:
检测 onmouseover 和 onmouseout 事件发生时,鼠标所离开的元素。 参考:18.toElement

语法:
event.fromElement

注释:
这是个只读属性。


8.keyCode
描述:
检测键盘事件相对应的内码。
这个属性用于 onkeydown, onkeyup, 和 onkeypress 事件。

语法:
event.keyCode[ = keyCode]


可能的值:
这是个可读写的值,可以是任何一个Unicode键盘内码。如果没有引发键盘事件,则该值为 0 。


9.offsetX
描述:
检查相对于触发事件的对象,鼠标位置的水平坐标

语法:
event.offsetX


10.offsetY
描述:
检查相对于触发事件的对象,鼠标位置的垂直坐标

语法:
event.offsetY


11.propertyName
描述:
设置或返回元素的变化了的属性的名称。

语法:
event.propertyName [ = sProperty ]

可能的值:
sProperty 是一个字符串,指定或返回触发事件的元素在事件中变化了的属性的名称。
这个属性是可读写的。无默认值。

注释:
你可以通过使用 onpropertychange 事件,得到 propertyName 的值。

例子:
下面的例子通过使用 onpropertychange 事件,弹出一个对话框,显示 propertyName 的值。

code<HEAD>
<SCRIPT>
function changeProp(){
    btnProp.value = "This is the new VALUE";
}

function changeCSSProp(){
    btnStyleProp.style.backgroundColor = "aqua";
}
</SCRIPT>
</HEAD>
<BODY>
<P>The event object property propertyName is
used here to return which property has been
altered.</P>

<INPUT TYPE=button ID=btnProp onclick="changeProp()"
VALUE="Click to change the VALUE property of this button"
onpropertychange='alert(event.propertyName+" property has changed value")'>
<INPUT TYPE=button ID=btnStyleProp
onclick="changeCSSProp()"
VALUE="Click to change the CSS backgroundColor property of this button"
onpropertychange='alert(event.propertyName+" property has changed value")'>
</BODY>

 

12.returnValue
描述:
设置或检查从事件中返回的值

语法:
event.returnValue[ = Boolean]

可能的值:
true 事件中的值被返回
false 源对象上事件的默认操作被取消

例子见本文的开头。


13.screenX
描述:
检测鼠标相对于用户屏幕的水平位置

语法:
event.screenX


注释:
这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。


14.screenY
描述:
检测鼠标相对于用户屏幕的垂直位置

语法:
event.screenY

注释:
这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。


15.shiftKey
描述:
检查shift键的状态。

语法:
event.shiftKey

可能的值:
当shift键按下时,值为 TRUE ,否则为 FALSE 。只读。


16.srcElement
描述:
返回触发事件的元素。只读。例子见本文开头。

语法:
event.srcElement


17.srcFilter
描述:
返回触发 onfilterchange 事件的滤镜。只读。

语法:
event.srcFilter


18.toElement
描述:
检测 onmouseover 和 onmouseout 事件发生时,鼠标所进入的元素。 参考:7.fromElement

语法:
event.toElement

注释:
这是个只读属性。

例子:下面的代码演示了当鼠标移到按钮上时,弹出一个对话框,显示“mouse arrived”

code<SCRIPT>
function testMouse(oObject) {
    if(oObject.contains(event.toElement)) {
        alert("mouse arrived");
    }
}
</SCRIPT>
:
<BUTTON ID=oButton onmouseover="testMouse(this)">Mouse Over This.</BUTTON>

 

19.type
描述:
返回事件名。

语法:
event.type

注释:
返回没有“on”作为前缀的事件名,比如,onclick事件返回的type是click
只读。


20. x
描述:
返回鼠标相对于css属性中有position属性的上级元素的x轴坐标。如果没有css属性中有position属性的上级元素,默认以BODY元素作为参考对象。

语法:
event.x

注释:
如果事件触发后,鼠标移出窗口外,则返回的值为 -1
这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。


21. y
描述:
返回鼠标相对于css属性中有position属性的上级元素的y轴坐标。如果没有css属性中有position属性的上级元素,默认以BODY元素作为参考对象。

语法:
event.y

注释:
如果事件触发后,鼠标移出窗口外,则返回的值为 -1
这是个只读属性。这意味着,你只能通过它来得到鼠标的当前位置,却不能用它来更改鼠标的位置。

posted @ 2006-02-23 09:54 swingboat 阅读(2096) | 评论 (0) | 编辑 收藏
 
javascript对XML的解析

1.对XMLHttpRequest请求返回的responseXML进行解析,responseXML是个XMLDOcument对象
假设返回的responseXML为:
<?xml version="1.0" encoding="UTF-8"
  standalone="yes"?>
<response>
  <method>checkName</method>
  <result>1</result>
</response>
则获取method和result值方法为:
var response=req.responseXML.documentElement;
method    =response.getElementsByTagName('method')[0].firstChild.data;
result    = response.getElementsByTagName('result')[0].firstChild.data;

2.创建一个XMLDocument对象
function getXMLDocument() {
    var xDoc = null;
    if (document.implementation && document.implementation.createDocument) {
        xDoc = document.implementation.createDocument("", "", null);
    } else {
        if ((typeof ActiveXObject) != "undefined") {
            var msXmlAx = null;
            try {
                msXmlAx = new ActiveXObject("Msxml2.DOMDocument");
            }
            catch (e) {
                msXmlAx = new ActiveXObject("Msxml.DOMDocument");
            }
            xDoc = msXmlAx;
        }
    }
    if (xDoc == null || typeof xDoc.load == "undefined") {
        xDoc = null;
    }
    return xDoc;
}

3.创建一个DOM树
<people>
 <person first-name="eric" middle-initial="h" last-name="jung">
  <address street="321 south st" city="denver" state="co" country="usa" />
 </person>
 <person first-name="jed" last-name="brown">
  <address street="321 north st" city="atlanta" state="ga" country="usa" />
  <address street="321 south avenue" city="denver" state="co" country="usa" />
 </person>
</people>
程序如下:
  var doc=getXMLDocument();
  var peopleElem = doc.createElement("people");
  var personElem1 = doc.createElement("person");
  personElem1.setAttribute("first-name", "eric");
  personElem1.setAttribute("middle-initial", "h");
  personElem1.setAttribute("last-name", "jung");
  
  var addressElem1 = doc.createElement("address");
  addressElem1.setAttribute("street", "321 south st");
  addressElem1.setAttribute("city", "denver");
  addressElem1.setAttribute("state", "co");
  addressElem1.setAttribute("country", "usa");
  personElem1.appendChild(addressElem1);
  
  var personElem2 = doc.createElement("person");
  personElem2.setAttribute("first-name", "jed");
  personElem2.setAttribute("last-name", "brown");
  
  var addressElem3 = doc.createElement("address");
  addressElem3.setAttribute("street", "321 north st");
  addressElem3.setAttribute("city", "atlanta");
  addressElem3.setAttribute("state", "ga");
  addressElem3.setAttribute("country", "usa");
  personElem2.appendChild(addressElem3);  
  
  var addressElem5 = doc.createElement("address");
  addressElem5.setAttribute("street", "321 south avenue");
  addressElem5.setAttribute("city", "denver");
  addressElem5.setAttribute("state", "co");
  addressElem5.setAttribute("country", "usa");
  personElem2.appendChild(addressElem5);
  
  peopleElem.appendChild(personElem1);
  peopleElem.appendChild(personElem2);
  doc.appendChild(peopleElem);
  alert(doc.xml);//xml属性只对IE管用

posted @ 2006-02-21 17:13 swingboat 阅读(1117) | 评论 (0) | 编辑 收藏
 
AXIS学习(1)

1.axis服务器包的校验。
  到http://ws.apache.org/下载axis后,解压,拷贝axis到tomcat的webapps目录下。启动tomcat,运行http://localhost:8080/axis
  点击“validation”,程序会检测少的包,并提示下载路径。我目前包含的包如下:
    axis.jar;                              
 axis-ant.jar;                          
 axis-schema.jar;                       
 commons-discovery-0.2.jar;             
 commons-httpclient-3.0-rc2.jar;        
 commons-logging-1.0.4.jar;             
 jaxrpc.jar;                            
 log4j-1.2.8.jar;                       
 saaj.jar;                              
 wsdl4j-1.5.1.jar;                      
 activation.jar;                        
 mail.jar    

2.环境变量的配置
  其实运行axis是不用配置环境变量的。但有的时候需要利用axis提供的一些工具,产生一些文件,需要应用很多包,利用ClassPath就比较方便了。
  AXIS_HOME:
  AXIS_LIB:
  AXISCLASSPATH:
 
3.把axis集成 到项目中
  a、把上面所提到的包拷贝到项目相应的lib目录中
  b、修改web.xml文件,增加所需的servlet配置
  <servlet>
  <servlet-name>AxisServlet</servlet-name>
  <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
 </servlet>

 <servlet>
  <servlet-name>AdminServlet</servlet-name>
  <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
  <load-on-startup>100</load-on-startup>
 </servlet>

 <servlet>
  <servlet-name>SOAPMonitorService</servlet-name>
  <servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
  <init-param>
   <param-name>SOAPMonitorPort</param-name>
   <param-value>5001</param-value>
  </init-param>
  <load-on-startup>100</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>/servlet/AxisServlet</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>*.jws</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>/services/*</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>SOAPMonitorService</servlet-name>
  <url-pattern>/SOAPMonitor</url-pattern>
 </servlet-mapping>

 <session-config>
  <session-timeout>5</session-timeout>
 </session-config>

 <mime-mapping>
  <extension>wsdl</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>

 <mime-mapping>
  <extension>xsd</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>
  
4.服务发布(jws文件发布和定制发布)
  a、jws文件发布
  在web应用程序目录下,新建一个jws文件,例如:Hello.jws文件(其实就是个java文件,不包含包名)。 
  public class Hello {
 public String hello(String name){
  if(name==null){
   name="";
  }
  return "Hi,你好 "+name+",欢迎来到Web服务世界!";
 }
  }
  这样就可以直接查看hello服务相应的wsdl了:http://localhost:8080/testaxis/hello.jws?wsdl
 
  b.定制发布。
  定制发布,依赖一个server-confif.wsdd文件。
  在web-inf目录下新建一个deploy.wsdd文件,设置发布的服务,例如:
  <deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="city" provider="java:RPC">
      <parameter name="className" value="yhp.test.axis.service.CityService"/>
      <parameter name="allowedMethods" value="*"/>
    </service>
  </deployment>
 
  利用axis提供的工具,就可以生成server-confif.wsdd文件了:
  java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
  在运行过程中发现:如果没有把axis自带的应用发布到服务器上,运行时会提示404的错误,未发现axis/servlet/AxisServlet。

5.客户端调用
        String endpoint = "http://localhost:" + "8080"
    + "/testaxis/services/city";  //以定制发布方式,如果是jws文件,则endpoint为相应的jws文件

  Service service = new Service();
  Call call = (Call) service.createCall();
  call.setTargetEndpointAddress(new java.net.URL(endpoint));
  call.setOperationName("getZip");

  String res = (String) call.invoke(new Object[] {""});//object数组为远程方法的参数 

  System.out.println(res);
  
6.生成客户端stub相关类
   Axis提供了工具生成客户端stub相关的类,即通过wsdl产生stub。
   java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java http://localhost:8080/testaxis/services/city?wsdl
 
    

posted @ 2006-02-13 17:11 swingboat 阅读(976) | 评论 (0) | 编辑 收藏
 
获取classes目录下的资源文件和类所在目录下的资源文件?
classes目录:DBUtil.class.getClassLoader().getResourceAsStream("testing.properties");
DBUtil.class所在目录:DBUtil.class.getResourceAsStream("testing.properties");

  Properties props = new Properties();
  props.load(DBUtil.class.getClassLoader().getResourceAsStream("testing.properties"));
  strDriver = props.getProperty("Driver"); 
  strURL = props.getProperty("URL");
  strUser = props.getProperty("User");
  strPassword = props.getProperty("Password");
  System.out.println("strDriver="+strDriver);
  System.out.println("strURL="+strURL);
  System.out.println("strUser="+strUser);
  System.out.println("strPassword="+strPassword); 
posted @ 2006-02-07 11:54 swingboat 阅读(989) | 评论 (0) | 编辑 收藏
 
Web2.0:AJAX的使用(XMLHttpRequest简介)
一、XMLHttpRequest对象的历史
XMLHttpRequest类首先由Internet Explorer以ActiveX对象引入,被称为XMLHTTP。 后来Mozilla、Netscape、Safari和其他浏览器也提供了
XMLHttpRequest类,不过它们创建XMLHttpRequest类的方法不同。IE的版本不同,创建XMLHttpRequest也不同。


二、XMLHttpRequest对象创建方法
IE:
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP.3.0"); //3.0或4.0, 5.0
xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
Other:
xmlhttp_request = new XMLHttpRequest();

如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作。 为了解决这个问题,如果服务器响应的header不是
text/xml,可以调用其它方法修改该header。

xmlhttp_request = new XMLHttpRequest();
xmlhttp_request.overrideMimeType('text/xml');

三、XMLHttpRequest对象的处理过程。
1.发送远程请求
   
xmlhttp_request.open('GET', URL, true);
xmlhttp_request.send(null);

open():
第一个参数是HTTP请求方式—GET,POST或任何服务器所支持的您想调用的方式。 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求。
第二个参数是请求页面的URL。
第三个参数设置请求是否为异步模式。如果是TRUE,JavaScript函数将继续执行,而不等待服务器响应。这就是"AJAX"中的"A"(异步)。

2.响应结束后,处理函数设置

xmlhttp_request.onreadystatechange =FunctionName;
FunctionName是用JavaScript创建的函数名,注意不要写成FunctionName(),当然我们也可以直接将JavaScript代码创建在onreadystatechange之后,例如:
xmlhttp_request.onreadystatechange = function(){
// JavaScript代码段
};

3.响应后状态
只有当一个完整的服务器响应已经收到了,函数才可以处理该响应。XMLHttpRequest 提供了readyState属性来对服务器响应进行判断。
readyState的取值如下:
  0 (未初始化)
  1 (正在装载)
  2 (装载完毕)
  3 (交互中)
  4 (完成)
所以只有当readyState=4时,一个完整的服务器响应已经收到了,函数才可以处理该响应。

if (http_request.readyState == 4) {
// 收到完整的服务器响应
} else {
// 没有收到完整的服务器响应
}

4.响应后返回值
有两种方式可以得到这些数据:
(1) 以文本字符串的方式返回服务器的响应
(2) 以XMLDocument对象方式返回响应
eg:
var response = xmlhttp_request.responseXML.documentElement;
var result = response.getElementsByTagName('result')[0].firstChild.data;//返回result节点数据
if(result ==-2){
document.getElementById('message').innerHTML = "用户名"+document.getElementById('163id').value+"尚未注册";
}
else if(result ==-1){
document.getElementById('message').innerHTML = "对不起,用户名"+document.getElementById('163id').value+"已经注册";
}

四、XMLHttpRequest对象属性
onreadystatechange 状态改变的事件触发器
readyState 对象状态(integer):
0 = 未初始化
1 = 读取中
2 = 已读取
3 = 交互中
4 = 完成
responseText 服务器进程返回数据的文本版本
responseXML 服务器进程返回数据的兼容DOM的XML文档对象
status 服务器返回的状态码, 如:404 = "文件末找到" 、200 ="成功"
statusText 服务器返回的状态文本信息

五、XMLHttpRequest对象方法
abort() 停止当前请求
getAllResponseHeaders() 作为字符串返问完整的headers
getResponseHeader("headerLabel") 作为字符串返问单个的header标签
open("method","URL"[,asyncFlag[,"userName"[, "password"]]]) 设置未决的请求的目标 URL, 方法, 和其他参数
send(content) 发送请求
setRequestHeader("label", "value") 设置header并和请求一起发送

六、附录
HTTP 1.1支持的状态代码
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分
101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议
200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
201 Created 服务器已经创建了文档,Location头给出了它的URL。
202 Accepted 已经接受请求,但处理尚未完成。
203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝
204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的
205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容
206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它
300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取
304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取
307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。
400 Bad Request 请求出现语法错误。
401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
403 Forbidden 资源不可用。
404 Not Found 无法找到指定位置的资源
405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。
406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容
407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。
408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。
409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。
410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。
411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。
412 Precondition Failed 请求头中指定的一些前提条件失败
413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头
414 Request URI Too Long URI太长
416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头
500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求
501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求
502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答
503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头
504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答
505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本
posted @ 2005-12-30 11:43 swingboat 阅读(1870) | 评论 (1) | 编辑 收藏
 
Web2.0:AJAX的使用(DWR Framework 二):制作简单的Apartment管理
一、DWR环境配置以及数据库设置
二、Apartment的VO设置
三、DAO层对数据的操作
四、dwr.xml配置
五、javascript函数编写
六、总结
posted @ 2005-12-28 17:08 swingboat 阅读(471) | 评论 (0) | 编辑 收藏
 
Web2.0:AJAX的使用(DWR Framework 一):制作Web进度条
一、Ajax简介
Adaptive Path公司的Jesse James Garrett这样定义Ajax:
Ajax不是一种技术。实际上,它由几种蓬勃发展的技术以新的强大方式组合而成。Ajax包含:
      1.基于CSS标准的表示;
      2.使用Document Object Model进行动态显示和交互;
      3.使用XMLHttpRequest与服务器进行异步通信;
      4.使用JavaScript绑定一切。
Ajax= Asynchronous JavaScript + XML 

二、常用的几种Ajax框架
   1.DWR         ---- http://getahead.ltd.uk/dwr/
   2.JSon-Rpc      ---- http://oss.metaparadigm.com/jsonrpc/
   3.echo2            ---- http://www.nextapp.com/platform/echo2/echo/
   4.backbase       ---- http://www.backbase.com
   右边网址有具体的说明:http://www.51cto.com/html/2005/1222/15373.htm

三、DWR使用说明。
示例:在页面中做个进度条,点击“install”按钮,进度条开始递增。进度数据是从后台获取。 

1.配置DWR环境。
在Eclipse中新建一个Web Project(MyEclipse\J2ee Projects\Web Project),引入dwr-0.9.2b.jar包,修改WEB-INF\web.xml文件,
配置dwr-invoker servlet。如下:
      <servlet>
        <servlet-name>dwr-invoker</servlet-name>
        <display-name>DWR Servlet</display-name>
        <description>Direct Web Remoter Servlet</description>
        <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>true</param-value>
        </init-param>
     </servlet>
     <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
     </servlet-mapping>

2.编写递增类Progress。此类只有一个方法getProgress,获取递增的数据。如下:
   package dwr.sample;
  
   import java.io.BufferedReader;
   import java.io.FileReader;
   public class Progress {
     public int getProgress(int nowProgress){   
        int nowValue=nowProgress+1;
        return nowValue;
     }
   }

3.配置dwr.xml文件。此文件和web.xml位于同一目录下。
   <!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
   <dwr> 
     <allow>
        <create creator="new" javascript="ProgressBar" >
            <param name="class" value="dwr.sample.Progress"/> 
            <include method="getProgress"/>
        </create>
     </allow>
   </dwr>

4.编写index.htm文件。
a、引入js文件。首先引入dwr自己的两个js文件:
           <script src='dwr/engine.js'></script>
           <script src='dwr/util.js'></script>
在dwr.xml中我们配置了一个名为"ProgressBar"的create 。dwr会在dwr/interface下产生一个ProgressBar.js文件。
在ProgressBar.js文件中,有一个javascript对象:ProgressBar,ProgressBar对象完成了和后台javabean:dwr
.sample.Progress的匹配。引入ProgressBar.js文件:
   <script src='dwr/interface/ProgressBar.js'></script>

b. 编写显示进度的HTML文本:
    <TABLE style="width:700;height="50" border="1" >
      <TR>
        <td>
          <TABLE  border="0" style="width:0%;height:100%" id="ProgressBar">
            <TR>
              <td bgcolor="#000099">&nbsp;</td>
            </TR>
          </TABLE>
        </td>
      </tr>
    </TABLE>
    <br>
    <!--点击Install,进度条开始跑动  -->
    <input type="button" value="Install" onclick="doProgress()"> 

c. 编写doProgress函数
 function doProgress(){
    //获取当前进度条的值,按百分比计算   
    var width=$("ProgressBar").style.width;
  //去掉进度条值后面的"%"
    var scaleWidth=width.substring(0,width.length-1);
       //当进度条值为100的时候,停止跑动
     if(scaleWidth!=100){
      //调用ProgressBar.js中的ProgressBar.getProgress函数
       ProgressBar.getProgress(scaleWidth,updateProgress);
//说明:javabean:Progress方法getProgress,其实它只有一个输入参数,一个返回参数。而javascript的ProgressBar.getProgress方法有两个参数。dwr在mapping方法的时候,对于返回值,它采用的是回调函数的方式。所以对于ProgressBar.getProgress方法的第二个参数是一个函数指针。这里是updateProgress函数。 
     }
   }
   function updateProgress(progress){
      //设置进度条的值
      $("ProgressBar").style.width=progress+"%";
   //进度条继续跑动
     doProgress();
     }

 

posted @ 2005-12-28 16:35 swingboat 阅读(1641) | 评论 (1) | 编辑 收藏
 
Mysql 的中乱码问题
环境:winxp sp2,jboss-3.2.3,mysql 4.1
现象:启动jboss,浏览网页,能够从数据库中读出数据,但是所有中文数据都是“?”
原因:可能有两种
          1、mysql的确省字符集设置的不是gb
          2、mysql-connector(mysql官方提供的jdbc驱动程序)有问题

解决:
      第一种情况:修改my.ini文件。my.ini可能存在系统目录下(c:\windows)和mysql所安装的目录下(C:\Program Files\mysql\MySQL Server 4.1)。打开my.ini文件,找到[mysqld]块。把default-character设置为gbk,如果没有找到则添加即default-character-set=gbk。 重启mysql,问题解决。
       第二种情况:到mysql的官方网站下载最新的jdbc驱动程序。www.mysql.org
posted @ 2005-12-28 09:23 swingboat 阅读(279) | 评论 (0) | 编辑 收藏
 
利用sql语句实现的几个功能

1、SQL 语句中,union的使用:
   Table a:    field1,field2             Table b:   field1,field2
   data:       1       2                 data:      2,     2  
               1       4                            2,     3
   sql:  select filed1 from a union select field1 from b
   data: field1
         1
         2
   sql:  select filed1,field2 from a union select field1,field2 from b
   data: field1,field2
         1      2
         1      4
         2      2
         2      3 
2、table1{id:int,charge:int,fk:int}
   table2{id:int,charge:int}
   修改table2,使charge等于table1中相应值的和
   sql:update a set a.charge=b.totalcharge
        from (select id,sum(charge) totalcharge from table1 group by id)  b,table2 a
        where a.id=b.id
3、出发点   目的地     路程
      A         B
      A         C
      A         D
      A         E
      B         F
      C         G
      C         A
      用sql语句计算出所有从A出发所能到达的目的地,包括间接的。
   sql:select distinic 目的地 from 表
        where 出发点 in (
                        select distinic 目的地 from  表
                        where 出发点='A' union select 'A')
   说明:上面的方法只使用一级嵌套。可以满足此题的需求。
4、表t1
     year   quarter   num
     2001     1        3.4
     2001     2        5.12
     2001     3        6.13
     2001     4        8.14
     2002     1        5.21
     2002     2        4.22
     2002     3        6.23
     2002     4        4.24
     用sql语句获取下面的数据
     2001  3.4  5.12  6.13  8.14
     2002  5.21  4.22  6.23  4.24

   sql:select [year],avg(case[quarter] when '1' then num) as 'quarter1',
               avg(case[quarter] when '2' then num) as 'quarter2',
               avg(case[quarter] when '3' then num) as 'quarter3',
               avg(case[quarter] when '4' then num) as 'quarter4'
        from t1 group by year

posted @ 2005-12-28 09:23 swingboat 阅读(417) | 评论 (0) | 编辑 收藏
 
Oracle的几个使用问题
1、在Windows的服务中“OracleServiceWINSOM”服务的状态为“启动”,所能执行的任务也都是灰色的。Oracle没有正常的启动。
   解决:run:cmd
         svrmgrl
         connect internal/oracle
         shutdown immediate
         startup
2、导入,导出数据
   a、删除一个用户:
      drop user smartweb CASCADE
   b、创建一个用户:
      create user smartweb identified by smartweb
   c、给用户赋予权限:
      grant connect to smartweb
      grant resource to smartweb
      grant create session to smartweb
   d、连接:
      conn smartweb/smartweb
   e、导入:
      imp
3、查看oracle的版本
   select * from v$version
4、修改oracle中的Oracle Servlet Engine(OSE)所占的8080端口(TNSLSNR.exe)。
   安装Oracle 9i后8080端口被OSE占用,即tnslsnr.exe进程所占用。清除此端口方法:
   cd $ORACLE_HOME/jis/install
   sess_sh -u sys/change_on_install -role SYSDBA -s jdbc:oracle:oci8:@yhp
   $@serverendp.ssh
   $exit
5、imp时,出现的错误:不支持要求的字符集转换(从类型850到852)
   使用函数NLS_CHARSET_NAME即可获得该字符集:
   SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
把852换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制数与十六进制之间的转换,想明白其中的道理)
posted @ 2005-12-28 09:22 swingboat 阅读(303) | 评论 (0) | 编辑 收藏
 
实现类clone方法

例子:
public class Outbound2splitVO implements Serializable ,Cloneable {
    private long id;
    private String brand;
    public long getId() {
        return id;
    }
    public void setId(long id){
        this.id=id;
    }
    public void setBrand(String brand) {
        this.brand=brand;
    }
    public String getBrand(){
        return brand;
    }

    public Object clone(){
          Outbound2splitVO o = null;
          try{
              o = (Outbound2splitVO)super.clone();
          }catch(CloneNotSupportedException e){
              e.printStackTrace();
          }
          return o;
      }
}

类必须实现Cloneable接口,clone方法。

posted @ 2005-12-28 09:22 swingboat 阅读(365) | 评论 (0) | 编辑 收藏
 
设计模式-->Singleton(单例模式)

单例模式,也就是在系统中只存在一个事例。它的应用还是比较广泛的,例如产品的功能菜单(功能树),系统上线以后,它就很少进行修改了,为了提供系统的性能,可以在系统中只存在这样一个功能菜单事例。这样单例模式也往往和Caching(缓存)模式同时使用。
package yhp.test.pattern.singleton;

public class TestSingleton {
   
    private static TestSingleton _instance;
    public static TestSingleton getInstance(){
        if(_instance==null)
            _instance=new TestSingleton();
        return _instance;
    }
    private TestSingleton(){}  //保证了不能直接new
    
    private int _x=0;

    public int get_x() {
        return _x;
    }
    public void set_x(int _x) {
        this._x = _x;
    }
   
    public static void main(String[] args) {
        TestSingleton first=TestSingleton.getInstance();
        TestSingleton second=TestSingleton.getInstance();
        first.set_x(4);
        System.out.println("First instance X's Value is:"+first.get_x());                   //输入:4
        System.out.println("Sesond instance X's Value is:"+second.get_x());         //输入:4    
    }
}

有点奇怪的是:我在main函数中增加以下代码:
try{
        TestSingleton test= new TestSingleton(); 
        test.set_x(6);
        System.out.println("new instance X's Value is:"+test.get_x());
}catch(Exception e){
        System.out.println("单例模式对象是不允许被new的!");
}
在eclipse中运行,竟然能够编译通过,而且输出了6,但新建一个类,在main函数中增加相同的代码,编译就不能通过了。

posted @ 2005-12-28 09:21 swingboat 阅读(374) | 评论 (0) | 编辑 收藏
 
Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

Collection接口,包含list和set子接口
Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。
在Map对象中,每一个关键字最多有一个关联的值。
Map:不能包括两个相同的键,一个键最多能绑定一个值。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的
值为null。当get()方法返回null值时,即可以表示Map中没有该键,也可以表示该键所对应的值为null。因此,在Map中不能由get()方法来判断Map中是否存在某个键,而应该用containsKey()方法来判断。
继承Map的类有:HashMap,HashTable
HashMap:Map的实现类,缺省情况下是非同步的,可以通过Map Collections.synchronizedMap(Map m)来达到线程同步
HashTable:Dictionary的子类,确省是线程同步的。不允许关键字或值为null

当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。


以下引用:
  • 为什么要使用集合类

当你事先不知道要存放数据的个数,或者你需要一种比数组下标存取机制更灵活的方法时,你就需要用到集合类。

  • 理解集合类

集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。

(1)集
集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。
集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。

(2)列表
列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
关于实现列表的集合类,是我们日常工作中经常用到的,将在后边的笔记详细介绍。

(3)映射
映射与集或列表有明显区别,映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。
关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。

  • 集合类简介

java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合,以下是这些类的简单介绍

集:
HashSet:
使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的.
TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap.
列表:
Vector: 实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类??当两个或多个线程同时访问时也是性能良好的。
Stsck: 这个类从Vector派生而来,并且增加了方法实现栈??一种后进先出的存储结构。
LinkedList: 实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。
ArrayList: 实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。
映射:
HashTable:
实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。
HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。
WeakHashMap: 实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。
TreeMap: 实现这样一个映象,对象是按键升序排列的。

下图是集合类所实现的接口之间的关系:

Set和List都是由公共接口Collection扩展而来,所以它们都可以使用一个类型为Collection的变量来引用。这就意味着任何列表或集构成的集合都可以用这种方式引用,只有映射类除外(但也不是完全排除在外,因为可以从映射获得一个列表。)所以说,把一个列表或集传递给方法的标准途径是使用Collection类型的参数。

posted @ 2005-12-28 09:21 swingboat 阅读(825) | 评论 (0) | 编辑 收藏
 
forward,include,redirect区别。
forward,include,redirect是jsp中web页面(jsp或servelt)的三种不同的路由关系,三个貌似相同,其实还是有许多差别的,而了解这些细微的差别,在web开发中是很重要的。
说明:
一、forward、include由javax.servlet.RequestDispatcher来封装,由包容器container提供RequestDispatcher接口的实现,其中声明如下:
void forward(ServletRequest req,ServletResponse res)
void include(ServeltRequest req,ServletResponse res)
可以通过两种方式得到RequestDispatcher:
1、ServletContext.getRequestDispatcher(String path);
其中这里的path必须开始为"/",即这里的path必须相对于context的root.
2、ServeltRequest.getRequestDispatcher(String path)
这里的path可以为相对路径,如果path开始为"/",则也认为是从context的root开始的。
二、Redirect由HttpServletResponse.sendRedirect(String location)来支持
差别:
三个都可以对用户的request进行转发,但是还是有许多的不同,差别最主要集中在如下几个方面:
1、forward与include共亨Request范围内的对象,而redirect则不行,即:如果一个javabean被声明为request范围的话,则被forward到的资源也可以访问这个javabean,而redriect则不行。
2、forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect("http://www.mocuai.com");

Forward功能的实现,这样
private void setForward(String url,ServletRequest request, ServletResponse response)throws Exception {  
        HttpServletRequest hreq = (HttpServletRequest) request;
        RequestDispatcher dispatcher =  hreq.getSession().getServletContext().getRequestDispatcher(url);
        dispatcher.forward(request,response);
}
posted @ 2005-12-28 09:21 swingboat 阅读(629) | 评论 (0) | 编辑 收藏
 
利用hosts文件,完成同一个ip,不同的主机名解析。

在win xp中,hosts文件在目录windows\system32\drivers\etc下。

127.0.0.1       localhost
127.0.0.1       test1
127.0.0.1       test2
127.0.0.1       test3


这样设置后,测试机器就可以解析test1,test2,test3解析到127.0.0.1

posted @ 2005-12-28 09:20 swingboat 阅读(521) | 评论 (0) | 编辑 收藏
 
页面过虑器制作
需求描述:
        在网站中有一些网页是受保护的,即只有规定的用户才能访问,而有一些网页任何人都可以访问。所以用户在IE中输入URL提交后,服务器必须对用户输入的URL进行分析过虑。
分析:
       需要考虑的问题:
1、 怎么拦截用户输入的URL?
2、 怎么判断输入的URL是否是受保护的?
3、 在用户量很大的情况下,每一个URL都要进行判断,怎样提高判断的性能?
方法:
1、 在web.xml中可以定义filter,服务器会更据filter的定义进行拦截,以及相应的处理。例如下面的配置:
<filter>  
           <filter-name>webfilter</filter-name>
           <filter-class>com.cyberway.web.filter.WebFilter</filter-class>
       </filter>
       <filter-mapping>
           <filter-name>webfilter</filter-name>
           <url-pattern>/*</url-pattern>
   </filter-mapping>
 
filter-name:定义过滤器的名称
filter-class:定义过滤器处理的类
url-pattern:定义拦截url
/*:表示所有的都拦截
*.jsp:只拦截jsp文件
2、利用数据库把需要保护的URL保存起来,每请求一次,检测一次。
3、如果每请求一次,都去数据库访问检测一次,这样性能一定会非常差的。网站稳定以后受保护的页面一般更新较少,我们可以第一次请求时,从数据库中获取所有的受保护页面,保存在hashtble中,然后每次从hashtable中进行检测。如果更新了受保护页面,则需更新hashtable。其实就是一种catch模式。事例代码如下:
public class URLHelper{
private static URLHelper me;
private HashTable  urlTable;
private Boolean hasInit=false;
 
static{
      me=new URLHelper();
}
private URLHelper(){
}
public URLHelper getInstance(){
      return me;
}
public Boolean isHasInit{
      return hasInit;
}
public void init(){
      urlTable=new HashTable();
      Collection datas=getAllURLs();
      Iterator it=datas.iterator();
      while(it.hasNext()){
             URLVO vo=(URLVO)it.next();  //URLVO:一个记录URL信息的实体类
             urlTable.put(vo.URL,vo);
}
}
//根据URL判断是否上受保护的
public boolean isProtected(String url) {
    return urlTable.containsKey(url);
}
private Collection getAllURLs(){
      //从数据库中获取所受保护网页
}
}
WebFilter类如下:
public class WebFilter extends HttpServlet implements Filter {
 
    public void doFilter(ServletRequest request, ServletResponse response,
                 FilterChain filterChain) throws ServletException {
        try {
            request.setCharacterEncoding("GBK");
           HttpServletRequest hreq = (HttpServletRequest) request;
            HttpServletResponse hres = (HttpServletResponse) response;
            HttpSession session = hreq.getSession();
            ServletContext context = session.getServletContext();
            String currentURL = hreq.getRequestURI();//返回不带参数URL
            /String preURL = hreq.getHeader("referer");//返回上一页URL
            String urlParam = hreq.getQueryString();//返回当前URL的参数
            String currentURLpara = null;
            // check if is requesting a protect resource
            if (currentURL != null) {
                 //String contextPath = hreq.getContextPath();//返回 "/webroot"
URLHelper helper=URLHelper.getInstance();
if(helper. isProtected(currentURL)){
    setForward(currentURL)
}else{
    setForward(”error.jsp”);    
}                  
                }
                filterChain.doFilter(request, response);
        }catch (ServletException sx) {
            filterConfig.getServletContext().log(sx.getMessage());
        }catch (IOException iox) {
            filterConfig.getServletContext().log(iox.getMessage());
        }catch (Exception ex) {
            filterConfig.getServletContext().log(ex.getMessage());
        }
}
//forward一个页面
private void setForward(String url, ServletRequest request,
                    ServletResponse response) throws Exception {
             HttpServletRequest hreq = (HttpServletRequest) request;
             RequestDispatcher dispatcher =            hreq.getSession().getServletContext()
                          .getRequestDispatcher(url);
             dispatcher.forward(request, response);
      }
}
 
 
  
 
        
 
 
posted @ 2005-12-28 09:20 swingboat 阅读(304) | 评论 (0) | 编辑 收藏
 
ORACLE SQL语句优化技术分析
IN 操作符

    用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

    但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:

    ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

    推荐方案:在业务密集的SQL当中尽量不采用IN操作符。

    NOT IN操作符

    此操作是强列推荐不使用的,因为它不能应用表的索引。

    推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替

    <> 操作符(不等于)

    不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

    推荐方案:用其它相同功能的操作运算代替,如

    a<>0 改为 a>0 or a<0

    a<>’’ 改为 a>’’

    IS NULL 或IS NOT NULL操作(判断字段是否为空)

    判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

    推荐方案:

    用其它相同功能的操作运算代替,如

    a is not null 改为 a>0 或a>’’等。

    不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。

    建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象)

    > 及 < 操作符(大于或小于操作符)

    大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。

    LIKE操作符

    LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

posted @ 2005-12-28 09:19 swingboat 阅读(256) | 评论 (0) | 编辑 收藏
 
在java中一种中文问题的解决办法
如果我们想在网址的查询参数中利用中文,则在提交到的页面必须对中文参数进行处理
例如:
<script>
   location.href="goto.jsp?type=分类";
</script>
在goto.jsp页面要获取type参数,需要对此参数进行处理:
String type=(String)request.getParameter("type");
type=type==null?"":type.trim();
type=new String(type.getBytes("ISO-8859-1"),"GBK");

System.out.println("Type:"+type);//这样才能正确输出:Type:分类
posted @ 2005-12-28 09:18 swingboat 阅读(288) | 评论 (0) | 编辑 收藏
 
在struts1.1框架下,利用smartupload实现文件的上传(可以是多个文件)
1、前端页面upload.jsp,后台处理程序UplodAction.java
2、struts.config的配置参数如下(没有设置ActionForm):
<action input="/upload.jsp"  path="/save" scope="request" type="yhp.test.web.UploadAction" validate="false">
      <forward name="success" path="/list.do" />
    </action>
3、upload.jsp页面中主要部分代码
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<html:html>
<head>
<title> 测试Struts利用SmartUpload上传文件 </title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
</head>
<body>
<html:form action="/save.do" styleId="formItem" method="post"  enctype="multipart/form-data">
<html:hidden property="id"/>
<html:file property="serverpath" styleClass="input-text"></html:file>
</html:form>
</body>
</html:html>
4、UploadAction.java
import com.jspsmart.upload.File;
import com.jspsmart.upload.Files;
import com.jspsmart.upload.SmartUpload;

public ActionForward doBatchsave(ActionMapping actionMapping,
   ActionForm actionForm, HttpServletRequest httpServletRequest,
   HttpServletResponse httpServletResponse) throws Exception {
SmartUpload mySmartUpload = new SmartUpload();
  mySmartUpload.initialize(getServlet().getServletConfig(),httpServletRequest, httpServletResponse);  
  mySmartUpload.upload();
  //获取除文件以外的相关信息,例如upload.jsp中隐藏控件id的值
  String strId=(String)mySmartUpload.getRequest().getParameter("id");
  Files files=mySmartUpload.getFiles();
  Collection col=files.getCollection();
  Iterator it=col.iterator();
  while(it.hasNext()){
    File file=(File)it.next();    
    String oldFileName=file.getFileName();     
    String extname=file.getFileExt();
    String fileName=Sequence.getSequence()+"."+extname;//产生一个唯一的文件名
    file.saveAs("c:\\temp\"+fileName);    
  }
  return (actionMapping.findForward("success"));
}
posted @ 2005-12-28 09:18 swingboat 阅读(530) | 评论 (0) | 编辑 收藏
 
含有中文字符串的截取问题!
问题:
    字符串:music<<美丽的草原我的家>>。该字符串的长度即str.length()为:17,而目前需要存入数据库对应的字段长度为:16。所以必须对字符串进行截取。而前16个字节中,“原”字只有半个。这样存入数据库确对会出现“?”。所以必须判断是否是半个汉字,即只能存入“music<<美丽的草”。

分析:
    汉字是双字节编码,它为了能够与英文字符分开,每个字节的最高位一定为1。如果是汉字,那么这个字节就是小于0的。这个函数就是通过这一原理实现的。所以要通过getBytes()转化为byte型,再比较与零的大小。  
getBytes()是把一个字符串转成一个byte数组,因为计算机的数据都是基于字符的,也就是说一个字符串实际上就是一个字符流,因此可以转为字符数组。

程序:
    public  static  String  getStr(String  src,  int  len)  {  
       if  (src  ==  null)              return  null;  
       if  (src.getBytes().length  <=  len)    return  src;  
 
       byte[]  s  =  src.getBytes();  
       int  flag  =  0;  
       for(int  i=0;i<len;++i){  
         if(s[i]  <  0)  flag++;    
       }  
       if(flag%2!=0)  len--;          
 
       byte[]  d  =  new  byte[len];  
       System.arraycopy(s,  0,  d,  0,  len);  
       return  new  String(d);  
   }  
posted @ 2005-12-28 09:18 swingboat 阅读(396) | 评论 (0) | 编辑 收藏
 
软件工程中的经典案例!

案例背景:
1、A small business called the ABC Company.
 a、Three sectors: software sector (SS); commercial sector (CS); finance sector (FS).
2、The SS was a team with less than 15 people.
 a、Mission: to develop and supply high quality business software products and services.
3、The SS was chaotic
 a、Although significant experience had accumulated over the years, there was no internal or external co-ordination.
 b、No managerial or engineering procedures or policies had been reinforced, and no administrative support existed.
 c、Quality was low. No one knew exactly what the other people working on
4、The other sectors of the business also had their own problems.
 a、Negotiation and sale of software contracts by the CS were based on insufficient knowledge about the
    corresponding products. This often led to last minute changes and adaptations that had not been planned nor
    managed.
 b、The financial situation of the firm was very fragile.
 c、All those factors contributed to increase the instability and confusion within the SS.
5、The ABC Company has made a strategic decision that it wants to improve its competency in software development to meet its vision.


案例情况:
1、SS提出了一个称为销售奖励程序SBP(用来管理支付地区代理佣金的软件)的单机版软件产品建议书,预计开发周期为1年。
2、公司决策层审批通过,但要求实现网络通讯功能,将工期缩短为6个月,尽管SS认为没有多大可能在6个月内完成,但公司决策层主意已定,认为只要技术人员加倍努力应没问题,允许扩大项目组规模。
3、SS试图:
   (1)采用C++和面向对象的设计方法;
   (2)采用一种报表自动生成工具;
   (3)拥有更新、更快的硬件设备;
   (4)雇佣到顶尖的开发人员。
   公司进一步要求加班加点拼命工作,将项目计划压缩到6个月内。
4、SS组建了项目组,由于公司内部固定的开发成员无法完成一些特定任务,招聘了1个合同制开发成员,该合同开发者被面试人员建议不宜雇佣,但项目经理急于用人,而且觉得他具备了相应开发技能,还是雇佣了他。
5、在项目组的第一次会议上,公司高管向项目组阐明了ABC公司对于SBP项目的关注,如果项目取得成功,会获得丰厚的奖赏。接着,项目经理与成员粗略讨论了项目计划,并与测试经理约定5个月后交付功能完备并通过测试的版本。
6、项目组用不到1个月时间完成了需求分析报告和设计工作,似乎很好地发挥了C++的功能优势。然后开始了疯狂的编码,以满足在第4个月时发布第一个测试版本的要求。
7、项目进展并非一帆风顺,大家都不喜欢那个合同工,抱怨他不让任何人靠近他的代码,项目经理将这些归结于由于人们长时间工作所导致的个性冲突。
8、然而到了第4个月中旬,CS通知新的销售奖励制度已经发布,项目组发现他们必须改变输入对话框、数据库设计以及数据存取对象和通信对象,以适应新的结构。
   ※陷入修改的混乱当中
9、转眼间数周过去了,预计第5个月初交付测试通过的完全版的日期到来并过去了,项目组还是没能提交第1个测试版,存在许多遗留问题
   ※报表生成程序不如预想那样工作;人员互相埋怨和不协作;…
10、公司高管又召开了项目组会议,要求项目组努力工作以按时交付产品,每天工作10小时。每个人为了按期交付而加班加点,终于在在第7个月初提交第一个完整版本供测试。一个半月每周60小时的工作几乎压垮了他们,这期间个别开发人员被他以前的项目组经常叫去做一些技术支持工作(大约每天得为他们工作2小时)。
   ※2天后,测试经理发布了第1个问题报告,在程序中发现了200多个问题,包括必须处理的一类严重错误数十个。
   ※测试组每小时还在发现新的错误。
11、经过1天的讨论并估算修正每个错误所需要的时间,公司高管被迫同意项目计划延期4周,要求每个人被要求每天工作12小时,每周工作6天,高管则开始了自己为期1个月的年假去度假了。
12、接下的1个月时间里,项目组每天都要在办公室呆上12小时,但他们会花许多时间看杂志、电话聊天,他们每处理一个错误,测试人员就会发现2个新的错误,一些本来估计花几分钟就可以解决的问题由于牵扯到项目各方,变成需花数天时间才能解决。
13、这期间,那名合同工接受了另外一家公司的合约而离职,项目经理只好又紧急雇佣了一个程序员来帮助处理其所编代码,但经过1周的“鏖战”,发现程序中存在一些深层缺陷,被迫重新设计和编写程序。由于新人不了解团队的工作规则,经常覆盖其他成员的工作文件,导致工作的重复与时间的浪费。
14、半年后,项目终于正式发布,得到了市场及用户的认可。
   ※ABC公司向项目组每位成员颁发了250元的奖金,以感谢他们辛勤的工作。
   ※几周以后,部分人员跳槽到另外一家公司去了。

posted @ 2005-12-28 09:17 swingboat 阅读(541) | 评论 (0) | 编辑 收藏
 
在struts框架下实现文件的上传

由于jspsmartupload上传文件,当前端页面没有file控件时,后端用jspsmartupload控件upload时将会走入一个死循环。现在采用struts自己提供的功能实现文件的上传。
1、前端页面upload.jsp
<html:form action="/filesave.do" styleId="formItem" method="post"  enctype="multipart/form-data">
<INPUT  class='input-file' type="file" name="theFile">
</html:form>
2、struts-config.xml文件配置
<form-bean name="UploadForm" type="yhp.test.web.UploadForm" />
<action input="/upload.jsp" name="UploadForm"   path="/filesave" scope="request" type="yhp.test.web.UploadAction" validate="false">
      <forward name="success" path="/success.jsp" />
      <forward name="error" path="/error.jsp" />
    </action>
3、UploadForm.java文件
package yhp.test.web;

import org.apache.struts.upload.FormFile;
import org.apache.struts.action.ActionForm;

public class UploadForm extends ActionForm {
  protected String theText;   //使用protected ,其它需要上传的form可以继承此form
  protected boolean writeFile = true;
  protected FormFile theFile;
  protected String filePath;

  public String getTheText() {
    return theText;
  }
  public void setTheText(String theText) {
    this.theText = theText;
  }
  public FormFile getTheFile() {
    return theFile;
  }
  public void setTheFile(FormFile theFile) {
    this.theFile = theFile;
  }
  public void setWriteFile(boolean writeFile) {
    this.writeFile = writeFile;
  }
  public boolean getWriteFile() {
    return writeFile;
  }
  public void setFilePath(String filePath) {
    this.filePath = filePath;
  }
  public String getFilePath() {
    return filePath;
  }
  public void reset() {
    writeFile = false;
  }
}

4、UploadAction.java文件
package yhp.test.web;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;


public class UploadAction extends Action {
  public ActionForward execute(ActionMapping actionMapping,
                               ActionForm actionForm,
                               HttpServletRequest httpServletRequest,
                               HttpServletResponse httpServletResponse) throws
      Exception {
    if (actionForm instanceof UploadForm) {
      // 获取上传的目录
      String path = getServlet().getServletContext().getInitParameter("UPLOADPATH");
      File f = new File(path);
      if (!f.isDirectory()) {
        f.mkdir();
      }

      UploadForm theForm = (UploadForm) actionForm;
      String text = theForm.getTheText();
      FormFile file = theForm.getTheFile();
      String fileName = file.getFileName();
      String contentType = file.getContentType();
      boolean writeFile = theForm.getWriteFile();
      String desFileName=path fileName ;
      String size = (file.getFileSize() + " bytes");
      try {
          InputStream stream = file.getInputStream();
   OutputStream bos = new FileOutputStream(strFileName);         
          byte[] buffer = new byte[file.getFileSize()];
          stream.read(buffer);
          bos.write(buffer);
   stream.close(); 
          bos.close();
          return actionMapping.findForward("success");
      }
      catch (FileNotFoundException fnfe) {
          return actionMapping.findForward("success");
      }
      catch (IOException ioe) {
          return actionMapping.findForward("success");
      }
      catch(Exception eo){
          return actionMapping.findForward("error");
      } 
    }else{
      return actionMapping.findForward("error");
    }
  }
}

posted @ 2005-12-28 09:16 swingboat 阅读(316) | 评论 (0) | 编辑 收藏
 
struts及jstl使用问题集(一)

1、ActionForm中的属性必须在<html:form></html:form>块中输出
struts-config.xml文件配置:
  <form-beans>
    <form-bean name="TestForm" type="yhp.test.struts.TestForm" />
  </form-beans>
<action-mappings>
    <action input="/test/teststruts.jsp" name="TestForm" path="/test/teststruts" scope="request" type="yhp.test.struts.TestAction" validate="false">
      <forward name="success" path="/test/teststruts.jsp" />
    </action> 
</action-mappings>
TestForm.java文件(两个属性):
package yhp.test.struts;
import org.apache.struts.action.*;
public class TestForm extends ActionForm{
    private String message;
    private String data;
    public String getData() {
        return data;
    }
    public void setData(String data) {
        this.data = data;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}
TestAction.java文件:
public ActionForward execute(ActionMapping actionMapping,
            ActionForm actionForm, HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) throws Exception {
        if(actionForm instanceof TestForm){
         TestForm form=(TestForm)actionForm;
         form.setMessage("Test Struts!");
         form.setData("Return data is YHP");
        }
        return actionMapping.findForward("success");       
    }
teststruts.jsp文件:
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%
String contextPath = request.getContextPath();
response.setLocale(java.util.Locale.CHINA);
%>
<html>
 <head>
 </head> 
<body>
<html:form action="/test/teststruts.do" styleId="formItem" method="post">
   <html:text  property="message"/><br>
   <html:text  property="data"/><br>
</html:form>
</body>
</html>
说明:没有红色部分代码,后台会报出Cannot find bean org.apache.struts.taglib.html.BEAN in any scope的错误信息。这样说明struts中ActionForm的数据是基于html中对应form的数据。
2、不利用struts标签输出ActionForm的属性值
<%@ page import="yhp.test.struts.TestForm"%>
<%
TestForm form=(TestForm)request.getAttribute("TestForm");//ActionForm类名
%>
<html>
 <head>
 </head> 
<body>
<html:form action="/test/teststruts.do" styleId="formItem" method="post">
   <html:text  property="message"/><br>
   <html:text  property="data"/><br>
 <%=form.getMessage()%><br>
</html:form>
</body>
</html>
3、通过JSTL输出ActionForm中的属性值
利用JSTL输出AcitonForm中的属性值:<c:out value="${TestForm.data}" /><br>
利用JSTL输出AcitonForm中的属性值:<c:out value="${requestScope.TestForm.data}" /><br> 
红色的字是ActionForm类名,两句的结果是一样的
说明:struts把ActionForm写入了requestScope中,类名作为requestScope的名字。
即:httpServletRequest.setAttribute("TestForm",actionForm);
<c:out value="${requestScope.TestForm.data}" />  也就是输出一个bean的属性值。

posted @ 2005-12-28 09:15 swingboat 阅读(480) | 评论 (0) | 编辑 收藏
 
利用html中的div标签实现网页中某一块区域的自动滚动
在web页面中,有一块固定大小的区域。在此区域中显示的数据由于条件不同而显示的数据也不同,有的时候显示的数据非常的多,会超出此区域的大小范围,而有的时候很少。所以希望有一种设置,能根据数据的多少,在固定区域中自动产生滚动条。在web页面中div标签就可以满足此要求。
html代码如下:
<html>
<body>
<div style="height:400;overflow:auto ">
<table width="543" height="300" border="1">
  <tr>
    <td width="59"><div align="center"></div></td>
    <td width="59"><div align="center"></div></td>
    <td width="403"><div align="center"></div></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
</div>
</body>
</html>
说明:div的高度为400,而table的高度为300,此种情况不会出现滚动条。div的高度为300,而table的高度为400,此种情况下,在table的旁边就会出现滚动条。主要是利用了div的overflow属性。
posted @ 2005-12-28 09:15 swingboat 阅读(1250) | 评论 (0) | 编辑 收藏
 
junit的使用

背景:当我们写完一个类的时候,需要对类的某些方法进行测试。我以前的做法是在类的main函数中,new一个类的实例,然后调用类的方法进行测试。当需要测试的方法越来越较多的时候,main函数也在逐渐的变大,最后连自己都糊涂了。这时候就需要junit了。
编码原则:
        从技术上强制你先考虑一个类的功能,也就是这个类提供给外部的接口,而不至于太早陷入它的细节。这是面向对象提倡的一种设计原则。
如果你要写一段代码:
1. 先用 junit 写测试,然后再写代码
2. 写完代码,运行测试,测试失败
3. 修改代码,运行测试,直到测试成功
编写步骤:如下图

测试代码:
package yhp.test.junit;

import junit.framework.*;
public class TestCar extends TestCase {
    protected int expectedWheels;
    protected Car myCar;
    public TestCar(String name) {
        super(name);
    }
    protected void setUp(){  //进行初始化任务
        expectedWheels = 4;
        myCar = new Car();
    }
    public static Test suite()    {//JUnit的TestRunner会调用suite方法来确定有多少个测试可以执行
        return new TestSuite(TestCar.class);
    }
    public void testGetWheels(){//以test开头,注意命名
        assertEquals(expectedWheels, myCar.getWheels());
    }
}

以下是通过eclipse自带的junit工具产生的代码:
package yhp.test.junit;
import junit.framework.TestCase;
public class TestCar2 extends TestCase {
    protected int expectedWheels;
    protected Car myCar;
    public static void main(String[] args) {
        junit.textui.TestRunner.run(TestCar2.class);//TestCar是个特殊suite的静态方法
    }
    protected void setUp() throws Exception {
        super.setUp();
        expectedWheels = 4;
        myCar = new Car();
    }
    protected void tearDown() throws Exception {
        super.tearDown();
    }
    public TestCar2(String arg0) {
        super(arg0);
    }
    public final void testGetWheels() {
        assertEquals(expectedWheels, myCar.getWheels());
    }
}

当有多个测试类的时候,系统能进行统一测试,这时可以利用TestSuite来实现。可以将TestSuite看作是包裹测试的一个容器。
通过eclipse自带的工具生成的代码如下:
package yhp.test.junit;
import junit.framework.Test;
import junit.framework.TestSuite;

public class AllTests {
     public static Test suite() {
        TestSuite suite = new TestSuite("Test for yhp.test.junit");
        //$JUnit-BEGIN$
        suite.addTest(TestCar.suite());         //调用的方法,参数不一样,实际是一致的。
        suite.addTestSuite(TestCar2.class);  //
        //$JUnit-END$
        return suite;
    }
}

posted @ 2005-12-28 09:14 swingboat 阅读(500) | 评论 (0) | 编辑 收藏
 
在jboss4环境下,URL查询参数中支持中文
在jboss4环境下,使URL参数中支持中文,例如:
http://site.net?name=中国
找到jboss4的deploy\jbossweb-tomcat50.sar\server.xml,编辑该文件,在下面的XML节点中增加红色的字
<Connector port="8080" address="${jboss.bind.address}"
         maxThreads="150" maxHttpHeaderSize="8192"
         minSpareThreads="25" maxSpareThreads="75"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
posted @ 2005-12-28 09:13 swingboat 阅读(306) | 评论 (0) | 编辑 收藏
 
jsp页面,以excel的方式输出
在jsp页面中加入以下的语句,就可以使jsp以excel的形式输出。
response.setHeader("Content-Type", "application/vnd.ms-excel;charset=GBK");
response.setContentType("application/vnd.ms-excel;charset=GBK");
posted @ 2005-12-28 09:13 swingboat 阅读(304) | 评论 (0) | 编辑 收藏
 
有限状态机的实现
有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。

最近看了一些游戏编程AI的材料,感觉游戏中的AI,第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。

FSM的实现方式:
1) switch/case或者if/else
这无意是最直观的方式,使用一堆条件判断,会编程的人都可以做到,对简单小巧的状态机来说最合适,但是毫无疑问,这样的方式比较原始,对庞大的状态机难以维护。

2) 状态表
维护一个二维状态表,横坐标表示当前状态,纵坐标表示输入,表中一个元素存储下一个状态和对应的操作。这一招易于维护,但是运行时间和存储空间的代价较大。

3) 使用State Pattern
使用State Pattern使得代码的维护比switch/case方式稍好,性能上也不会有很多的影响,但是也不是100%完美。不过Robert C. Martin做了两个自动产生FSM代码的工具,for java和for C++各一个,在http://www.objectmentor.com/resources/index上有免费下载,这个工具的输入是纯文本的状态机描述,自动产生符合State Pattern的代码,这样developer的工作只需要维护状态机的文本描述,每必要冒引入bug的风险去维护code。

4) 使用宏定义描述状态机
一般来说,C++编程中应该避免使用#define,但是这主要是因为如果用宏来定义函数的话,很容易产生这样那样的问题,但是巧妙的使用,还是能够产生奇妙的效果。MFC就是使用宏定义来实现大的架构的。
在实现FSM的时候,可以把一些繁琐无比的if/else还有花括号的组合放在宏中,这样,在代码中可以3)中状态机描述文本一样写,通过编译器的预编译处理产生1)一样的效果,我见过产生C代码的宏,如果要产生C++代码,己软MFC可以,那么理论上也是可行的。
posted @ 2005-12-28 09:02 swingboat 阅读(2438) | 评论 (1) | 编辑 收藏
 
cache模式的两种构成方式
在我们系统开发中,有一些数据变动比较少,但是会经常对它进行访问。为了提高访问的性能,我们首先会把数据从数据库中读出,放入到一个Hashtable中。以后数据的访问都是从Hashtable中获取,这样起到了一个cache的作用。从数据库中获取数据有两种方式:
1、系统第一次访问,从数据中获取所有的数据放入到Hashtable。
      这种方式比较适合数据量比较小的数据,例如:模块的管理。一个系统中不可能有太多的模块,一次从数据库中获取出所有的模块数据,放入到Hashtable中。以后对模块的访问都只用对Hashtable访问就可以了。
 2、系统第一次访问,只获取需要访问的数据,然后把它们放入到Hashtable中
       这种方式比较适合数据量还是比较大的数据。需要访问数据时,首先检测Hashtable中有没有需要的数据,如果有就直接从Hashtable中获取,如果没有就从数据库中获取需要的数据,然后再把这些数据放入到Hashtable中。

注意:两种方式,当数据被改动的时候(add,update,del)同时也需要更新Hashtable中的数据。
posted @ 2005-12-28 09:01 swingboat 阅读(397) | 评论 (0) | 编辑 收藏
 
在Oracle中,快速获取一个部门以及它下面所有的子部门的方法。

有一个部门表(T_Department):
T_Department:
     ID :varchar2(25)
     Name:varchar2(100)
     SuperiorID:varchar2(25)
     SuperiorName:varchar2(100)
     Remark:varchar2(1000)


根据一个部门的ID,获取该部门下所有的子部门,例如部门的ID为“D”:
select * from T_Department
      Start with  ID='D'
      Connect by  prior  ID=SuperiorID

posted @ 2005-12-28 09:01 swingboat 阅读(513) | 评论 (0) | 编辑 收藏
 
 
<2005年12月>
日一二三四五六
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

 公告


 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 51
  • 文章: 1
  • 评论: 50
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(4)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • JAVA(21) (rss)
  • javascript&DHTML&CSS(15) (rss)
  • Oracle/MySQL(6) (rss)
  • SOA(1) (rss)
  • WEB2.0(4) (rss)
  • WorkFlow&BPEL(1) (rss)
  • 名词概念(1) (rss)
  • 架构模式 (rss)
  • 汽车&甲壳虫 (rss)
  • 设计模式(3) (rss)
  • 软件工程(1) (rss)

随笔档案

  • 2007年9月 (1)
  • 2007年8月 (3)
  • 2007年7月 (1)
  • 2007年5月 (2)
  • 2007年4月 (4)
  • 2007年3月 (1)
  • 2007年2月 (1)
  • 2006年12月 (1)
  • 2006年11月 (2)
  • 2006年10月 (1)
  • 2006年8月 (1)
  • 2006年4月 (1)
  • 2006年3月 (2)
  • 2006年2月 (4)
  • 2005年12月 (26)

文章档案

  • 2006年1月 (1)

IT

  • Delver 's Study BLOG
  • 竹笋炒肉

搜索

  •  

积分与排名

  • 积分 - 133135
  • 排名 - 466

最新随笔

  • 1. IE对select的处理,又一怪现象:innerHTML竟然不起作用。
  • 2. 在IE下,页面只有一个text的时候,回车将自动submit。
  • 3. 设置input的内容居中?
  • 4. 可恶的“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”对话框?
  • 5. 利用JGroups同步两台server之间的cache。
  • 6. 有关“+”和“_”的search。
  • 7. synchronized的作用
  • 8. HTML的特殊字符
  • 9. 不同时区之间,时间的转换?
  • 10. javascript在IE和Firefox中的区别1

最新评论

  • 1. re: javascript转换日期字符串为Date对象
  • 大牛
  • --sfafa
  • 2. re: synchronized的作用[未登录]
  • 把100换成1000就好了!
  • --xyz
  • 3. re: synchronized的作用
  • 晦涩难懂!
  • --无知者
  • 4. re: synchronized的作用
  • 好
  • --白河夜歌
  • 5. re: 可恶的“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”对话框?
  • 评论内容较长,点击标题查看
  • --老梁

阅读排行榜

  • 1. javascript转换日期字符串为Date对象(47715)
  • 2. synchronized的作用(16408)
  • 3. 可恶的“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”对话框?(11093)
  • 4. 不同时区之间,时间的转换?(7455)
  • 5. 利用JGroups同步两台server之间的cache。(6606)

评论排行榜

  • 1. synchronized的作用(18)
  • 2. 可恶的“本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容”对话框?(7)
  • 3. javascript在IE和Firefox中的区别1(6)
  • 4. javascript转换日期字符串为Date对象(4)
  • 5. 在IE下,页面只有一个text的时候,回车将自动submit。(3)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 swingboat