Struts2+jreloader 出现 NoClassDefFoundError: VelocityEngine

用 jreloader 动态重新加载改变的类而不用重启 JVM 来避免因 classes 目录中的文件改动而不停重启 Tomcat。但是却会出现如下的问题:

Feb 15, 2011 3:51:06 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter struts2
java.lang.NoClassDefFoundError: Lorg/apache/velocity/app/VelocityEngine;
 at java.lang.Class.getDeclaredFields0(Native Method)
 at java.lang.Class.privateGetDeclaredFields(Class.java:2291)
 at java.lang.Class.getDeclaredFields(Class.java:1743)
 at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:89)
 at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:71)
 at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:67)
 at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 阅读全文 >>

Struts2-Json-Plugin 的使用(翻译自官方文档)

在 Struts2 中要使用 Ajax 获得 Json 数据我认为目前还是 struts2-json-plugin 了。当然你你可以用手工用像 XStreamGoogle GsonJackson 这样的工具手工把 Java 对象转换成 Json 字符串再写往 Response 去,要写的代码自然多不了,还得留心字符集与 content type。而 struts2-json-plugin 毫无疑问是与 Struts2 最亲近了,只需你配置一些属性就能得到你想的结果。

本想分几篇逐步介绍如何使用 struts2-json-plugin 的,然而就在现在发现官方的 struts2-json-plugin 指南已经很详细了,所以干脆翻译一下 http://struts.apache.org/2.2.1.1/docs/json-plugin.html,同时自己加深对它的理解。 阅读全文 >>

Struts2 的 <s:component> 中如何加条件参数 <s:param>...

Struts2 的 <s:component> 标签可以让你消磨掉自定义标签的意愿,它可以指定一个模板文件,我比校亲赖于 ftl 文件,然后用 <s:param> 给上参数,其他的事情交给 freemarker 去处理了,而且在 ftl 文件能够直接以 <@s.textfield ..../> 的形式使用 Struts2 的标签。

比如,jsp 文件里这么使用 <s:component> 标签:

<s:component template="/components/status.ftl" theme="simple">
    <s:param name="status" value="#status"/>
</s:component>

把 status.ftl 要放在 WEB-INF/classes/template/simple/components/status.ftl。当然你可以应用 <s:component> 的 templateDir 属性使 status.ftl 放在别的位置上,但可能会带来别的麻烦。 阅读全文 >>

简化 Struts2 OGNL 访问静态方法和静态变量

前些日子折腾过这一话题,而且在 Struts2 中 OGNL 如何更简单的访问静态变量和静态方法 记述了其中的原理,也对实现作了初步的猜想,但没给出实际的答案。这里将会给出,探寻的过程中有过不少尝试,下面也将把解决的过程描述出来,仍有不少迷域之处。先交待一下答案,必须在一个自定义的 PreResultListener 里压入静态方法或静态变量所在类的对象实例,在返回结果之前方能保证它们是在栈顶的。

解决此问题的一个明确目标就是要把静态方法或静态变量所在类的对象实例压到 ValueStatic 已知的位置上,当然最应该就是在栈顶,其他的栈数据,如当前 Action 实例或 Model 对象应该在它们之下,这样的话,你就能用 @vs@, 或 @vs1@... 这样的方式明确访问哪个类的静态成员。

最简单方法,前篇也讲过,在 Action 的 execute() 方法中往 ValueStatic 中压入的值会在栈顶--在 Action 实例和 Model 实例之上。 阅读全文 >>

Spring 中如何向 Bean 注入系统属性或环境变量

在 Spring 中为 javabean 注入属性文件中的属性值一般人都知道的,可以通过 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 引入一个属性文件,然后给 bean 指定属性的时候就可以用 ${jdbc.url} 方式赋值了。比如在 Spring 中是这样的配置:

只是有时候我们需要给 bean 赋上系统属性(System.getProperties() ) 中的值或环境变量(System.getenv() ) 中的值,根据程序所处的环境产生不同的行为,这样我们无法事先在某个 properties 文件预先设定好值的。 阅读全文 >>

Spring JdbcTemplate 调用存储过程

以前一篇中写到了 hibernate 调用存储过程,这里介绍 Spring 借道 JdbcTemplate 如何调用数据库存储过程。还是以前面的那个 DB2 存储过程为例,该过程的代码如下:

这个过程中最后一行直接打开了一个游标,也就是返回了一个结果集。调用存储过程的方法应该看看 org.springframework.jdbc.core.JdbcTemplate 的各个 execute() 方法,具体点就是带了 CallableStatementCallback<T> 参数的那两个 execute(),究底的话又归结为其中之一。 阅读全文 >>

Struts2 中 OGNL 如何更简单的访问静态变量和静态方法

在 struts2 标签中是使用 OGNL 来访问对象属性或方法的,也就是访问的 ValueStack 中的值,即 OgnlValueStack。OGNL 也能让你直接访问类的静态变量和静态方法,标准写法是:

@类全限定名@静态属性或方法名,比如访问某个常量:

<s:property value="@cc.unmi.common.Constants@MY_NAME"/>

<s:property value="@cc.unmi.common.Utils.now()"/>

麻烦就是一定要写上类的全限定名称,实际应用时肯定比这个还要长,所以必须寻求一种更精练的写法。幸好像这篇文章:Struts2 OGNL 的增强 提到了可以用: 阅读全文 >>

引入了 struts2-spring-plugins 包后 Spring 就会管理你的 Action

Struts2 与 Spring 结合,使用 Spring 来管理 Action 实例,在项目中引入了struts2-spring-plugin-2.2.1.jar 包。然后想到的是既然是要用 Spring 来管理 Action 实例,就得在 struts.xml 里加上:

或者是在 struts.properties 里加上一条属性:

OK,这也没问题,然而有次在某个测试项目中想暂时不用 Spring 来管理 Bean,于是把上面的配置去了,也把 web.xml 中的相关 Spring 的 ContextLoaderListener 也格啦。容器启动的时候却发现: 阅读全文 >>

灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断

我们在使用 Hibernate 时一般只会关注是否显示生成的 SQL 语句,不过有些时候还不够。默认时 Hibernate 执行的 SQL 语句是打印在控制台上的,它也可以配置为输出给 Log4J 或是 Log4Back,还能显示出更详细的参数和取值信息。这里简单讲来。

Hibernate 的配置文件 hibernate.cfg.xml 里提供有三个有关显示 SQL 的配置项,如果是与 Spring 联合,也可以配置到 Spring 的配置中。它们的取值是 boolean 值。

1) hibernate.show_sql - 是否显示所生成 SQL 语句,我们最常和它打交道
2) hibernate.format_sql - 是否格式化生成的 SQL 语句,增加可读性,不然全挤在一行
3) hibernate.use_sql_comments - 是否显示注释,用以指出什么操作产生的 SQL 语句,相比上面两条而言,这个配置会稍稍陌生些

 来看看加了上面三条配置后产生的效果,执行了 Hibernate 查询后,在控制台上产生如下输出: 阅读全文 >>

显示出 Hibernate 查询语句的绑定参数值

在使用 Hibernate 进行数据库操作的时候可以显示出所执行的 SQL 语句,相信用 Hibernate 的兄弟姐妹们都知道怎么设置。就设置 hibernate.show_sql  或者 show_sql 属性为 true 就行,在 hibernate.cfg.xml 或者与 Spring 集成时配置在 Spring 的配置文件中。再就是要让显示的 SQL 语句是格式化的,就配置 hibernate.format_sql 或是 format_sql 为 true,否则总在一行中执行。Hibernate 显示的 SQL 语句好像是通过 System.out.println() 直接输出的。

Hibernate 大部份时候是通过 PreparedStatement 来执行 SQL 语句的,它的好处是可预处理、被缓存,可防止注入。只是这样让 Hibernate 执行的 SQL 语句输出到控制台是带问号的,如: 阅读全文 >>