Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容

在上一篇: Struts2 使用 XSLTResult 输出页面内容详解 中说到了,如果在 Action 中送给 xstl 的是一个字符串,例如 String user = "<user><name>Unmi</name></user>",那么 xslt result 输出的将是:

<result>
&lt;user&gt;&lt;name&gt;Unmi&lt;/name&gt;&lt;/user&gt;
</result>

而不我们期望的

<user>
<name>Unmi</name>
</user>

那么怎么才能做到这一点呢?在 XSLTResult 有 adapterFactory 以及相应的 setter/getter 方法,但它们是 protected,所以也无法定制自己的 AdapterFactory 来判断是字符串就作为 Document 的内容。 阅读全文 >>

Struts2 使用 XSLTResult 输出页面内容详解

Struts2 内置提供了 xslt 结果类型,实现类为 org.apache.struts2.views.xslt.XSLTResult,它让你方便的把获得的 XML 数据内容,或者是用 OGNL 能访问到的某个属性(像 ContenxtMap、Request 等中的属性),通过一个 xslt 文件转换成你想要的格式。前面这句听来不怎么明白,后面慢慢道来。

在 Struts2 的 struts-default.xml 中定义了 chain、dispatcher、freemarker、httpheader、redirect、redirectAction、stream、velocity、xslt 和 plainText 10 种类型的 Result;而在 Struts2 初期版本中的 jasper、chart、jsf 和 tiles 结果类型已移到相应的插件去实现了。

freemarker、velocity 和 xslt 可以很自由的使用各自的模板语言,velocity 渐渐淡出了我们的视野,那还剩下 freemarker 和 xslt。freemarker 要求实合并的变量是实体类型,满足了多数时候的需求,不过现在要说的 xslt 结果类型,向 xslt 文件送去的数据可以是实体类型,也可以是原生的 org.w3c.dom.Document 类型,当然到了 xslt 文件这一层处理的都是 阅读全文 >>

Lucene 索引、查询日期类型字段

Lucene 的 Field 在构造时内容参数可接受一个字符串或者字节数组,流等,不支持 Date 等类型。如果把 Date.toString() 转换成字符串来索引的话那么存储在索引中的样子就不确定(new Date().toString() 为 “Tue Mar 15 13:25:41 GMT+08:00 2011”),也给下次还原来为 Date 类型带来不便。在以前的版本 Lucene 专门提供了 DateField 来索引 Date 类型,但

现在不推荐使用了,而且也无法用,因为 Lucene 的 Document 在 add(Fieldable field) 时接受的是一个 Fieldable 类,然而 DateField 并未实现 Fieldable 接口,保留它是用来读取老的索引文件。

那 Lucene 要怎么索引日期类型呢?说到底,还是把它转换为字符串,搜索的时候从存储的字符串还原出来,辅助工具类是 DateTools, 它所提供的方法: 阅读全文 >>

JDK 7 中的语法增强 -- (4) 创建泛型实例时的类型推断

Java 的泛型实例在声明时有点傻,比如像这样的语句 List<String> list = new ArrayList<String>(); 前明的 List<String> 已经提供了足够的信息让编译器知道 ArrayList 的参数类型,当然这是个简单的例子,如果复杂些,来点嵌套的话:

Map<String, List<Map<String, String>>> myMap = new HashMap<String, List<Map<String,String>>>();

那就够呛的,所以 Java 的这一语法要求也让 Scala 这样的语言所诟病,当然人家 Scala 是个趋近于动态性的语言,它认为上面的语句应该这么写:

val x = new HashMap[String, List[String, List[Map[String, String]]]() 或者是
val x: Map[String, List[String, List[Map[String, String]]] = new HashMap()

总之,只要一端的表态就行,其他事情交给编译器来推断。现在 JDK 也反省到了这一点,因为引入一个叫做菱形操作符(Diamond operator) 的东西,即两个尖括号 <>。让使得你像 Scala 一样只要在左边声明参数类型就行啦。这个操作符不免让我想起了在 perl 里有个 <=>  这样的操作符,好像叫做飞机,不是斗地主的飞机,它相当于 Java 里的 compareTo() 的功能。

于是泛型实例的声明就简单化成了 Map<String, List<Map<String, String>>> myMap = new HashMap<>(); 继续往下看: 阅读全文 >>

JDK 7 中的语法增强 -- (3) swith 里用 String 类型

java 在 switch 语句这一项上更多的是承袭了 c++,其实整个语法就是 c 风格的。java 的 switch 里只能用 byte、char、short、int 和 enum 类型,连 long 型都不能用(因为 switch 里的要被转换为 int  型,而 long 太长了)。要说不支持 float 和 double 那样的浮点那好理解,因为它们本身是不精确的,1 可能是 0.9999999999。boolean 就两值,放 switch 里无意义,因为 c++ 的 switch 里可用bool 型,但在 java 中遭摈弃。

现在在 jdk7 里 switch 可以用字符串了,学了 c#,字符串的好处就是它是表意的,像 switch(action) case "create" : ...; case "delete" : .....,多写意啊,再也不用先定义一堆常量,然后再 switch(action) case Constants.ACTION_CREATE : ......; case Constants.ACTION_DELETE : ......,当然写过不少程序的尽量会避免写成 case 1... case 2 这样的写法了,会让人不知所以的。常量放在 case 中就要求我们经常要去查它定义的值是什么。 阅读全文 >>

HttpClient 模拟登陆,保持会话并进行后续操作

Apache HttpClient 是很方便的 Java 开源的访问 HTTP 资源的组件。网站上的资源不总是能匿名访问的,很多都需要登陆后才能操作,且不说论坛里登陆后才能发言,就是某些稍显敏感的 XML 等信息也是登陆后才能获取到的。

没问题,HttpClient 能让你做到,它提供了 Basic 和 Form-Based 两种验证方式。登陆后获得服务器端发来的 Cookie 作为下一次访问的凭证, 让服务端认为你还是个合法用户。服务端不是用 Session 来维护会话的吗?是的,Session 也要有个载体,Cookie 了。或有时 Java Web 会用 jsessionid 参数在服务端与客户端来回关联 Session 信息,也没问题,HttpClient 同样能胜任。

下面主要说明 Form-Based 的验证方式,Basic 的验证简单列了几行代码,还未实践,具体可参考文后的链接。 阅读全文 >>

JDK 7 中的语法增强 -- (2) 数值常量中的下划线

再次进入到 JDK7 语法增强的第二道道上来,也就是数值常量书写时可以中间插入下划线作为分隔线,也就是 int i = 22_33 相当于 int i = 2233,仅仅是一定程度上的有助于阅读代码,除此之外,别无它处。编译后或执行时这些下划线便透明掉了,编译后的字节码里也没有了附加的下划线,当然执行时也不可能向你输出下整数 i 为 22_33 的。

也不知道是谁只是众目期盼中的版本净找些这类来增强,感觉意义不是很大,大约类同于二进制方式来表示整数。这里的数值包括整数和小数的,加上 16 进制那么可用来表示数字的字符就有 0-9 和 a-f(A-F) 了,注意下划线只能加在前面所列的某两个字符之间,而且可连续多个下划线。看例子吧: 阅读全文 >>

JDK 7 中的语法增强 -- (1) 二进制字面常量

JDK 7 预览版已出,当然到实际的使用还有段时间,包括 IDE 的和各大主要的应用服务器的升级,及 JDK 7 本身的稳定尚须时日,但我们还是有必须瞧瞧新版 JDK 带来了哪些语法增加。

我们没有盼到闭包,相对于 JDK 5 的语法增强,JDK 7 的动作还较小,大约 8 个,这里介绍第一个 二进制字面常量。

1)二进制字面常量 -- 任何整数类型(byte, short, int 和 long) 声明时可用二进制的形式,即 01 串,只要数字前加上 0b 或 0B 即行。 阅读全文 >>

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): 阅读全文 >>