2008年9月19日星期五
2008年9月18日星期四
显示帮助的div
<html xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE>code by:haiwa - 随滚动条移动的层 - 中国asp之家 - www.aspxhome.com</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html" charset="gb2312">
</HEAD>
<style>
<!--
.div{
position: absolute;
border: 2px solid red;
background-color: #EFEFEF;
line-height:90px;
font-size:12px;
z-index:1000;
}
-->
</style>
<BODY>
<div id="Javascript.Div1" class="div" style="width: 240px; height:90px" align="center">正中...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc1(){
document.getElementById("Javascript.Div1").style.top=(document.documentElement.scrollTop+(document.documentElement.clientHeight-document.getElementById("Javascript.Div1").offsetHeight)/2)+"px";
document.getElementById("Javascript.Div1").style.left=(document.documentElement.scrollLeft+(document.documentElement.clientWidth-document.getElementById("Javascript.Div1").offsetWidth)/2)+"px";
}
</SCRIPT>
<div id="Javascript.Div2" class="div" style="width: 240px; height:90px" align="center">左上...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc2(){
document.getElementById("Javascript.Div2").style.top=(document.documentElement.scrollTop)+"px";
document.getElementById("Javascript.Div2").style.left=(document.documentElement.scrollLeft)+"px";
}
</SCRIPT>
<div id="Javascript.Div3" class="div" style="width: 240px; height:90px" align="center">左下...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc3(){
document.getElementById("Javascript.Div3").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div3").offsetHeight)+"px";
document.getElementById("Javascript.Div3").style.left=(document.documentElement.scrollLeft)+"px";
}
</SCRIPT>
<div id="Javascript.Div4" class="div" style="width: 240px; height:90px" align="center">右上...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc4(){
document.getElementById("Javascript.Div4").style.top=(document.documentElement.scrollTop)+"px";
document.getElementById("Javascript.Div4").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div4").offsetWidth)+"px";
}
</SCRIPT>
<div id="Javascript.Div5" class="div" style="width: 240px; height:90px" align="center">右下...</div>
<SCRIPT LANGUAGE="JavaScript">
function sc5(){
document.getElementById("Javascript.Div5").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div5").offsetHeight)+"px";
document.getElementById("Javascript.Div5").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div5").offsetWidth)+"px";
}
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
<!--
function scall(){
sc1();sc2();sc3();sc4();sc5();
}
window.onscroll=scall;
window.onresize=scall;
window.onload=scall;
//-->
</SCRIPT>
<div style="position: absolute; top: 0px; left: 0px; width: 10000px; height: 4000px;"></div>
</BODY>
</HTML>
2008年9月16日星期二
第一次使用Subversion,Attempted to lock an already-locked dir
装上,捣鼓了半天终于上传上Google code了,哈哈。有成就感
这两天有搞了个eclipse插件subclipse,运行起来以后无论commit还是update都提示错误:
Attempted to lock an already-locked dir
通过搜索,解决办法是 执行clearup操作,就好了
记录在这,Subversion还要继续研究
Google Code Host的使用说明(转)
by shootsoft
1. Eclipse的Subversion使用说明
开发工具以Eclipse为主,所以Eclipse首先需要安装一个Subversion的插件。参考下面的网址:
http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/
项目组的所有成员必须都要按照以上的操作安装好插件,并且注册Google的Gmail帐户。
2.Google Code Host说明项目组组长到http://code.google.com/hosting/创建新项目(Create a new project)过程省略。最后会看到项目的协作平台网址:http://code.google.com/p/group6homework/。(group6homework是项目名称)组长创建完成后还需要把组员的帐户添加进来:通过[Administer]—[Project Members]就可以对项目组成员帐户进行管理。
创建完成后组长需要安装http://tortoisesvn.net/downloads Subversion的客户端插件进行项目首次的Check In操作。
操作如下:
到Eclipse的项目的workspace目录下,进入需要协作的项目的目录,比如我的:
D:"shootsoft"GP6Platform
单击鼠标右键,选择[TortoiseSVN]—[Import]然后输入:
https://group6homework.googlecode.com/svn/trunk/
注意:
-
这里网址如果你不太清楚可以登录
http://code.google.com/p/group6homework/source查看
-
Google Code Host使用的密码是随机生成的,如果已经登录Google,可以查看以下网址获得密码:
http://code.google.com/hosting/settings
首次登录可能需要安装证书和输入密码。完成后TortoiseSVN就会自动把文件夹
D:"shootsoft"workspace"GP6Platform下的所有文件同步到服务器上去了。
3. Google Code Host与Eclipse
Check In操作完成后组长还需要将项目Check Out出来,真正和Eclipse中的项目结合,组员也需要这样做:
1.将自己的项目文件夹备份并且从Eclipse中删除。需要选择第一项,连同文件夹一起删除。
2.按照http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/中的说明进行Import操作,操作结果如下所示:
3.这时点击Next按钮,选择第一项,然后点击Finish按钮。
4.通过Windows菜单,[Show View]—[Other]
5.在弹出的新窗口中选择“SVN—SVN资源库”
6.在刚才Import进来的那个资源库上单击鼠标右键,选择“检出为(A)...”
7.然后在新窗口中中输入项目名称
点击“Finish”按钮。
稍微等待一会儿,程序就会全部下载回来了。
8.我的Tomcat5补丁放在了D:"Tomcat5补丁目录下,请各位参考我的未知把补丁放置好。
如果导入的项目有红叉叉,在项目上点击鼠标右键,选择“Close Project”然后再打开就好了。这时可以清楚的看到项目上图标发生了一点点变化:
在上面的第3步上,按道理应该可以作为项目可以直接检出,但是我这里操作总是出错,所以只有按照稍微烦琐一点的步骤来操作了。
4. Subversion的使用
如果你对某一个文件进行了修改,想要把这个文件提交到服务器上去,就需要在需要提交的文件上单击鼠标右键,通过Team菜单来[提交]
如果你需要把修改过的文件使用服务器上的来覆盖,可以通过Team菜单的[更新]来进行。
Subversion的使用非常简单,但是要深入探究也可以说上几千字,还是建议通过官方或者非官方的教程来学习:
http://www.baidu.com/s?tn=searches_dg&ie=utf-8&word=subversion+%E6%95%99%E7%A8%8B
2008年9月12日星期五
普元EOS培训第二天
今天剖析了昨天三下两下生成的增删改查的代码(能看到的代码也仅仅限于jsp页面中的一些标签),其他的要看的话都是xml,要用EOS的设计器看才是类似于流程图的东西
感觉看不到亲切的java代码很不爽,呵呵
然后练习自定义运算逻辑,这下自己写类了呵呵,eos能够由向导自动生成类和方法体,就像Myeclipse中新建struts的action一样,发现eos的方法都是静态的,都是返回一个int整型值,参数列表也都是Document doc, BizContext param,看起来只有方法名可以自定义了,呵呵!
之前说过普元这套东西都是用xml格式传递参数的,这里就是从param中获取xml,然后拆解每个要用到的节点,来获取传入的参数,然后经过处理后把返回值再放到xml节点中,好费劲。
然后是handler,为了灵活的加入新的处理,可以在一个业务逻辑的前后加入多个handler,跟一般的过滤器写法没什么差别。
然后是jsp Tag自定义,也是继承了javax.servlet.jsp.tagext.TagSupport,没有普元的东西
再然后是复杂查询,多表查询,他是创建一个查询实体,就是视图啦
一天下来对普元EOS了解的多了些,它以方法为单位作为构成构件,以达到重用的目的,各个层之间以xml格式作为联系,开发人员基本上已图形化开发,不接触底层技术,给程序员的门槛降低了(大学生就业更难了呵呵),开发系统开始工业化,把零件装起来,螺丝拧上就OK了
可能经历实际开发了,会有多一些不一样的感触吧
还是没闹明白难道这就是所谓SOA吗???
用Zoundry发blog
想找个离线发布blog的工具,折腾了一晚上
大家评论说Zoundry不错,就下载下来安装了,如何配置成为了一个问题,我有多个blog想同时更新
下面搜集了几个blog配置的地址,供参考
blogjava
http://www.blogjava.net/yourblog/services/metaweblog.aspx
bloggers
https://www.blogger.com/feeds/default/blogs (不稳定,有时成功有时不成功,可能是太和谐了)
blogbus
http://rpc.blogbus.com/blogger
csdn blog
2008年9月11日星期四
普元EOS培训第一天
普元EOS,面向构件的开发
公司要购进普元的EOS开发工具,组织为期5天的培训
为了今天的培训我把我的笔记本系统都重装了,折腾了半天装数据库,装EOS,装EOS补丁,不知道干嘛不做一个集成了补丁的安装包
安装过程中要配置数据库,要初始化数据库,会向数据库中自动建好多表,然后安装成功后可以在服务控制台管理。
首先做了个HelloWorld
界面就是这样的
首先新建一个构件包(面向构件的开发嘛),每个构建包下有页面构件page,展现逻辑构件pr,业务逻辑构件biz,数据逻辑构件data等等。
我的理解就是每个构件就相当于分层架构中的一层,page就是jsp页面,pr是Struts的action,biz是spring的bean,data是hibernate的映射,普元在这之上又进行了封装,以前我们在各个层之间传递数据通常由一个DTO数据传递对象,而普元在各个层用xml来传递,普元把普遍通用的实现逻辑处理都封装成了构件,我们只要调用构件就行了。
之后又来了复杂点有刺激的,通过向导实现对一个单表的增删改查,向导跟vs.net中的那个数据连接,数据适配器拖到页面上选择表,选择字段,就自动生成了增删改查,只是vs.net中可以看到生成的C#的代码,而普元生成的只是一堆xml。
原来一天未必能完成的事,现在十分钟做完,能傻瓜的都傻瓜了,真的也要下岗了。
哦,对了,这些和SOA怎么联系上呢?
2008年9月5日星期五
jsp下载文件的问题
思路确定了
生成xml
在服务器指定目录创建文件
取得文件路径,弹出下载框
Java语言:01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04 String pathurl = (String)request.getAttribute("pathurl");
05 if(pathurl !=null && !pathurl.equals("")){
06
07 String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08 //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09 addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10
11 // 设置响应头和下载保存的文件名
12 response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");
13 response.setHeader("Content-Disposition",
14 "attachment; filename=\"" + pathurl + "\"");
15
16 // 打开指定文件的流信息
17 java.io.FileInputStream fileInputStream =
18 new java.io.FileInputStream(addressReport);
19
20 写出流信息
21 int i;
22 while ((i=fileInputStream.read()) != -1) {
23 out.write(i);
24 }
25
26 fileInputStream.close();
27 out.close();
28
29 }
30 %>
这么写在jsp文件中的代码,开始试验没有问题,但是如果xml中有中文,就会是乱码,xml文件是使用utf8生成的,猜想可能是在流读取的时候编码不对,于是在网上搜得了下面这样的写法,通过InputStreamReader设置了编码UTF-8
测试成功
Java语言:
01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04 String pathurl = (String)request.getAttribute("pathurl");
05 if(pathurl !=null && !pathurl.equals("")){
06
07 String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08 //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09 addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10
11 // 设置响应头和下载保存的文件名
12 response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");
13 response.setHeader("Content-Disposition",
14 "attachment; filename=\"" + pathurl + "\"");
15
16 // 打开指定文件的流信息
17 java.io.FileInputStream fileInputStream =
18 new java.io.FileInputStream(addressReport);
19
20 // 写出流信息
21 //int i;
22 //while ((i=fileInputStream.read()) != -1) {
23 //out.write(i);
24 //}
25
26 //fileInputStream.close();
27 //out.close();
28
29 InputStreamReader reader=new InputStreamReader(fileInputStream,"UTF-8");
30 int i=0;
31 while((i=reader.read())!=-1){
32 out.write(i);
33
34 }
35 reader.close();
36 fileInputStream.close();
37 out.close();
38 }
39 %>
总结:还是对java的流相关只是掌握不清啊,不能熟练运用
sqlServer2000与sqlServer2005的错误
让我帮忙调式一下程序,而我的机器尚没有sql05,只有sql2000,期间听说过05和2000可以同时安装,装吧,要不没法附加他那2005的数据库,费了好大劲装好了,开始附加数据库,但是死活附加不上去,错误提示:执行Transact_SQL语句或批处理时发生了异常。未能在sysindexes中找到数据库ID 9 对象ID 1 对应的行,请对sysindexes运行DBCC CHECKTABLE
按照提示,执行 DBCC CHECKTABLE 还是没有效果
遂在google上搜,有网友遇到这个问题是因为同时装了sql2000,卸载了2000重装sql2005就成功了
晕,这下功夫耗大了
卸载吧,同学提供了一个干净卸载的工具来卸载,早就知道卸载sql2000卸不干净,重装会出问题,于是采用此工具
“微软的Windows_Installer_清理实用工具msicuu2”
可谁知道,这东西帮了倒忙,好像得先运行卸载程序,再运行这个“微软的Windows_Installer_清理实用工具msicuu2”可以帮忙将注册表之类的垃圾清理掉,但是我直接运行了这个“微软的Windows_Installer_清理实用工具msicuu2”,结果sql2000还在并且可以运行,在控制面板卸载,提示 找不到D:\Program Files\Microsoft SQL Server\MSSQL\Uninst.isu
晕,这是干啥的啊
接着google
找到一网友的播客http://www.anywolfs.com/liuhui/article.asp?id=257,提出了解决办法,用之,终于可以卸载了
接着卸载sql2005,哎,等等,现在是不是可以附加了呢,试,.....还是不行,呵呵
卸载吧
哦?从控制面板貌似sql05也卸载不了了,卸了好几次也没反应啊,倒是不报错
试了好几次,貌似选哪个都不好使,点下一步,一会儿窗口就自己消失了
啊,啊啊,晕,先睡觉,明儿再搞定05
谁位大哥遇到过,提示一下啊......
难道是hibernate装聪明?
今天开发中遇到一个奇怪的hibernate错误
我的数据库中一个表中有个字段名叫id,但是它并不是主键
用hibernate映射后为
2 <column name="APPR_ID" precision="11" scale="0" />
3 <generator class="assigned" />
4 </id>
5 <property name="Id" type="java.lang.Long">
6 <column name="ID" precision="11" scale="0" />
7 </property>而我当执行这样的hibernate的HQL的时候
SQL语言:1 from RcUApprInfo as model where model.Id = ?
hibernate解析成sql语句竟然是
SQL语言:1 select ...... from rc_u_appr_info where as model where model.APPR_ID = ?
跟踪了好几遍,都是这样
在确定自己的代码没问题后,想到可能是hibernate理解错了于是将Id改成了别的名
再试,竟然没问题了
难道hibernate将凡是叫Id的都认为成主键??不解 不解
试用Google的浏览器
早上上班来,打开电脑,看到一则最新消息,google发布自己的浏览器了
9月3日消息 9月3日凌晨,谷歌中国与全球同步推出其开源浏览器Google Chrome测试版,中文名为谷歌浏览器.
下载地址为:http://www.google.com/chrome
记得前几天还看见csdn上新闻说google澄清不会出浏览器跟IE竞争,晕,现在成现实了,google的所有服务差不多用了个遍,这个也不例外,下了一个,惊讶下载文件竟然只有几百K,开始安装才知道也是采用windows live那样的安装方式,还要下载一通。
终于安装完啦,打开
第一感觉很简单,把所有空间都给了页面显示,就像IE按了F11一样,因为在公司是使用代理上网,纳闷的是我也没有配置代理居然一下就能上网,于是打开选项查找,有个设置代理的按钮,点击打开的竟然是IE的选项窗口,google的浏览器调用IE的internate选项,这不是成了遨游?
什么是SOA
培训中,工程师演示了普元的产品,他们的一个开发工具EOS包含了AppFream,Report,RishWeb,WorkFlow,软件开发的各个层面都覆盖到了,俺的个娘啊,感觉就是要是这些东西用起来还要我们这些程序员干嘛,只要项目经理就行了,项目经理跟客户确认好需求,然后用普元的工具一通拖拽画出流程图,完了,这就完工了,流程图画出的同时我们的应用也能运行了,看效果吧,呵呵
貌似,做测试的也可以下岗了,因为每一步都是自动生成的,并且可以监控每一步的运行情况。
半天的培训下来,突然有种危机感,如果总经理真的决定在我们部门推行这个EOS系统,那我们岂不是离下岗不远啦?
程序员真不如民工喽。。。
自己的一点点理解 ,功力尚浅,呵呵,欢迎拍砖
控制td换行的css样式
遇到一个棘手的问题,即便是给td限定的宽度,但是如果里面的内容是连续的,IE就认为是一个单词,不会换行,瞎聪明,google了一通,用css把问题解决了,css这玩意太强了,收藏一下,控制td换行的css样式:style="word-wrap:break-word;word-break:break-all;"
12
3
4
5
6
2008年9月3日星期三
试用Google的浏览器 chrome
早上上班来,打开电脑,看到一则最新消息,google发布自己的浏览器了
9月3日消息 9月3日凌晨,谷歌中国与全球同步推出其开源浏览器Google Chrome测试版,中文名为谷歌浏览器.
下载地址为:http://www.google.com/chrome
记得前几天还看见csdn上新闻说google澄清不会出浏览器跟IE竞争,晕,现在成现实了,google的所有服务差不多用了个遍,这个也不例外,下了一个,惊讶下载文件竟然只有几百K,开始安装才知道也是采用windows live那样的安装方式,还要下载一通。
终于安装完啦,打开
第一感觉很简单,把所有空间都给了页面显示,就像IE按了F11一样,因为在公司是使用代理上网,纳闷的是我也没有配置代理居然一下就能上网,于是打开选项查找,有个设置代理的按钮,点击打开的竟然是IE的选项窗口,google的浏览器调用IE的internate选项,这不是成了遨游?
一点心得
忙里偷闲
一直想写一个blog程序
架子打起来了,用struts1.2+hibernate
这个问题可把我难住了(功力太浅),于是google上搜开源的blog系统,看他们的源码,首先下的roller,费了好大劲把系统配起来了,运行起来那个高兴,接下来晕了,新版本是struts2,还没研究过,看了一下好像struts2能很容易实现我要的,可是我用的是1.x啊,接着搜,Pebble,blojsom ,DLOG4J ,myblog,都试用了,其中blojsom使用了一个servlet,在里面解析URI,比如请求的地址是/blog/spring/,那么就被解析成/blogView.do?go=spring,以这个地址转向,从而被struts的控制器接收。
这里得用(并且redirectURL必须是相对路径,用完整路径好像还不行,在我这报404错误)
1
2
1
又建立了一个过滤器,用以判断session中的用户是否是当前访问的博客的管理员,比如访问/blog/spring/,判断session中保存的用户是否是spring,然后往request,setAttribute中放一个标示,标示是否具有管理员权限,在jsp页面中获取这个参数以决定是否显示后台管理连接。
到这里,最基本,最挠头的问题暂时解决了,感觉肯定有更加方便、更加精妙、更加简单的方法,只是功力还没涉到那么深,哪位博友看到了不胜赐教,接下来还要攻克的,如何产生静态html页面,如何rss......
2008年9月1日星期一
web.xml中的3种写法
① 完全匹配
<url-pattern>/test/list.do</url-pattern>
② 目录匹配
<url-pattern>/test/*</url-pattern>
③ 扩展名匹配
<url-pattern>*.do</url-pattern>
servlet-mapping的重要规则:
☆ 容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。
☆ 如果一个请求匹配多个“目录匹配”,容器会选择最长的匹配。
2008年8月27日星期三
真的好久没更新了
呵呵,瞅瞅下面的一篇到现在足有两个多月了,时间过得好快啊
最近一段时间,事儿真的很多,公司的事不算忙了,所以也没什么技术问题写一写,一直想弄个blog,还没弄起来,家里有很多事忙
上周末回了趟家,正好赶上下雨,庆幸买上了火车票,还有坐,倒霉的还没赶上火车,到火车站停止检票了,在麦当劳蹲了一宿
凌晨4:30上车,开始闹肚子,哎呦,一直到家,一宿没睡,还闹肚子,我太坚强了,呵呵
想点招,赚钱,极度缺钱
为什么baidu空间不能用windows live writer这样的客户端写blog呢,落伍了啊
2008年6月13日星期五
八兄弟
向来只是吃饭的时候,有时候看电视,也总是遥控器不离手,不停的换台
无意中看了会儿 八兄弟~~觉得还不错
讲的是咱老百姓的事儿
讽刺~幽默~
生活~就是不停的迈一道道的坎啊
讲话了,要当就当棍
2008年6月12日星期四
hibernate的save()疑惑
hibernate save的时候必须启用事务,也就是必须
beginTransaction();
然后
commit();
要不然不会insert
看孙卫琴.精通Hibernate:Java对象持久化技术详解上讲
调用save方法后,hibernate并不会立即insert,而是保存在缓存里,等清理缓存时再insert
什么时候清理缓存呢?
1、事务commit();
2、find方法(hibernate3被废)
3、显示调用flush();
而为什么不用事务,只是在save();后直接显示调用flush();还是没有insert呢?
参考csdn的一个帖子http://topic.csdn.net/u/20080603/19/d6918606-3a62-43a4-b63d-cd292242bbc6.html
因为数据源的问题
真正的原因是数据源conn默认的提交方式,hibernate不管这件事,大部分开源数据源都是默认false的
我试了hibernate的默认连接池,和tomcat中配的连接池用使用事务都没有insert。
下面这段代码能够insert可以说明一些问题
public static void main(String[] args) throws Exception {
SessionFactory sf=HibernateSessionFactory.getSessionFactory();
Session session=sf.openSession();
System.out.println(session.connection().getAutoCommit());
session.connection().setAutoCommit(true);
User u=new User();
u.setName("aaa");
session.save(u);
}
}
而commit和flush的区别就是commit先flush再提交,而flush没有提交
而在close的时候,孙卫琴.精通Hibernate:Java对象持久化技术详解上讲的是hibernate会清空缓存,一个清理,一个清空,一字之差,呵呵
2008年6月4日星期三
roller blog
看在OpenSource的介绍:
Roller Weblogger这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。
很好的学习资料,哈哈,那就学习学习吧
不过到现在也没看出个什么门道来
系统用了struts2 不熟,struts1还行
用了JPA,不熟,确切的说刚知道这东西
用了velocity,没用过
....还有很多没见过的名词,狂晕
打了个断点跟了几圈,就晕了
呵呵