<?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; Struts</title>
	<atom:link href="http://unmi.cc/category/javajee/struts/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>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>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>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>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>简化 Struts2 OGNL 访问静态方法和静态变量</title>
		<link>http://unmi.cc/simplify-struts2-ognl-static-member</link>
		<comments>http://unmi.cc/simplify-struts2-ognl-static-member#comments</comments>
		<pubDate>Wed, 26 Jan 2011 14:35:51 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[OGNL]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3099</guid>
		<description><![CDATA[前些日子折腾过这一话题，而且在 Struts2 中 OGNL 如何更简单的访问静态变量和静态方法 记述了其中的原理，也对实现作了初步的猜想，但没给出实际的答案。这里将会给出，探寻的过程中有过不少尝试，下面也将把解决的过程描述出来，仍有不少迷域之处。先交待一下答案，必须在一个自定义的 PreResultListener 里压入静态方法或静态变量所在类的对象实例，在返回结果之前方能保证它们是在栈顶的。 解决此问题的一个明确目标就是要把静态方法或静态变量所在类的对象实例压到 ValueStatic 已知的位置上，当然最应该就是在栈顶，其他的栈数据，如当前 Action 实例或 Model 对象应该在它们之下，这样的话，你就能用 @vs@, 或 @vs1@... 这样的方式明确访问哪个类的静态成员。 最简单方法，前篇也讲过，在 Action 的 execute() 方法中往 ValueStatic 中压入的值会在栈顶--在 Action 实例和 Model 实例之上。 public class IndexAction extends ActionSupport implements ModelDriven&#60;User&#62; {     public String execute() throws Exception {         ValueStack vs = ActionContext.getContext().getValueStack(); System.out.println("IndexAction: " + vs);         vs.push(new [...]]]></description>
		<wfw:commentRss>http://unmi.cc/simplify-struts2-ognl-static-member/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Struts2 中 OGNL 如何更简单的访问静态变量和静态方法</title>
		<link>http://unmi.cc/struts2-ognl-access-static</link>
		<comments>http://unmi.cc/struts2-ognl-access-static#comments</comments>
		<pubDate>Thu, 20 Jan 2011 13:35:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/?p=3068</guid>
		<description><![CDATA[在 struts2 标签中是使用 OGNL 来访问对象属性或方法的，也就是访问的 ValueStack 中的值，即 OgnlValueStack。OGNL 也能让你直接访问类的静态变量和静态方法，标准写法是： @类全限定名@静态属性或方法名，比如访问某个常量： &#60;s:property value="@cc.unmi.common.Constants@MY_NAME"/&#62; &#60;s:property value="@cc.unmi.common.Utils.now()"/&#62; 麻烦就是一定要写上类的全限定名称，实际应用时肯定比这个还要长，所以必须寻求一种更精练的写法。幸好像这篇文章：Struts2 OGNL 的增强 提到了可以用： 除了使用标准的OGNL表达式访问静态字段和静态方法外，Struts2还允许你不指定完整的类名，而是通过“vs”前缀来调用保存在栈中的静态字段和静态方法。 　@vs@FOO_PROPERTY 　@vs@someMethod() 　@vs1@someMethod() vs表示ValueStack，如果只有vs，那么将使用栈顶对象的类；如果在vs后面跟上一个数字，那么将使用栈中指定位置处的对象类。 看似确实很精简，实际上也是。但问题是我们该怎么把自己的常量或静态方法(应该是它们所在的类) 放到 ValueStack 上呢，并且是在栈里的哪个位置呢？ OGNL 本身的规定是在它的上下文中只能有一个 root，然后 XWork/Struts2 对它衍生了，它认为在 ValueStack 中可以有多个根对象，对根对象的属性的访问可以不用 # 号。在 Struts2 的标签中对于是否该附上 # 号，也许很多人会有些迷糊。 比如对于一个简单的 Action 转向的 jsp 页面 index.jsp，在其中用 &#60;s:debug/&#62; 来查看一下 ValueStack: 上图中这两个对象 IndexAction 和 DefaultTextProvider 就是 ValueStack 的根对象，所以如果要访问 IndexAction [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-ognl-access-static/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(十四)</title>
		<link>http://unmi.cc/unmi-study-struts2-14</link>
		<comments>http://unmi.cc/unmi-study-struts2-14#comments</comments>
		<pubDate>Thu, 22 May 2008 13:39:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e5%8d%81%e5%9b%9b</guid>
		<description><![CDATA[生活中常为一些无伤大体之事优柔寡断，譬如买羽毛球拍是方头的还是圆头的呢？电子产品是这款好还是那款好呢？拿此又放下，举彼又放下，最后靠概率来决定。取其一，少段时间内总有些戚戚然，而后全然无所谓。小事无碍，大事可就会后悔不及，无疑亦会让许多机会径直溜去。 1. 从此开始学习 Struts2 对 Ajax 的支持。这也是 Struts2 新注入的元素。Struts2 的 Ajax 支持是建立在 Dojo 和 DWR 基础之上的。提供了 Ajax 的输入检验，表单提交；pub-sub 事件模型、自动完成以及与 JSON 的使用等功能。 2. 在 Struts2.0.6 和 Struts2.0.11 的 apps/struts-showcase-2.x.x.war 中的 dwr 包都还是 dwr-1.1-beta-3.jar，当前 DWR 最新版是 2.0，前一个稳定版是 1.1.4，所以正式应用可用 1.1.4 版，若用 2.0 DWR 需做充分的测试。Struts2 的 Ajax 支持是建立在 ajax 主题上的，ajax 是扩展了 xhtml 主题。 3. 用 Ajax 进行输入校验有以下几个步骤(当然项目中要引入 dwr 的 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-14/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(十三)</title>
		<link>http://unmi.cc/unmi-study-struts2-13</link>
		<comments>http://unmi.cc/unmi-study-struts2-13#comments</comments>
		<pubDate>Sat, 17 May 2008 16:18:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[unmi]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e5%8d%81%e4%b8%89</guid>
		<description><![CDATA[柏杨在形容中国人不团结，喜欢窝里斗用了这样的话：每一个中国人都是一条龙,但是三个中国人加在一起──三条龙加在一起，就成了一条猪、一条虫，甚至连虫都不如--《丑陋的中国人》。可是他老人家走得走，要是能多有半个月的阳寿，不知作有何感想。 1. &#60;s:optiontransferselect.../&#62; 正是考虑到通常使用而新加的用于创建两个下拉框，可以来回移动列表项。有属性设置是否显示 "选定左移"、"全部左移"、"选定右移"、"全部右移" 按钮以及各按钮上的文本，其他的 list/listKey/listValue/doubleList/doubleKey/doubleValue 等属性同 &#60;s:doubleselect.../&#62; 的是一样的。还可设置 allowUpDownOnLeft/allowUpDownOnRight 是否出现相应框的上下移动选择的按钮(true/false)。 2. &#60;s:radio.../&#62; 的用法与 &#60;s:checkboxlist.../&#62; 完全一样，只页面表现不一样，一个多选，一个单选。 3. &#60;s:optgroup.../&#62; 要放在 &#60;s:select.../&#62; 中使用，选项分组，属性有 list/listKey/listValue，不再说明它们的意义了，参考前篇笔记对 &#60;s:checkboxlist.../&#62; 对应属性的描述，它生成 html 的 &#60;optgroup&#62; 标签。 4. &#60;s:token/&#62; 生成如下的内容：(struts.token.name 标识哪个隐藏域存了 token 值)         &#60;input type="hidden" name="struts.token.name" value="struts.token"/&#62;         &#60;input type="hidden" name="struts.token" value="7GXL55LPSGU19SDC9D3VP54I20XT3BVA"/&#62;     注意自定义的表单域别重名了。它的作用是防止表单重复提交，每次加载页面 struts.token 的值都不一样，如果两次提交时该值一样，则认为是重复提交。此时要启用 TokenInterceptor(token) 拦截器，最好是也启用 TokenSessionStoreInterceptor(token-session) 拦截器，不然后台会出现错误提示： 2008-5-17 22:39:21 com.opensymphony.xwork2.interceptor.ParametersInterceptor [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-13/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>手工处理 Struts2 框架上传的文件</title>
		<link>http://unmi.cc/manual-struts2-file-upload</link>
		<comments>http://unmi.cc/manual-struts2-file-upload#comments</comments>
		<pubDate>Thu, 15 May 2008 09:16:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/%e6%89%8b%e5%b7%a5%e5%a4%84%e7%90%86-struts2-%e6%a1%86%e6%9e%b6%e4%b8%8a%e4%bc%a0%e7%9a%84%e6%96%87%e4%bb%b6</guid>
		<description><![CDATA[在使用了 Struts2 框架的系统中，对于处理像下面这种表单上传文件时： &#60;form action="..." enctype="multipart/form-data"&#62; 文件：&#60;input type="file" name="upload"&#62;&#60;br&#62; 描述：&#60;input type="text" name="desc"&#62;&#60;/br&#62; &#60;input type="submit" value="提交"&#62; &#60;/form&#62; 自然而然的想法就是在 Action 中声明变量 File upload 和 String desc，请求提交到这个 Action 后，在 execute() 方法中就能直接使用 upload 和 desc 了，它们已被 Struts2 框架(org.apache.struts2.interceptor.FileUploadInterceptor 监听器) 赋上了相应的值了。 因为维护的是一个古老的项目，请求都是直接提交给 jsp。在这个项目中套上了 Struts2 已是不易了。原来项目是用的 jspSmartUpload 来处理上传文件的，Struts2 一上 jspSmartUpload 便不能正常工作了，因为 Struts2 的过滤器 org.apache.struts2.dispatcher.FilterDispatcher 拦截的是所有的请求,在交把请求交给 jspSmartUpload 之前请求 request 就已被处理过了，即使是把 struts2-core-2.x.x.jar 中的 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/manual-struts2-file-upload/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>为何我的 Struts2 标签 tooltip 和 tooltipConfig 是这种效果呢？</title>
		<link>http://unmi.cc/struts2-tag-tooltip-tooltipconfig</link>
		<comments>http://unmi.cc/struts2-tag-tooltip-tooltipconfig#comments</comments>
		<pubDate>Mon, 05 May 2008 15:59:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/%e4%b8%ba%e4%bd%95%e6%88%91%e7%9a%84-struts2-%e6%a0%87%e7%ad%be-tooltip-%e5%92%8c-tooltipconfig-%e6%98%af%e8%bf%99%e7%a7%8d%e6%95%88%e6%9e%9c%e5%91%a2%ef%bc%9f</guid>
		<description><![CDATA[我的环境是 Tomcat 5.0.28 + Struts2.0.6 (web.xml 配置的是支持 Servlet 2.4) testTooltip.jsp 文件内容如下： &#60;%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%&#62; &#60;%@ taglib prefix="s" uri="/struts-tags"%&#62; &#60;html&#62; &#60;head&#62; &#60;title&#62;Test Struts Tooltip&#60;/title&#62; &#60;s:head /&#62; &#60;/head&#62; &#60;body&#62; &#60;s:form tooltipConfig="#{'jsTooltipEnabled':'true'}"&#62; &#60;s:textfield label="Name" name="name" tooltip="Enter your Name here" tooltipConfig="#{'tooltipFontColor':'#ff0000'}" /&#62; &#60;/s:form&#62; &#60;/body&#62; &#60;/html&#62; 打开浏览器，浏览时鼠标移到输入框前面那个图标上稍呆会儿的效果是这样子的。 1) 出现一个 JS 的提示层，在下方，然后又出现一个图片的 alt/title 属性的提示。两种提示产生了重叠，十分难看。 2) 我明明设置了 tooltipConfig="#{'tooltipFontColor':'#ff0000'}"，JS 的提示层文字应为红色，可不是那么回事。 初见 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/struts2-tag-tooltip-tooltipconfig/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(十一)</title>
		<link>http://unmi.cc/unmi-study-struts2-11</link>
		<comments>http://unmi.cc/unmi-study-struts2-11#comments</comments>
		<pubDate>Mon, 28 Apr 2008 16:46:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e5%8d%81%e4%b8%80</guid>
		<description><![CDATA[你尽可以做个良民，为群体效率而本份的遵循个人秩序，然而事与愿违，非但不能因此提升群体的效率，而你势必失去诸多的机会，不会有人褒奖你，更得不到同情，只得自觉的天真。 1. 模板目录－＞主题目录－＞主题(模板文件) 这是模板/主题的目录组织方式。以实际为例，打开 struts2-core-2.x.x.jar 可以看到里面有一个 template，在 template 下有5个目录 ajax、css_xhtml、simple、xhtml 和 archive，其中前四个分别是 ajax、css_xhtml、simple、xhtml 主题的目录，每个主题目录中有各自的模板文件，主要是 ftl 文件，还有 css 和 js 文件。最后一个 archive 是归档的主题目录，其下又有 ajax、simple、xhtml、模板文件是 .vm 文件。由此可知 Struts2 大力推荐的模板语言是 FreeMarker，而不是 Velocity，以后要好好看看 FreeMarker，只知道 FreeMarkder 更 XML 化。 2. 上面看到模板目录名是 template，是 struts2-core-2.x.x.jar 中，其实目录名是由 struts.ui.templateDir 常量来指定的，只是默认值是 template。意味着 Struts 2 从 Web 应用的 template 目录或 CLASSPATH 的 template 目录(包) 中依次加载特定的模板文件。 3. 比如我们使用一个 select [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-11/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(九)</title>
		<link>http://unmi.cc/unmi-study-struts2-9</link>
		<comments>http://unmi.cc/unmi-study-struts2-9#comments</comments>
		<pubDate>Mon, 14 Apr 2008 15:24:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b9%9d</guid>
		<description><![CDATA[中世纪的欧洲《礼仪书》中说：痰不要吐到桌子上，也不要飞过桌子。1774年，欧洲的《礼仪与基督教礼貌守则》中说：我们再也不能原谅那些把痰吐到窗户外、墙上或者家具上的人。可见，欧洲人的素质也是在他们工业化富了之后的事。至少那个时候，我们的老祖宗再不争气，也绝不会把痰吐到桌子上。 1. OGNL 中有生成 List 和 Map 的表达式，分别是：{e1,e2,e3,...} 和 #{key1:val1,key2:val2,...}。对集合 OGNL 提供了两个操作符 in 和 not in，如：    &#60;s:if test="'foo' in {'foo','bar'}" ... &#60;/s:if&#62;            ---- not in 的用法当然是一样的了。 之外，OGNL 还允许通过某个规则取集合的子集     ·? ：取出所有符合条件逻辑的元素     ·^：取出符合条件的第一个元素     ·$：取出符合条件的最后一个元素 请将上面这三个符号与正则表达式的表示法联系起来 例了：persons.relatives.{? #this.gender == 'male'}        //取出集合 persons 中所有 gender 属性为 'male' 的子集。 OGNL 还支持基本的 Lambda(λ) 表达式语法，不过好像有点复杂，暂不关顾。 2. Struts2 的各路标签已是面目全非了。     [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(八)</title>
		<link>http://unmi.cc/unmi-study-struts2-8</link>
		<comments>http://unmi.cc/unmi-study-struts2-8#comments</comments>
		<pubDate>Thu, 10 Apr 2008 18:32:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e5%85%ab</guid>
		<description><![CDATA[吾同人数进寺庙，却从未点过一柱香。概因精神世界里终无所寄托。既不为生儿还是女而筹算，也无须因落下亏心事要请得神灵庇佑。想来，真要的东西，阿弥陀佛也给不了。在物价飞涨之际，谁能给你加薪，何来民主，看看这辈子能不能有机会参与选一回国家领导人，少说几句了，就这点言论自由了。 1. Struts 2 标签库以 OGNL 表达式为基础，对集合、对象的访问功能更强了。Struts 2 的标签用统一的前缀，一般为 "s"，不再像 Struts1 那样分 &#60;html:.../&#62;、&#60;bean:.../&#62;、&#60;logic:.../&#62; 等多个命名空间的标签。如果在 JSP 2.0 之前用过 JSTL，也就知道什么是 OGNL 表达式的。 2. Struts2 提供了很多 Struts1 标签没有的东西，如日历、树型控件、Tab页等；同时可借助 DWR，有标签支持 Ajax，除此还提供了主题、模板，还允许在页面中使用自定义组件。Struts2 标签都定义在 URI 为 "/struts-tags" 的命名空间下，Struts2 的标签库功能很强大，使用起来却更简单。 3. 同 Struts1 相比，Struts2 的标签库不依赖于作何表现层技术，即大部分标签，不光能在 JSP 中用，还能在 Velocity 和 FreeMarker 等模板中用。Struts1 中要支持 EL，必须引入 struts-el.jar 和 JSTL 类库；而 Struts2 默认支持 OGNL、JSTL、Groovy 和 Velocity [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-8/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(七)</title>
		<link>http://unmi.cc/unmi-study-struts2-7</link>
		<comments>http://unmi.cc/unmi-study-struts2-7#comments</comments>
		<pubDate>Sat, 29 Mar 2008 19:52:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%83</guid>
		<description><![CDATA[小时候，大人们的谆谆教诲：做人要诚实。并真以此为做人原则。长大后才知道何谓社会。譬如530，再如艳照门，风声乍起之时，有人辟谣；直东窗事发后，道貌岸然者有之、恬不知耻者亦有之。原本成功就不属于规矩之人。纵观，无玄武门之血腥，何来一代宗皇；老毛若不有理而造反，一味守规矩，或为一介书匠耳。雅各一碗红豆汤便谋得以扫的长子权，再行骗去亚伯拉罕的祝福，并顺理成章让耶和华与他同在，可见上帝之“贤明”？。高等教育中有一句，顺利的是骗子，倒霉的是傻子，我是？不还有企业家的原罪吗？有时竟被社会所放任？ 1. 前面讲的自定义类型转换器是基于 OGNL 的 DefaultTypeConverter 类并实现 convertValue() 方法，两个转换方向的逻辑都写在这一个方法中。而 Struts 2 为我们提供了一个 DefaultTypeConverter 的抽象子类 StrutsTypeConverter 来继承，并实现其中两个抽象方法 convertFromString() 和 convertToString()，这要简单易懂。对比 Struts 1 的转换器是要实现 org.apache.commons.beanutils.Converter 接口，以及它的 convert() 方法的。 2. 注意，上面的 convertFromString() 的第二个参数是一个字符串数组，所以可为请求的数组(如请求串为 ?u=1&#38;u=2&#38;u=3)定义转换器，Action 中相应的属性就应为数组或 List，这一方法的返回值也该为相应的类型(数组或List，要通过第三个参数 toClass 来判断是返回数组还是 List 了)。 3. 字符串(如 "user,pass") 转换成 Action 中的复合属性(如 User user) 前面是自定了类型转换器。除此之外，还可以 Struts 2 内置的 OGNL 表达式，更简单的转换，不用写转换器。例如，你的 Action 有属性 User user，只要在 [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-7/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Unmi 的 Struts2 学习笔记(六)</title>
		<link>http://unmi.cc/unmi-study-struts2-6</link>
		<comments>http://unmi.cc/unmi-study-struts2-6#comments</comments>
		<pubDate>Wed, 27 Feb 2008 16:06:00 +0000</pubDate>
		<dc:creator>Unmi</dc:creator>
				<category><![CDATA[Struts]]></category>
		<category><![CDATA[Struts2]]></category>

		<guid isPermaLink="false">http://unmi.cc/uncategorized/unmi-%e7%9a%84-struts2-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e5%85%ad</guid>
		<description><![CDATA[米洗毕，水适量，盖合上，心摇摆，总觉水多了一分或是少了几点，于是重又加上或倒出少许，其实这丁点份量完全无碍煮出香喷喷的饭来。及至将熟之际，亦有犹豫，心中默数至少10，如再有不定辄至20，掐火，20对最终质量来说或有所损。 1. Struts2 的 Action 中可直接用属性来封装请求参数和处理结果，此谓之属性驱动。也可以像 Struts1 那样使用专门的 ActionForm 来处理请求参数和结果，只不过 Struts2 用的是一个更单纯的 POJO，这就做模型驱动；此时的 Action 需要实现 ModelDriven 接口，并实现其 getModel() 方法将 Action 与对应 Model 相关联。 2. 例子说明采用模型驱动的 Action (UserBean 是一个普通 JavaBean，其中定义了 username 和 password 两个属性)：     public class LoginAction implments Action, ModelDriven&#60;UserBean&#62;{         UserBean model = new UserBean();         public UserBean getModel(){             return model;        } [...]]]></description>
		<wfw:commentRss>http://unmi.cc/unmi-study-struts2-6/feed</wfw:commentRss>
		<slash:comments>1</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 11/103 queries in 0.082 seconds using disk: basic
Object Caching 5603/5797 objects using disk: basic

Served from: unmi.cc @ 2012-02-23 07:51:20 -->
