MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1,基本写法
<body>
    <link rel="STYLESHEET" type="text/css" href="css/dhtmlxtree.css">
    <script  src="js/dhtmlxcommon.js"></script>
    <script  src="js/dhtmlxtree.js"></script>
    <div id="treeboxbox_tree"></div>
    <script type="text/javascript">
  tree=new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);
  tree.attachEvent("onClick",onNodeSelect);
  tree.setImagePath("images/tree/");
  tree.setXMLAutoLoading("dept.do?action=folder_treeview");//逐级展开
  tree.loadXML("dept.do?action=folder_treeview&id=1");//初始化
  function onNodeSelect(nodeId){
      document.getElementById("parent_folder_id").value = nodeId;
  }
    </script>
</body>


2,初始化需要的xml,必须带item
<?xml version='1.0' encoding='utf-8'?>
<tree id="0">
<item nocheckbox="1" open="1" id="-1" select="0" text= "公司" >
<item  open="1" child="1"  text= "财务部" id= "1"></item>
<item  open="1" child="0"  text= "技术部" id= "2"></item>
<item  open="1" child="0"  text= "人事部" id= "4"></item>
</item>
</tree>
注意<tree>里的id的值必须和dhtmlXTreeObject的第4个参数的值保持一致,否则会报错:
Error type: DataStructure
Description: XMLrefferstonotexistingparent

3,逐级展开的xml
<?xml version="1.0" encoding="utf-8"?><tree id="3">
<item  open="1" text= "甲部门" id= "5" ></item>
<item  open="1" text= "乙部门" id= "6" ></item>
</tree>

4,child属性表示是否有子级

posted @ 2009-01-15 23:58 leekiang 阅读(1635) | 评论 (0)编辑 收藏

Sun的JVM用下列方法可以产生Thread Dump堆栈信息:

1,Solaris OS
<ctrl>-’\’ (Control-Backslash)
 kill -QUIT <pid>

2, HP-UX/UNIX/Linux
Kill -3 PID 
PID通过下面方法获取
ps -efHl | grep 'java' **. **

3,Windows
直接对MSDOS窗口的程序按Ctrl-break

有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在 weblogic启动的时候,最好将其标准输出重定向到一个文件,用"nohup sh startWebLogic.sh > start.log &"命令,执行"kill -3 <pid>",Stack trace就会输出到start.log里。Tomcat的Thread Dump会输出到命令行控制台或者logs的catalina.out文件里。为了反映线程状态的动态变化,需要接连多次做thread dump,每次间隔10-20s。

Sun JVM的常见线程状态

对于thread dump信息,主要关注的是线程的状态和其执行堆栈
线程的状态一般为三类
Runnable(R):当前可以运行的线程
Waiting on monitor(CW):线程主动wait
Waiting for monitor entry(MW):线程等锁
一般关注的都是第一和第三种状态的线程
Cpu很忙则关注runnable的线程
Cpu闲则关注waiting for monitor entry的线程
一种典型的死锁是由于在server端应用(比如servlet)中请求由同一weblogic实例server的资源
解决办法就是将该servlet放到另外的执行队列里去执行


来源:http://www.searchfull.net/blog/2007/04/10/1176207938784.html

Thread Dump Analyzer 主页:https://tda.dev.java.net/

posted @ 2009-01-14 14:29 leekiang 阅读(1574) | 评论 (0)编辑 收藏

利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码)
(1)jmap -dump:file=heap_file_name pid 会产生一个heap_file_name文件
(2)jhat heap_file_name,然后打开浏览器http://localhost:7000/ 浏览。
   可看到里面显示了运行的所有的类和实例及大小。平台(例如tomcat)的不会包括在里面。
(3)如果觉得不够,还可以把heap_file_name文件加一个bin的后缀,然后让Eclipse MAT来分析。看这里
另外
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt  pid 如:查看2788的MaxPerm大小可以用  jinfo -flag MaxPermSize 2788。
jstat 也很有用,说明见这里


3,
SUN JDK所支持的典型选项以及说明:http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp 上面有很多选项
-XX:-HeapDumpOnOutOfMemoryError 从jdk1.4.2 update 12 和java 5 update 7开始支持这个选项。

4,
关于jmap
从JDK 5开始,SUN JDK开始提供JMap的工具。但是仅仅是实验性质的,而且只有在solaris平台上有。
后来Jmap被反向移植到jdk 1.4.2_09。因为是实验性质,所以jmap可能会出现dump失败的情况。
但是自从JDK 6之后,jmap的稳定性和可用性都没问题了。请注意各个版本的jvm都要用自己版本的jmap,
而jhat可以用于分析各个版本的jmap dump出来的文件。至于jhat用于分析1g以上的dump文件,
我们有过多次在笔记本上的成功经历,它对内存的要求可能并没有那么高。
http://space.itpub.net/27378/viewspace-521225

5,J2SE6中使用jhat来分析内存堆
http://hi.baidu.com/tister/blog/item/e7374482f4341ca70cf4d2e8.html

6,Java内存溢出(OutOfMemory),内存分析相关工具
http://uglytroll.ycool.com/post.3046111.html

7,JDK中的好工具 jmap、jhat
http://wangzaixiang.blogspot.com/2008/10/jdk-jmapjhat.html
http://hi.baidu.com/zeorliu/blog/item/4f38989413601719d21b70d5.html

8,SAP贡献给eclipse基金会的MemoryAnalyzer,原来叫Java Memory Analysis
能分析几G的Memory Dump而不会内存溢出?
http://www.eclipse.org/mat/
可惜还是只支持jdk1.4.2 update 12 和java 5 update 7以上

9,在一个方法里面的变量是不会引起内存泄露的。
内存泄露都是发生在类变量和实例变量(且此实例被缓存、如单例模式)里。
我建议你从HashMap、HashMap$Entry 入手查查。
我也研究过一阵子的内存泄露问题,最终解决了。
http://www.javaeye.com/topic/233080

10,你遇到的是最理想的情况,但有时候,这种方法不能找到原因,只找到造成崩溃的点.就好比,
一个HTTP 请求,没有设置超时(对不起,默认是不超时,不知道为什么SUN要这样设定),
然后这条线程就卡在这里了,然后,这条线程里的一个堆栈被另一条线程放入内容,
本来这些内容就是要这条闲线程去处理的,但是现在,这条线程卡住了,但是用你说的这种方法,
绝对找不到造成内存泄露的原因是因为http不超时,一直卡在那里.

我还有一个笨办法做精细的内存分配比较:就是定期用pmap命令dump出来JVM进程的内存映射表,然后diff。
http://www.javaeye.com/topic/256701

11,http://calvin.javaeye.com/blog/91903
 java 不是有垃圾收集器了吗?怎么还泄漏啊,唬我啊??
   嗯,此泄漏非比泄漏。C/C++的泄漏,是对象已不可到达,而内存又没有回收,真正的内存黑洞。
   而Java的泄漏,则是因为各种原因,对象对应用已经无用,但一直被持有,一直可到达。
   总结原因无外乎几方面:

   1). 被生命周期极长的集合类不当持有,号称是Java内存泄漏的首因。
      这些集合类的生命周期通常极长,而且是一个辅助管理性质的对象,在一个业务事务运行完后,如果没有将某个业务对象主动的从中清除的话,这个集合就会吃越来越多内存,可以用WeakReference,如WeakHashMap,使得它持有的对象不增加对象的引用数。
   2). Scope定义不对,这个很简单了,方法的局部变量定义成类的变量,类的静态变量等。
   3). 异常时没有加finally{}来释放某些资源,JDBC时代也是很普遍的事情。
   4). 另外一些我了解不深的原因,如:Swing里的Listener没有显式remove;内部类持有外部对象的隐式引用;Finalizers造成关联对象没有被及时清空等。
 

搭车
我的SQL调优公式T=S/V
http://space.itpub.net/27378/viewspace-157789

MetaWidget及SOA
http://wangzaixiang.blogspot.com/2008/10/metawidget.html

posted @ 2009-01-14 14:18 leekiang 阅读(6053) | 评论 (2)编辑 收藏

1,Kwok Information Server is an open source IT management system
   http://www.kwoksys.com

2,《守、破、离》 是一种做事方式。或许,对于一个程序员来说,离是我们追求的境界,但守是我们应该先做好的。相信你可以对应的上,这里的守,便是前面提到的那些要固化下来 的内容。守不仅仅是一个简单的简化编码的方法,我们甚至可以把一些设计上的理念守下来,这样,做类似的应用,我们就不必从头再来。守的范围越大,离的层次 也就可以越高。

软件开发的发展,就是一个守的范围不端扩张的过程,操作寄存器的模式用高级程序设计语言的方式守了下来,一些良好的设计方法用设计模式的概念守了下来,一些好的编程习惯用最佳实践的方式守了下来……
http://dreamhead.blogbus.com/logs/33461687.html

3,正确认识数据冗余
 主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的 是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗 余),反对低级冗余(重复性冗余)。
http://itren.javaeye.com/blog/180385

4,MapReduce
是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(化简)",和他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。[1]  当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

你的编程语言可以这样做吗?(map/reduce的js示范)

http://www.todd-lee.com/blog/article.asp?id=174


5,TransactionInterceptor反编译后有MISSING_BLOCK_LABEL_76

6,AKBAR锡兰红茶

7,在Java上实现RESTful Web Services可用Jersey

8,外包网站 odesk,elance

posted @ 2009-01-12 20:06 leekiang 阅读(186) | 评论 (0)编辑 收藏

1,<spring:bind>是spring2.0以前的写法。
2,public ModelAndView login(HttpServletRequest request,
            HttpServletResponse response,HttpSession session,User user)
  public ModelAndView login(HttpServletRequest request,
            HttpServletResponse response,User user)
MultiActionController自动把最后一个参数当作Command对象。
也可以覆盖protected Object newCommandObject(Class clazz)方法,但这样每个 Controller的Command对象就是同一个iele,
同时要改为
public ModelAndView login(HttpServletRequest request,
            HttpServletResponse response,Object command)再对command造型
            
3,重定向写法
return new ModelAndView("redirect:/system/user.do?do=addUserForm");

4,有2个JsonView的,或者更适合Ajax,当然自己写一个JsonView都很简单
1) json-lib-ext-spring
http://sourceforge.net/projects/json-lib/files/
2) spring json view
http://spring-json.sourceforge.net/download.html
http://article.yeeyan.org/view/jdonee/10145

5, 绑定的基本写法
ServletRequestDataBinder binder = new ServletRequestDataBinder(obj);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(
                dateFormat, true));
        binder.setDisallowedFields(new String[]{"endtime"});
        binder.bind(request);

posted @ 2009-01-08 09:31 leekiang 阅读(298) | 评论 (0)编辑 收藏

1,为了尽量平稳过渡,继续用junit3.8,而不是直接使用junit4
2,@ContextConfiguration(locations = { "classpath:applicationContext-sys.xml",
        "classpath:applicationContext.xml" })
public class BaseTests extends AbstractTransactionalJUnit38SpringContextTests {
}
所有的TestCase都继承上面这个类,使得spring配置文件重用,同时ApplicationContext也是同一个。

3,要测试的service类通过@Autowired注入,例如
    @Autowired
    private UserDAO  userDAO;
    
4,注意,对于继承了BaseTests的测试类里的每一个test方法,运行测试时都会按
   setUp()-->test方法-->tearDown()的顺序执行,而且这3个组成一个事务,执行完后默认会回滚。
   如果不想回滚,在类名前面@TransactionConfiguration(defaultRollback = false)
   
5,因为还是用的junit3.8,故TestSuite的写法照旧
  public class SuiteTests {
    public static Test suite() {
        TestSuite suite = new TestSuite("运行所有测试");
        suite.addTestSuite(UserServiceTests.class);
        suite.addTestSuite(RoleServiceTests.class);
        return suite;
    }
}

6,测试类并没有当作bean配置在application.xml文件中,
   spring测试框架是如何使"setUp()-->test方法-->tearDown()"处于同一个事务的呢?
   具体就要看AbstractTransactionalJUnit38SpringContextTests了,是通过注解实现的。
   service方法在test方法里面,这两个方法都配置有事务,即形成了事务的嵌套,这里有点复杂了,我还没想清楚。
   不过可以肯定的是,如果test方法的事务不提交,那么service方法的事务也不会提交。
   
7,如果想在jdk1.4下重用ApplicationContext,可采用以下的办法,出处再补上。这个办法与前面的进行比较,
   我觉得最大的区别是这种写法要手动进行测试数据的清除。
public class BaseTestCase extends TestCase {
     static ApplicationContext context = null;

    static {
        // perform the "global" set up logic
        // 这里的代码会在类初始化时执行,所以相当于BeforeClass
        String[] CONFIG_FILES_MIN = { "applicationContext-sys.xml",
                "applicationContext.xml" };
        context = new ClassPathXmlApplicationContext(CONFIG_FILES_MIN);
        System.out.println("setup");

        // and now register the shutdown hook for tear down logic
        // 将一个匿名方法写到这里,就相当于AfterClass
        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                System.out.println("shutdown");
            }
        });
    }

    protected void setUp() throws Exception {
    }
}

8,如果用junit-4.jar,去官网下载junit4.4.jar。不要采用myeclipse自带的junit4.jar,因为这个不带JUnit4ClassRunner类。
   另外不要用junit-4.5.jar,据说与spring2.5有冲突,
   详见Spring Test Context Framework not compatible with JUnit 4.5,http://jira.springframework.org/browse/SPR-5145


9,String htmlContent = "<html><head></head><body>html content</body></html>";
String plainContent = "plain content";

MockMultipartHttpServletRequest req = new MockMultipartHttpServletRequest();
req.setContentType("multipart/form-data");
//req.addHeader("Content-type", "multipart/form-data");//这样写应该是一样的
req.setMethod("POST");
req.addFile( new MockMultipartFile("file","test1.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );
req.addFile( new MockMultipartFile("file","test2.html","text/html", htmlContent.getBytes( "US-ASCII" ) ) );
req.addFile( new MockMultipartFile("file","test.txt", "text/plain",plainContent.getBytes( "US-ASCII" ) ) );
assertTrue( ServletFileUpload.isMultipartContent( req ) );
int content_length = req.getContentLength();

10,AbstractTransactionalJUnit38SpringContextTests
    AbstractTransactionalSpringContextTests
    AbstractTransactionalDataSourceSpringContextTests
的区别?

11,MockHttpServletRequest的addParameter方法和setParameter的区别


参考:
详细讲解在Spring中进行集成测试
http://www.javaeye.com/topic/68185
http://www.google.cn/codesearch/p?hl=zh-CN#Vq-IOboH1tI/trunk/test/es/peerreview/service/TestPeerReviewSpring.java
用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试
http://code.google.com/p/anewssystem/source/browse/trunk/anewssystem/parent/core/src/main/java/anni/core/test/?r=105
http://docs.huihoo.com/spring/2.5.x/zh-cn/testing.html
http://arkxu.javaeye.com/blog/261679
http://www.ibm.com/developerworks/cn/java/j-cb06066.html
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-test/
基于mock对象和JUnit框架简化Spring Web组件单元测试
http://www.blogjava.net/calvin/archive/2005/09/21/13628.html
http://www.yybean.com/testing-framework-to-use-spring-integration-testing


posted @ 2009-01-04 18:13 leekiang 阅读(1895) | 评论 (0)编辑 收藏

1,做人、做事,做架构师——架构师能力模型解析

2,剑法三套,程序员也能挣大钱

posted @ 2008-12-29 22:57 leekiang 阅读(227) | 评论 (0)编辑 收藏

1,Junit测试Action
http://lyx.javaeye.com/blog/57037

2,在JUnit中多个testCase只执行一次setup和tearDown的方法

3,SoapUI当选最佳开源Web Services测试工具

4,通过Spring2.5对单元测试的Annotation支持进行TDD开发

5,sventon用于svn代码的在线浏览,其单元测试代码很规整。
http://svn.sventon.org/repos/berlios/show/trunk/sventon/src/test/java/org/sventon/web/ctrl/template/GetFileControllerTest.java

6,mockito似乎比easymock好用

posted @ 2008-12-24 00:31 leekiang 阅读(258) | 评论 (0)编辑 收藏

1,项目中如何进行敏捷建模
2,来自Rails世界的项目管理工具Redmine

posted @ 2008-12-24 00:28 leekiang 阅读(100) | 评论 (0)编辑 收藏

1,范围查询,例如
Term begin=new Term("publishdate","1999-01-01");
Term end
=new Term ("publishdate","1999-10-15");
RangeQuery q
=new RangeQuery(begin,end,true);





1),
Lucene-2.2.0 源代码阅读学习
2)
Lucene 中自定义排序的实现
3)
lucene学习笔记
4)
http://www.lucene.com.cn/sj.htm
5)LRU
LRU(最近最少使用算法) and MRU(最近最常使用算法)  所谓的LRU(Least recently used)算法的基本概念是:当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,换句话说就是优先清除”较不常使用的数据”,并释放其空间.之所以”较不常使用的数据”要用引号是因为这里判断所谓的较不常使用的标准是人为的、不严格的.所谓的MRU(Most recently used)算法的意义正好和LRU算法相反.
oracle缓存用到了LRU
http://bluepopopo.javaeye.com/blog/180236
6,Apache lucene知识汇集
7,Lucene 2.3.1 阅读学习(41)
8,Lucene的score()实现
9,Lucene 的排序修改
10,6大原因让你不选择使用Lucene
11,解决lucene范围搜索中的TooManyClauses exception

posted @ 2008-12-23 23:22 leekiang 阅读(266) | 评论 (0)编辑 收藏

仅列出标题
共54页: First 上一页 27 28 29 30 31 32 33 34 35 下一页 Last