关于 JavaBean 规范你还是应该知道的二三事

作为 Java  程序员,对于 JavaBean 也许你会说再熟悉不过了,它贯穿在系统的多层中,不同的叫法有 PO、VO、DTO、POJO、DO(Domain Object)。然而它无外乎就是一个 Class 类,带上些属性和它们的 setter/getter 方法,set/get 后面那一个字母大写。虽然我们现在很少把 JavaBean 与那个古老的 2.0 的 EJB 搞混,但为什么明明用 IDE 为属性生成的 getter/setter 方法,应用一运行,还是报找不到某个 bean 属性的 setter 或 getter 方法呢?

要知道,在 Sun 的网站上那个关于 JavaBean 规范的 PDF 文档可是有足足实实的 114 页啊。难免有些规则有点古怪,至使知名的 IDE 都难以应对,所以我们还是有必要了解其中二三,来规范我们的 JavaBean 和解释一些情形。

Sun  的关于 JavaBean 规范见:http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html,其中可下载到 JavaBean 规范的  PDF 文档。 阅读全文 >>

DWR 的 Converter 实现原理简单分析及应用

我们在应用 DWR 调用远程方法时涉及到 JS 与 JAVA 之间参数和返回值的数据转换,例如:

JS 的 123 与 Java 的 int  或 Integer、long 间的转换
JS 的 "2009-06-23" 与 Java 的 java.util.Date 之间的转换
JS 的 "[1,2,3]" 与 Java 的 int[] 间的转换
JS 的 "{id:123, name: 'Unmi'}" 与 Java 的 Class Person{int id; String name} 间的转换

或者更复杂的嵌套类型( "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" ) 与 Java 类型间的转换,等等。那么这一切是怎么进行的呢?其实我们见识过很多组件的类型映射,如 Java 的 PropertyEditor、Hibernate(UserType)、iBatis(TypeHandler) 的类型映射,Struts1/2 中 Form/Model 用的 Converter 等。 阅读全文 >>

请教一下 Servlet 中如何设定下载文件保存用的字符集

在前面一篇日志:理解和灵活应用 Struts2 的文件下载功能 还留下一个问题,在 Servlet 中支持文件下载功能时,客户保存下载文件所用的字符集总是 ANSI(ISO8859-1),如何能设定客户保存文件用的字符集呢?像 BlogJava 的备份数据功能下载后就是用的 UTF-8 字符集的。自己作了一些尝试,总是无济于事,看如下代码是 Servlet 的 doGet() 方法:

阅读全文 >>

使用 DWR 我是这样做简单分页的[自己记录一下]

DWR 本身未提供分页的功能,所以这部分要自己来实现。如果把后台的所有记录都拉到页面用 JS 分页,那是很不现实的。因此,虽说是 DWR 分页,但还得服务端来支持,由服务端的远程方法只返回当前页所显示的记录,DWR 自己要明确当前是第几页,是否有上一页、下一页。

还是用代码来说明吧,分解为三部分代码:

1. 暴露给 DWR 调用的 Java 的远程方法
2. JS 的 DWR 调用
3. 显示分页导航栏

DWR 要调用的 Java 方法: 阅读全文 >>

理解和灵活应用 Struts2 的文件下载功能

文件下载给我们最直接的概念就是,给个文件链接点击就下载。似乎太简单,然而 Struts2 却把它作为一个独立的学问来对待,理由有四:

1. 文件名为中文时,直接点击下载,链接可能会走样(某些浏览器,URL 编码的问题),致使无法下载。
2. 不总是从下载实际的文件,文件内容有时候是动态生成的,如数据库中的内容。
3. 对于知名的文件类型不让浏览器直接打开,而是出现下载对话框保存文件。例如,要下载的文件是 .txt 的,可能直接就在浏览器中显示其内容。
4. 需要授权才能下载文件时

当然对于以上若干问题,Servlet/JSP 都能通过正确的 URL 编码,响应头设置、权限代码控制解决,只是 Struts2 让我们处理起来更方便了,内部原理自然是一样的。 阅读全文 >>

DWR 调用远程方法的错误和异常处理

记得以前通常我们在调用 DWR 的远程方法是这样写

第一个至倒数第二个参数为客户端传向服务端的数据,最后一个参数直接就是一个回调函数。因为服务端根据 Java 对象生成的 js 代码就是:

Remote.method = function(p0, callback) {
    dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback);
}

阅读全文 >>

DWR 的 DWRUtil.addRows() 函数的使用

使用 DWR 一个常用的操作就是取到的数据往表格里填充,这就是 DWR 的 DWRUtil.addRows() 操作了,本篇就是以例子详细说明这个函数的用法。而另一个移除所有表格行的操作 DWRUtil.removeAllRows() 使用简单就不多说明了。

开始的时候我们还是要对这个函数的原型加以说明,虽然有些俗套,但还是必要的:

DWRUtil.addRows(id, array, cellfuncs, [options]);

描述:
向指定id的table元素添加行。它使用数组中的每一个元素(对象)在table中创建一行。然后用 cellfuncs 数组中的对应的函数创建一个列。单元格是依次用 cellfunc 根据没有数组中的元素创建出来的。

DWR1.1开始,addRows()也可以用对象(遍历对象的属性创建行)做为数据。如果你用一个对象代替一个数组来创建单元格,这个对象会被传递给cell函数。 阅读全文 >>

Apache Commons Logging 是如何决定使用哪个日志实现类的

Apache Commons Logging 像 SLF4J 一样,是个通用日志框架,广泛应用在各个开源组件中。说其通用,是因为它本身只提供了简单的日志输出的实现(org.apache.commons.logging.impl.SimpleLog和org.apache.commons.logging.impl.NoOpLog),主要是为你统一使用其他专业日志实现(Log4j、jdk1.4 Logger、aavalon-Logkit)的方式,让你在程序中看不到具体日志实现的代码,以配置方式解藕。

那么 commons-logging 是怎么决定程序执行时该使用哪个具体的日志实现呢?这里 commons-logging 有两个步骤要做:

1. 定位 org.apache.commons.logging.LogFactory 的实现类(这一步是关键)
2. 定位到的 LogFactory 实现类决定使用哪个 org.apache.commons.logging.Log 实现

那现在我们把注意力主要集中在 commons-logging 如何定位 LogFactory 实现类上来。org.apche.commons.logging.LogFactory 是一个抽象类,所以需要一个 LogFactory 具体类。 阅读全文 >>

了解 Java ClassLoader -- 为便于阅读整理做成了一个 CHM 文件

Java 程序员还是应该对 Java ClassLoader 有所了解,曾经问过一个做 Java 的 JVM  是什么?结果是:没听过。汗颜了吧,但也不少写 JSP 的甚至是 Java 代码的真的可能不了解 ClassLoader,所以对 Classpath 仍然费解。JRE 本身就有一个 ClassLoader 层次,更别说在各种应用服务器中因为 ClassLoader 层次的因素产生了莫名其妙的问题。例如,数据库驱动有时候应该放在哪个目录中,怎么应用却加载了一个旧版的 Jar 包等等。

本篇的 Understand Java ClassLoader.chm 文件是我根据 IBM 开发者网站上的 https://www6.software.ibm.com/developerworks/cn/education/java/j-classloader/tutorial 整理而成的。以前是用 Visual CHM 工具来制作 CHM 文件,而这个呢是用 FAR 生成的,感觉 FAR 的功能要强大些。 阅读全文 >>

Eclipse 远程调试 WebSphere Application Server (WAS)

我们用 Eclipse 开发 Web 项目时,多会用某个插件(如 MyEclipse) 来对 Tomcat 中的应用进行单步调试。而要调试 WAS 下的应用,MyEclipse 也是可以的,但在 MyEclipse 中启动 WAS 比较慢,且需要在本地安装一个 WAS。再有便捷点的方法是用 WSAD (Websphere Studio Application Developer) 或它的升级版 RAD (Rational Application Developer),它们内置了对 WAS 很好的支持,不过也需要本机安装了 WAS,WSAD/RAD 肥大的身躯自是不必说。若要让 WSAD/RAD 进行远程调试,似乎还得在Server 上安装个 IBM Agent Controller。

实际上 WAS 就支持远程调试的设置,打开它,你只需要用 Eclipse Debug 中的 Remote Java Application 功能连接到服务器上相应端口即行。设置很简单,这样的办法你甚至可以在闲时偷偷的调试一下生产环境的 WAS 应用以验证测试环境难以/无法重现的问题。具体做法如下(WAS 5.x 和 6.x 下的操作基本相同):  阅读全文 >>