Struts2 中如何覆盖已内置拦截器的属性(参数)值

在前面一篇 Struts2 中 ModelDriven Action 的 setModel() 为何不起作用? 中发现最漂亮的办法就是修改 ModelDrivern 的 refreshModelBeforeResult 属性为 true,同时留下一个话题。这里接着,即如何覆盖内置拦截器的属性(参数) 值。

如果是自定的拦截器,则可以在 struts.xml 中的 <interceptor> 或 <interceptor-ref> 中用 <param name="paramName">paramValue</param> 来指定参数。但是对于 struts2 核心包内置的或是第三方的拦截器的参数需要进行重新设置该如何呢?

比如在 struts2 包中的 struts-default.xml 中定义很多拦截器,通常我们使用的是其中组织好的 defaultStack 拦截器栈,看 struts-default.xml 中关键几行配置: 阅读全文 >>

iText5.0.6 用 HTMLWorker 转换 HTML 为 PDF 已支持单元格宽度设置

前有一文 iText 用 HTMLWorker 转换 HTML 为 PDF 时可设置表格列宽度 介绍了在 iText5.0.4 的基础上转换 html 为 pdf 时,如何让 table 中的单元格能支持宽度设定,并且还修改了三份源代码: HTMLWorker.java、IncCell.java 和 IncTable。也只是实现了以百分比形式来设定每列的相对宽度,现在好了,iText 顺理的发现了用户的这一需求,在进化后的 iText5.0.6 中可以让你设定 <td> 的宽度,可直接用百分比数值(20%)相对宽度,或用参照数值来设置,之后呢,HTMLWorker 会帮你转换为相对的宽度--比如有三列,分别设置为 20,10,50,被转换为相对宽度就是 25%,12.5% 和 62.5%。

看iText5.0.6 简短的 release 说明,iText5.0.6 has been released(http://lowagie.com/node/73): 阅读全文 >>

Struts2 文件下载及找不到文件的处理办法

Struts2 对文件的上传和下载提供了很好的支持,上传时直接用 java.io.File 来接收,下载时也无需自己去设置相应的 Stream 响应头,它提供了 org.apache.struts2.dispatcher.StreamResult 给 Action 使用。它反映到 struts.xml 配置里就是type="stream" 的 result,由 result 去负责把文件内容写入响应中去。Action 的执行方法在 result 之前执行,所以你可以借此控制下载权限,本文也演示了如何判断文件是否存在,不存在则导向到 FileNotFound 页面。StreamResult 中有哪些相关的配置参数可以参考它的源代码: 阅读全文 >>

Hibernate 的 formula 简单用法

Hibernate 3 之后,formula(公式,Excel 里常见的) 得到了更广泛的应用,不过这里还是简单记录一下它在 <property> 中的应用。

假如我们要映射这么一个类:

package cc.unmi.model;

public class User {
    private int id;
    private String name;
    Private Set<Order> orders = new HashSet<Order>();

    //setter & getter ......
} 阅读全文 >>

Spring 2.0可扩展XML配置初探[转]

本文通过一个简单的例子,说明如何去扩展XML配置,它大致需要的几个步骤。具体的需求是使用自定义标签定义一个简单的bean,这个bean有一个或多个属性,标签定义完成后,可以在其他项目中用自定义标签来定义该bean。

Spring 2.0版本支持扩展XML配置,着实兴奋了一下,在我看来,Spring作为目前最流行的框架,不能扩展用户自定义的配置,实在是Spring的一个很不爽的地方,的方式用起来比较通用,起码到目前为止符合大部分人的使用习惯,并且能完成Spring所有的配置操作,但是对于第三方的提供商或则会经常扩展Spring功能的开发者来说,使用这样的配置方式或许不是他们最想要的,他们需要使组件的配置更加直观、易阅读、易扩展……试想使用下面的配置方式。 阅读全文 >>

Slfj + Logback 时,基本的 logback.xml 配置

现在越来越多的项目用 Slfj,而与它结合最好的 Log4j 替代品就是 Logback,下面是 Logback 的一个可供参考的基本的配置文件 logback.xml,可以控制台和文件同时输出,文件可进行两种类型的归档,分天存储日志,或按文件大小压缩日志归档。

Logback 和 Log4J 同出一人之手,而作者的专注点也在 Logback,Logback 有更好的性能,特别是在现代 Java 程序中。

一般是 rollingPolicy 和 triggeringPolicy 搭配使用,rollingPolicy 负责做什么,triggeringPolicy 管理什么时候做,而 FixedWindowRollingPolicy 本身就实现了 TriggeringPolicy 接口,所以它能够自我管理,不需要别人来推动就会做的。 阅读全文 >>

Struts2 中 ModelDriven Action 的 setModel() 为何不起作用?

我们在使用 Struts2 的时候一定有用过它的 ModelDriven 类型的 Action,它适于把零散的属性自动组装到一个 JavaBean 中,它的 Model 就相当于 Struts1 的 FormBean。你的 Action 必须实现 com.opensymphony.xwork2.ModelDriven 接口及它的 getModel() 方法,当然要声明一个存储 Model 对象的属性,这个属性将会被压入到 ValueStack 中。

你也可以自然或不自觉在 Action 中加入一个 setModel() 方法,试图在执行期修改当前的 Model 对象,比如像下面这样的 IndexAction 代码: 阅读全文 >>

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 放在别的位置上,但可能会带来别的麻烦。 阅读全文 >>