﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-程序人生-文章分类-webwork</title><link>http://www.blogjava.net/caihualin/category/27705.html</link><description>我们站在同一起跑线上,让我们共同努力,共同奋进,愿您的人生因程序而美好!</description><language>zh-cn</language><lastBuildDate>Mon, 03 Dec 2007 00:57:57 GMT</lastBuildDate><pubDate>Mon, 03 Dec 2007 00:57:57 GMT</pubDate><ttl>60</ttl><item><title>webwork类型转换的问题（java.util.Date）</title><link>http://www.blogjava.net/caihualin/articles/164691.html</link><dc:creator>蔡华林</dc:creator><author>蔡华林</author><pubDate>Sun, 02 Dec 2007 12:29:00 GMT</pubDate><guid>http://www.blogjava.net/caihualin/articles/164691.html</guid><wfw:comment>http://www.blogjava.net/caihualin/comments/164691.html</wfw:comment><comments>http://www.blogjava.net/caihualin/articles/164691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caihualin/comments/commentRss/164691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caihualin/services/trackbacks/164691.html</trackback:ping><description><![CDATA[<table style="width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 12pt; font-family: 宋体">在使用webwork过程中遇到了这样一个问题：<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;我的domain model类包含了一个属性java.util.Date beginTime; webwork使用的model driven的方式。界面上需要显示格式是：yyyy-MM-dd HH:mm，但是用&lt;ww:property value="beginTime"/&gt;似乎webwork默认的转换格式是yy-MM-dd，怎样才能得到yyyy-MM-dd HH:mm呢？</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 12pt; font-family: 宋体">写一个convert: </span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">package com.eruite.webapp.webwork;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">import java.text.ParseException;<br />
import java.text.SimpleDateFormat;<br />
import java.util.Date;<br />
import java.util.Map;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">import com.opensymphony.webwork.util.WebWorkTypeConverter;<br />
import com.opensymphony.xwork.XworkException;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">public class DateConverter extends WebWorkTypeConverter {<br />
&nbsp;private static final SimpleDateFormat sdf = new SimpleDateFormat(<br />
&nbsp;&nbsp;&nbsp;"yyyy-MM-dd HH:mm");</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;public Object convertFromString(Map context, String[] values, Class toClass) {<br />
&nbsp;&nbsp;return doConvertToDate(values[0]);<br />
&nbsp;}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;public String convertToString(Map context, Object o) {<br />
&nbsp;&nbsp;String result = null;<br />
&nbsp;&nbsp;if (o instanceof Date) {<br />
&nbsp;&nbsp;&nbsp;result = sdf.format(o);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;private Date doConvertToDate(Object value) {<br />
&nbsp;&nbsp;Date result = null;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;if (value instanceof String) {<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;result = sdf.parse((String) value);<br />
&nbsp;&nbsp;&nbsp;} catch (ParseException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;throw new XworkException("Could not parse date", e);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}<br />
}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 12pt; font-family: 宋体">可以添加默认的xwork-default-conversion.properties&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.util.Date=com.eruite.webapp.webwork.DateConverter&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;也可以写在Domain Model的converter配置里面，如Examination-conversion.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beginTime = com.eruite.webapp.webwork.DateConverter</span></p>
<img src ="http://www.blogjava.net/caihualin/aggbug/164691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caihualin/" target="_blank">蔡华林</a> 2007-12-02 20:29 <a href="http://www.blogjava.net/caihualin/articles/164691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork 2.2 中如何给Collection赋值</title><link>http://www.blogjava.net/caihualin/articles/164651.html</link><dc:creator>蔡华林</dc:creator><author>蔡华林</author><pubDate>Sun, 02 Dec 2007 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/caihualin/articles/164651.html</guid><wfw:comment>http://www.blogjava.net/caihualin/comments/164651.html</wfw:comment><comments>http://www.blogjava.net/caihualin/articles/164651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caihualin/comments/commentRss/164651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caihualin/services/trackbacks/164651.html</trackback:ping><description><![CDATA[<h2><a name="TypeConversion-Collection%E5%92%8CMap%E6%94%AF%E6%8C%81"></a>Collection和Map支持</h2>
<p>WebWork支持多种方法来判断集合中的对象类型. 这是通过一个 <em>ObjectTypeDeterminer</em> 完成的. WebWork提供了缺省实现. 下面的JavaDocs解释了对Map和Collection的支持是如何在DefaultObjectTypeDeterminer中完成的:</p>
<p>ObjectTypeDeterminer检查 <strong>Class-conversion.properties</strong> 文件中包含的用于表示Map和Collection中包含的对象类型的相关内容 . 对于Collection, 如List, 使用格式 <strong>Element_xxx</strong> 来指定其中的元素类型, 这里xxx是action或其他对象中的集合属性名称. 对于Map, 需要按照格式 <strong>Key_xxx</strong> 和 <strong>Element_xxx</strong> 分别指定key和value的类型.</p>
<p>从WebWork 2.1.x开始, 仍然支持Collection_xxx这样的书写格式, 尽管这种格式已经被声明废弃而且最终将被去除.</p>
<p>(摘自snippet:id=javadoc|javadoc=true|url=com.opensymphony.xwork.util.DefaultObjectTypeDeterminer)</p>
<p>除此之外, 也可以实现接口ObjectTypeDeterminer来创建自己的定制ObjectTypeDeterminer. WebWork也包含一个可选的使用Java5范型(generics)技术实现的ObjectTypeDeterminer. 更多信息参见<a title="J2SE 5 Support" href="http://wiki.javascud.org/display/ww2cndoc/J2SE+5+Support">J2SE 5 Support</a>.</p>
<h3><a name="TypeConversion-%E4%BD%BF%E7%94%A8%E9%9B%86%E5%90%88%E7%9A%84%E5%B1%9E%E6%80%A7%E7%B4%A2%E5%BC%95%E9%9B%86%E5%90%88%E5%85%83%E7%B4%A0%28Indexingacollectionbyapropertyofthatcollection%29"></a>使用集合的属性索引集合元素(Indexing a collection by a property of that collection)</h3>
<p>也可以向WebWork传递元素的某个给定属性的值来获取集合中的唯一元素(element). 缺省情况下, 这个属性由 Class-conversion.properties中定义的KeyProperty_xxx=yyy决定, 这里的xxx是返回集合的JavaBean类型名称, yyy是我们用于索引集合中元素的属性名称. (the property of the element of the collection is determined in Class-conversion.properties using KeyProperty_xxx=yyy where xxx is the property of the bean 'Class' that returns the collection and yyy is the property of the collection element that we want to index on.) 下面的两个类是一个示例:</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>MyAction.java</strong></div>
<div class="codeContent">
<pre class="code-java">/**
* @<span class="code-keyword">return</span> a Collection of Foo objects
*/
<span class="code-keyword">public</span> Collection getFooCollection()
{
<span class="code-keyword">return</span> foo;
}</pre>
</div>
</div>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>Foo.java</strong></div>
<div class="codeContent">
<pre class="code-java">/**
* @<span class="code-keyword">return</span> a unique identifier
*/
<span class="code-keyword">public</span> <span class="code-object">Long</span> getId()
{
<span class="code-keyword">return</span> id;
}</pre>
</div>
</div>
<p>然后将 <strong>KeyProperty_fooCollection=id</strong> 放在MyAction-conversion.properties文件中. 这样就可以使用 <strong>fooCollection(someIdValue)</strong> 从集合fooCollection中获取id等于 <em>someIdValue</em> 的Foo对象. 例如, <strong>fooCollection(22)</strong> 将得到id值为22的Foo对象.</p>
<p>这一点十分有用, 因为这直接将一个集合中的元素与它的唯一标志符联系起来, 而不需要强制使用索引, 从而允许修改一个Bean的集合中的元素而不需要编写额外的代码. 例如, 值为 <strong>Phil</strong> 的参数 <strong>fooCollection(22).name</strong> 将集合fooClooection中id属性值为22的Foo对象的name属性设置为"Phil". </p>
<p>Webwork可以使用类型转换自动将参数的类型转换成key属性的类型.</p>
<p>与Map和List元素的属性不同, 如果fooCollection(22)不存在, WebWork不会创建新的对象. 想要做到这一点, 可以使用符号 <strong>fooCollection.makeNew[index]</strong>, 在这里index是一个整数(0, 1等等). 因此, 参数 <strong>fooCollection.makeNew[0]=Phil</strong> 以及 <strong>fooCollection.makeNew[1]=John</strong> 将在fooCollection中添加两个新的Foo对象, 一个name属性值为Phil, 另一个为Bar. 注意, 不管用哪种方法, 在使用Set类型时, 必须定义对象的equals方法和hashCode方法来并保证他们不仅仅包含id属性. 这将导致id属性为null的元素可以从Set中删除.</p>
<h2><a name="TypeConversion-%E7%B4%A2%E5%BC%95%E7%9A%84List%E5%92%8CMap%E7%9A%84%E9%AB%98%E7%BA%A7%E7%A4%BA%E4%BE%8B"></a>索引的List和Map的高级示例</h2>
<p>下面是一个用于List中的模型bean.<br />
该类的KeyProperty是id属性.</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>MyBean.java</strong></div>
<div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class MyBean <span class="code-keyword">implements</span> Serializable {
<span class="code-keyword">private</span> <span class="code-object">Long</span> id;
<span class="code-keyword">private</span> <span class="code-object">String</span> name;
<span class="code-keyword">public</span> <span class="code-object">Long</span> getId() {
<span class="code-keyword">return</span> id;
}
<span class="code-keyword">public</span> void setId(<span class="code-object">Long</span> id) {
<span class="code-keyword">this</span>.id = id;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getName() {
<span class="code-keyword">return</span> name;
}
<span class="code-keyword">public</span> void setName(<span class="code-object">String</span> name) {
<span class="code-keyword">this</span>.name = name;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> toString() {
<span class="code-keyword">return</span> <span class="code-quote">"MyBean{"</span> +
<span class="code-quote">"id="</span> + id +
<span class="code-quote">", name='"</span> + name + '\'' +
'}';
}
}</pre>
</div>
</div>
<p>下面的action有一个beanList属性, 它被初始化为一个空的ArrayList对象.</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>MyBeanAction.java</strong></div>
<div class="codeContent">
<pre class="code-java">ublic class MyBeanAction <span class="code-keyword">implements</span> Action {
<span class="code-keyword">private</span> List beanList = <span class="code-keyword">new</span> ArrayList();
<span class="code-keyword">private</span> Map beanMap = <span class="code-keyword">new</span> HashMap();
<span class="code-keyword">public</span> List getBeanList() {
<span class="code-keyword">return</span> beanList;
}
<span class="code-keyword">public</span> void setBeanList(List beanList) {
<span class="code-keyword">this</span>.beanList = beanList;
}
<span class="code-keyword">public</span> Map getBeanMap() {
<span class="code-keyword">return</span> beanMap;
}
<span class="code-keyword">public</span> void setBeanMap(Map beanMap) {
<span class="code-keyword">this</span>.beanMap = beanMap;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> execute() <span class="code-keyword">throws</span> Exception {
<span class="code-keyword">return</span> SUCCESS;
}
}</pre>
</div>
</div>
<p>定义在conversion.properties中的内容告诉TypeConverter使用MyBean的实例作为List的元素.</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>MyBeanAction-conversion.properties</strong></div>
<div class="codeContent">
<pre class="code-java">KeyProperty_beanList=id
Element_beanList=MyBean
CreateIfNull_beanList=<span class="code-keyword">true</span></pre>
</div>
</div>
<p>当通过表单提交到Action时, (id)的值被当作beanList中MyBean实例的KeyProperty.<br />
注意()符号! 不要使用[], 那仅能用在Map里!<br />
属性的name的值将根据指定的id设置到对应的MyBean实例中.<br />
无效的id值将不会再加入null值.<br />
这就避免了OutOfMemory异常的产生!</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>MyBeanAction.jsp</strong></div>
<div class="codeContent">
<pre class="code-java">&lt;ww:iterator value=<span class="code-quote">"beanList"</span> id=<span class="code-quote">"bean"</span>&gt;
&lt;ww:textfield name=<span class="code-quote">"beanList(%{bean.id}).name"</span> /&gt;
&lt;/ww:iterator&gt;</pre>
</div>
</div>
 <img src ="http://www.blogjava.net/caihualin/aggbug/164651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caihualin/" target="_blank">蔡华林</a> 2007-12-02 16:30 <a href="http://www.blogjava.net/caihualin/articles/164651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>