论坛上关于测试的帖子很多,而且有一部分是一些大牛写的,看得也比较有感触.在这一个帖子里面主要谈一下,自己关于测试的一些理解. 还是从我目前所处项目组的情况说起吧,整个项目开发的架构是从DAO层-BS层-BIZ层-Action展现层,典型的J2EE分层的结构,从名字中就可以看得出DAO层是只对数据库进行操作的,BS层主要处理大量的业务方法,而BIZ层是干什么用的呢?其实BIZ主要是负责事务管理和用户的权限控制的;另外,Action当然是表示层的东西啦,搞java开发的地球人都听说过这一个称谓。在这里,并不想评论公司开发的架构的思想怎样怎样,毕竟论坛里面已讨论了N次,在这里只是想把自身对单元测试 ...
2008-01-14

The Contract for Equality[java]

关键字: equality
As we Know,The Java API documentation for the equals method in Object provides a list of what defines an equivalence relation between two objects: Reflexivity: x.equals(x) Symmetry: x.equals(y) if-and-only-if (iff) y.equals(x) Transitivity: if x.equals(y) and y.equals(z), then x.equals(z) Consi ...
善用多态来改善你的switch语句 下面举的这一个例子,其实和<<重构>>第一章里面的那一个经典实例很像的,<<重构>>一本书绝对是一本好书,非常不错值得推荐的一本书。 举一个例子,是我现在的一个项目里面一位同事写的一小段代码,代码如下,它可以根据不同的操作符进行加减乘除方面的操作,而且这一些操作很有可能发生一些变化。当重构成我的现在每天的面包和水的时候,我看到switch语句,就想能不能把改良一下。虽然改善后,代码量是增加,但从可维护的角度来讲,我个人认为还是值得的,特别在你需要的操作的Switch语句里面很有可能发生需求变化的时候。 pri ...
大家都清楚Spring的AOP方面工作是很优秀,但是其内在的基础的东西,还是有一大部分不太了解的,其AOP大量用了ThreadLocal,这一个在前面已做了介绍了,还有一个比较重要的怎样用动态代理组装成AOP. 说到动态代理,有两种情况,第一种是有接口的情况下,你可以选择为jdk自带的动态代理的方式来编写程序,但你想要为一个实在的类编写动态代理的方式的话,这时候就必须选择一些开源的lib包啦.spring和hibernate选择了同样的CGlib包,具体表现在:Hibernate主要是利用cglib生成pojo的子类并override get方法来实现lazy loading机制,Sp ...
url传递中文参数笔录 我们在处理一些遗留系统的时候,通常有可能遇到处理有一些链接是带有中文,而且是传递到另一个页面的,而这另一个页面有可能把拿到的数据放到数据库中去,这时候往往会造成乱码的问题,特别在不同的系统的时候更是如此. 假定,我们现在有一个name的参数,能通过"/pages/a.jsp?name=博客"传递到下一个页面,这时候,我们可以这样做: 1、首先用JS的encodeURI的方法作一些转换,如下 passName = encodeURI(name); 转换之后的字符会产生一些"%"字符,而这一些字符在URL的时候通常是不能传递的,或者通常出问题的;所以我下一 ...
2007-12-05

小心给servlet忽悠了

关键字: servlet
你真的会写线程安全的servlet吗? 很多人认为servlet随便怎样写可以的,反正是线程安全的,没有什么关系的.那我们来看看下面的这一个例子吧. 首先要看一下小段的servlet代码,如下: public class Test extends HttpServlet { String name; protected void doPost (HttpServletRequest req, HttpServletResponse res) { name = req.getParameter("name"); ...
如果有看到spring的一些源码的同学都知道,ThreadLocal对象在spring几乎在每一个重要的类的都存在其身影。到底ThreadLocal是有什么用的呢,让我们来揭开其面纱吧。 假如某一个对象是非线程安全的,在多线程的环境下,对对象的访问则须采用synchronized或lock/unlock进行线程同步,采用这样的方法限制了并发的访问,会带来比较大的性能损失.当然,我们可以在无须同步的的情况下,来化解线程安全的问题---就是采用ThreadLocal. 其实可以把ThreadLocal看成一个线程的局部变量,我们可以通过ThreadLocal为每一个线程提供了单独的 ...
2007-11-23

体会Observer/Observable模式

关键字: Observer/Observable模式
在现在的项目中,后台有一块程序感觉用Observer/Observable模式比较好一些,所以和同事就写这样一个很简单的demo出来,记录下来,当作记录吧。里面的用到的API是Doug Lea这一大牛写的concurrent包,已经成为了java1.5的标准库了。但我们只能1.4的JDK,所以用concurrent包来代替实现同样的功能。 有一个Pojo类如下: public class Account { private int numOne; private int numTwo; private int sum; public int getNumOne( ...
对于Java 5.0多线程编程的学习,可以参考一下网上的下面的几篇文章: Java 5.0多线程编程(sun公司的文章,很值得一看) http://gceclub.sun.com.cn/Concurrency/Java5_Multi_Thread.html 还有一篇The Java Tutorials的文章. http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html 还有就是--> 学习笔记 - java.util.concurrent 多线程框架: http://www.ismayday.com/? ...
2007-11-06

关于ClassLoader工作机制小记

关键字: 基础
类装载器就是寻找类或接口字节文件进行解析并构造JVM内部对象表示的组件. 在java中,类装载器把一个类装入JVM中,要经过如下的步骤: 引用1、装载:查找和导入CLass文件 2、链接:执行校验(检查载入Class文件数据的正确性),准备(给类的静态变量分配存储空间)和解析(将符号引用转成直接引用)步骤, 其中解析步骤是可以选择的。 3、初始化:对类的静态变量,静态代码块执行初始化工作。 类装载工作是由classloader及其子类负责,classLoader是一个重要的java运行时系统组件,它负责在运行时查找和装入Class字节文件。 JVM在运行的时候会产生三个c ...
2007-11-04

web应用程序开发须注意私自启动线程的问题

关键字: 私自启动线程的问题
web应用程序开发注意私自启动线程的问题 我们知道静态变量是ClassLoader级别的,如果Web应用程序停止掉,这些静态变量也会从JVM中清除.但是线程则是JVM级别的,如果用户在Web应用中启动一个线程,这个线程的生命周期并不会和Web应用程序操持同步.也就是,即使停止了Web应用,这个线程还是活跃的.正是因为这个很隐晦的问题,所以很多有经验的开发不太赞成在Web程序中私自启动线程.举例: public class Test implements ServletContextListener { private Timer timer; public void context ...
2007-10-25

interrupt方法点滴记录

关键字: 线程
1、sleep方法与interrupt方法 假如线程A像下面这样,使用线程的sleep()方法暂停着. Thread.sleep(10000);这时候线程B,会执行下面的语句,要求B放弃等待操作. a.interrupt(); //a是线程A的实例 在这里使用的interrupt方法,是Thread类的实例方法.执行interrupt方法时,并不需要获取Thread实例的锁定.任何线程在任何时刻,都可以调用其他线程interrupt方法. 当sleep中的线程被调用interrupt方法时,就会放弃暂停的状态.并抛出InterruptedException.丢出异常的,是A线程. 2、w ...
2007-10-23

wait方法是在什么时候结束

关键字: Thread
wait方法是在什么时候结束 1、当notify方法执行时 对obj调用notify方法,线程被唤醒时. 2、当notifyAll方法执行时 notifyAll 会把实例的等待区里所有的线程全部唤醒。无论是notify还是notifyALl,线程被唤醒后,还是要重新获取obj的锁定。 3、当interrupt方法执行时 被interrupt时,等待区里的线程会重新获取obj的锁定,并抛出InterruptedException异常。 notify、notifyAll两个方法是对实例调用的,而interrupt则是对线程调用的。 4、发生timeout的时候 ...
2007-10-18

synchronized 笔记

关键字: Thread
synchronized 笔记 1、synchronized实例方法 synchronized void method(){ ... } 在功能上,它相当于 void method() { synchronized (this) { ... } } 2、synchronized类方法 class Something { static synchronized void method(){ ... } } 在功能上,它相当于 class Something { static void method() { ...
选择notify的话,因为要唤醒的线程比较少,程序处理速度当然比notifyAll高出一些. 但选择notify的时候,若这部分处理得不好,可能会有程序挂掉的危险性。一般来说,选择notifyAll所写出来的程序代码会比选择notify可靠。 除非你能确定程序员对程序代码的意义和能力限度一清二楚,否则选择notifyAll应该更稳妥一些。 参考:Java多线程设计模式 P34
2007-09-04

有趣而简单的两段代码

关键字: agile java
假如你想写一个小程序,保证字符串首尾两个字符是一样的,你可以如下实现: public static boolean isPalindrome(String string) { for (int forward = 0, backward = string.length() - 1; forward < string .length(); forward++, backward--) if (string.charAt(forward) != string.charAt(backward)) return false; return true; ...
举下面一段代码: public\\s+void\\s+test\\w*\\s*\\(\\s*\\)\\s*\\{ 解析的过程如下: 匹配文本"public" public 匹配一个或多个空白符 \\s+ 匹配文本"void" void 匹配一个或多个空白符 \\s+ 匹配文本"test" test 匹配0或多个单词字符 \\w* 匹配0个或多个空白符 \\s* 匹配一个左括号 \\( 注:你必须转义括号与大括号字符 匹配0个或多个空白符 ...
在论坛里看到一个帖子,是Godlikeme在这一个帖子写的 http://www.javaeye.com/topic/101025 里面写的内容 自己本也想写一篇短短关于eclipse快捷键的文章,看到他人的好文章,感觉差不多就不太想写了,引用一下,如下所示: 引用ctrl+shift+o,ctrl+shift+m刚开始使用eclipse发现得最好用得功能。 ctrl+d,ctrl+shift+down,删除,复制几行代码可以不用鼠标的。 ctrl+shift+r,看到还有人还在左边列表里翻来翻去,不晕么,找个文件得半分钟。 ctrl+shift+t,一用便知。 ctrl+o,ct ...
2007-06-16

线程间通信一小例学习

关键字: 复习笔记
wait:告诉线程放弃监视器并进入睡眠状态,直到其他线程进入同一监视器并调用notify为止 notify:唤醒同一对象监视器中调用wait的第一个线程,用于类似饭馆有一个空位后通知所有等候就餐顾客中的第一位可以入座的情况. notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行. 看下面的步骤: Thread t --> synchronized(o)--->o.wait()--->o.notify 1、新建一个线程t 2、线程t得到对象o的lock旗标 3、此时线程t被放置在对象o的等待线程池中,t自动释放o的锁旗标 4、当另外的线程执行了对 ...
2007-01-15

非常简单的mysql的BlobTest实例

关键字: Blob java
看一下代码就清楚啦,没有什么废话: package org.mmc.dao.impl; import java.io.*; import java.sql.*; /** *测试操作blob数据 */ public class BlobTest { Connection con=null; /** *往数据库中添加BLOB数据 */ public void addBlob() { try { //创建一个PreparedStatement实例 PreparedStatement pstmt= ...
DAO模式的异常的处理 DAO执行的是数据库访问操作,可能抛出底层的SQLException,而底层的通常不应该暴露给客户端,DAO应该负责捕捉这些底层的异常,而不应该把数据库访问殿堂拆散到业务逻辑层,让业务逻辑层处理数据库异常.关于DAO对象的异常处理,通常推荐如下: 1、DAO方法应该抛出有意义的业务逻辑异常. 2、DAO方法不应该抛出java.lang.Exception异常,这一个异常太大了,业务层很难准确地捕捉到这一个异常。 3、DAO不应该抛出数据访问异常,如SQLException。数据库访问异常是底层异常,不应该扩散到业务层,DAO应用封装数据库访问异常,然后抛出封 ...
2006-12-30

利用servlet生成简单的验证码

关键字: servlet 验证码
在web.xml配置: <servlet> <servlet-name>image</servlet-name> <servlet-class>org.test.web.AuthImage</servlet-class> </servlet> <servlet-mapping> <servlet-name>image</servlet-name> <url-pattern>/authImage</url-pattern> ...
2006-11-30

实战篇:设计自己的Annotation

关键字: java基础
Annotation在java的世界正铺天盖地展开,有空写这一篇简单的annotations的文章,算是关于Annotation入门的文章吧,希望能各位们能抛砖,共同学习...... 不讲废话了,实践才是硬道理. 第一部分:了解一下java1.5起默认的三个annotation类型: 一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。 一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上. 一个是@SuppressWarnings:这一个类型可以来暂时把一些 ...
在Ubuntu搭建java开发环境 这里的说的java开发环境,以搭建eclipse3.2.1为主题. 1、安装好Ubuntu系统;安装的时候强烈建议连接上网,它会自动下载语言包,自动装上五笔,拼音,还有会默认把firefox浏览器设置为中文. 安装Ubuntu比windows系统一个比较爽地方就是安装可以一边上网浏览,还可以试用一下Ubuntu的功能。 2、配置Ubuntu环境:添加源,更新软件信息,升级内核 可以参考网上的一篇文章: http://hi.baidu.com/myownroom/blog/category/Linux 3、安装jdk软件包 ...
算法程序题:该公司笔试题就1个,要求在10分钟内作完。题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。下面的代码是网上的一位老兄写的,值得参考一下:上面的程序还可以改进一下的,各位有时间可以想一想.   import java.util.Iterator;    import java.util.TreeSet; ...
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。我选了一些比较常用的项目做简单介绍。文中用了很多网上现成的东西,我只是做了一个汇总整理。   Commons BeanUtils http://jakarta.apache.org/commons/beanutils/index.html 说明:针对Bean的一个工具集。由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。 使用示例:功能有很多,网站上有详细介绍。一个比较常用的功能是Bean&nb ...
     解决的办法简单,在"开始"-->"运行"---->打入"cmd"进入命令提示行后,再进入eclipse的安装目录,然后输入eclipse -clean即可.    
一. Input和Output1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型:1.1 以字节为导向的stream以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:1) input stream:1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用2) StringB ...