Java

在Struts2 + Freemarker环境中使用 自定义的JSP Tag

比如说,使用 jmesa这个标签库。FTL应该这样写: 1. 声明一下标签库 <#assign ec=JspTaglibs[“/WEB-INF/tld/jmesa.tld”]> 2. 使用extremetTable标签 <@jmesa.tableFacade id="users_table"  items=users var="user">                   <@jmesa.htmlTable width="100%">                     <@jmesa.htmlRow>                       <@jmesa.htmlColumn property="loginId" title="Login Id"/>                       <@jmesa.htmlColumn property="firstName" title="First Name"/>                       <@jmesa.htmlColumn property="lastName" title="Last Name"/>                     </@jmesa.htmlRow>                   </@jmesa.htmlTable>                 </@jmesa.tableFacade>     a.要写 "<@jmesa.tableFacade>",而不是 "<jmesa:tableFacade>"     b.类集变量的表达式是不带引号的users,而不是"users",也不是 "${users}"

[Hibernate]我建议不要在entity中使用原始类型作为成员的类型

使用原始类型,如    private int age; 它的致命缺点是: age永远不会为空值,这会使hibernate防空值的功能形同虚设。 具体来说,    假说 age 的 nullable = false, 那如果setAge()没被调用,我们就会预期hibernate在运行时报错,防止age为空的数据进入数据库。    然而,实际的结果是:JRE会把age的值为0,然后把 age=0 的数据插入数据库,而age = 0并不是我们想要的东西。   而如果使用 private Integer age,就没有这个问题。

Spring 为Hibernate做的packagesToScan 倒底是怎么被解析的?

首先,Spring用AntPathMatcher 来解析路径,这个好办,毕竟Ant风格的路径大家都熟 但在调用这个Matcher之前,Spring 会先将你在XML中写的路径转变成Ant风格的路径。那,是怎么转换的呢? 经过试验,我的结论如下         <property name="packagesToScan" value=" com.xxx.model" />, 会转换成"classpath*:com/xxx/ model**/*.class",这个路径可以找出com/xxx/model根目录下的类文件       <property name="packagesToScan" value="com.xxx.model .*" />, 会转换成"classpath*:com/xxx/ model/***/*.class",这个路径可以找出com/xxx/model根目录下一级子目录中的类文件,如com/xxx/model/son/Hi.class       <property name="packagesToScan" value="com.xxx.model ." />(注意最后的点) , 会转换成"classpath*:com/xxx/model /**/*.class",这个路径可以找出com/xxx/model根目录下及其子孙目录下所有的类文件. 一般来讲,这些就是我们要的文件。

滥用Session级变量的后果

目前只想到两个后果,以后再补充 1.无法确定何时从session中移除这个变量。 在一系列操作的最后一步时去除?不行,用户可能做了一半就不做了。那,就不移除又怎么样? 答案是会有灾难性的后果,用户会看到莫名奇妙的东西,同时程序员很难复现这种问题。 2.无法确定何时把变量植入到session中。一般认为在“操作系列”的第一步时植入就够了,但其实每个中间步骤在未来都可能变成另一个“操作系列”第一步。到未来再说? 未来的程序员就是另一个人了,他根本不知道原始“操作系列”的存在!

为了单元测试,我觉得程序中应该大量采用“支持链式调用”的setter

所谓链式的setter 就是     bean.setProp1("1").setProp2("2")…setPropN("N") 这样的好处就是:一行代码就可以设置完尽量多的属性值。这在单元测试里特别有用。 举例来说,当你要设置一个Bean作为测试数据,如果不用链式,则 Bean bean = new Bean(); bean.setProp1("1"); bean.setProp2("2"); bean.setProp3("3"); assertEquals("XXX", bean.getXXX());    一共要写五行代码。     1. 由于普通的Setter不支持链式调用,因此3个属性要写3行set语句,每条语句里都要写一个"bean"字,即12个字母;     2. 另外,构造方法 new Bean()本来是链式的,但由于受到无链式setter的拖累,以致于必须显式地声明一个 "bean" 变量。 而如果我们用链式风格的setter的话,一行即可。 assertEquals("XXX",new Bean().setProp1().setProp2().setProp3().getXXX()));    看,多简洁! 可以采用匿名对象(new Bean()),并且不用换行。 当然了,这样做的好处主要是为了单元测试时准备数据。正式代码里可能不会一次性设置这么多属性,就算要设置这么多,这样写也会降低代码的可调试性。 你可能会问为什么不用一个 带有所有参数的构造方式? 我的看法是,    1.参数较多的构造方法比较丑陋,调用时也容易把参数顺序搞错。比如 new Name("Diego", "Maradona") 中,哪个是 first name, 哪个是 last name?    2.写带参构造方法比写无参和要累    3.最重要的是,新增属性时会使带参的构造方法不得不重构。很烦。

SQL编程中的曳光弹

有本书里提到了“曳光弹”这个东西。它让你在暗夜开枪时,除了靠你的本事命中目标之外,同时还会帮你把子弹的轨迹在夜空里展现出来。 在JAVA编程时,一种典型的曳光弹就是日志。 在SQL编程时,也可以用到曳光弹这个技巧。 一个例子就是:找出所有 A.a = B.a 的 A.c 记录集。我们在写这个SQL时,除了 select A.c之外,也可以同时select出 A.a 和 B.a,然后就可以用肉眼检查一下A.a和B.a是否相等,这样可以帮助保证SQL程序的质量。 另外一个例子是:找出所有符合某个条件的记录集,然后对它们进行批量更新。对这种问题,我们可也直接写一条 update + where全部搞定,但也可以先把符合条件的记录集插到一种临时表中,然后再按临时表去更新实际的记录。当你回头去看临时表时,你就可以切实地看到哪些记录被修改,可以检查这些记录是否符合修改条件,从而也更加保证了SQL程序的质量。

Fast Code Eclipse Plugin

这个东西可以根据 "Item"生成一 ItemService, ItemDAO, ItemForm 以及相关的Spring/Hibernate配置文件 而且它还可以生成 JUnit Test Case.  有了它,你的开发进度可以缩短10%了。来这里看: http://fast-code.sourceforge.net/index.htm

EasyMock 最佳文档

网上有很多关于 EasyMock的 tutorial, 但我觉得这篇是唯一能看下去的! http://www.ibm.com/developerworks/java/library/j-easymock.html?ca=drs- 以后搜这种综述性文章或向导性文章,最好都到 developerworks 里找。 IBM社区的文章不会有错的。