<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>隔叶黄莺 Unmi Blog &#187; Java/JEE</title>
	<atom:link href="http://unmi.cc/category/javajee/feed" rel="self" type="application/rss+xml" />
	<link>http://unmi.cc</link>
	<description></description>
	<lastBuildDate>Wed, 22 Feb 2012 14:20:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Spring MVC 碰到 java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX</title>
		<link>http://unmi.cc/spring-mvc-%e7%a2%b0%e5%88%b0-java-lang-nosuchfielderror-application_context_id_prefix</link>
		<comments>http://unmi.cc/spring-mvc-%e7%a2%b0%e5%88%b0-java-lang-nosuchfielderror-application_context_id_prefix#comments</comments>
		<pubDate>Mon, 23 May 2011 15:02:31 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3600</guid>
		<description><![CDATA[Spring MVC 应用在 Tomcat 启动的时候出现了下面的错误： java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX  at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:430)  at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)  at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)  at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)  at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)  at javax.servlet.GenericServlet.init(GenericServlet.java:212)  at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)  at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)  at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4350)  at org.apache.catalina.core.StandardContext.start(StandardContext.java:4659)  at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)  at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)  at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)  at org.apache.catalina.core.StandardService.start(StandardService.java:519)  at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)  at org.apache.catalina.startup.Catalina.start(Catalina.java:581)  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  at java.lang.reflect.Method.invoke(Method.java:597)  at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 2011-5-23 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/spring-mvc-%e7%a2%b0%e5%88%b0-java-lang-nosuchfielderror-application_context_id_prefix/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有一种方法给 XSLT 中变量进行赋值，是保持状态的那种</title>
		<link>http://unmi.cc/xslt-assign-variables</link>
		<comments>http://unmi.cc/xslt-assign-variables#comments</comments>
		<pubDate>Tue, 03 May 2011 18:55:11 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[XML/DOM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[xstl]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3538</guid>
		<description><![CDATA[在 XSLT 中声明变量可以用 &#60;xsl:variable&#62; 和 &#60;xsl:param&#62;，它们的区别是可以通过 &#60;xsl:param&#62; 从外部向 XSLT 文件传参数，除此之外，在 xslt 内部使用时这两者的用法基本是一样的。下面只以 &#60;xsl:variable&#62; 为例子，例子中的 xsl:variable 替换成 xsl:param 也是能 run 的。 &#60;xsl:variable&#62; 的基本用法是： &#60;xsl:variable name="username" select="'Initial'"/&#62; &#60;!-- 不写 select 则默认为 '' --&#62; &#60;xsl:variable name="username" select="'New Value'"/&#62; &#60;!-- 赋值 --&#62; &#60;xsl:value-of select="$username"/&#62; &#60;!-- 显示变量值，变量名前加上 $ 符号 --&#62; 上面三行同时写在一个 &#60;xsl:template/&#62; 里是没问题的，最后显示出新的值为 'New Value'，但是跨了多次模板调用就有问题了，即使是把第一行写在最外层看起来像个全局变量。等会例子会揭示出现像来，先记住一点，在 XSLT 中每次应用模板就像是一次方法调用一样，那好，看个例子吧，有三部分组成，XML、XSLT、XsltTransformer 类，这三个文件都放在 cc/unmi/xslt 包中： [...]]]></description>
		<wfw:commentRss>http://unmi.cc/xslt-assign-variables/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>应用 Castor 把 XML 转换成相应的 JavaBean(二)</title>
		<link>http://unmi.cc/castor-xml-to-javabean-2</link>
		<comments>http://unmi.cc/castor-xml-to-javabean-2#comments</comments>
		<pubDate>Sat, 23 Apr 2011 09:38:13 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[XML/DOM]]></category>
		<category><![CDATA[castor]]></category>
		<category><![CDATA[data bingding]]></category>
		<category><![CDATA[JavaBean]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3491</guid>
		<description><![CDATA[紧接前一篇 应用 Castor 把 XML 转换成相应的 JavaBean(一)，本例稍显复杂一些，也就是要使用到映射文件，更复杂的 JavaBean、XML 数据类型和结构，引入自定的 FieldHandler，还有存在 Namespace 的情形。 关于如何使用 Castor 来把 XML 映射成 JavaBean 请着重阅读这个链接 http://www.castor.org/reference/html/XML%20data%20binding.html 中的内容，里面有说明支持的类型，如何定义自己的类型 Handler 及配置 Handler 的属性，mapping.xml 文件怎么写及各部份的意义；还有 castor.properties 的配置，比其中的 suppressNamespaces 为 true 时可以忽略掉 Namespace，默认为 false. 直接看例子吧： 1. persons.xml，这里放了一个 Namespace，并定义了一个 Address 类型，还使得节点名与 Bean 的属性名不一致： &#60;?xml version="1.0" encoding="UTF-8"?&#62; &#60;Persons xmlns:i="http://www.w3.org/2001/XMLSchema-instance"&#62;     &#60;Person i:Type="worker"&#62;         &#60;Name&#62;Unmi&#60;/Name&#62;         &#60;Address&#62;st1&#124;st2&#60;/Address&#62;     &#60;/Person&#62; [...]]]></description>
		<wfw:commentRss>http://unmi.cc/castor-xml-to-javabean-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>应用 Castor 把 XML 转换成相应的 JavaBean(一)</title>
		<link>http://unmi.cc/castor-xml-to-javabean-1</link>
		<comments>http://unmi.cc/castor-xml-to-javabean-1#comments</comments>
		<pubDate>Sat, 23 Apr 2011 08:06:30 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[XML/DOM]]></category>
		<category><![CDATA[castor]]></category>
		<category><![CDATA[data binding]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3485</guid>
		<description><![CDATA[之前有一篇用例子演示了 应用 JAXB 把 XML 转换成相应的 JavaBean，现在来看另一款 XML Data Binding 工具 Castor 怎么把 XML 映射成 JavaBean  的，相对于 JAXB 规范性的东西，Castor 的官方网站上关于 Castor 的使用文档我觉得要多些。作为一个 XML Data Binding  工具，Castor 同样提供了 Marshaller 和 Unmarshaller 的功能，它不依赖于注解，还是采用映射文件的方式，像 Hibernate 那样的映射文件。 从 Castor 的官方网站 http://www.castor.org/ 看到它的外围生态系统还是不错的，有 JDO、Maven、Spring、Eclipse Plugin 的支持，也有众多组件用到了它。和其他类似工具一样，Castor 也提供了 XML、Schema 生成 Class 类的功能，但照例这里还是看看先有类的情况，怎么从 XML 中获取相应值。 通常使用 Castor 从 XML 得到 JavaBean 需要一个映射文件，要是 JavaBean 的属性和 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/castor-xml-to-javabean-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容(终结)</title>
		<link>http://unmi.cc/struts2-xslt-string-document-final</link>
		<comments>http://unmi.cc/struts2-xslt-string-document-final#comments</comments>
		<pubDate>Tue, 12 Apr 2011 11:47:14 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3432</guid>
		<description><![CDATA[前面两篇：Struts2 使用 XSLTResult 输出页面内容详解 和 Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容 对 Struts2 如何使用 xslt 结果和怎么把字符串直接作为 Document 内容进行的讲解、研究和探讨。关于 Action 中的字符怎么直接作为 xslt 的内容已有一种方法，就是把 String 转换成 org.w3c.dom.Document 类型再送给 xslt 文件。 同时也发现 Struts2 使用了 org.apache.struts2.views.xslt.StringAdapter 了对字符串的处理，并提供了 parseStringAsXML 的开关选项(虽然是无从设置它的值)，但即使把 parseStringAsXML 设置成了 true，送给 xslt 文件的内容也是被包裹上了 &#60;result&#62; 根节点，xslt 中不得不用 &#60;xsl:template match="/result/你的根节点"&#62; 来应用模板。 通过在上一篇 Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容 里琢磨来琢磨去的探寻，着实又走了不少弯路，甚至是误入了歧途，但终究是找到了一个较好的办法来让 Action 直接送 String 表示的 Document [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-xslt-string-document-final/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 使用 xslt 结果类型如何把字符串直接作为 Document 内容</title>
		<link>http://unmi.cc/struts2-xsltresult-string-to-document</link>
		<comments>http://unmi.cc/struts2-xsltresult-string-to-document#comments</comments>
		<pubDate>Sun, 10 Apr 2011 10:58:39 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3419</guid>
		<description><![CDATA[在上一篇: Struts2 使用 XSLTResult 输出页面内容详解 中说到了，如果在 Action 中送给 xstl 的是一个字符串，例如 String user = "&#60;user&#62;&#60;name&#62;Unmi&#60;/name&#62;&#60;/user&#62;"，那么 xslt result 输出的将是: &#60;result&#62; &#38;lt;user&#38;gt;&#38;lt;name&#38;gt;Unmi&#38;lt;/name&#38;gt;&#38;lt;/user&#38;gt; &#60;/result&#62; 而不我们期望的 &#60;user&#62; &#60;name&#62;Unmi&#60;/name&#62; &#60;/user&#62; 那么怎么才能做到这一点呢？在 XSLTResult 有 adapterFactory 以及相应的 setter/getter 方法，但它们是 protected，所以也无法定制自己的 AdapterFactory 来判断是字符串就作为 Document 的内容。 我们再看 org.apache.struts2.views.xslt.AdapterFactory 的 API，里面说可以定义一个自己的 Adapter，然后调用 AdapterFactory 的 registerAdapterType(Class type, Class adapterType)  方法来注册，但问题是这是个实例方法，如何去调用，而且每次页页请求时，XSLTResult 的 AdapterFactory 都是不同的实例，更是无从定位。 其实 Struts2 为 XSLTResult [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-xsltresult-string-to-document/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 使用 XSLTResult 输出页面内容详解</title>
		<link>http://unmi.cc/struts2-xsltresult-details</link>
		<comments>http://unmi.cc/struts2-xsltresult-details#comments</comments>
		<pubDate>Sat, 09 Apr 2011 09:59:10 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3410</guid>
		<description><![CDATA[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 文件这一层处理的都是 org.w3c.dom.Document 类型。注意不能是别的 Document，如 org.dom4j.Document。这对于像调用 WebService 返回的是个 XML 内容然后用 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-xsltresult-details/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lucene 索引、查询日期类型字段</title>
		<link>http://unmi.cc/lucene-index-date-field</link>
		<comments>http://unmi.cc/lucene-index-date-field#comments</comments>
		<pubDate>Tue, 15 Mar 2011 10:59:38 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Lucene]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3320</guid>
		<description><![CDATA[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, 它所提供的方法： static String  dateToString(Date date, DateTools.Resolution resolution); static Date  round(Date date, DateTools.Resolution resolution); [...]]]></description>
		<wfw:commentRss>http://unmi.cc/lucene-index-date-field/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HttpClient 模拟登陆，保持会话并进行后续操作</title>
		<link>http://unmi.cc/httpclient-login-session</link>
		<comments>http://unmi.cc/httpclient-login-session#comments</comments>
		<pubDate>Thu, 10 Mar 2011 02:02:53 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[httpclient]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3293</guid>
		<description><![CDATA[Apache HttpClient 是很方便的 Java 开源的访问 HTTP 资源的组件。网站上的资源不总是能匿名访问的，很多都需要登陆后才能操作，且不说论坛里登陆后才能发言，就是某些稍显敏感的 XML 等信息也是登陆后才能获取到的。 没问题，HttpClient 能让你做到，它提供了 Basic 和 Form-Based 两种验证方式。登陆后获得服务器端发来的 Cookie 作为下一次访问的凭证, 让服务端认为你还是个合法用户。服务端不是用 Session 来维护会话的吗？是的，Session 也要有个载体，Cookie 了。或有时 Java Web 会用 jsessionid 参数在服务端与客户端来回关联 Session 信息，也没问题，HttpClient 同样能胜任。 下面主要说明 Form-Based 的验证方式，Basic 的验证简单列了几行代码，还未实践，具体可参考文后的链接。 看 Form-Based 方式的演示代码，如果登陆时需要一个验证码的话，那只有自己想办法怎么得到这个码了，登陆时谁都想无码： package cc.unmi.httpclient; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.junit.Test; public class [...]]]></description>
		<wfw:commentRss>http://unmi.cc/httpclient-login-session/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 中如何覆盖已内置拦截器的属性(参数)值</title>
		<link>http://unmi.cc/struts2-how-to-override-interceptor-parameters</link>
		<comments>http://unmi.cc/struts2-how-to-override-interceptor-parameters#comments</comments>
		<pubDate>Sun, 06 Mar 2011 08:19:01 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[拦截器]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3192</guid>
		<description><![CDATA[在前面一篇 Struts2 中 ModelDriven Action 的 setModel() 为何不起作用？ 中发现最漂亮的办法就是修改 ModelDrivern 的 refreshModelBeforeResult 属性为 true，同时留下一个话题。这里接着，即如何覆盖内置拦截器的属性(参数) 值。 如果是自定的拦截器，则可以在 struts.xml 中的 &#60;interceptor&#62; 或 &#60;interceptor-ref&#62; 中用 &#60;param name="paramName"&#62;paramValue&#60;/param&#62; 来指定参数。但是对于 struts2 核心包内置的或是第三方的拦截器的参数需要进行重新设置该如何呢？ 比如在 struts2 包中的 struts-default.xml 中定义很多拦截器，通常我们使用的是其中组织好的 defaultStack 拦截器栈，看 struts-default.xml 中关键几行配置： &#60;struts&#62;     &#60;package name="struts-default" abstract="true"&#62;             &#60;interceptor-stack name="defaultStack"&#62;&#60;!--引用了18个拦截器--&#62;                 &#60;interceptor-ref name="exception"/&#62;                 ......                 &#60;interceptor-ref name="modelDriven"/&#62;                 &#60;interceptor-ref name="fileUpload"/&#62;                 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-how-to-override-interceptor-parameters/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iText5.0.6 用 HTMLWorker 转换 HTML 为 PDF 已支持单元格宽度设置</title>
		<link>http://unmi.cc/itext5-0-6-htmlworker-html-pdf-support-cell-width</link>
		<comments>http://unmi.cc/itext5-0-6-htmlworker-html-pdf-support-cell-width#comments</comments>
		<pubDate>Fri, 04 Mar 2011 09:05:57 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[iText]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3248</guid>
		<description><![CDATA[前有一文 iText 用 HTMLWorker 转换 HTML 为 PDF 时可设置表格列宽度 介绍了在 iText5.0.4 的基础上转换 html 为 pdf 时，如何让 table 中的单元格能支持宽度设定，并且还修改了三份源代码: HTMLWorker.java、IncCell.java 和 IncTable。也只是实现了以百分比形式来设定每列的相对宽度，现在好了，iText 顺理的发现了用户的这一需求，在进化后的 iText5.0.6 中可以让你设定 &#60;td&#62; 的宽度，可直接用百分比数值(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): 最主要的改变就是 HTMLWorker，也就是 HTML 直接转换为 PDF 那块功能，加了些新特性。不仅如此，这部分的代码被重写了，更多的标签和样式支持还该期待不久的 iText 5.1.0。 再看 iText5.0.6 的 changelogs http://www.itextpdf.com/history/index.php?branch=50&#38;node=506，其中有： HTMLWorker: relative cell widths [...]]]></description>
		<wfw:commentRss>http://unmi.cc/itext5-0-6-htmlworker-html-pdf-support-cell-width/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 文件下载及找不到文件的处理办法</title>
		<link>http://unmi.cc/struts2-download-file-not-found</link>
		<comments>http://unmi.cc/struts2-download-file-not-found#comments</comments>
		<pubDate>Wed, 02 Mar 2011 01:12:08 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[下载]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3243</guid>
		<description><![CDATA[Struts2 对文件的上传和下载提供了很好的支持，上传时直接用 java.io.File 来接收，下载时也无需自己去设置相应的 Stream 响应头，它提供了 org.apache.struts2.dispatcher.StreamResult 给 Action 使用。它反映到 struts.xml 配置里就是type="stream" 的 result，由 result 去负责把文件内容写入响应中去。Action 的执行方法在 result 之前执行，所以你可以借此控制下载权限，本文也演示了如何判断文件是否存在，不存在则导向到 FileNotFound 页面。StreamResult 中有哪些相关的配置参数可以参考它的源代码： public class StreamResult extends StrutsResultSupport {     private static final long serialVersionUID = -1468409635999059850L;     protected static final Logger LOG = LoggerFactory.getLogger(StreamResult.class);     public static final String DEFAULT_PARAM = "inputName";     protected String [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-download-file-not-found/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate 的 formula 简单用法</title>
		<link>http://unmi.cc/hibernate-formula-simple</link>
		<comments>http://unmi.cc/hibernate-formula-simple#comments</comments>
		<pubDate>Wed, 23 Feb 2011 13:26:51 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Hibernate]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3224</guid>
		<description><![CDATA[Hibernate 3 之后，formula(公式，Excel 里常见的) 得到了更广泛的应用，不过这里还是简单记录一下它在 &#60;property&#62; 中的应用。 假如我们要映射这么一个类： package cc.unmi.model; public class User {     private int id;     private String name;     Private Set&#60;Order&#62; orders = new HashSet&#60;Order&#62;();     //setter &#38; getter ...... } User 与 Order 建立了一对多的关联，那么它在 hbm 映射文件的写法大概就是： &#60;property name="name" type="string" column="name"&#62; &#60;set name="orders"&#62;     &#60;key column="user_id"/&#62;     &#60;one-to-many/&#62; &#60;/set&#62; 没错，这两个对象进行的关联，通过 user.getOrders() [...]]]></description>
		<wfw:commentRss>http://unmi.cc/hibernate-formula-simple/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring 2.0可扩展XML配置初探[转]</title>
		<link>http://unmi.cc/spring-xml-custom-schema</link>
		<comments>http://unmi.cc/spring-xml-custom-schema#comments</comments>
		<pubDate>Mon, 21 Feb 2011 12:30:42 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3208</guid>
		<description><![CDATA[本文通过一个简单的例子，说明如何去扩展XML配置，它大致需要的几个步骤。具体的需求是使用自定义标签定义一个简单的bean，这个bean有一个或多个属性，标签定义完成后，可以在其他项目中用自定义标签来定义该bean。 Spring 2.0版本支持扩展XML配置，着实兴奋了一下，在我看来，Spring作为目前最流行的框架，不能扩展用户自定义的配置，实在是Spring的一个很不爽的地方，的方式用起来比较通用，起码到目前为止符合大部分人的使用习惯，并且能完成Spring所有的配置操作，但是对于第三方的提供商或则会经常扩展Spring功能的开发者来说，使用这样的配置方式或许不是他们最想要的，他们需要使组件的配置更加直观、易阅读、易扩展……试想使用下面的配置方式。 &#60;mytag:datasource id="datasource"                   databaseType="oracle"                   ip="192.168.1.110"                   port="1521"                   databaseName="myDB"                   userName="admin"                   password="password" /&#62; &#60;mytag:ehCache id="ehcache"                cache="true"                maxElements="100000"                timeToIdleSeconds="120"                timeToLiveSeconds="120"                overflowToDisk="true" /&#62;  上面的代码中配置了两个组件，datasource和cache组件，相比普通的bean&#38;propertiy方式，很显然，这种配置方式更直观，更易读，更重要的是，如果作为组件发布，使用者也可以很方便快捷的开始使用，而不需要关心组件的任何实现细节。 扩展XML配置大致需要一下几个步骤： 1、创建一个需要扩展的组件 2、定义一个xsd文件描述组件内容 3、创建一个文件，实现BeanDefinitionParser接口，用来解析xsd文件中的定义和组件定义 4、创建一个Handler文件，扩展自NamespaceHandlerSupport，目的是将组件注册到Spring容器 5、编写spring.handlers和spring.schemas文件 提供一个简单的例子，来说明如何去扩展一个Spring配置，需求如下：使用自定义标签定义一个简单的bean，这个bean有一个或多个属性，标签定义完成后，可以在其他项目中用自定义标签来定义该bean。 首先，创建一个需要扩展的组件，在这里只是一个简单的bean，而且这个bean只有一个属性age。 One.java package com.mysite.tag; public class One {     private String age;     public One() { [...]]]></description>
		<wfw:commentRss>http://unmi.cc/spring-xml-custom-schema/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slfj + Logback 时，基本的 logback.xml 配置</title>
		<link>http://unmi.cc/slfj-logback-xml-base-config</link>
		<comments>http://unmi.cc/slfj-logback-xml-base-config#comments</comments>
		<pubDate>Fri, 18 Feb 2011 13:33:12 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[Logback]]></category>
		<category><![CDATA[slfj]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3195</guid>
		<description><![CDATA[现在越来越多的项目用 Slfj，而与它结合最好的 Log4j 替代品就是 Logback，下面是 Logback 的一个可供参考的基本的配置文件 logback.xml，可以控制台和文件同时输出，文件可进行两种类型的归档，分天存储日志，或按文件大小压缩日志归档。 Logback 和 Log4J 同出一人之手，而作者的专注点也在 Logback，Logback 有更好的性能，特别是在现代 Java 程序中。 一般是 rollingPolicy 和 triggeringPolicy 搭配使用，rollingPolicy 负责做什么，triggeringPolicy 管理什么时候做，而 FixedWindowRollingPolicy 本身就实现了 TriggeringPolicy 接口，所以它能够自我管理，不需要别人来推动就会做的。 &#60;?xml version="1.0" encoding="UTF-8"?&#62; &#60;!-- Reference Manual http://logback.qos.ch/manual/index.html --&#62; &#60;configuration&#62;     &#60;appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"&#62;          &#60;encoder charset="UTF-8"&#62; &#60;!-- encoder 可以指定字符集，对于中文输出有意义 --&#62;             &#60;pattern&#62;%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&#60;/pattern&#62;         [...]]]></description>
		<wfw:commentRss>http://unmi.cc/slfj-logback-xml-base-config/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 中 ModelDriven Action 的 setModel() 为何不起作用？</title>
		<link>http://unmi.cc/struts2-modeldriven-setmodel-nothing</link>
		<comments>http://unmi.cc/struts2-modeldriven-setmodel-nothing#comments</comments>
		<pubDate>Fri, 18 Feb 2011 13:04:53 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[ModelDriven]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3184</guid>
		<description><![CDATA[我们在使用 Struts2 的时候一定有用过它的 ModelDriven 类型的 Action，它适于把零散的属性自动组装到一个 JavaBean 中，它的 Model 就相当于 Struts1 的 FormBean。你的 Action 必须实现 com.opensymphony.xwork2.ModelDriven 接口及它的 getModel() 方法，当然要声明一个存储 Model 对象的属性，这个属性将会被压入到 ValueStack 中。 你也可以自然或不自觉在 Action 中加入一个 setModel() 方法，试图在执行期修改当前的 Model 对象，比如像下面这样的 IndexAction 代码： package cc.unmi.struts2; import com.opensymphony.xwork2.ModelDriven; public class IndexAction implements ModelDriven&#60;User&#62; {     private User user = new User("Fantasia");     @Override     public User getModel() [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-modeldriven-setmodel-nothing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2+jreloader 出现 NoClassDefFoundError: VelocityEngine</title>
		<link>http://unmi.cc/struts2-jreloader-no-velocityengine</link>
		<comments>http://unmi.cc/struts2-jreloader-no-velocityengine#comments</comments>
		<pubDate>Tue, 15 Feb 2011 08:05:57 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[jrebel]]></category>
		<category><![CDATA[jreloader]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3147</guid>
		<description><![CDATA[用 用 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)  at java.util.concurrent.FutureTask.run(FutureTask.java:138)  at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)  at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)  at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.&#60;init&#62;(ContainerImpl.java:348)  at com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:305)  at com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:301)  at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)  at [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-jreloader-no-velocityengine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2-Json-Plugin 的使用(翻译自官方文档)</title>
		<link>http://unmi.cc/struts2-json-plugin-guide</link>
		<comments>http://unmi.cc/struts2-json-plugin-guide#comments</comments>
		<pubDate>Sun, 13 Feb 2011 10:40:43 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[翻译]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3133</guid>
		<description><![CDATA[在 Struts2 中要使用 Ajax 获得 Json 数据我认为目前还是 struts2-json-plugin 了。当然你你可以用手工用像 XStream、Google Gson、Jackson 这样的工具手工把 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，同时自己加深对它的理解。 JSON 插件提供了一个 "json" 结果类型来把 action 序列化成 JSON. 这一序列化的过程是递归的, 意即整个对象图，从 action 类开始 (未包括基类) 将会被序列化 (可以用 "root" 属性来指定自己的根对象). 如果使用了 json 拦截器, action 将可通过请求中的 JSON 内容组装出来, 该拦截器遵循以下几条规则: "content-type" 必须为 "application/json" [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-json-plugin-guide/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2 的 &lt;s:component&gt; 中如何加条件参数 &lt;s:param&gt;...</title>
		<link>http://unmi.cc/struts2-s-param-conditions</link>
		<comments>http://unmi.cc/struts2-s-param-conditions#comments</comments>
		<pubDate>Thu, 10 Feb 2011 11:11:56 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3117</guid>
		<description><![CDATA[Struts2 的 &#60;s:component&#62; 标签可以让你消磨掉自定义标签的意愿，它可以指定一个模板文件，我比校亲赖于 ftl 文件，然后用 &#60;s:param&#62; 给上参数，其他的事情交给 freemarker 去处理了，而且在 ftl 文件能够直接以 &#60;@s.textfield ..../&#62; 的形式使用 Struts2 的标签。 比如，jsp 文件里这么使用 &#60;s:component&#62; 标签： &#60;s:component template="/components/status.ftl" theme="simple"&#62;     &#60;s:param name="status" value="#status"/&#62; &#60;/s:component&#62; 把 status.ftl 要放在 WEB-INF/classes/template/simple/components/status.ftl。当然你可以应用 &#60;s:component&#62; 的 templateDir 属性使 status.ftl 放在别的位置上，但可能会带来别的麻烦。 然后在 status.ftl 文件里用 &#60;#if parameters.status??&#62;...... 判断参数，进而随意发挥 FreeMarker 和 Struts2 标签的功能了。 有时候多个 jsp 页面要共用同一个 ftl 文件时，某些时候要向 ftl [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-s-param-conditions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用 jreloader 动态重新加载改变的类而不用重启 JVM</title>
		<link>http://unmi.cc/jreloader-reload-class</link>
		<comments>http://unmi.cc/jreloader-reload-class#comments</comments>
		<pubDate>Fri, 28 Jan 2011 12:02:27 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Java/JEE]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[jreloader]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3111</guid>
		<description><![CDATA[在 Tomcat 中可以配置 reloadable="true" 做到类改变后，Tomcat 重新加载。其实这个过程大约也是当 Tomcat 发现有改变的类会重新启动一个新的应用程序重新加载所有的类来服务于新的请求，只是不需要你手动的去执行 shutdown.sh(.bat)，再 startup.sh(.bat)。这种方式对于古老的 jsp 程序完全能从容以对，因为 web.xml 里几乎没什么随应用一起启动且耗时长代码；但当下是框架横行，web.xml 中随应用一起启动的程度可谓是争先恐后的，所以仅仅依赖 reloadable="true" 是满足不了需求的。每改一个类(无论是改动了方法体中的代码还是变动了类的结构，准确的说是动了 WEB-INF/classes 目录中的任何文件) 你都可能就会在 Jan 28, 2011 7:19:42 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext 这一步上等上半天，况且对于 reloadable="true" 对于类结构的改动是无动为力的，像实现了不同的接口，继承了不同的类，或者增删了方法或属性的时候，Tomcat 必须是 shutdown，然而再 startup 的。 这样的频繁重启对于调试是一种煎熬，所以希望能找到一个工具，能在类改动的时候不需要重新启动当前应用，当然不希望重启 Tomcat 了。能实现此功能的工具有 JavaRebel 和 jreloader，其中前者是收费的，后者是开源的，不过后者实际上也不错。 这里介绍下后者在 Eclipse WTP  Tomcat 环境中怎么配置使用。 当前版本是 jreloader-0.4.zip，其中有 jreloader.jar 和 jreloader-src.zip，再就是非常简单且足够的 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/jreloader-reload-class/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 25/68 queries in 0.031 seconds using disk: basic
Object Caching 5624/5742 objects using disk: basic

Served from: unmi.cc @ 2012-02-23 07:42:00 -->
