﻿<?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-java技术</title><link>http://www.blogjava.net/fuhoujun/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 04:29:47 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 04:29:47 GMT</pubDate><ttl>60</ttl><item><title>开源JEE框架　(Bootstrap javascript  spring boot)</title><link>http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Mon, 13 Jun 2016 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/430865.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/430865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/430865.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: * 此框架采用前后台分开，前后台都可以单独部署，前端采用轻量级的扁平化设计（html+javascript+Bootstrap）, 会自动针对不同的屏幕尺寸调整页面，使其在各个尺寸的屏幕上表现良好。<br>* 后端采用Spring boot，它使我们更容易去创建基于Spring的独立和产品级的可以即时运行的应用和服务。直接嵌入Tomcat 或Jetty服务器，不需要部署WAR 文件，可直接运行jar文件。<br>* 系统权限框架采用Shiro，实现前后台权限校验 * 持久层采用JPA ，并实现类ibatis的查询功能；数据响应该采用json格式。<br>* 服务采用REST形式，能够方便的与手机app进行对接，集成swagger能够在线查看RESTAPI 文档和在线测试服务接口<br>* 支持单点登录，可以多系统进行菜单集成，形成一个portal<br>* 支持高并发和水平扩展，支持Session的统一存储<br>* 项目采用gradle构建，能够方便的将各项目进行按需组装&nbsp;&nbsp;<a href='http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html'>阅读全文</a><img src ="http://www.blogjava.net/fuhoujun/aggbug/430865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2016-06-13 10:00 <a href="http://www.blogjava.net/fuhoujun/archive/2016/06/13/430865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java NIO</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Tue, 21 Oct 2008 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/235733.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/235733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/235733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java nio的全称是java new I/O，即一个全新的I/O控制系统，它的API的包名为java.nio，是在jdk1.4后引入的。nio之所以为为新，在于它并没在原来I/O的基础上进行开发，而是提供了全新的类和接口，除了原来的基本功能之外，它还提供了以下新的特征：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ►&nbsp;多路选择的非封锁式...&nbsp;&nbsp;<a href='http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html'>阅读全文</a><img src ="http://www.blogjava.net/fuhoujun/aggbug/235733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-21 17:44 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/21/235733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>轻松实现Apache,Tomcat集群和负载均衡</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Mon, 20 Oct 2008 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/235373.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/235373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/235373.html</trackback:ping><description><![CDATA[&nbsp;作者:罗代均 ldj_work#126.com,转载请保持完整性<br />
环境说明
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache&nbsp; :apache_2.0.55&nbsp;&nbsp;&nbsp;&nbsp; 1 个</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tomcat:&nbsp; apache-tomcat-5.5.17 (zip版) 2个</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mod_jk:: mod_jk-apache-2.0.55.so&nbsp; 1个</p>
<p><strong>第一部分：负载均衡</strong></p>
<p>&nbsp;&nbsp;&nbsp; 负载均衡，就是apache将客户请求均衡的分给tomcat1,tomcat2....去处理</p>
<p><strong>&nbsp;&nbsp; 1.安装apche,tomcat</strong></p>
<p>&nbsp;&nbsp; <a href="http://httpd.apache.org/">http://httpd.apache.org/</a>&nbsp;下载Apache 2.0.55</p>
<p>&nbsp;&nbsp;&nbsp; <a href="http://tomcat.apache.org/download-55.cgi">http://tomcat.apache.org/download-55.cgi</a>&nbsp;下载tomcat5.5 zip版本（解压即可，绿色版）</p>
<p>&nbsp;&nbsp; <a href="http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/">http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/</a>&nbsp; 下载mod_jk,注意和&nbsp; apache版本匹配</p>
<p>&nbsp;&nbsp; 按照jdk,我的路径为:E:\ide\apache\Apache2</p>
<p>&nbsp;&nbsp; 解压两份Tomcat, 路径分别为 E:\ide\tomcat1,E:\ide\tomcat2</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/9d61f003d5034eec09fa935b.jpg" border="0" small="0"  alt="" /></div>
<p>下载mod_jk</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/52855e82373a3ea20df4d224.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/46899c50d44e3b628435245b.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<p><strong>2.修改Apache配置文件http.conf</strong></p>
<p>&nbsp;&nbsp; 在apache安装目录下conf目录中找到http.conf</p>
<p>&nbsp;&nbsp; 在文件最后加上下面一句话就可以了</p>
<p>&nbsp; include "E:\ide\apache\Apache2\conf\mod_jk.conf"</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/d1c28cd49b8d6901a08bb720.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>2. http.conf 同目录下新建mod_jk.conf文件，内容如下</strong></div>
<div forimg="1">&nbsp;&nbsp; </div>
<div forimg="1">#加载mod_jk Module<br />
LoadModule jk_module modules/mod_jk-apache-2.0.55.so</div>
<div forimg="1"></div>
<div forimg="1">#指定 workers.properties文件路径<br />
JkWorkersFile conf/workers.properties</div>
<div forimg="1"></div>
<div forimg="1">#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器</div>
<div forimg="1">JkMount /*.jsp controller</div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>3.在http.conf同目录下新建 workers.properties文件，内容如下</strong></div>
<div forimg="1">&nbsp;</div>
<div forimg="1">worker.list = controller,tomcat1,tomcat2&nbsp; #server 列表</div>
<div forimg="1"></div>
<div forimg="1">#========tomcat1========</div>
<div forimg="1">worker.tomcat1.port=8009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ajp13 端口号，在tomcat下server.xml配置,默认8009<br />
worker.tomcat1.host=localhost&nbsp; #tomcat的主机地址，如不为本机，请填写ip地址<br />
worker.tomcat1.type=ajp13<br />
worker.tomcat1.lbfactor = 1&nbsp;&nbsp; #server的加权比重，值越高，分得的请求越多</div>
<div forimg="1"></div>
<div forimg="1">#========tomcat2========</div>
<div forimg="1">worker.tomcat2.port=9009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ajp13 端口号，在tomcat下server.xml配置,默认8009<br />
worker.tomcat2.host=localhost&nbsp; #tomcat的主机地址，如不为本机，请填写ip地址<br />
worker.tomcat2.type=ajp13<br />
worker.tomcat2.lbfactor = 1&nbsp;&nbsp; #server的加权比重，值越高，分得的请求越多</div>
<div forimg="1"><br />
#========controller,负载均衡控制器========<br />
worker.controller.type=lb<br />
worker.controller.balanced_workers=tomcat1,tomcat2&nbsp;&nbsp; #指定分担请求的tomcat<br />
worker.controller.sticky_session=1</div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>4.修改tomcat配置文件server.xml</strong></div>
<div forimg="1">如果你在不同电脑上安装tomcat,tomcat的安装数量为一个，可以不必修改tomcat配置文件</div>
<div forimg="1">我这里是在同一台电脑上安装两个tomcat，所以需要更改其中一个的设置</div>
<div forimg="1"></div>
<div forimg="1">打开tomcat2/conf/server.xml文件</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/a3d133a8ed4063b1ca130c36.jpg" border="0" small="0"  alt="" />
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/8c3cae7727b25d1bb151b937.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/56b04b085ba7f3950b7b8230.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>5.编写一个测试jsp</strong></div>
<div forimg="1"></div>
<div forimg="1">建立一个目录test.里面新建一个test.jsp,内容为</div>
<div forimg="1"></div>
<div forimg="1">&lt;% <br />
&nbsp;&nbsp; System.out.println("===========================");<br />
%&gt;<br />
</div>
<div forimg="1">把test放到tomcat1,tomcat2的webapps下</div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>6.启动apache,tomcat1,tomcat2,进行测试</strong></div>
<div forimg="1"></div>
<div forimg="1">通过 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a>&nbsp;访问，查看tomcat1的窗口，可以看到打印了一行"=========="</div>
<div forimg="1">再刷新一次，tomcat2也打印了一条，再刷新，可以看到请求会被tomcat1,tomcat2轮流处理,实现了负载均衡</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/acf2fcf2c8b77d13b17ec53d.jpg" width="830" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>第二部分，配置集群</strong></div>
<div forimg="1">&nbsp;&nbsp; 只配置负载均衡还不行，还要session复制，也就是说其中任何一个tomcat的添加的session，是要同步复制到其它tomcat， 集群内的tomcat都有相同的session</div>
<div forimg="1"></div>
<div forimg="1"><strong>1. 修改tomcat1, tomcat2的server.xml</strong>,将集群部分配置的在注释符删掉,并将tomcat2的4001端口改为4002，以避免与tomcat冲突，当然，如果是两台电脑，是不用改端口的，去掉注释符即可</div>
<div forimg="1">&nbsp;&nbsp;
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/aa4ab5fb0f3582224f4aeab2.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1">
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/89b84c3627ecc1dda3cc2b92.jpg" border="0" small="0"  alt="" /></div>
</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/cc4b858b603d47d3fd1f10b2.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<div forimg="1"></div>
<div forimg="1"><strong>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/52dfdac4bc506ecb38db4959.jpg" border="0" small="0"  alt="" /></div>
</strong></div>
<div forimg="1"><strong></strong></div>
<div forimg="1"><strong>2，修改测试项目test</strong></div>
<div forimg="1">修改test.jsp,内容如下</div>
<div forimg="1"></div>
<div forimg="1">&nbsp; &lt;%@ page contentType="text/html; charset=GBK" %&gt;<br />
&lt;%@ page import="java.util.*" %&gt;<br />
&lt;html&gt;&lt;head&gt;&lt;title&gt;Cluster App Test&lt;/title&gt;&lt;/head&gt;<br />
&lt;body&gt;<br />
Server Info:<br />
&lt;%<br />
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&lt;br&gt;");%&gt;<br />
&lt;%<br />
&nbsp; out.println("&lt;br&gt; ID " + session.getId()+"&lt;br&gt;");</div>
<div forimg="1">&nbsp; // 如果有新的 Session 属性设置<br />
&nbsp; String dataName = request.getParameter("dataName");<br />
&nbsp; if (dataName != null &amp;&amp; dataName.length() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String dataValue = request.getParameter("dataValue");<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute(dataName, dataValue);<br />
&nbsp; }</div>
<div forimg="1">&nbsp; out.print("&lt;b&gt;Session 列表&lt;/b&gt;");</div>
<div forimg="1">&nbsp; Enumeration e = session.getAttributeNames();<br />
&nbsp; while (e.hasMoreElements()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String name = (String)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String value = session.getAttribute(name).toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp; out.println( name + " = " + value+"&lt;br&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( name + " = " + value);<br />
&nbsp;&nbsp; }<br />
%&gt;<br />
&nbsp; &lt;form action="index.jsp" method="POST"&gt;<br />
&nbsp;&nbsp;&nbsp; 名称:&lt;input type=text size=20 name="dataName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 值:&lt;input type=text size=20 name="dataValue"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;input type=submit&gt;<br />
&nbsp;&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</div>
<div forimg="1"></div>
<div forimg="1">然后在test 新建WEB-INF目录，WEB-INF下新建web.xml,内容如下</div>
<div forimg="1">&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>" version="2.4"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;TomcatDemo&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000"> &lt;distributable/&gt;</font></strong><br />
&lt;/web-app&gt;</div>
<div forimg="1"></div>
<div forimg="1">注意：在你的应用的web.xml加入&nbsp;<font color="#ff0000"><strong> &lt;distributable/&gt;</strong> </font><font color="#000000">即可</font></div>
<div forimg="1"></div>
<div forimg="1">ok,讲test复制到tomcat1,tomcat2的webapps下，重启apache,tomcat1,tomcat2,</div>
<div forimg="1">输入网址 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a>&nbsp;&nbsp; </div>
<div forimg="1"></div>
<div forimg="1">新建一个 名称为 xiaoluo&nbsp; ,值为 cdut 的session,提交查询，新开一个ie窗口，再提交查询，如图，可以看到，两个tomcat 是负载均衡，并且session同步的</div>
<div forimg="1">
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/luodaijun/pic/item/79a9317af99aa5ed2e73b385.jpg" width="830" border="0" small="0"  alt="" /></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/235373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-20 08:49 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/20/235373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext中FormPanel面板及Form控件横排测试(CSS) </title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/15/234416.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Wed, 15 Oct 2008 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/15/234416.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/234416.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/15/234416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/234416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/234416.html</trackback:ping><description><![CDATA[<div class="content">
<p>在实际的网页开发中，大部分时间都要涉及到Form表单的处理。在Ext框架中也提供了很多这方面的控件，而且还有一个专门的FormPanel布 局，该布局默认为放在面板上面的所有控件都是换行放置，而在实际应用中为了美观，有些需要横排，特别是Radio控件，这个时候就需要我们重新定制这些控 件的布局了，该例子中使用CSS来实现这些功能，先贴出一张效果图。</p>
<p><img height="192" alt="" src="http://www.xlei.net/x/wp-content/uploads/2008/06/005638mlp.jpg" width="420" border="0" /><br />
<code><br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;<br />
&lt;title&gt;Ext中FormPanel面板及Form控件横排测试(CSS)&lt;/title&gt;<br />
&lt;link rel="stylesheet" type="text/css" media="all" href="../ext/resources/css/ext-all.css" /&gt;<br />
&lt;style type="text/css" media="all"&gt;<br />
.allow-float {clear:none!important;} /* 允许该元素浮动 */<br />
.stop-float {clear:both!important;} /* 阻止该元素浮动 */<br />
.sex-male {float:left;}<br />
.sex-female {float:left;padding:0 0 0 20px;}<br />
.age-field {float:left;padding:0 0 0 58px;*padding:0 0 0 50px!important;*padding:0 0 0 50px;}<br />
&lt;/style&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;script type="text/javascript" src="../ext/adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="../ext/ext-all.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript" src="../ext/build/locale/ext-lang-zh_CN.js"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;Ext.BLANK_IMAGE_URL = '../ext/resources/images/default/s.gif';&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;<br />
Ext.onReady(function() {<br />
//创建Form面板<br />
var fp = new Ext.form.FormPanel({<br />
buttonAlign:'center',<br />
labelAlign:'right',<br />
labelWidth:40,<br />
frame:true,<br />
bodyStyle:'padding:8px 0 0 0;',<br />
items:[{<br />
xtype:'textfield',<br />
fieldLabel:'姓名',<br />
name:'n_username',<br />
id:'i_username',<br />
width:320<br />
},{<br />
xtype:'radio',<br />
fieldLabel:'性别',<br />
boxLabel:'男',<br />
name:'sex',<br />
id:'male',<br />
itemCls:'sex-male', //向左边浮动,处理控件横排<br />
clearCls:'allow-float', //允许两边浮动,在实际生成的HTML结构中有专门的DIV阻断浮动<br />
checked:true<br />
},{<br />
xtype:'radio',<br />
boxLabel:'女',<br />
name:'sex',<br />
id:'female',<br />
itemCls:'sex-female', //向左浮动,处理控件横排<br />
clearCls:'allow-float', //允许两边浮动<br />
hideLabel:true //不显示前面"性别"的标签<br />
},{<br />
xtype:'textfield',<br />
fieldLabel:'年龄',<br />
name:'n_age',<br />
id:'i_age',<br />
itemCls:'age-field', //向左浮动,处理控件横排<br />
width:133<br />
},{<br />
xtype:'textfield',<br />
fieldLabel:'住址',<br />
name:'n_address',<br />
id:'i_address',<br />
itemCls:'stop-float', //不允许浮动,结束控件横排<br />
width:320<br />
}],<br />
buttons:[{<br />
text:'确定',<br />
handler:onOK //实际应用一般是处理fp.getForm.submit()事件<br />
}, {<br />
text:'重置',<br />
handler:function(){ fp.getForm().reset(); }<br />
}],<br />
keys:[{ //处理键盘回车事件<br />
key:Ext.EventObject.ENTER,<br />
fn:onOK,<br />
scope:this<br />
}]<br />
});</p>
<p>//确定按钮事件,这里只是简单获取各控件值,实际应用一般和后台脚本结合<br />
function onOK() {<br />
var strMsg;<br />
strMsg = &#8216;姓名：&#8217; + fp.getComponent(&#8217;i_username&#8217;).getValue() + &#8216;，性别：&#8217;;<br />
if (fp.getComponent(&#8217;male&#8217;).checked) strMsg += &#8216;男&#8217;;<br />
if (fp.getComponent(&#8217;female&#8217;).checked) strMsg += &#8216;女&#8217;;<br />
strMsg += &#8216;，年龄：&#8217; + fp.getComponent(&#8217;i_age&#8217;).getValue();<br />
strMsg += &#8216;，住址：&#8217; + fp.getComponent(&#8217;i_address&#8217;).getValue();<br />
alert(strMsg);<br />
}</p>
<p>//创建主窗口<br />
new Ext.Window({<br />
title:&#8217;Ext中FormPanel面板及Form控件横排测试(CSS)&#8217;,<br />
width:400,<br />
closable:false,<br />
collapsible:true,<br />
draggable:false,<br />
resizable:false,<br />
modal:true,<br />
border:false,<br />
items:[fp],<br />
buttons:[]<br />
}).show();<br />
});<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code></p>
<div class="clear"></div>
</div>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/234416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-15 13:03 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/15/234416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java下的框架编程之cglib的应用</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Wed, 08 Oct 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/233074.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/233074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/233074.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="96%" align="center" border="0">
    <tbody>
        <tr>
            <td class="d_font3" valign="bottom" align="center" height="24">Java下的框架编程之cglib的应用</td>
        </tr>
        <tr>
            <td bgcolor="#e3e3e3" height="3"></td>
        </tr>
        <tr>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td class="d_font4">
            <p>Proxy可以看作是微型的AOP，明白提供了在继承和委托之外的第三个代码封装途径，只要有足够的想象力，可以做得非常好玩，Spring的源码里用Proxy就用得很随便，看得我非常眼红。可惜Proxy必须基于接口。因此Spring的做法，基于接口的用proxy,否则就用cglib。AOP么，一般小事非compoent一级的就不麻烦AspectJ出手了。</p>
            <p>cglib的Enhancer说起来神奇，用起来一页纸不到就讲完了。</p>
            <p>它的原理就是用Enhancer生成一个原有类的子类，并且设置好callback到proxy， 则原有类的每个方法调用都会转为调用实现了MethodInterceptor接口的proxy的intercept()&nbsp;函数：</p>
            <p>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;o,Method&nbsp;method,Object[]&nbsp;args,MethodProxy&nbsp;proxy)</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            在intercept()函数里，你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函数，在执行前后加入自己的东西，改变它的参数值，也可以瞒天过海，完全干别的。说白了，就是AOP中的around advice。 <br />
            <p>AOP没有出现以前，该领域经典的设计模式是Decorator，像Java IO Stream的设计就是如此。不过，如果为每个DAO, 每个方法的写Decorator函数会写死人的，所以用上cglib的好处是一次过拦截所有方法。&nbsp;<br />
            <br />
            另外，cglib除了Enhancer之外，还有BulkBean和Transform，都是Hibernate持久化的基础，但文档贫乏，一时还没去看怎么用。<br />
            <br />
            1.AOP里讲了一百遍啊一百遍的log aspect在cglib是这样做的：</p>
            <p>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LogDAOProxy&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodInterceptor<br />
                        &nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Logger&nbsp;log</span><span style="color: #000000">=</span><span style="color: #000000">Logger.getLogger(LogDAOProxy.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Enhancer&nbsp;enhancer</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Enhancer();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回DAO的子类</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getDAO(Class&nbsp;clz)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(clz);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//默认</span><span style="color: #008000">的拦截方法</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;o,Method&nbsp;method,Object[]&nbsp;args,</span></p>
                        <p><span style="color: #000000">        MethodProxy&nbsp;proxy)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">调用日志方法</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">method.getName());<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invokeSuper(o,args);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;}</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            应用的代码：</p>
            <p>
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p>LogDAOProxy&nbsp;proxy&nbsp;<span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LogDAOProxy();<br />
                        &nbsp;&nbsp;GoodsDAO&nbsp;&nbsp;dao&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(GoodsDAO)proxy.getDAO(GoodsDAO.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;dao.insert(goods);</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            2.而在Spring的管理下应该略加修改的高级Decorator</p>
            <p>上面的例子用<span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();创建子类实例，但在Spring管理下，一些Bean的实例必须由Spring来创建和管理，而不由enhancer来创建的。所以我对上述用法略加修改，使它真正当一个Proxy的角色，请对比黑体字的部分。</span></p>
            <p><span style="color: #000000">
            <table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
                <tbody>
                    <tr>
                        <td class="code" bgcolor="#e6e6e6">
                        <pre>
                        <p><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LogDAOProxy&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodInterceptor<br />
                        &nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Logger&nbsp;log</span><span style="color: #000000">=</span><span style="color: #000000">Logger.getLogger(LogDAOProxy.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;dao</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Enhancer&nbsp;enhancer</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Enhancer();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回DAO的子类</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getDAO(Class&nbsp;clz,Object&nbsp;dao)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.dao&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dao;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setSuperclass(clz);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;enhancer.create();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">默认的拦截方法</span><span style="color: #008000"><br />
                        </span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;intercept(Object&nbsp;o,Method&nbsp;method,Object[]&nbsp;args,</span></p>
                        <p><span style="color: #000000">        MethodProxy&nbsp;proxy)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">调用日志方法</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">method.getName());<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invoke(dao,&nbsp;args);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }</span></p>
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />
            </span>可见，原来模式里在getDao()时由enhancer创建dao，而&nbsp;调用intercept时则将enhancer创建的dao以Object o参数传回。<br />
            而新模式里，dao在getDao()时从外面传入，enhancer.create()返回的是一个proxy. 而调用intercept时，实际会用之前传入的dao进行操作，而忽略Object o参数传入的proxy。</p>
            <p>有点遗憾, intercept函数里MethodProxy的Signature是固定的，即客户如果调用foo(String),你不可以用proxy.invoke偷换成foo(String,String); </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/233074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-08 10:38 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/08/233074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext-实现带查询以及分页的列表</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232399.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Sat, 04 Oct 2008 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232399.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/232399.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/232399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/232399.html</trackback:ping><description><![CDATA[<p>前台：
<p>Store:
<p>var resource = new Ext.data.Store({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fields: ['imgpath','typeImage','title', 'type'],<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url: 'teaching/resource/resourceAction.evi?method=getResourceList',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader: new Ext.data.XmlReader(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record: "Item",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalRecords: "TotalCount"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [{name:'title',mapping: 'title'}, {name:'type',mapping: 'type'},{name:'imgpath',mapping: 'imgpath'},{name:'typeImage',mapping: 'typeImage'} ]<br />
&nbsp;&nbsp;&nbsp; )<br />
});
<p>resource.addListener('load', function(st, rds, opts) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // st 是当前的store, rds是读到的Record[], opts是store的配置<br />
&nbsp;&nbsp; for( var c=0; c&lt;rds.length; c++ ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rds[c].set('typeImage', "&lt;img src='./images/33.gif' width='12' height='12' /&gt;");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //待定类别，先定死类别图片<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
});
<p>resource.load({params:{start:0,limit:10}});
<p>var resourceType = new Ext.data.Store({<br />
<a href="http://shihan999.blog.hexun.com/'teaching/resourceType/resourceTypeAction.evi?method=getResourceTypeList'">url:'teaching/resourceType/resourceTypeAction.evi?method=getResourceTypeList'</a>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader: new Ext.data.XmlReader({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record: "Item"<br />
&nbsp;&nbsp;&nbsp;&nbsp; }, [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'resourceTypeId', mapping: 'resourceTypeId'},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'resourceType', mapping: 'resourceType'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ])<br />
&nbsp;&nbsp; });<br />
resourceType.load();<br />
var languageType = new Ext.data.Store({<br />
<a href="http://shihan999.blog.hexun.com/'teaching/languageType/languageTypeAction.evi?method=getLanguageTypeList'">url:'teaching/languageType/languageTypeAction.evi?method=getLanguageTypeList'</a>,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader: new Ext.data.XmlReader({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record: "Item"<br />
&nbsp;&nbsp;&nbsp;&nbsp; }, [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'languageTypeId', mapping: 'languageTypeId'},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'languageType', mapping: 'languageType'}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ])<br />
&nbsp;&nbsp; });<br />
languageType.load();
<p>列表：
<p>resourcePanel = new Ext.grid.GridPanel({<br />
id: 'resources',<br />
frame: true,<br />
header: false,<br />
width: 288,<br />
autoWidth: true,<br />
autoHeight: true,<br />
loadMask:{msg:'正在加载数据，请稍侯&#8230;&#8230;'},<br />
iconCls:'icon-grid',<br />
viewConfig: { forceFit: true },<br />
&nbsp;&nbsp; columns:[<br />
&nbsp; {header: " ",dataIndex: 'typeImage' , width:20},<br />
&nbsp; {header: "资源标题", width: 190, sortable: true, dataIndex: 'title'},<br />
&nbsp; {header: "类别", width: 80, sortable: true, dataIndex: 'type'}<br />
&nbsp;&nbsp; ],<br />
&nbsp; store: resource,<br />
&nbsp; selModel: new Ext.grid.RowSelectionModel({singleSelect:false}),<br />
&nbsp;&nbsp;&nbsp;&nbsp; bbar: new Ext.PagingToolbar({ <br />
&nbsp; pageSize: 10, <br />
&nbsp; store: resource, <br />
&nbsp; displayInfo: false, <br />
&nbsp; //displayMsg: '显示第 {0} 条到 {1} 条记录，一共 {2} 条', <br />
&nbsp; emptyMsg: "没有记录"&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }),<br />
&nbsp; listeners: {<br />
&nbsp; rowclick:function(e) {<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; window.parent.parent.Ext.ux.MyTips.msg("提示", "双击该行可预览该资源");<br />
&nbsp;&nbsp;&nbsp; } catch(e) {}<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp; rowdblclick:function(g, rIdx, e) {<br />
&nbsp;&nbsp; var rd = g.getStore().getAt(rIdx);<br />
&nbsp;&nbsp; var html = "&lt;img src='./images/" + rd.get('imgpath') + "' /&gt;";<br />
&nbsp; window.parent.showWin({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout: 'fit',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maximizable: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: rd.get('title'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width: 400,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height: 400,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //modal: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //closeAction: 'hide',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plain: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items: [ {html: html} ]<br />
&nbsp;&nbsp;&nbsp; });<br />
&nbsp; }<br />
}<br />
});
<p>FormPanel:
<p>var rform = new Ext.form.FormPanel({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id:'rform',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; header: false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hideBorders: false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items: [<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ext.form.TextField({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldLabel: '关键字',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name:'keyword'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ext.form.ComboBox({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldLabel: '资源类别',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode: 'local',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; triggerAction: 'all',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store: resourceType,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeAhead: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hiddenName:'resourceTypeId',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayField: 'resourceType',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valueField: 'resourceTypeId',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readOnly: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectOnFocus: true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ext.form.ComboBox({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldLabel: '语言',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mode: 'local',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; triggerAction: 'all',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typeAhead: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hiddenName:'languageTypeId',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayField:'languageType',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valueField:'languageTypeId',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readOnly: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectOnFocus: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store:languageType<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ext.Panel({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout: 'table',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buttonAlign: 'center',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layoutConfig: { colspan: 3 },<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buttons:[{text: '搜&nbsp; 寻',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler: function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var keyword = Ext.get('keyword').dom.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var resourceTypeId = Ext.get('resourceTypeId').dom.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var languageTypeId = Ext.get('languageTypeId').dom.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resource.reload({params:{start:0,limit:3,keyword:keyword,resourceTypeId:resourceTypeId,languageTypeId:languageTypeId}});<br />
&nbsp;&nbsp; //这里不用再写ajax，Ext已经封装了ajax，只要把参数传进去就行了&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: '重&nbsp; 置',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler: function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ext.getCmp('rform').form.reset();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })
<p>后台：
<p>public ActionForward getResourceList(ActionMapping mapping,<br />
&nbsp;&nbsp; ActionForm form, HttpServletRequest request,<br />
&nbsp;&nbsp; HttpServletResponse response) throws IOException {
<p>&nbsp; Document document = DocumentHelper.createDocument();<br />
&nbsp; String start = request.getParameter("start");<br />
&nbsp; String limit = request.getParameter("limit");<br />
&nbsp; String keyword = request.getParameter("keyword");<br />
&nbsp; String resourceTypeId = request.getParameter("resourceTypeId");<br />
&nbsp; String languageTypeId = request.getParameter("languageTypeId");
<p>&nbsp; List&lt;HqlCondition&gt; hqlFilter = new LinkedList&lt;HqlCondition&gt;();<br />
&nbsp; if(keyword != null &amp;&amp; keyword.length()&gt;0){<br />
&nbsp;&nbsp; hqlFilter.add( new HqlCondition("and", "rs.title", "like", "%" + keyword + "%", HqlCondition.String) );<br />
&nbsp;&nbsp; hqlFilter.add( new HqlCondition("or", "rs.remarks", "like", "%" + keyword + "%", HqlCondition.String) );<br />
&nbsp; }<br />
&nbsp; if(resourceTypeId != null &amp;&amp; resourceTypeId.length()&gt;0){<br />
&nbsp;&nbsp; hqlFilter.add( new HqlCondition("and", "rs.resourceType.resourceTypeId", "=", new Long(resourceTypeId), HqlCondition.Long) );<br />
&nbsp; }<br />
&nbsp; if(languageTypeId != null &amp;&amp; languageTypeId.length()&gt;0){<br />
&nbsp;&nbsp; hqlFilter.add( new HqlCondition("and", "rs.languageType.languageTypeId", "=", new Integer(languageTypeId), HqlCondition.Integer) );<br />
&nbsp; }<br />
&nbsp; int pageno =1;<br />
&nbsp; int pagesize = 10;<br />
&nbsp; if(limit != null &amp;&amp; limit.length()&gt;0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pagesize = Integer.parseInt(limit);<br />
&nbsp; }
<p>&nbsp; if(!start.equalsIgnoreCase("0") &amp;&amp; start != null &amp;&amp; start.length()&gt;0){<br />
&nbsp;&nbsp;&nbsp;&nbsp; int bpos = Integer.parseInt(start);<br />
&nbsp;&nbsp;&nbsp;&nbsp; pageno = (bpos + pagesize)/pagesize;<br />
&nbsp; }<br />
&nbsp; int total = this.rse.getResourceTotalCount(hqlFilter);<br />
&nbsp; Collection&lt;BaseVO&gt; coll = this.rse.getResourceList(hqlFilter,pageno,pagesize);<br />
&nbsp; Iterator&lt;BaseVO&gt; it = coll.iterator();<br />
&nbsp; while(it != null &amp;&amp; it.hasNext()){<br />
&nbsp;&nbsp; BaseVO bv = it.next();<br />
&nbsp;&nbsp; ResourceType rt = this.rts.getResourceType(((ResourceType)bv.get("resourceType")).getResourceTypeId());<br />
&nbsp;&nbsp; bv.set("type", rt.getResourceType());<br />
&nbsp; }<br />
&nbsp; document.addElement("type");<br />
&nbsp; new OutputVOXml().writeXML(total,new LinkedList&lt;BaseVO&gt;(coll), response);<br />
&nbsp; return null;<br />
}</p>
<a href="http://shihan999.photo.hexun.com/41773672_d.html"><img alt="查看更多精彩图片" src="http://photo13.hexun.com/p/2008/0605/208868/b_79A49EB7FFC7F6EB4A26026C74AF6F6E.jpg" border="0" /></a><script type="text/javascript">
addthis_pub= 'wolfit';
addthis_logo= 'http://download.rainbowsoft.org/image/common/zbloglogo.gif';
addthis_brand= 'Z-Blog';
addthis_options= 'favorites, delicious, twitter, digg, myspace, facebook, google, live,  email, more';
</script>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/232399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 22:43 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/04/232399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON与struts2 </title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Sat, 04 Oct 2008 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/232324.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/232324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/232324.html</trackback:ping><description><![CDATA[&nbsp;Apache<span style="font-family: 宋体">提供的一个插件包，可以把</span>Action<span style="font-family: 宋体">中的数据以</span>JSON<span style="font-family: 宋体">做个封装然后返回。</span>
<p><span style="font-family: 宋体">它会将整个</span>action<span style="font-family: 宋体">中的变量转化为</span>JSON<span style="font-family: 宋体">数据</span>(<span style="font-family: 宋体">根对象在</span>JSON<span style="font-family: 宋体">中数据添加一个</span>&#8221;root&#8221;<span style="font-family: 宋体">标识</span>)<span style="font-family: 宋体">。如果要使用它，</span>Action<span style="font-family: 宋体">必须遵循以下几点：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">返回的页面类型中</span>&#8221;content-type&#8221;<span style="font-family: 宋体">必须是</span>&#8221;application/json&#8221;.(<span style="font-family: 宋体">这个已经</span>Internet Community<span style="font-family: 宋体">采用</span>).</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>JSON<span style="font-family: 宋体">内容必须是符合格式要求的</span>.</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Action<span style="font-family: 宋体">中</span>field<span style="font-family: 宋体">必须有</span>public<span style="font-family: 宋体">的</span>set<span style="font-family: 宋体">方法</span>.(<span style="font-family: 宋体">是不是没有</span>set<span style="font-family: 宋体">方法就不会将</span>field<span style="font-family: 宋体">添加到</span>JSON<span style="font-family: 宋体">数据中，有待验证</span>).</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">它支持的类型有</span>: <span style="font-family: 宋体">基本类型</span>(int,long...String), Date, List, Map, Primitive Arrays, <span style="font-family: 宋体">其它</span>class, <span style="font-family: 宋体">对象数组</span>.</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">在</span>JSON<span style="font-family: 宋体">中任何的</span>Object<span style="font-family: 宋体">会被封装在</span>list<span style="font-family: 宋体">或</span>map<span style="font-family: 宋体">中，数据会被封装程</span>Long<span style="font-family: 宋体">，如果是含有的数据则会被封装程</span>Double<span style="font-family: 宋体">，数组会被封装程</span>List.</p>
<p><span style="font-family: 宋体">下面给出</span>JSON<span style="font-family: 宋体">的数据格式</span>:</p>
<p>{</p>
<p>&nbsp;&nbsp; "doubleValue": 10.10,</p>
<p>&nbsp;&nbsp; "nestedBean": {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name": "Mr Bean"</p>
<p>&nbsp;&nbsp; },</p>
<p>&nbsp;&nbsp; "list": ["A", 10, 20.20, {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "firstName": "El Zorro"</p>
<p>&nbsp;&nbsp; }],</p>
<p>&nbsp;&nbsp; "array": [10, 20] </p>
<p>}</p>
<p><span style="font-family: 宋体">说明</span>:</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">a.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这个插件支持以下几个注释</span>:</p>
<table style="margin-left: 3.75pt; border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: #cccccc 1pt solid; padding-left: 3pt; background: #f0f0f0; padding-bottom: 2.25pt; border-left: #cccccc 1pt solid; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><strong><span style="font-size: 8.5pt; color: black; font-family: 宋体">注释名</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: #cccccc 1pt solid; padding-left: 3pt; background: #f0f0f0; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><strong><span style="font-size: 8.5pt; color: black; font-family: 宋体">简介</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: #cccccc 1pt solid; padding-left: 3pt; background: #f0f0f0; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><strong><span style="font-size: 8.5pt; color: black; font-family: 宋体">默认值</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: #cccccc 1pt solid; padding-left: 3pt; background: #f0f0f0; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><strong><span style="font-size: 8.5pt; color: black; font-family: 宋体">序列化</span></strong></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: #cccccc 1pt solid; padding-left: 3pt; background: #f0f0f0; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><strong><span style="font-size: 8.5pt; color: black; font-family: 宋体">反序列化</span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: #cccccc 1pt solid; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">name</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: 宋体">配置</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">JSON</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">中</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">name</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">empty</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">yes</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">no</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: #cccccc 1pt solid; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">serialize</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: 宋体">在</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">serialization</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">中</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">true</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">yes</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">no</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: #cccccc 1pt solid; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">deserialize</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: 宋体">在</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">deserialization</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">中</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">true</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">no</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">yes</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: #cccccc 1pt solid; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">format</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: 宋体">格式化</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">Date</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">字段</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">"yyyy-MM-dd'T'HH:mm:ss"</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">yes</span></p>
            </td>
            <td style="border-right: #cccccc 1pt solid; padding-right: 3pt; border-top: medium none; padding-left: 3pt; padding-bottom: 2.25pt; border-left: medium none; padding-top: 2.25pt; border-bottom: #cccccc 1pt solid">
            <p style="margin: 3.75pt 0cm; line-height: 12pt; text-align: center" align="center"><span style="font-size: 8.5pt; color: black; font-family: Verdana">yes</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin-left: 21pt"><span style="font-family: 宋体">可以通过配置来显示指出要放在</span>JSON<span style="font-family: 宋体">中</span>field<span style="font-family: 宋体">，其中有个自己的验证规则需要研究</span>.</p>
<p style="margin-left: 21pt">&lt;!-- Result fragment --&gt;</p>
<p style="margin-left: 21pt">&lt;result type="json"&gt;</p>
<p style="margin-left: 21pt">&nbsp;&lt;param name="excludeProperties"&gt;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; login.password,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; studentList.*".sin</p>
<p style="margin-left: 21pt">&nbsp;&lt;/param&gt;</p>
<p style="margin-left: 21pt">&lt;/result&gt;</p>
<p style="margin-left: 21pt">&lt;!-- Interceptor fragment --&gt;</p>
<p style="margin-left: 21pt">&lt;interceptor-ref name="json"&gt;</p>
<p style="margin-left: 21pt">&nbsp;&lt;param name="enableSMD"&gt;true&lt;/param&gt;</p>
<p style="margin-left: 21pt">&nbsp;&lt;param name="excludeProperties"&gt;</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; login.password,</p>
<p style="margin-left: 21pt">&nbsp;&nbsp;&nbsp; studentList.*".sin</p>
<p style="margin-left: 21pt">&nbsp;&lt;/param&gt;</p>
<p style="margin-left: 21pt">&lt;/interceptor-ref&gt;</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">b.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">根对象</span></p>
<p style="margin-left: 18pt">&nbsp;&lt;result type="json"&gt;</p>
<p style="margin-left: 18pt">&nbsp;&lt;param name="root"&gt;</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp; person.job</p>
<p style="margin-left: 18pt">&nbsp;&lt;/param&gt;</p>
<p style="margin-left: 18pt">&lt;/result&gt;</p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">也可以使用拦截器配置操作父对象</span></p>
<p style="margin-left: 18pt">&lt;interceptor-ref name="json"&gt;</p>
<p style="margin-left: 18pt">&nbsp;&lt;param name="root"&gt;bean1.bean2&lt;/param&gt;</p>
<p style="margin-left: 18pt">&lt;/interceptor-ref&gt;</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">c.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">将</span>JSON<span style="font-family: 宋体">数据用注释封装</span></p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">如果</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">wrapWithComments</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">设置为</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">true(</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">默认值为</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">false)</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">，则生成的</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">JSON</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">数据会变成这样：</span></p>
<p style="margin-left: 18pt">/* {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; "doubleVal": 10.10,</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; "nestedBean": {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "name": "Mr Bean"</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; },</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; "list": ["A", 10, 20.20, {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "firstName": "El Zorro"</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; }],</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; "array": [10, 20] </p>
<p style="margin-left: 18pt">} */</p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">这样做可以避免</span>js<span style="font-family: 宋体">中一些潜在的风险，使用时需要</span>:</p>
<p style="margin-left: 18pt">Var responseObject = eval("("+data.substring(data.indexOf(""/"*")+2, data.lastIndexOf(""*"/"))+")");</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">d.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">父类</span></p>
<p style="margin-left: 18pt">&#8220;root&#8221;<span style="font-family: 宋体">对象中父类的</span>field<span style="font-family: 宋体">不会默认存放到</span>JSON<span style="font-family: 宋体">数据中，如果不想这样做，需要在配置时指定</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">ignoreHierarchy</span><span style="font-size: 8.5pt; color: black; font-family: 宋体">为</span><span style="font-size: 8.5pt; color: black; font-family: Verdana">false:</span></p>
<p style="margin-left: 18pt">&lt;result type="json"&gt;</p>
<p style="margin-left: 18pt">&nbsp;&lt;param name="ignoreHierarchy"&gt;false&lt;/param&gt;</p>
<p style="margin-left: 18pt">&lt;/result&gt;</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">e.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">枚举类型</span></p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">默认处理枚举类型时，会被处理成</span>JSON<span style="font-family: 宋体">数据中</span>name<span style="font-family: 宋体">等于枚举中</span>value<span style="font-family: 宋体">而</span>value<span style="font-family: 宋体">等于枚举中</span>name.</p>
<p style="margin-left: 18pt">public enum AnEnum {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; ValueA,</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; ValueB</p>
<p style="margin-left: 18pt">&nbsp;}</p>
<p style="margin-left: 18pt">&nbsp;JSON:&nbsp;"myEnum":"ValueA"</p>
<p style="margin-left: 18pt"><span style="font-family: 宋体">如果在处理枚举类型时，在</span>xml<span style="font-family: 宋体">中配置了</span>enumAsBean<span style="font-family: 宋体">，则会被当作一个</span>Bean<span style="font-family: 宋体">处理，在</span>JSON<span style="font-family: 宋体">数据中会有一个特别的属性</span>&#8221;_name&#8221;<span style="font-family: 宋体">值为</span>name().<span style="font-family: 宋体">这个枚举中的所有属性都会被处理</span>.</p>
<p style="margin-left: 18pt">public enum AnEnum {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; ValueA("A"),</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; ValueB("B");</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; private String val;</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; public AnEnum(val) {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.val = val;</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; public getVal() {</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val;</p>
<p style="margin-left: 18pt">&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt">&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt">&nbsp;JSON:&nbsp;myEnum: { "_name": "ValueA", "val": "A" }</p>
<p style="margin-left: 18pt">Xml<span style="font-family: 宋体">中配置</span>:</p>
<p style="margin-left: 18pt">&lt;result type="json"&gt;</p>
<p style="margin-left: 18pt">&nbsp;&lt;param name="enumAsBean"&gt;true&lt;/param&gt;</p>
<p style="margin-left: 18pt">&lt;/result&gt;</p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">f.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">例子</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt">a)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Action</p>
<p style="margin-left: 42pt">import java.util.HashMap;</p>
<p style="margin-left: 42pt">import java.util.Map;</p>
<p style="margin-left: 42pt">import com.opensymphony.xwork2.Action;</p>
<p style="margin-left: 42pt">public class JSONExample {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private String field1 = "str";</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private int[] ints = {10, 20};</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private Map map = new HashMap();</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private String customName = "custom";</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //'transient' fields are not serialized</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private transient String field2;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //fields without getter method are not serialized</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private String field3;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public String execute() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("John", "Galt");</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Action.SUCCESS;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public String getField1() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return field1;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public void setField1(String field1) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.field1 = field1;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public int[] getInts() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ints;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public void setInts(int[] ints) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.ints = ints;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public Map getMap() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return map;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public void setMap(Map map) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.map = map;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; @JSON(name="newName")</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public String getCustomName() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.customName;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">}</p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt">b)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Xml<span style="font-family: 宋体">配置</span></p>
<p style="margin-left: 42pt">&nbsp;&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</p>
<p style="margin-left: 42pt">&lt;!DOCTYPE struts PUBLIC</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</p>
<p style="margin-left: 42pt">&lt;struts&gt;</p>
<p style="margin-left: 42pt">&nbsp;&lt;package name="example"&nbsp;extends="json-default"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; &nbsp;&lt;action name="JSONExample" class="example.JSONExample"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result type="json"/&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;</p>
<p style="margin-left: 42pt">&nbsp;&lt;/package&gt;</p>
<p style="margin-left: 42pt">&lt;/struts&gt;</p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">这里有两个地方需要注意</span>:</p>
<p style="margin-left: 60pt; text-indent: -18pt; tab-stops: list 60.0pt">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">需要继承</span>json-default<span style="font-family: 宋体">包</span></p>
<p style="margin-left: 60pt; text-indent: -18pt; tab-stops: list 60.0pt">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;result&gt;<span style="font-family: 宋体">签的定义</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt">c)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>JSON<span style="font-family: 宋体">数据</span></p>
<p style="margin-left: 42pt">&nbsp;{&nbsp;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; "field1" : "str", </p>
<p style="margin-left: 42pt">&nbsp;&nbsp; "ints": [10, 20],</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; "map": {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "John":"Galt"</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; },</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; "newName": "custom"</p>
<p style="margin-left: 42pt">}</p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt">d)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>JSON RPC</p>
<p style="margin-left: 42pt">JSON<span style="font-family: 宋体">插件可以在</span>js<span style="font-family: 宋体">中调用</span>action<span style="font-family: 宋体">方法，返回执行结果。这个已经在</span>dojo<span style="font-family: 宋体">中有了实现，可以用</span>Simple Method Definition<span style="font-family: 宋体">调用远程服务。来一起看看下面的例子：</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">首先写一个</span>Action<span style="font-family: 宋体">：</span></p>
<p style="margin-left: 42pt">package smd;</p>
<p style="margin-left: 42pt">import com.googlecode.jsonplugin.annotations.SMDMethod;</p>
<p style="margin-left: 42pt">import com.opensymphony.xwork2.Action;</p>
<p style="margin-left: 42pt">public class SMDAction {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public String smd() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Action.SUCCESS;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; @SMDMethod</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public Bean doSomething(Bean bean, int quantity) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bean.setPrice(quantity * 10);</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bean;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">}</p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt">e)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">方法必须用</span>SMDMethod<span style="font-family: 宋体">加上注解，这样才能被远程调用，为了安全因素。这个方法会产生一个</span>bean<span style="font-family: 宋体">对象，实现修改价格的功能。</span>Action<span style="font-family: 宋体">被添加上</span>SMD<span style="font-family: 宋体">注解会生成一个</span>SMD<span style="font-family: 宋体">，同时参数也会被加上</span>SMDMethodParameter<span style="font-family: 宋体">注解。像你所看到的，</span>Action<span style="font-family: 宋体">中定义了一个空方法：</span>smd<span style="font-family: 宋体">。这个方法是作为</span>Simple Method Definition (<span style="font-family: 宋体">定义</span>class<span style="font-family: 宋体">中提供的服务</span>)<span style="font-family: 宋体">，在</span>struts.xml<span style="font-family: 宋体">配置</span>&lt;result&gt;<span style="font-family: 宋体">时使用</span>type<span style="font-family: 宋体">属性值为</span>&#8221;json&#8221;<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">下面是</span>bean<span style="font-family: 宋体">的定义：</span></p>
<p style="margin-left: 42pt">package smd;</p>
<p style="margin-left: 42pt">public class Bean {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private String type;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; private int price;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public String getType() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public void setType(String type) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public int getPrice() {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return price;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; public void setPrice(int price) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.price = price;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 42pt">}</p>
<p style="margin-left: 42pt">Xml<span style="font-family: 宋体">文件</span>:</p>
<p style="margin-left: 42pt">&lt;package name="RPC" namespace="/nodecorate" extends="json-default"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; &lt;action name="SMDAction" class="smd.SMDAction" method="smd"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="json"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="enableSMD"&gt;true&lt;/param&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result type="json"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="enableSMD"&gt;true&lt;/param&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; &lt;/action&gt;</p>
<p style="margin-left: 42pt">&lt;/package&gt;</p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">这里需要注意一点</span>:&#8221; enableSMD&#8221;<span style="font-family: 宋体">这个必须在</span>interceptor<span style="font-family: 宋体">和</span>result<span style="font-family: 宋体">都要配置</span>.</p>
<p style="margin-left: 42pt">Js<span style="font-family: 宋体">代码</span>:</p>
<p style="margin-left: 42pt">&lt;s:url id="smdUrl" namespace="/nodecorate" action="SMDAction" /&gt;</p>
<p style="margin-left: 42pt">&lt;script type="text/javascript"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //load dojo RPC</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; dojo.require("dojo.rpc.*");</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //create service object(proxy) using SMD (generated by the json result)</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; var service = new dojo.rpc.JsonService("${smdUrl}");</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //function called when remote method returns</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; var callback = function(bean) {</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("Price for " + bean.name + " is " + bean.price);</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; };</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //parameter</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; var bean = {name: "Mocca"};</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //execute remote method</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; var defered = service.doSomething(bean, 5);</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; //attach callback to defered object</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp; defered.addCallback(callback);</p>
<p style="margin-left: 42pt">&lt;/script&gt;</p>
<p style="margin-left: 42pt">JsonService<span style="font-family: 宋体">会发出一个请求到</span>action<span style="font-family: 宋体">加载</span>SMD<span style="font-family: 宋体">，同时远程方法会返回一个</span>JSON<span style="font-family: 宋体">对象，这个过程是</span>Dojo<span style="font-family: 宋体">给</span>action<span style="font-family: 宋体">中的方法创建了一个</span>Proxy<span style="font-family: 宋体">。因为这是异步调用过程，当远程方法执行的时候，它会返回一个对象到</span>callback<span style="font-family: 宋体">方法中。</span></p>
<p style="margin-left: 42pt; text-indent: -21pt; tab-stops: list 42.0pt">f)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">代理的对象</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">当使用的注解不是继承自</span>Java<span style="font-family: 宋体">，可能你使用代理会出现一些问题。比如：当你使用</span>aop<span style="font-family: 宋体">拦截你的</span>action<span style="font-family: 宋体">的时候。在这种情况下，这个插件不会自动发现注解的方法。为了避免这种情况发生，你需要在</span>xml<span style="font-family: 宋体">中配置</span>ignoreInterfaces<span style="font-family: 宋体">为</span>false<span style="font-family: 宋体">，这样插件会自己查找注解的所有接口和父类。</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">注意：这个参数只有在</span>Action<span style="font-family: 宋体">执行的过程是通过注解来运行的时候才应该设为</span>false<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 42pt">&lt;action name="contact" class="package.ContactAction" method="smd"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; &lt;interceptor-ref name="json"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="enableSMD"&gt;true&lt;/param&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ignoreInterfaces"&gt;false&lt;/param&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; &lt;/interceptor-ref&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; &lt;result type="json"&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="enableSMD"&gt;true&lt;/param&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="ignoreInterfaces"&gt;false&lt;/param&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; &lt;/result&gt;</p>
<p style="margin-left: 42pt">&nbsp;&nbsp; &lt;interceptor-ref name="default"/&gt;</p>
<p style="margin-left: 42pt">&lt;/action&gt;</p>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/232324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 14:45 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>extjs+struts2+spring例子</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232319.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Sat, 04 Oct 2008 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232319.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/232319.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232319.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/232319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/232319.html</trackback:ping><description><![CDATA[<span class="hilite1">struts2</span>的<span class="hilite2">json</span> plugin的位置在：http://code.google.com/p/<span class="hilite2">json</span>plugin/<br />
下载<span class="hilite2">json</span> plugin的jar包，放到/WEB-INF/lib/目录下就可以了<br />
<br />
Spring + Struts + JPA的项目结构如其他例子中的一致<br />
首先是web.xml<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">web-app</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"WebApp_ID"</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"2.4"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/j2ee"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>quickstart</span><span class="tag">&lt;/</span><span class="tag-name">display-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span><span class="hilite1">struts2</span></span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.<span class="hilite1">struts2</span>.dispatcher.FilterDispatcher&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>jpaFilter</span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>entityManagerFactory</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>entityManagerFactory</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>jpaFilter</span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>*.action</span><span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span><span class="hilite1">struts2</span></span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>/*</span><span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">filter-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">welcome-file-list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">welcome-file</span><span class="tag">&gt;</span><span>index.jsp</span><span class="tag">&lt;/</span><span class="tag-name">welcome-file</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">welcome-file-list</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">listener</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.context.ContextLoaderListener&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">listener-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">listener</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">web-app</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
加入<span><span>jpaFilter，是为了不让hibernate的session过早关闭，因为有的action会通过ajax动态调用。<br />
下面是struts.xml，注意struts.xml需要放在源代码目录下面：<br />
<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span>&nbsp;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&lt;!DOCTYPE&nbsp;struts&nbsp;PUBLIC&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">constant</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"struts.objectFactory"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"spring"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">constant</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"struts.devMode"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">constant</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"struts.i18n.encoding"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"person"</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">"<span class="hilite2">json</span>-default"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"list"</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">"execute"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"personaction"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"<span class="hilite2">json</span>"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">package</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span><span class="tag">&lt;/</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
这里注意，</span></span><span><span><span><span class="attribute-value">struts.objectFactory告诉struts所有的action都到spring的上下文里面去找，另外还需要注意，我们自己的包要继承自<span class="hilite2">json</span>-default，这样才可以在result的type属性中使用<span class="hilite2">json</span>。<br />
下面是spring的配置文件applicationContext.xml：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">beans</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/beans"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns:aop</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/aop"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xmlns:tx</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/tx"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">xsi:schemaLocation</span><span>="&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"entityManagerFactory"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"dataSource"</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">"dataSource"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jpaVendorAdapter"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"database"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"MYSQL"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"showSql"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"true"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"dataSource"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.jdbc.datasource.DriverManagerDataSource"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"driverClassName"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"com.mysql.jdbc.Driver"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"url"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"jdbc:mysql://localhost/extjs"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"username"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"root"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">""</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"transactionManager"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.orm.jpa.JpaTransactionManager"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"entityManagerFactory"</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">ref</span><span>=</span><span class="attribute-value">"entityManagerFactory"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">tx:annotation-driven</span><span>&nbsp;</span><span class="attribute">transaction-manager</span><span>=</span><span class="attribute-value">"transactionManager"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--Service&nbsp;开始&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"personService"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.myext.service.impl.PersonServiceJpaImpl"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"personaction"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.myext.action.PersonPageAction"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"person"</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">"personService"</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
这里的bean personaction和strutx.xml中的action class一致就可以了，下面是代码：<br />
action：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span> com.myext.action; </span></span>
    <li>
    <li class="alt"><span><span class="keyword">import</span><span> java.util.ArrayList; </span></span>
    <li><span><span class="keyword">import</span><span> java.util.List; </span></span>
    <li class="alt">
    <li><span><span class="keyword">import</span><span> com.myext.service.PersonService; </span></span>
    <li class="alt">
    <li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> PersonPageAction { </span></span>
    <li class="alt"><span><span class="keyword">private</span><span> </span><span class="keyword">int</span><span> limit=</span><span class="number">10</span><span>; </span></span>
    <li><span><span class="keyword">private</span><span> </span><span class="keyword">int</span><span> start=</span><span class="number">0</span><span>; </span></span>
    <li class="alt"><span><span class="keyword">private</span><span> PersonService person; </span></span>
    <li><span><span class="keyword">private</span><span> </span><span class="keyword">int</span><span> total=</span><span class="number">0</span><span>; </span></span>
    <li class="alt"><span><span class="keyword">private</span><span> List persons = </span><span class="keyword">new</span><span> ArrayList(); </span></span>
    <li><span><span class="keyword">private</span><span> </span><span class="keyword">boolean</span><span> success=</span><span class="keyword">true</span><span>; </span></span>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> getSuccess(){ </span></span>
    <li><span><span class="keyword">return</span><span> </span><span class="keyword">this</span><span>.success; </span></span>
    <li class="alt"><span>} </span>
    <li><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setLimit(</span><span class="keyword">int</span><span> limit) { </span></span>
    <li class="alt"><span><span class="keyword">this</span><span>.limit = limit; </span></span>
    <li><span>} </span>
    <li class="alt">
    <li><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setStart(</span><span class="keyword">int</span><span> start) { </span></span>
    <li class="alt"><span><span class="keyword">this</span><span>.start = start; </span></span>
    <li><span>} </span>
    <li class="alt">
    <li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setPerson(PersonService person) { </span></span>
    <li><span><span class="keyword">this</span><span>.person = person; </span></span>
    <li class="alt"><span>} </span>
    <li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getTotal() { </span></span>
    <li><span><span class="keyword">return</span><span> total; </span></span>
    <li class="alt"><span>} </span>
    <li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setTotal(</span><span class="keyword">int</span><span> total) { </span></span>
    <li><span><span class="keyword">this</span><span>.total = total; </span></span>
    <li class="alt"><span>} </span>
    <li>
    <li class="alt"><span><span class="keyword">public</span><span> List getPersons() { </span></span>
    <li><span><span class="keyword">return</span><span> persons; </span></span>
    <li class="alt"><span>} </span>
    <li>
    <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setPersons(List persons) { </span></span>
    <li><span><span class="keyword">this</span><span>.persons = persons; </span></span>
    <li class="alt"><span>} </span>
    <li>
    <li class="alt"><span><span class="keyword">public</span><span> String execute(){ </span></span>
    <li><span><span class="keyword">this</span><span>.total = person.getTotal(); </span></span>
    <li class="alt"><span><span class="keyword">this</span><span>.persons = person.getPage(</span><span class="keyword">this</span><span>.start, </span><span class="keyword">this</span><span>.limit); </span></span>
    <li><span><span class="keyword">return</span><span> </span><span class="string">"success"</span><span>; </span></span>
    <li class="alt"><span>} </span>
    <li><span>} </span></li>
</ol>
</div>
service：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span> com.myext.service.impl; </span></span>
    <li>
    <li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span>
    <li>
    <li class="alt"><span><span class="keyword">import</span><span> javax.persistence.EntityManager; </span></span>
    <li><span><span class="keyword">import</span><span> javax.persistence.PersistenceContext; </span></span>
    <li class="alt"><span><span class="keyword">import</span><span> javax.persistence.Query; </span></span>
    <li>
    <li class="alt"><span><span class="keyword">import</span><span> com.myext.model.Person; </span></span>
    <li><span><span class="keyword">import</span><span> com.myext.service.PersonService; </span></span>
    <li class="alt">
    <li><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> PersonServiceJpaImpl </span><span class="keyword">implements</span><span> PersonService { </span></span>
    <li class="alt"><span><span class="keyword">private</span><span> EntityManager em; </span></span>
    <li><span><span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String poname = Person.</span><span class="keyword">class</span><span>.getName(); </span></span>
    <li class="alt"><span><span class="annotation">@PersistenceContext</span><span> </span></span>
    <li><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setEntityManager(EntityManager em){ </span></span>
    <li class="alt"><span><span class="keyword">this</span><span>.em = em; </span></span>
    <li><span>} </span>
    <li class="alt"><span><span class="annotation">@SuppressWarnings</span><span>(</span><span class="string">"unchecked"</span><span>) </span></span>
    <li><span><span class="annotation">@Override</span><span> </span></span>
    <li class="alt"><span><span class="keyword">public</span><span> List getPage( </span><span class="keyword">int</span><span> start, </span><span class="keyword">int</span><span> limit) { </span></span>
    <li><span>Query q = <span class="keyword">this</span><span>.em.createQuery(</span><span class="string">"from "</span><span> + poname ); </span></span>
    <li class="alt"><span>q.setFirstResult(start); </span>
    <li><span>q.setMaxResults(limit); </span>
    <li class="alt"><span><span class="keyword">return</span><span> q.getResultList(); </span></span>
    <li><span>} </span>
    <li class="alt"><span><span class="annotation">@Override</span><span> </span></span>
    <li><span><span class="keyword">public</span><span> </span><span class="keyword">int</span><span> getTotal() { </span></span>
    <li class="alt"><span><span class="keyword">return</span><span> </span><span class="keyword">this</span><span>.em.createQuery(</span><span class="string">"from "</span><span> + poname).getResultList().size(); </span></span>
    <li><span>} </span>
    <li class="alt">
    <li><span>} </span></li>
</ol>
</div>
页面的代码：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span> </span><span class="tag">?&gt;</span><span> </span></span></span>
    <li><span><span class="tag">&lt;</span><span>%@ page </span><span class="attribute">language</span><span>=</span><span class="attribute-value">"java"</span><span> </span><span class="attribute">contentType</span><span>=</span><span class="attribute-value">"text/html; charset=UTF-8"</span><span> </span></span>
    <li class="alt"><span><span class="attribute">pageEncoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span>%</span><span class="tag">&gt;</span><span> </span></span>
    <li><span><span class="tag">&gt;</span><span> </span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.w3.org/1999/xhtml"</span><span class="tag">&gt;</span><span> </span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span> </span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">meta</span><span> </span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">"Content-Type"</span><span> </span><span class="attribute">content</span><span>=</span><span class="attribute-value">"text/html; charset=UTF-8"</span><span> </span><span class="tag">/&gt;</span><span> </span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>Grid3</span><span class="tag"><!--</span--><span class="tag-name">title</span><span class="tag">&gt;</span><span> </span></span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">link</span><span> </span><span class="attribute">rel</span><span>=</span><span class="attribute-value">"stylesheet"</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/css"</span><span> </span><span class="attribute">href</span><span>=</span><span class="attribute-value">"extjs/resources/css/ext-all.css"</span><span> </span><span class="tag">/&gt;</span><span> </span></span>
    <li><span><span class="comments"><!--</span> </span></li>
    <li class="alt"><span><span class="comments"><link rel="stylesheet" type="text/css" href="extjs/resources/css/xtheme-gray.css" /></link></span> </span></li>
    <li><span><span class="comments">--></span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span> </span><span class="attribute">src</span><span>=</span><span class="attribute-value">"extjs/adapter/ext/ext-base.js"</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">script</span><span class="tag">&gt;</span><span> </span></span></span>
    <li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span> </span><span class="attribute">src</span><span>=</span><span class="attribute-value">"extjs/ext-all.js"</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">script</span><span class="tag">&gt;</span><span> </span></span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">script</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span> </span><span class="attribute">src</span><span>=</span><span class="attribute-value">"extjs/ext-lang-zh_CN.js"</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">script</span><span class="tag">&gt;</span><span> </span></span></span>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">head</span><span class="tag">&gt;</span><span> </span></span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span> </span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span> </span><span class="attribute">src</span><span>=</span><span class="attribute-value">"grid3.js"</span><span class="tag">&gt;</span><span class="tag"><!--</span--><span class="tag-name">script</span><span class="tag">&gt;</span><span> </span></span></span>
    <li><span><span class="tag">&lt;</span><span class="tag-name">div</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"grid3"</span><span> </span><span class="tag">&gt;</span><span> </span></span>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">div</span><span class="tag">&gt;</span><span> </span></span></span>
    <li><span><span class="tag"><!--</span--><span class="tag-name">body</span><span class="tag">&gt;</span><span> </span></span></span>
    <li class="alt"><span><span class="tag"><!--</span--><span class="tag-name">html</span><span class="tag">&gt;</span><span> </span></span></span></li>
</ol>
</div>
grid3.js代码<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">/**</span> </span>
    <li><span><span class="comment">* @author fox</span> </span>
    <li class="alt"><span><span class="comment">*/</span><span> </span></span>
    <li><span>Ext.onReady(<span class="keyword">function</span><span>(){ </span></span>
    <li class="alt"><span>Ext.BLANK_IMAGE_URL = 'extjs/resources/images/<span class="keyword">default</span><span>/s.gif'; </span></span>
    <li><span>Ext.QuickTips.init(); </span>
    <li class="alt"><span><span class="keyword">var</span><span> sm = </span><span class="keyword">new</span><span> Ext.grid.CheckboxSelectionModel(); //CheckBox选择列 </span></span>
    <li><span><span class="keyword">var</span><span> cm = </span><span class="keyword">new</span><span> Ext.grid.ColumnModel([ </span></span>
    <li class="alt"><span><span class="keyword">new</span><span> Ext.grid.RowNumberer(), //行号列 </span></span>
    <li><span>sm, </span>
    <li class="alt"><span>{header:'编号',dataIndex:'id'}, </span>
    <li><span>{header:'性别',dataIndex:'sex',renderer:<span class="keyword">function</span><span>(value){ </span></span>
    <li class="alt"><span><span class="keyword">if</span><span>(value=='male'){ </span></span>
    <li><span><span class="keyword">return</span><span> </span><span class="string">"<span style="font-weight: bold; color: red">男</span>"</span><span>; </span></span>
    <li class="alt"><span>}<span class="keyword">else</span><span>{ </span></span>
    <li><span><span class="keyword">return</span><span> </span><span class="string">"<span style="font-weight: bold; color: green">女</span>"</span><span>; </span></span>
    <li class="alt"><span>} </span>
    <li><span>}}, <span class="comment">//增加性别，自定义renderer，即显示的样式，可以加html代码，来显示图片等。</span><span> </span></span>
    <li class="alt"><span>{header:'名称',dataIndex:'name'}, </span>
    <li><span>{header:'描述',dataIndex:'descn'} </span>
    <li class="alt"><span>]); </span>
    <li>
    <li class="alt">
    <li><span><span class="keyword">var</span><span> ds = </span><span class="keyword">new</span><span> Ext.data.Store({ </span></span>
    <li class="alt"><span>proxy: <span class="keyword">new</span><span> Ext.data.HttpProxy({url:'list.action'}),//调用的动作 </span></span>
    <li><span>reader: <span class="keyword">new</span><span> Ext.data.<span class="hilite2">Json</span>Reader({ </span></span>
    <li class="alt"><span>totalProperty: 'total', </span>
    <li><span>root: 'persons', </span>
    <li class="alt"><span>successProperty :'success' </span>
    <li><span>}, [ </span>
    <li class="alt"><span>{name: 'id',mapping:'id',type:'<span class="keyword">int</span><span>'}, </span></span>
    <li><span>{name: 'sex',mapping:'sex',type:'string'}, </span>
    <li class="alt"><span>{name: 'name',mapping:'name',type:'string'}, </span>
    <li><span>{name: 'descn',mapping:'descn',type:'string'} //列的映射 </span>
    <li class="alt"><span>]) </span>
    <li><span>}); </span>
    <li class="alt">
    <li>
    <li class="alt"><span><span class="keyword">var</span><span> grid = </span><span class="keyword">new</span><span> Ext.grid.GridPanel({ </span></span>
    <li><span>el: 'grid3', </span>
    <li class="alt"><span>ds: ds, </span>
    <li><span>sm: sm, </span>
    <li class="alt"><span>cm: cm, </span>
    <li><span>width:700, </span>
    <li class="alt"><span>height:280, </span>
    <li><span>bbar: <span class="keyword">new</span><span> Ext.PagingToolbar({ </span></span>
    <li class="alt"><span>pageSize: 10, </span>
    <li><span>store: ds, </span>
    <li class="alt"><span>displayInfo: <span class="keyword">true</span><span>, </span></span>
    <li><span>displayMsg: '显示第 {0} 条到 {1} 条记录，一共 {2} 条', </span>
    <li class="alt"><span>emptyMsg: <span class="string">"没有记录"</span><span> </span></span>
    <li><span>}) //页脚显示分页 </span>
    <li class="alt"><span>}); </span>
    <li><span><span class="comment">//el:指定html元素用于显示grid</span><span> </span></span>
    <li class="alt"><span>grid.render();<span class="comment">//渲染表格</span><span> </span></span>
    <li><span>ds.load({params:{start:0, limit:10}}); //加载数据 </span>
    <li class="alt"><span>}); </span></li>
</ol>
</div>
注意，这里的gridpanel一定要设置高度，否则数据是显示不出来的。<br />
最后启动tomcat，在浏览器里输入http://localhost:8080/extjs/grid3.jsp,就可以看到效果<br />
</span></span></span></span>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/232319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 14:35 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/04/232319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中结合json的使用</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232318.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Sat, 04 Oct 2008 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232318.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/232318.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/232318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/232318.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://prototype.conio.net/dist/ 下载(对Ajax支持的prototype--js函数库)：    prototype-1.4.0.js    或    prototype-1.4.0.tar.gz &nbsp;http://code.google.com/p/jsonplugin/downloads/list下载(Struts2...&nbsp;&nbsp;<a href='http://www.blogjava.net/fuhoujun/archive/2008/10/04/232318.html'>阅读全文</a><img src ="http://www.blogjava.net/fuhoujun/aggbug/232318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 14:19 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/04/232318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中的零配置与CoC（Convention over Configration）</title><link>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232312.html</link><dc:creator>Loy Fu</dc:creator><author>Loy Fu</author><pubDate>Sat, 04 Oct 2008 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232312.html</guid><wfw:comment>http://www.blogjava.net/fuhoujun/comments/232312.html</wfw:comment><comments>http://www.blogjava.net/fuhoujun/archive/2008/10/04/232312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fuhoujun/comments/commentRss/232312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fuhoujun/services/trackbacks/232312.html</trackback:ping><description><![CDATA[<strong>关键字: Struts2 COC</strong>
<div class="blog_content">摘要：介绍Struts2中的零配置（Zero Configuration），以及如何用COC来更好地简化Struts2的配置。在第一章，我使用Maven来创建一个起点项目；第二章，以该项目为例，讲解如何使用Struts2的零配置；第三章，论述第二章中的实现方式的缺陷，然后讲解如何使用COC来改进这些缺陷，并进一步简化Struts2的配置。附件是这篇文章用到的示例代码。<br />
<br />
<h2>一、从零开始</h2>
这里，我将建立一个新的示例项目，作为讲解的起点。我使用JDK 6、Maven 2、Eclipse 3.3来建立这个示例，如果读者对Maven2不熟也没关系，这只是个示例。<br />
首先，运行下边的命令：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mvn archetype:create -DgroupId=demo.struts -DartifactId=demo-struts-coc -DarchetypeArtifactId=maven-archetype-webapp<br />
这会建立如下的目录结构：<demo-struts-coc><br />
&nbsp;|- POM.xml<br />
&nbsp;|- src<br />
&nbsp;&nbsp; &nbsp; |- main<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; |- resources<br />
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; |- webapp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |- index.jsp<br />
&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |- WEB-INF<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |- web.xml<br />
然后我们在src/main目录下新建一个名为java的目录，用来放置java代码。在src下建立test目录，并在test目录下建立java目录，用来放置测试代码。另外，我这个示例不想使用JSP，所以我将src/main/webapp目录下的index.jsp改为index.html。<br />
现在，需要配置该项目要用到哪些lib。在POM.xml中加入struts2-core：<br />
</demo-struts-coc>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>org.apache.struts</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>struts2-core</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>2.0.9</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
另外，我想在Eclipse里使用jetty来启动项目并进行测试，所以在POM.xml中再加入jetty、jetty-util、servlet-api等的依赖，详情见附件。<br />
我希望使用Eclipse来作为这个项目的IDE，所以，我在命令行状态下，进入这个项目所在的目录，运行：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mvn eclipse:eclipse<br />
然后使用Eclipse导入这个项目。如果你是第一次用Eclipse导入用Maven生成的项目，那你需要在Eclipse里配置一个名叫M2_REPO的Variable，指向你的Maven 2的repository目录。缺省情况下，它应该位于${user.home}/.m2/repository。<br />
OK！现在我们已经可以在Eclipse中进行工作了。<br />
修改src/main/webapp/WEB-INF/web.xml，加入struts2的FilterDispatcher并设置filter-mapping。在这个示例中我将url-pattern设为"/app/*"，也就是说，url的匹配是基于路径来做的。这只是我的个人喜好而已，你也可以将它设成"*"。<br />
既然是在讲struts2的零配置，当然是可以不要任何配置文件的。但是为了更好地进行&#8220;配置&#8221;，我还是建立了struts.xml文件（在src/main/resources目录下）。我不喜欢url最后都有个action后缀，现在，我在struts.xml中配置struts.action.extension，将这个后缀去掉：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">constant</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"struts.action.extension"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">""</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">struts</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
然后我在src/test/java下建立demo/RunJetty.java文件，main方法如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Server&nbsp;server&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Server(</span><span class="number">8080</span><span>);&nbsp;</span><span class="comment">//也可以改成其它端口</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;rootDir&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;File(RunJetty.</span><span class="keyword">class</span><span>.getResource(</span><span class="string">"/"</span><span>).getPath()).getParentFile().getParentFile();&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;webAppPath&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;File(rootDir,&nbsp;</span><span class="string">"src/main/webapp"</span><span>).getPath();&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;WebAppContext(server,&nbsp;webAppPath,&nbsp;</span><span class="string">"/"</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;server.start();&nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
现在，在Eclipse里运行或调试这个RunJetty.java，用浏览器打开http://localhost:8080/看看吧。如果不出问题，应该可以访问到webapp目录下的index.html了。有了Jetty，你还在用MyEclipse或其它插件么？<br />
<br />
<h2>二、零配置</h2>
首先要澄清一点，这里说的零配置并不是一点配置都没有，只是说配置很少而已。<br />
Struts2（我只用过Struts 2.0.6和2.0.9，不清楚其它版本是否支持零配置）引入了零配置的新特性，元数据可以通过规则和注解来表达：A "Zero Configuration" Struts application or plugin uses no additional XML or properties files. Metadata is expressed through convention and annotation.<br />
目前，这个新特性还在测试阶段，但经过一段时间的使用，我觉得这个特性已经可用。下面我讲一下如何使用它。<br />
1. Actions的定位<br />
以前需要在xml配置文件中配置Action的name和class，如果使用零配置，所带来的一个问题就是如何定位这些Action。我们需要在web.xml中找到struts2的filter的配置，增加一个名为actionPackages的init-param，它的值是一个以逗号分隔的Java包名列表，比如：demo.actions1,demo.actions2。struts2将会扫描这些包（包括这些包下边的子包），在这些包下，所有实现了Action接口的或者是类名以&#8220;Action&#8221;结尾的类都会被检查到，并被当做Action。<br />
以前，我们写Action必须要实现Action接口或者继承ActionSupport。但是，上面提到的类名以"Action"结尾的类并不需要这样做，它可以是一个POJO，Struts2支持POJO Action！<br />
下面是actionPackages的配置示例：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>struts2</span><span class="tag">&lt;/</span><span class="tag-name">filter-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>org.apache.struts2.dispatcher.FilterDispatcher</span><span class="tag">&lt;/</span><span class="tag-name">filter-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>actionPackages</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>demo.actions1,demo.actions2</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">filter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
2. 示例<br />
现在我们建立demo.actions1.app.person和demo.actions2.app.group两个包，在demo.actions1.app.person包下建立ListPeopleAction.java，在demo.actions2.app.group下建立ListGroupAction.java。作为示例，这两个类只是包含一个execute方法，返回"success"或"error"，其它什么都不做：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"success"</span><span>;&nbsp;&nbsp;</span></span>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
在Filter的配置中，我指定actionPackages为demo.actions1,demo.actions2，当系统启动时，Struts2就会在这两个包下扫描到demo.actions1.app.person.ListPeopleAction和demo.actions2.app.group.ListGroupAction。<br />
<br />
3. Action and Package name<br />
Struts2扫描到Action后，从actionPackages指定的包开始，子包名会成为这个Action的namespace，而Action的name则由这个Action的类名决定。将类名首字母小写，如果类名以Action结尾，则去掉"Action"后缀，形成的名字就是这个Action的名字。在如上所述的示例中，actionPackages指定为demo.actions1,demo.actions2，那么你可以这样访问demo.actions1.app.person.ListPeopleAction：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://localhost:8080/app/person/listPeople<br />
<br />
4. Results<br />
Struts2是通过"Result"和"Results"两个类级别的annotations来指定Results的。<br />
作为示例，我们在webapp目录下建两个html文件：success.html和error.html，随便写点什么内容都可以。现在假设我们访问/app/person/listPeople时，或Action返回success就转到success.html页面，若是error就转到error.html页面，这只需要在ListPeopleAction类上加上一段注解就可以了：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span class="annotation">@Results</span><span>({&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Result</span><span>(name=</span><span class="string">"success"</span><span>,&nbsp;type=NullResult.</span><span class="keyword">class</span><span>,&nbsp;value&nbsp;=&nbsp;</span><span class="string">"/success.html"</span><span>,&nbsp;params&nbsp;=&nbsp;{}),&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Result</span><span>(name=</span><span class="string">"error"</span><span>,&nbsp;type=NullResult.</span><span class="keyword">class</span><span>,&nbsp;value&nbsp;=&nbsp;</span><span class="string">"/error.html"</span><span>,&nbsp;params&nbsp;=&nbsp;{})&nbsp;&nbsp;</span></span>
    <li class=""><span>})&nbsp;&nbsp;</span>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ListPeopleAction&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;{&nbsp;&nbsp;</span></span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="string">"success"</span><span>;&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
同上，我们给ListGroupAction也加上注解。<br />
现在，我们已经完成了一个零配置的示例。我们并没有在xml文件里配置ListPeopleAction和ListGroupAction，但它们已经可以工作了！<br />
用Eclipse运行RunJetty，然后用浏览器访问http://localhost:8080/app/person/listPeople和http://localhost:8080/app/group/listGroup看看，是不是正是success.html（或error.html）的内容？<br />
<br />
5. Namespaces<br />
如上所述，namespace由包名所形成，但我们可以使用"Namespace"注解来自己指定namespace。<br />
<br />
6. Parent Package<br />
这个配置用得较少。Struts2提供一个"ParentPackage"注解来标识Action应该是属于哪个package。<br />
<br />
<h2>三、使用COC</h2>
如上所述，Struts2用注解来实现零配置。然而，这不是我喜欢的方式。在我看来，这不过是将配置从XML格式换成了注解方式，并不是真的零配置。而且，这种方式也未必比XML形式的配置更好。另外，对元数据的修改必然会导致项目的重新编译和部署。还有，现在的Struts2版本似乎对Result注解中的params的处理有些问题。<br />
其实，Struts2的actionPackages配置已经使用了COC，那为什么不能为Results也实现COC，从而去除这些每个Action都要写的注解？<br />
在严谨的项目中，package、action的名称和页面的路径、名称一定存在着某种关系。比如，页面的路径可能和package是对应的，页面的名称可能和action的名称是对应的，或是根据某种法则运算得到。我们知道webwork2和struts2有个配置叫global-results。我们为什么不能根据这些对应规则写个Result，将它配到global-results中，从而真正免去result的配置？<br />
事实上，我推荐Struts2的使用者只用Struts2输出XML或JSON，放弃UI，页面这层还是使用标准的HTML、CSS和一些JS组件来展现。许多人反映Struts2慢，确实，Struts2是慢，很慢！慢在哪儿？很大一部分因素是UI这层引起的，特别是使用了过多的Struts2的tag，并使用了ajax theme。但是，如果我们放弃了Struts2的笨拙的UI，Result只输出XML或JSON，UI则使用标准的HTML+CSS，使用JS组件（DOJO、Adobe Spry Framework、YUI-Ext等）来操作Struts2的输出数据，情况将会如何？我们会得到一个高性能、高可配的、UI和应用服务器的职责分割更为明确、合理的、更易于静态化部署的开发组合。<br />
这似乎是阉割了Struts2，但是这样阉割过的Struts2摆脱了性能低下的包袱，更轻、更现代化。<br />
有些扯远了，言归正传，不管是让Struts2输出XML或JSON，还是输出页面，我们都有办法根据项目的规则写一个Result，将它配到global-results中，从而大大减少Result的配置。<br />
假设我们让Struts2只输出JSON，有个jsonplugin可以做这件事。使用JsonResult时，不再需要知道页面的位置、名称等信息，它仅仅是数据输出，那么我们就可以将这个Result配成全局的，大部分Action将不再需要Result的配置。<br />
作为示例，我假设我的例子中输出的两个html页面（success.html和error.html）是JSON，我们看看怎么免去我例子中的两个Action的Result注解。<br />
首先，我们删去ListPeopleAction和ListGroupAction两个Action的注解，并修改struts.xml文件，加入：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"demo-default"</span><span>&nbsp;</span><span class="attribute">extends</span><span>=</span><span class="attribute-value">"struts-default"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">global-results</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"success"</span><span class="tag">&gt;</span><span>/success.html</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">global-results</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">package</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
<font color="#ff0000">请记住这只是一个示例，为了方便，我没在项目中加入jsonplugin来作真实的演示，我只是假设这个success是json输出，读者可以自行使用jsonplugin来作实验。</font><br />
<br />
现在，离成功不远了，但是项目仍然不能正常运行。我们的Action返回success，但并不会匹配到global-results中配置。为什么呢？因为，我们这里是把global-results配置到"demo-default"这个package下的，而Struts2根据actionPackages找到的Action不会匹配到这个package上。解决办法也很简单，还记得上面讲到的Parent Package吧？给Action加个注解，指定ParentPackage为"demo-default"。但这样可不是我喜欢的，其实有更好的办法，我们在struts.xml中加个constant就好了：<br />
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">constant</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"struts.configuration.classpath.defaultParentPackage"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"demo-default"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<br />
现在，大功告成！运行RunJetty来测试下吧！你可以访问/app/person/listPeople，可以访问/app/group/listGroup，而所有的配置仅仅是web.xml和struts.xml中的几行，我们的Java代码中也没有加注解。如果再加上几百个Action呢？配置仍然就这几行。<br />
可是，某些Action确实需要配置怎么办？对这些Action，你可以加注解，也可以针对这些Action来写些XML配置。一个项目中，大部分Action的配置是可以遵从一定规则的，可以使用规则来简化配置，只有少部分需要配置，这就是COC。<br />
<br />
</div>
<img src ="http://www.blogjava.net/fuhoujun/aggbug/232312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 14:08 <a href="http://www.blogjava.net/fuhoujun/archive/2008/10/04/232312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>