优化Spring启动速度
spring的容器是提供了lazy-load,缺省设置是bean没有lazy-load,该属性处于false状态。
把beans的default-lazy-init改为true就,再次启动,可以大大降低启动时间
10:00  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
Disable Hibernates usage of cglib reflection optimizer

Put the following line in hibernate.properties:

hibernate.cglib.use_reflection_optimizer=false
9:57  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
Use serialized XML documents when configuring Configuration

When building the configuration 40-60% of the time is used by the XML parsers and Dom4j to read up the XML document. Significant performance increases can be done by serializing the Document object's to disc once, and afterwards just add them to the configuration by deserializing them first.

In the current cvs we have an experimental Configuration.addCachableFile() method that can be used as inspiration for previous Hibernate versions.

public Configuration addCachableFile(String xmlFile) throws MappingException {        
        try {
            File file = new File(xmlFile);
            File lazyfile = new File(xmlFile + ".bin");
            org.dom4j.Document doc = null; 
            List errors = new ArrayList();
            if(file.exists() && lazyfile.exists() && file.lastModified()<lazyfile.lastModified()) {
                log.info("Mapping lazy file: " + lazyfile.getPath());
                ObjectInputStream oip = null;
                oip = new ObjectInputStream(new FileInputStream(lazyfile));
                doc = (org.dom4j.Document) oip.readObject();
                oip.close(); 
            } else {
                doc = xmlHelper.createSAXReader(xmlFile, errors, entityResolver).read( file );
                log.info("Writing lazy file to " + lazyfile);
                ObjectOutputStream oup = new ObjectOutputStream(new FileOutputStream(lazyfile));
                oup.writeObject(doc);
                oup.flush();
                oup.close();
            }
            
            if ( errors.size()!=0 ) throw new MappingException( "invalid mapping", (Throwable) errors.get(0) );
            add(doc);
            return this;
        }
        catch (Exception e) {
            log.error("Could not configure datastore from file: " + xmlFile, e);
            throw new MappingException(e);
        }
    }
9:55  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
7月14日
iSQL*PLUS
Enterprise Manager Database Control URL - (orcl) :
http://name:1158/em
iSQL*Plus URL 为:
http://name:5560/isqlplus
iSQL*Plus DBA URL 为:
http://name:5560/isqlplus/dba
14:31  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
7月12日
JDBC学习笔记——JDBC性能优化(转)

作者:佚名    来自:CSDN
jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另一个是与数据库相对独立的jdbc应用程序接口(api)的使用。这里说的是如何正确使用jdbc编程接口,以获得更好的性能。
  jdbc主要优化有:
  1.选择正确的jdbc驱动程序
  2.Connention的优化:使用连接池来管理Connection对象
  3.Statement的优化:使用批量更新等
  4.Result的优化:正确的从数据库中get数据等

  (1)选择正确的jdbc驱动程序:
  1、jdbc-odbc 桥
  2、本地api-部分 java驱动
  3、jdbc网路协议-纯java驱动
  4、jdbc本地协议
  最好选择 jdbc网路协议-纯java驱动  效率比较高  但需要第三方软件的支持 比如corba  weblogic属于这种类型

  (2)优化Connection对象:
  1、设置适当的参数
   DriverManager.getConnection(String url,Properties props);
   例如:
   Properties props=new Properties();
   props.put("user","wuwei");
   props.put("password","wuwei");
   props.put("defaultRowPrefectch","30");
   props.put("dufaultBatchValue","5");
   Connection con=DriverManager.getConnection("jdbc:oracle:thin:@hostsString",props);
   对象可以通过设置setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 两个参数类优化连接
  2、使用连接池
   可以自己写一个连接池,这样程序的灵活性强,便于移植。
      apache项目开发了一套非常通用而表现非常稳定的对象池 http://jakarta.apache.org/commons/pool.htm
      设计了自己的连接池后,在客户端调用建立对象:
   public Object makeObject() throws Exception{
    Class.forName("oracle.jdbc.driver.OracalDriver");
    return DriverManager.getConnection("url","username","password");
   }
      销毁对象时用:
   public void destroyObject(Object obj) throws Exception{
    ((Connection)obj.close());
   }
   注意几点:对象池里有没有回收机制,对象池里有机有容量限制,对象池里有多少个闲置对象(可以释放)
  3、控制事务的提交
   最好手动提交事务,不但可以可以保证数据原子性,而且对新能提高留下余地。
   try{
    connection.setAutoCommint(false);
    // 代码用PreparedStatement性能比Statementh好
    connection.commit();
    connection.setAutoCommit(true);
   }catch(SQLException e){
   }finally{
    //代码
    if(connection!=null){
     connection.close(); 
    }
   }
  4、适当的选择事务的隔离级别
   TRANSACTION_READ_UNCOMMITED  性能最高
   TRANSACTION_READ_COMMITED    快
   TRANSACTION_REFEATABLE_READ  中等
   RANSACTION_SERIALIZABLE      慢

  (3)Statement 优化:
  jdbc3个接口用来处理sql的执行,是Statement PreparedStatement CallableStatement提供适当的Statement接口批量执行sql从数据库批量获取数据。
  PreparedStatement 比Statement性能要好 主要体现在一个sql语句多次重复执行的情况。
  PreparedStatemnt只编译解析一次而Statement每次编译一次。

  批量修改数据库
  Statement 提供方法addBatch(String)和executeBatch()
  调用方法为
  stmt.addBatch("isnert.....");
  stmt.addBatch("update.....");
  stmt.executeBatch();
  也可以用PreparedStatement从而更好的提高性能:
  pstmt=conn.preparedStatement("insert into test_table(......) values(....?)");
  pstmt.setString(1,"aaa");
  pstmt.addBatch();
  pstmt.setString(1,"bbb");
  pstmt.addBatch();
  .....
  pstmt.executeBatch();

  批量地从数据库中取数据:
  通过setFetchSize()和getFectchSize()方法来设定和查看这个参数,这个参数对体统的性能影响比较大。这个参数太小会严重地降低程序的性能。
  Connection Statement ResultSet都有这个参数,他们对性能地影响顺序是:ResultSet---Statement---Connection

  (4)优化ResultSet:
  体现在以下几个方面:
  批量读取数据.合理设置ResultSet的getFetchSize()和setFetchSize()方法中的参数
  使用正确的get和set方法
  使用整数而不是字段名作为参数性能比较高
  例如:
  setInt(1,100);
  setString(2,"aaaa");
  比
  setInt("id","100");
  setString("name","aaaa");
  性能好
  设置适当的滚动方向。有3个方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN,单向滚动性能比较高。

  其他方面的性能优化
  及时显示的关闭Connection Statement ResultSet,其中Connection可以用Connetion Pool处理。
  使用数据库系统的强大查询功能去组织数据。这样程序运行是和数据库服务的交互次数少,数据库返回给程序的记录条数少的多,所以性能有很大的提高。

17:58  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
7月11日
设计模式的一个单词解释
PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。
VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。
DAO:data access object 数据访问对象,此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。
BO:business object 业务对象,封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。
POJO:plain ordinary java object 简单无规则java对象,我个人觉得它和其他不是一个层面上的东西,VO和PO应该都属于它。
15:48  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
结合struts和hibernate谈J2EE架构的数据表示 (转)
此篇文章作者:robbin
此篇文章来源: http://forum.hibernate.org.cn/
 
在 struts+ hibernate 这种结构中,是不应该把Hibernate产生的PO直接传递给JSP的,不管他是Iterator,还是List,这是一个设计错误。

我来谈谈在J2EE架构中各层的数据表示方法:

Web层的数据表示是FormBean,数据来源于HTML Form POST
业务层的数据表示是VO
持久层的数据表示是PO,其数据来源于数据库,持久层的数据表示例如CMP

在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说Web层的逻辑进行了修改,那么只需要修改FormBean的结构,而不需要触动业务层和持久层的代码修改。同样滴,当数据库表进行了小的调整,那么也只需要修改持久层数据表示,而不需要触动业务层代码和Web层代码。

不过由于Hibernate的强大功能,例如动态生成PO,PO的状态管理可以脱离Session,使得在应用了Hibernate的J2EE框架中,PO完全可以充当VO,因此我们下面把PO和VO合并,统称为PO。

先来谈谈ActionFormBean和持久层的PO之间的重大区别。

在简单的应用中,ActionFormBean和PO几乎是没有区别,所以很多人干脆就是用ActionFormBean来充当PO,于是ActionFormBean从JSP页面到Servlet控制层再到业务层,然后穿过持久层,最后一直映射到数据库表。真是一竿子捅到了底!

但是在复杂的应用中,ActionFormBean和PO是分离的,他们也不可能一样。ActionFormBean是和网页里面的Form表单一一对应的,Form里面有什么元素,Bean里面就有什么属性。而PO和数据库表对应,因此如果数据库表不修改,那么PO也不会修改,如果页面的流程和数据库表字段对应关系不一致,那么你又如何能够使用ActionFormBean来取代PO呢?

比如说吧,用户注册页面要求注册用户的基本信息,因此HTML Form里面包含了基本信息属性,于是你需要一个ActionFormBean来一一对应(注意:是一一对应),每个Bean属性对应一个文本框或者选择框什么的。

而用户这个持久对象呢?他的属性和ActionFormBean有什么明显不同呢?他会有一些ActionFormBean所没有的集合属性,比如说用户的权限属性,用户的组属性,用户的帖子等等。另外还有可能的是在ActionFormBean里面有3个属性,分别是用户的First Name, Middle Name, Last Name,而在我的User这个持久对象中就是一个 Name 对象属性。

假设我的注册页面原来只要你提供First Name,那么ActionFormBean就这一个属性,后来我要你提供全名,你要改ActionFormBean,加两个属性。但是这个时候PO是不应该修改滴,因为数据库没有改。

那么在一个完整的J2EE系统中应该如何进行合理的设计呢?

JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

ActionFormBean是Web层的数据表示,它和HTML页面Form对应,只要Web页面的操作流程发生改变,它就要相应的进行修改,它不应该也不能被传递到业务层和持久层,否则一旦页面修改,会一直牵连到业务层和持久层的大面积的代码进行修改,对于软件的可维护性和可扩展性而言,是一个灾难,Actiont就是他的边界,到此为止!

Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

而PO则是业务层和持久层的数据表示,它在业务层和持久层之间进行流动,他不应该也不能被传递到Web层的View中去,而ActionServlet就是他的边界,到此为止!

然后来看一看整个架构的流程:

当用户通过浏览器访问网页,提交了一个页面。于是Action拿到了这个FormBean,他会把FormBean属性读出来,然后构造一个PO对象,再调用业务层的Bean类,完成了注册操作,重定向到成功页面。而业务层Bean收到这个PO对象之后,调用DAO接口方法,进行持久对象的持久化操作。

当用户查询某个会员的信息的时候,他用全名进行查询,于是Action得到一个UserNameFormBean包括了3个属性,分别是first name, middle name, last name,然后Action把UserNameFormBean的3个属性读出来,构造Name对象,再调用业务Bean,把Name对象传递给业务Bean,进行查询。

业务Bean取得Name(注意: Name对象只是User的一个属性)对象之后调用DAO接口,返回一个User的PO对象,注意这个User不同于在Web层使用的UserFormBean,他有很多集合属性滴。然后业务Bean把User对象返回给Action。

Action拿到User之后,把User的基本属性取出(集合属性如果不需要就免了),构造UserFormBean,然后把UserFormBean request.setAttribute(...),然后重定向到查询结果页面。

查询页面拿到request对象里面的ActionFormBean,自动调用tag显示之。

总结:

FormBean是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。

FormBean和PO之间的数据转化是在Action中进行滴。

BTW:

JDO1.x还不能像Hibernate功能这样强大,PO不能脱离持久层,所以必须在业务层使用VO,因此必须在业务层进行大量的VO和PO的转化操作,相对于Hibernate来说,编程比较烦琐。

当然咯,理论是一回事,实际操作也不一定非要这样干,你可以自行取舍,在实际项目中灵活一点,增加一点bad smell,提高开发效率。只不过在大型项目中最好还是严丝合缝,不然的话,改版的时候会痛苦的很滴。
15:28  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
7月5日
判断字符串中第一次出现数字的长度
String[] str1=str.split("\\d");
13:41  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
7月4日
properties文件编码
native2ascii -encoding gb2312 a.properties b.properties
9:46  |  固定链接 | 引用通告 (0) | 记录它
6月21日
修改XP Search 的准确性和速度

更准:Windows XP默认不会搜索某些目录中的文件,且其对文件内搜索的支持也不是很完善,我们可以以下方法让搜索的结果更为全面:运行“Regedit”命令打开注册表编辑器,定位到“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer”,在右边窗口中分别将CaseSensitive、IncludeSubFolders、SearchHidden、SearchSlowFiles、SearchSystemDirs(如果没有则新建,其类型为REG_DWORD)的值修改为1,这样可以最大限度扩大搜索目录。接下来定位到“HKEY_CLASSES_ ROOT”分支,这里是控制文件内搜索所支持的文件类型,我们可以将几种比较常见的文件类型添加进去,以新建其对htm格式文件内搜索支持为例,方法是:在该分支新建一个名为“HTM”的项,再在HTM项新建一个名为“PersistentHandler”并将其默认值修改为“{5e941d80- bf96-11cd-b579- 08002b30bfeb}”。

更快:上面介绍了如何让搜索结果更多的技巧,那样的代价就是搜索速度的缓慢,如果你想让搜索更快,那么可以将“HKEY_CLASSES_ROOT”分支下不需要的文件类似删除。我们打开搜索窗口,依次单击“改变首选项→使用制作索引服务”将其开启,这样在我们系统处于空闲状态时,系统会自动将本机文件编制索引并加以维护,提高搜索速度。

16:48  |  固定链接 | 引用通告 (0) | 记录它 | 计算机与 Internet
6月20日
设置Tomcat的上传最大限制
maxPostSize="20097152"
14:47  |  固定链接 | 引用通告 (0) | 记录它
6月8日
世界杯时间表。
世界杯时间表。
日期 时间 对阵 组别 比赛地 场次
6月10日
星期六
00:00 德国 VS 哥斯达黎加 A 慕尼黑 1
03:00 波兰 VS 厄瓜多尔 A 盖尔森基兴 2
21:00 英格兰 VS 巴拉圭 B 法兰克福 3
6月11日
星期日
00:00 特立尼达和多巴哥 VS 瑞典 B 多特蒙德 4
03:00 阿根廷 VS 科特迪瓦 C 汉堡 5
21:00 塞黑 VS 荷兰 C 莱比锡 6
6月12日
星期一
00:00 墨西哥 VS 伊朗 D 纽伦堡 7
03:00 安哥拉 VS 葡萄牙 D 科隆 8
21:00 澳大利亚 VS 日本 F 凯泽斯劳滕 12
6月13日
星期二
00:00 美国 VS 捷克 E 盖尔森基兴 10
03:00 意大利 VS 加纳 E 汉诺威 9
21:00 韩国 VS 多哥 G 法兰克福 14
6月14日
星期三
00:00 法国 VS 瑞士 G 斯图加特 13
03:00 巴西 VS 克罗地亚 F 柏林 11
21:00 西班牙 VS 乌克兰 H 莱比锡 15
6月15日
星期四
00:00 突尼斯 VS 沙特阿拉伯 H 慕尼黑 16
03:00 德国 VS 波兰 A 多特蒙德 17
21:00 厄瓜多尔 VS 哥斯达黎加 A 汉堡 18
6月16日
星期五
00:00 英格兰 VS 特立尼达和多巴哥 B 纽伦堡 19
03:00 瑞典 VS 巴拉圭 B 柏林 20
21:00 阿根廷 VS 塞黑 C 盖尔森基兴 21
6月17日
星期六
00:00 荷兰 VS 科特迪瓦 C 斯图加特 22
03:00 墨西哥 VS 安哥拉 D 汉诺威 23
21:00 葡萄牙 VS 伊朗 D 法兰克福 24

6月18日
星期日

00:00 捷克 VS 加纳 E 科隆 26
03:00 意大利 VS 美国 E 凯泽斯劳滕 25
21:00 日本 VS 克罗地亚 F 纽伦堡 28

6月19日
星期一

00:00 巴西 VS 澳大利亚 F 慕尼黑 27
03:00 法国 VS 韩国 G 莱比锡 29
21:00 多哥 VS 瑞士 G 多特蒙德 30

6月20日
星期二

00:00 沙特阿拉伯 VS 乌克兰 H 汉堡 32
03:00 西班牙 VS 突尼斯 H 斯图加特 31
22:00 厄瓜多尔 VS 德国 A 柏林 33
22:00 哥斯达黎加 VS 波兰 A 汉诺威 34

6月21日
星期三

03:00 瑞典 VS 英格兰 B 科隆 35
03:00 巴拉圭 VS 特立尼达和多巴哥 B 凯泽斯劳滕 36
22:00 葡萄牙 VS 墨西哥 D 盖尔森基兴 39
22:00 伊朗 VS 安哥拉 D 莱比锡 40

6月22日
星期四

03:00 荷兰 VS 阿根廷 C 法兰克福 37
03:00 科特迪瓦 VS 塞黑 C 慕尼黑 38
22:00 捷克 VS 意大利 E 汉堡 41
22:00 加纳 VS 美国 E 纽伦堡 42

6月23日
星期五

03:00 日本 VS 巴西 F 多特蒙德 43
03:00 克罗地亚 VS 澳大利亚 F 斯图加特 44
22:00 沙特阿拉伯 VS 西班牙 H 凯泽斯劳滕 47
22:00 乌克兰 VS 突尼斯 H 柏林 48

6月24日
星期六

03:00 多哥 VS 法国 G 科隆 45
03:00 瑞士 VS 韩国 G 汉诺威 46
日期 时间 对阵 组别 比赛地 场次

6月24日
星期六

23:00 A1 VS B2 1/8决赛 慕尼黑 49

6月25日
星期日

03:00 C1 VS D2 1/8决赛 莱比锡 50
23:00 B1 VS A2 1/8决赛 斯图加特 51

6月26日
星期一

03:00 D1 VS C2 1/8决赛 纽伦堡 52
23:00 E1 VS F2 1/8决赛 凯泽斯劳腾 53

6月27日
星期二

03:00 G1 VS H2 1/8决赛 科隆 54
23:00 F1 VS E2 1/8决赛 多特蒙德 55

6月28日
星期三

03:00 H1 VS G2 1/8决赛 汉诺威 56

6月30日
星期五

23:00 49胜者 VS 50胜者 1/4决赛 柏林 57

7月1日
星期六

03:00 53胜者 VS 54胜者 1/4决赛 汉堡 58
23:00 51胜者 VS 52胜者 1/4决赛 盖尔森基兴 59

7月2日
星期日

3:00 55胜者 VS 56胜者 1/4决赛 法兰克福 60

7月5日
星期三

03:00 57胜者 VS 58胜者 半决赛 多特蒙德 61

7月6日
星期四

03:00 59胜者 VS 60胜者 半决赛 慕尼黑 62

7月9日
星期日

03:00 61负者 VS 62负者 3、4名决赛 斯图加特 63

7月10日
星期一

02:00 61胜者 VS 62胜者 决赛 柏林 64
17:45  |  固定链接 | 引用通告 (0) | 记录它
6月7日
SQL Server中各个系统表的作用
sysaltfiles            主数据库               保存数据库的文件
syscharsets        主数据库               字符集与排序顺序
sysconfigures     主数据库               配置选项
syscurconfigs     主数据库               当前配置选项
sysdatabases    主数据库               服务器中的数据库
syslanguages    主数据库               语言
syslogins            主数据库               登陆帐号信息
sysoledbusers   主数据库               链接服务器登陆信息
sysprocesses    主数据库               进程
sysremotelogins 主数据库               远程登录帐号
syscolumns        每个数据库             列
sysconstrains     每个数据库             限制
sysfilegroups      每个数据库             文件组
sysfiles                 每个数据库             文件
sysforeignkeys   每个数据库             外部关键字
sysindexs            每个数据库             索引
sysmenbers       每个数据库             角色成员
sysobjects           每个数据库             所有数据库对象
syspermissions 每个数据库             权限
systypes               每个数据库             用户定义数据类型
sysusers              每个数据库             用户
12:21  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
5月30日
每滚动一条信息停顿javascript
<DIV id=scroll_image onmouseover=bMouseOver=0 style="OVERFLOW: hidden; WIDTH: 202px; HEIGHT: 20px" onmouseout=bMouseOver=1>
     <SCRIPT language=javascript>
     var scrollerheight=20;
     var html,total_area=0,wait_flag=true;
     var bMouseOver = 1;
     var scrollspeed = 1;
     var waitingtime = 3500;
     var s_tmp = 0, s_amount = 20;
     var scroll_content=new Array();
     var startPanel=0, n_panel=0, i=0;
     function startscroll()
     {
     i=0;
     for (i in scroll_content)
     n_panel++;
     n_panel = n_panel -1 ;
     startPanel = Math.round(Math.random()*n_panel);
     if(startPanel == 0)
     {
     i=0;
     for (i in scroll_content)
     insert_area(total_area, total_area++);
     }
     else if(startPanel == n_panel)
     {
     insert_area(startPanel, total_area);
     total_area++;
     for (i=0; i<startPanel; i++)
     {
     insert_area(i, total_area);
     total_area++;
     }
     }
     else if((startPanel > 0) || (startPanel < n_panel))
     {
     insert_area(startPanel, total_area);
     total_area++;
     for (i=startPanel+1; i<=n_panel; i++)
     {
     insert_area(i, total_area);
     total_area++;
     }
     for (i=0; i<startPanel; i++)
     {
     insert_area(i, total_area);
     total_area++;
     }
     }
     window.setTimeout("scrolling()",waitingtime);
     }
     function scrolling(){
     if (bMouseOver && wait_flag)
     {
     for (i=0;i<total_area;i++){
     tmp = document.getElementById('scroll_area'+i).style;
     tmp.top = parseInt(tmp.top)-scrollspeed;
     if (parseInt(tmp.top) <= -scrollerheight){
     tmp.top = scrollerheight*(total_area-1);
     }
     if (s_tmp++ > (s_amount-1)*scroll_content.length){
     wait_flag=false;
     window.setTimeout("wait_flag=true;s_tmp=0;",waitingtime);
     }
     }
     }
     window.setTimeout("scrolling()",1);
     }
     function insert_area(idx, n){
     html='<div style="left: 0px; width: 100%; position: absolute; top: '+(scrollerheight*n)+'px" id="scroll_area'+n+'">';
     html+=scroll_content[idx];
     html+='</div>';
     document.write(html);
     }
     var newsVar = 0;
     <%
      Iterator it=col.iterator();
      EScheduleDto dto=null;
      int i=0;
      while(it.hasNext()){
       dto=(EScheduleDto) it.next();
     %>
     scroll_content[<%=i++%>]='<a href="javascript:refreshleftmenu(\'4\',\'4021\',\'/edoas2/shiwuchuli/opentheschedule?id=<%=dto.getEId()%>\');"><font style="font-size:10pt; text-decoration:none; color:red"><%=dto.getETitle()%></font></a>';
     <%
      }
     %>
     </SCRIPT>
     <SCRIPT>startscroll();</SCRIPT>
     </DIV>
17:52  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
5月15日
替换html代码
res = res.replaceAll("&", "&amp;");
res = res.replaceAll("<", "&lt;");
res = res.replaceAll(">", "&gt;");
res = res.replaceAll("'", "&apos;");
res = res.replaceAll("\"", "&quot;");
res = res.replaceAll("\n", "<br/>");
res = res.replaceAll("\r", "");
res = res.replaceAll(" ", "&nbsp;");
10:59  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
5月5日
痛苦的五一假期
 今天已经是五月五号了 已经加了3天班了 正经就五月一号和三号给我们休息 三号还是应为公司停电,要不然也要加班 。 别人加班要给三薪 我们加班一顿丽华快餐就给打发了 哎 苦命~
  一号那天在家好好的休息了一天 已经好长时间没有在家休息了 偶尔在家休息一天还有点不太习惯  已经习惯了这种天天加班的生活 真不明白 为什么 “程序员”=“加班” 这个公式是谁发明的
 二号在公司加了一天班 到了晚上跟几个同事去参加第二天另一个同事的婚礼,做了三个多小时的车才到( 好远呀 快到河北了) 第一次看到农村的婚礼原来是这样大家在家里吃吃喝喝的也挺爽的 跟她同事玩了一宿牌 等着明天参加婚礼 嘿嘿!
 三号 早上4点跟同事去接新娘 到了路上我才知道 原来我是“伴郎” 晕!~ 没有一点准备 只好赶鸭子上架了 到了新娘家跟同事去娶亲 原来这是个体力活 需要良好的身体素质才能把门打开 还好新郎身材比较魁梧 (忽然想到了自己 ,现在开始每天锻炼身体 ,为将来做准备 嘿嘿) 废了好大的力气和很多红包 总算把门打开了 回到新郎家开始举行婚礼 干了一个非常丢人的事 司仪说送亲的把手举起来 我居然把手抬的那么高 晕 我是伴郎 因该事娶亲的呀 天呀~ 我得脸当时都不知道事什么颜色的了 (红里透着紫)太丢人了 在回来的路上同事笑了我一路 这次没有经验下次估计就好了
 四号 在郁闷无奈中加了一天的班
 五号 上午干的还不错 实现了不少功能 中午吃完饭 忽然很郁闷不知道怎么回事就想跟别人聊聊,也不知道跟谁聊好 就上来写写 想想自己一个人要是不加班还真不知到 该去干什么 (只能这么安慰自己)
13:55  |  固定链接 | 引用通告 (0) | 记录它
ANT安装、配置

ANT安装、配置

内容摘要:
ant是一个基于JAVA的自动化脚本引擎,脚本格式为XML。除了做JAVA编译相关任务外,ANT还可以通过插件实现很多应用的调用。


ANT的基本概念:
ANT的安装:解包,设置路径
ANT的使用:最好的学习只不过是一个简单实用的例子起步……
ANT的基本概念:Java的Makefile
当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。


每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项目可能需要有以下任务。

任务1:usage 打印本脚本的帮助信息(缺省)
任务2:clean <-- init 清空初始化环境
任务3:javadoc <-- build <-- init 生成JAVADOC
任务4:jar <-- build <-- init 生成JAR
任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc
而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。

注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。
ANT的安装
解包后在系统可执行路径中加入指向ant的bin的路径就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin

这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任务,比如: build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。


ANT的使用

最好的学习过程就是看懂那些open source项目中的build.xml脚本,然后根据自己的需要简化成一个更简单的,ANT和APACHE上很多非常工程派的项目:简单易用,而且适应性非常强,因为这些项目的建立往往来源于开发人员日常最直接的需求。
以下是的一个WebLucene应用的例子:修改自JDOM的build.xml:

<project default="usage" basedir=".">

<!-- =================================================================== -->
<!-- Initialization target -->
<!-- =================================================================== -->
<target name="init">
<tstamp/>
<property file="${basedir}/build.properties" />
<property name="Name" value="ProjectFullName"/>
<property name="name" value="project_name"/>
<property name="version" value="0.2"/>
<property name="year" value="2003"/>

<echo message="----------- ${Name} ${version} [${year}] ------------"/>

<property name="debug" value="off"/>
<property name="optimize" value="on"/>
<property name="deprecation" value="on"/>

<property name="src.dir" value="./src/WEB-INF/src"/>
<property name="lib.dir" value="./src/WEB-INF/lib"/>
<property name="packages" value="com.chedong.*,org.apache.lucene.*"/>

<property name="build.src" value="./src/WEB-INF/build"/>
<property name="build.dest" value="./src/WEB-INF/classes"/>
<property name="build.javadocs" value="./src/doc"/>

<path id="classpath">
<pathelement path="${jsdk_jar}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>

<filter token="year" value="${year}"/>
<filter token="version" value="${version}"/>
<filter token="date" value="${TODAY}"/>
<filter token="log" value="true"/>
<filter token="verbose" value="true"/>
</target>

<!-- =================================================================== -->
<!-- Help on usage -->
<!-- =================================================================== -->
<target name="usage" depends="init">
<echo message="${Name} Build file"/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
<echo message=" available targets are:"/>
<echo message=""/>
<echo message=" jar --> generates the ${name}.jar file"/>
<echo message=" build --> compiles the source code"/>
<echo message=" javadoc --> generates the API documentation"/>
<echo message=" clean --> cleans up the directory"/>
<echo message=""/>
<echo message=" Please rename build.properties.default to build.properties"/>
<echo message=" and edit build.properties to specify JSDK 2.3 classpath."/>
<echo message=""/>
<echo message=" See the comments inside the build.xml file for more details."/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
<echo message=""/>
</target>

<!-- =================================================================== -->
<!-- Prepares the source code -->
<!-- =================================================================== -->
<target name="prepare-src" depends="init">
<!-- create directories -->
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>

<!-- copy src files -->
<copy todir="${build.src}">
<fileset dir="${src.dir}"/>
</copy>
</target>

<!-- =================================================================== -->
<!-- Compiles the source directory -->
<!-- =================================================================== -->
<target name="build" depends="prepare-src">
<javac srcdir="${build.src}"
destdir="${build.dest}"
debug="${debug}"
optimize="${optimize}">
<classpath refid="classpath"/>
</javac>
</target>

<!-- =================================================================== -->
<!-- Creates the class package -->
<!-- =================================================================== -->
<target name="jar" depends="build">
<jar jarfile="${lib.dir}/${name}.jar"
basedir="${build.dest}"
includes="**"/>
</target>

<!-- =================================================================== -->
<!-- Creates the API documentation -->
<!-- =================================================================== -->
<target name="javadoc" depends="build">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}"
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
<classpath refid="classpath"/>
</javadoc>
</target>

<!-- =================================================================== -->
<!-- Clean targets -->
<!-- =================================================================== -->
<target name="clean" depends="init">
<delete dir="${build.src}"/>
<delete dir="${build.dest}/org"/>
<delete dir="${build.dest}/com"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.class"/>
</delete>
</target>
</project>
<!-- End of file -->

缺省任务:usage 打印帮助文档,告诉有那些任务选项:可用的有build, jar, javadoc和clean.

初始化环境变量:init
所有任务都基于一些基本环境变量的设置初始化完成,是后续其他任务的基础,在环境初始化过程中,有2点比较可以方便设置:

1 除了使用却缺省的property设置了JAVA源路径和输出路径外,引用了一个外部的build.properties文件中的设置,
<property file="${basedir}/build.properties" />
这样大部分简单配置用户只要会看懂build.properties就可以了,毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。

2 CLASSPATH设置:使用了其中的:
<path id="classpath">
<pathelement path="${jsdk_jar}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
则相当于设置了:CLASSPATH=/path/to/resin/lib/jsdk23.jar; /path/to/project/lib/*.jar;

文件复制:prepare-src
创建临时SRC存放目录和输出目录。
<!-- =================================================================== -->
<!-- Prepares the source code -->
<!-- =================================================================== -->
<target name="prepare-src" depends="init">
<!-- create directories -->
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>

<!-- copy src files -->
<copy todir="${build.src}">
<fileset dir="${src.dir}"/>
</copy>
</target>

编译任务:build
编译时的CLASSPATH环境通过一下方式找到引用一个path对象
<classpath refid="classpath"/>

打包任务:jar
对应用打包生成项目所写名的.jar文件
<!-- =================================================================== -->
<!-- Creates the class package -->
<!-- =================================================================== -->
<target name="jar" depends="build">
<jar jarfile="${lib.dir}/${name}.jar"
basedir="${build.dest}"
includes="**"/>
</target>

生成JAVADOC文档任务: javadoc
<!-- =================================================================== -->
<!-- Creates the API documentation -->
<!-- =================================================================== -->
<target name="javadoc" depends="build">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}"
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
<classpath refid="classpath"/>
</javadoc>
</target>

清空临时编译文件:clean
<!-- =================================================================== -->
<!-- Clean targets -->
<!-- =================================================================== -->
<target name="clean" depends="init">
<delete dir="${build.src}"/>
<delete dir="${build.dest}/org"/>
<delete dir="${build.dest}/com"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.class"/>
</delete>
</target>

TODO:
更多任务/扩展:(样例)

测试任务:JUnit测试
代码风格检查任务:CheckStyle,Jalopy等
邮件警报任务:可以把以上这些任务的输出警告发送到制定的用户列表中,这个任务可以设置每天自动运行。

13:25  |  固定链接 | 引用通告 (0) | 记录它 | JAVA学习
4月29日
《短歌行》


对酒当歌,人生几何?譬如朝露,去日苦多。
概当以慷,忧思难忘。何以解忧?唯有杜康。
青青子衿,悠悠我心。但为君故,沈吟至今。
呦呦鹿鸣,食野之苹。我有嘉宾,鼓瑟吹笙。
明明如月,何时可掇?忧从中来,不可断绝。
越陌度阡,枉用相存。契阔谈咽,心念旧恩。
月明星稀,乌鹊南飞。绕树三匝,何枝可依。
山不厌高,海不厌深,周公吐哺,天下归心。
13:20  |  固定链接 | 引用通告 (0) | 记录它
4月24日
SQLServer和Oracle常用函数对比
数学函数
  1.绝对值
  S:select abs(-1) value
  O:select abs(-1) value from dual

  2.取整(大)
  S:select ceiling(-1.001) value
  O:select ceil(-1.001) value from dual

  3.取整(小)
  S:select floor(-1.001) value
  O:select floor(-1.001) value from dual

  4.取整(截取)
  S:select cast(-1.002 as int) value
  O:select trunc(-1.002) value from dual

  5.四舍五入
  S:select round(1.23456,4) value 1.23460
  O:select round(1.23456,4) value from dual 1.2346

  6.e为底的幂
  S:select Exp(1) value 2.7182818284590451
  O:select Exp(1) value from dual 2.71828182

  7.取e为底的对数
  S:select log(2.7182818284590451) value 1
  O:select ln(2.7182818284590451) value from dual; 1

  8.取10为底对数
  S:select log10(10) value 1
  O:select log(10,10) value from dual; 1

  9.取平方
  S:select SQUARE(4) value 16
  O:select power(4,2) value from dual 16

  10.取平方根
  S:select SQRT(4) value 2
  O:select SQRT(4) value from dual 2

  11.求任意数为底的幂
  S:select power(3,4) value 81
  O:select power(3,4) value from dual 81

  12.取随机数
  S:select rand() value
  O:select sys.dbms_random.value(0,1) value from dual;

  13.取符号
  S:select sign(-8) value -1
  O:select sign(-8) value from dual -1

  14.圆周率
  S:SELECT PI() value 3.1415926535897931
  O:不知道

  15.sin,cos,tan 参数都以弧度为单位
  例如:select sin(PI()/2) value 得到1(SQLServer)

  16.Asin,Acos,Atan,Atan2 返回弧度

  17.弧度角度互换(SQLServer,Oracle不知道)
  DEGREES:弧度-〉角度
  RADIANS:角度-〉弧度

数值间比较

  18. 求集合最大值
  S:select max(value) value from
  (select 1 value
  union
  select -2 value
  union
  select 4 value
  union
  select 3 value)a

  O:select greatest(1,-2,4,3) value from dual

  19. 求集合最小值
  S:select min(value) value from
  (select 1 value
  union
  select -2 value
  union
  select 4 value
  union
  select 3 value)a

  O:select least(1,-2,4,3) value from dual

  20.如何处理null值(F2中的null以10代替)
  S:select F1,IsNull(F2,10) value from Tbl
  O:select F1,nvl(F2,10) value from Tbl

  21.求字符序号
  S:select ascii('a') value
  O:select ascii('a') value from dual

  22.从序号求字符
  S:select char(97) value
  O:select chr(97) value from dual

  23.连接
  S:select '11'+'22'+'33' value
  O:select CONCAT('11','22')  33 value from dual

23.子串位置 --返回3
  S:select CHARINDEX('s','sdsq',2) value
  O:select INSTR('sdsq','s',2) value from dual

  23.模糊子串的位置 --返回2,参数去掉中间%则返回7
  S:select patindex('%d%q%','sdsfasdqe') value
  O:oracle没发现,但是instr可以通过第四个参数控制出现次数
  select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

  24.求子串
  S:select substring('abcd',2,2) value
  O:select substr('abcd',2,2) value from dual

  25.子串代替 返回aijklmnef
  S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
  O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

  26.子串全部替换
  S:没发现
  O:select Translate('fasdbfasegas','fa','我' ) value from dual

  27.长度
  S:len,datalength
  O:length

  28.大小写转换 lower,upper

  29.单词首字母大写
  S:没发现
  O:select INITCAP('abcd dsaf df') value from dual

  30.左补空格(LPAD的第一个参数为空格则同space函数)
  S:select space(10)+'abcd' value
  O:select LPAD('abcd',14) value from dual

  31.右补空格(RPAD的第一个参数为空格则同space函数)
  S:select 'abcd'+space(10) value
  O:select RPAD('abcd',14) value from dual

  32.删除空格
  S:ltrim,rtrim
  O:ltrim,rtrim,trim

  33. 重复字符串
  S:select REPLICATE('abcd',2) value
  O:没发现

  34.发音相似性比较(这两个单词返回值一样,发音相同)
  S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
  O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
  SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
  返回0-4,4为同音,1最高

日期函数
  35.系统时间
  S:select getdate() value
  O:select sysdate value from dual

  36.前后几日
  直接与整数相加减

  37.求日期
  S:select convert(char(10),getdate(),20) value
  O:select trunc(sysdate) value from dual
  select to_char(sysdate,'yyyy-mm-dd') value from dual

  38.求时间
  S:select convert(char(8),getdate(),108) value
  O:select to_char(sysdate,'hh24:mm:ss') value from dual

39.取日期时间的其他部分
  S:DATEPART 和 DATENAME 函数 (第一个参数决定)
  O:to_char函数 第二个参数决定

  参数---------------------------------下表需要补充
  year yy, yyyy
  quarter qq, q (季度)
  month mm, m (m O无效)
  dayofyear dy, y (O表星期)
  day dd, d (d O无效)
  week wk, ww (wk O无效)
  weekday dw (O不清楚)
  Hour hh,hh12,hh24 (hh12,hh24 S无效)
  minute mi, n (n O无效)
  second ss, s (s O无效)
  millisecond ms (O无效)
  ----------------------------------------------

  40.当月最后一天
  S:不知道
  O:select LAST_DAY(sysdate) value from dual

  41.本星期的某一天(比如星期日)
  S:不知道
  O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

  42.字符串转时间
  S:可以直接转或者select cast('2004-09-08'as datetime) value
  O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

  43.求两日期某一部分的差(比如秒)
  S:select datediff(ss,getdate(),getdate()+12.3) value
  O:直接用两个日期相减(比如d1-d2=12.3)
  SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

  44.根据差值求新的日期(比如分钟)
  S:select dateadd(mi,8,getdate()) value
  O:SELECT sysdate+8/60/24 vaule FROM DUAL;

  45.求不同时区时间
  S:不知道
  O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

  -----时区参数,北京在东8区应该是Ydt-------
  AST ADT 大西洋标准时间
  BST BDT 白令海标准时间
  CST CDT 中部标准时间
  EST EDT 东部标准时间
  GMT 格林尼治标准时间
  HST HDT 阿拉斯加?夏威夷标准时间
  MST MDT 山区标准时间
  NST 纽芬兰标准时间
  PST PDT 太平洋标准时间
  YST YDT YUKON标准时间