- 我们在应用 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 等。 Read More 在前面一篇日志: 理解和灵活应用 Struts2 的文件下载功能 还留下一个问题,在 Servlet 中支持文件下载功能时,客户保存下载文件所用的字符集总是 ANSI(ISO8859-1), 如何能设定客户保存文件用的字符集呢?像 BlogJava 的备份数据功能下载后就是用的 UTF-8 字符集的。 自己作了一些尝试,总是无济于事,看如下代码是 Servlet 的 doGet() 方法:
Read More1public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 // PrintWriter out = response.getWriter(); 5 PrintWriter out = new PrintWriter(new OutputStreamWriter(response 6 .getOutputStream(), "UTF-8")); 7 8 response.setContentType("text/plain;charset=UTF-8"); 9 response.setHeader("Content-Disposition","attachment;filename=down.txt"); 10 out.write("Servlet download file test"); 11 out.close(); 12}- DWR 本身未提供分页的功能,所以这部分要自己来实现。如果把后台的所有记录都拉到页面用 JS 分页,那是很不现实的。因此,虽说是 DWR 分页,但还得服务端来支持,由服务端的远程方法只返回当前页所显示的记录,DWR 自己要明确当前是第几页,是否有上一页、下一页。
还是用代码来说明吧,分解为三部分代码:
1. 暴露给 DWR 调用的 Java 的远程方法
2. JS 的 DWR 调用
3. 显示分页导航栏
DWR 要调用的 Java 方法:
Read More - 记得以前通常我们在调用 DWR 的远程方法是这样写第一个至倒数第二个参数为客户端传向服务端的数据,最后一个参数直接就是一个回调函数。因为服务端根据 Java 对象生成的 js 代码就是:
1Remote.method(params,function(data){ 2 //服务端执行后客户端的逻辑,如 3 alert("服务端执行后返回的数据:"+data); 4});
Remote.method = function(p0, callback) {
dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback);
}
Read More - 使用 DWR 一个常用的操作就是取到的数据往表格里填充,这就是 DWR 的 DWRUtil.addRows() 操作了,本篇就是以例子详细说明这个函数的用法。而另一个移除所有表格行的操作 DWRUtil.removeAllRows() 使用简单就不多说明了。
开始的时候我们还是要对这个函数的原型加以说明,虽然有些俗套,但还是必要的:
DWRUtil.addRows(id, array, cellfuncs, [options]);
描述:
向指定id的table元素添加行。它使用数组中的每一个元素(对象)在table中创建一行。然后用 cellfuncs 数组中的对应的函数创建一个列。单元格是依次用 cellfunc 根据没有数组中的元素创建出来的。
DWR1.1开始,addRows()也可以用对象(遍历对象的属性创建行)做为数据。如果你用一个对象代替一个数组来创建单元格,这个对象会被传递给cell函数。 Read More - 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 具体类。 Read More 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 的功能要强大些。 Read More
- 我们用 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 下的操作基本相同): Read More 本想把 p6spy 结合 SQL Profiler 或 IronTrack SQL 的使用介绍掇凑于一块来写。简单点说,只是一贴上图样,篇幅便需拖拉难遂人愿,也好, 索性把它们分成两个篇章。一来每篇主旨鲜明,二来五篇成一系列比起四更来的自然且吉利。
前面讲过 p6spy 本身就可利用 Log4j 的 SocketAppender 向远端发送日志,SQL Profiler 不过是在这个基础上作了进一步拓展。 而接下来要说的 IronTrack SQL 就略有不同了,看它带的 p6spy.properties 文件,里面有 IronTrack SQL 给 p6spy 定制的一个模块: module.ibeam=com.irongrid.ibeam.server.IBeamFactory。它用到了 log4j-1.2.8.jar,不过还得研究下 Log4j 在其中所起的作来。 现在就来介绍 p6spy 结合 IrconTrack SQL 的使用,最好是你知道如何单独使用 p6spy。压缩包里有文档:是 IronTrackSQL\docs\index.html。
Read Morep6spy 虽好,但把 SQL 语句输出到文件或是控制台中看起来有些吃力。若能图形界面展示出来便可一目了然,亲切许多。有种方法是配置 p6spy.properties 使用 Log4j 的 SocketAppender,然后启动 Log4j 的 org.apache.log4j.net.SocketServer 界面,或是在 Eclipse log4j plug-in 中也能观察所执行的 SQL 语句。
不过还有种更专业做法,本篇将介绍 p6spy 如何结合 Sql Profiler 或 IronTrack SQL 来使用,并附以贴图,来感受一下吧。也以此来完成关于 p6spy 的这个系列。 其实你到后面也会发现,即便是用 Sql Pofier 的实现过程也是借助了 Log4j 的 SocketApender,你可以从它自己带的 p6spy.properties 文件中的配置看出来, 即其中的 log4j.appender.SQLPROFILER_CLIENT=org.apache.log4j.net.SocketAppender 这么一个配置。 Read More