??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲嫩草影院久久精品,亚洲最大激情中文字幕,久久亚洲国产成人精品性色http://www.tkk7.com/fuhoujun/archive/2016/06/13/430865.htmlLoy FuLoy FuMon, 13 Jun 2016 02:00:00 GMThttp://www.tkk7.com/fuhoujun/archive/2016/06/13/430865.htmlhttp://www.tkk7.com/fuhoujun/comments/430865.htmlhttp://www.tkk7.com/fuhoujun/archive/2016/06/13/430865.html#Feedback0http://www.tkk7.com/fuhoujun/comments/commentRss/430865.htmlhttp://www.tkk7.com/fuhoujun/services/trackbacks/430865.html* 后端采用Spring bootQ它使我们更Ҏd建基于Spring的独立和产品U的可以xq行的应用和服务。直接嵌入Tomcat 或Jetty服务器,不需要部|WAR 文gQ可直接q行jar文g?
* pȝ权限框架采用ShiroQ实现前后台权限校验 * 持久层采用JPA Qƈ实现cibatis的查询功能;数据响应该采用json格式?
* 服务采用REST形式Q能够方便的与手机appq行ҎQ集成swagger能够在线查看RESTAPI 文和在U测试服务接?
* 支持单点dQ可以多pȝq行菜单集成QŞ成一个portal
* 支持高ƈ发和水^扩展Q支持Session的统一存储
* 目采用gradle构徏Q能够方便的各目q行按需l装  阅读全文

Loy Fu 2016-06-13 10:00 发表评论
]]>
java NIOhttp://www.tkk7.com/fuhoujun/archive/2008/10/21/235733.htmlLoy FuLoy FuTue, 21 Oct 2008 09:44:00 GMThttp://www.tkk7.com/fuhoujun/archive/2008/10/21/235733.htmlhttp://www.tkk7.com/fuhoujun/comments/235733.htmlhttp://www.tkk7.com/fuhoujun/archive/2008/10/21/235733.html#Feedback0http://www.tkk7.com/fuhoujun/comments/commentRss/235733.htmlhttp://www.tkk7.com/fuhoujun/services/trackbacks/235733.html阅读全文

Loy Fu 2008-10-21 17:44 发表评论
]]>
L实现Apache,Tomcat集群和负载均?/title><link>http://www.tkk7.com/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.tkk7.com/fuhoujun/archive/2008/10/20/235373.html</guid><wfw:comment>http://www.tkk7.com/fuhoujun/comments/235373.html</wfw:comment><comments>http://www.tkk7.com/fuhoujun/archive/2008/10/20/235373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fuhoujun/comments/commentRss/235373.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fuhoujun/services/trackbacks/235373.html</trackback:ping><description><![CDATA[ 作?|代?ldj_work#126.com,转蝲请保持完整?br /> 环境说明 <p>       Apache  :apache_2.0.55     1 ?/p> <p>       Tomcat:  apache-tomcat-5.5.17 (zip? 2?/p> <p>       mod_jk:: mod_jk-apache-2.0.55.so  1?/p> <p><strong>W一部分Q负载均?/strong></p> <p>    负蝲均衡Q就是apache客戯求均衡的分给tomcat1,tomcat2....d?/p> <p><strong>   1.安装apche,tomcat</strong></p> <p>   <a >http://httpd.apache.org/</a> 下蝲Apache 2.0.55</p> <p>    <a >http://tomcat.apache.org/download-55.cgi</a> 下蝲tomcat5.5 zip版本Q解压即可,l色版)</p> <p>   <a >http://apache.justdn.org/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.15/</a>  下蝲mod_jk,注意?nbsp; apache版本匚w</p> <p>   按照jdk,我的路径?E:\ide\apache\Apache2</p> <p>   解压两䆾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配置文ghttp.conf</strong></p> <p>   在apache安装目录下conf目录中找到http.conf</p> <p>   在文件最后加上下面一句话可以了</p> <p>  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文gQ内容如?/strong></div> <div forimg="1">   </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文g路径<br /> JkWorkersFile conf/workers.properties</div> <div forimg="1"></div> <div forimg="1">#指定那些h交给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文gQ内容如?/strong></div> <div forimg="1"> </div> <div forimg="1">worker.list = controller,tomcat1,tomcat2  #server 列表</div> <div forimg="1"></div> <div forimg="1">#========tomcat1========</div> <div forimg="1">worker.tomcat1.port=8009         #ajp13 端口P在tomcat下server.xml配置,默认8009<br /> worker.tomcat1.host=localhost  #tomcat的主机地址Q如不ؓ本机Q请填写ip地址<br /> worker.tomcat1.type=ajp13<br /> worker.tomcat1.lbfactor = 1   #server的加权比重,D高,分得的请求越?/div> <div forimg="1"></div> <div forimg="1">#========tomcat2========</div> <div forimg="1">worker.tomcat2.port=9009       #ajp13 端口P在tomcat下server.xml配置,默认8009<br /> worker.tomcat2.host=localhost  #tomcat的主机地址Q如不ؓ本机Q请填写ip地址<br /> worker.tomcat2.type=ajp13<br /> worker.tomcat2.lbfactor = 1   #server的加权比重,D高,分得的请求越?/div> <div forimg="1"><br /> #========controller,负蝲均衡控制?=======<br /> worker.controller.type=lb<br /> worker.controller.balanced_workers=tomcat1,tomcat2   #指定分担h的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配置文gserver.xml</strong></div> <div forimg="1">如果你在不同电脑上安装tomcat,tomcat的安装数量ؓ一个,可以不必修改tomcat配置文g</div> <div forimg="1">我这里是在同一台电脑上安装两个tomcatQ所以需要更改其中一个的讄</div> <div forimg="1"></div> <div forimg="1">打开tomcat2/conf/server.xml文g</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"><% <br />    System.out.println("===========================");<br /> %><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,q行试</strong></div> <div forimg="1"></div> <div forimg="1">通过 <a href="http://localhost/test/test.jsp">http://localhost/test/test.jsp</a> 讉KQ查看tomcat1的窗口,可以看到打印了一?=========="</div> <div forimg="1">再刷Cơ,tomcat2也打C一条,再刷斎ͼ可以看到h会被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>W二部分Q配|集?/strong></div> <div forimg="1">   只配|负载均衡还不行Q还要session复制Q也是说其中Q何一个tomcat的添加的sessionQ是要同步复制到其它tomcatQ?集群内的tomcat都有相同的session</div> <div forimg="1"></div> <div forimg="1"><strong>1. 修改tomcat1, tomcat2的server.xml</strong>,集部分配|的在注释符删掉,q将tomcat2?001端口改ؓ4002Q以避免与tomcat冲突Q当Ӟ如果是两台电脑,是不用改端口的,L注释W即?/div> <div forimg="1">   <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>2Q修Ҏ试项目test</strong></div> <div forimg="1">修改test.jsp,内容如下</div> <div forimg="1"></div> <div forimg="1">  <%@ page contentType="text/html; charset=GBK" %><br /> <%@ page import="java.util.*" %><br /> <html><head><title>Cluster App Test</title></head><br /> <body><br /> Server Info:<br /> <%<br /> out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%><br /> <%<br />   out.println("<br> ID " + session.getId()+"<br>");</div> <div forimg="1">  // 如果有新?Session 属性设|?br />   String dataName = request.getParameter("dataName");<br />   if (dataName != null && dataName.length() > 0) {<br />      String dataValue = request.getParameter("dataValue");<br />      session.setAttribute(dataName, dataValue);<br />   }</div> <div forimg="1">  out.print("<b>Session 列表</b>");</div> <div forimg="1">  Enumeration e = session.getAttributeNames();<br />   while (e.hasMoreElements()) {<br />      String name = (String)e.nextElement();<br />      String value = session.getAttribute(name).toString();<br />      out.println( name + " = " + value+"<br>");<br />          System.out.println( name + " = " + value);<br />    }<br /> %><br />   <form action="index.jsp" method="POST"><br />     名称:<input type=text size=20 name="dataName"><br />      <br><br />     ?<input type=text size=20 name="dataValue"><br />      <br><br />     <input type=submit><br />    </form><br /> </body><br /> </html></div> <div forimg="1"></div> <div forimg="1">然后在test 新徏WEB-INF目录QWEB-INF下新建web.xml,内容如下</div> <div forimg="1"><web-app xmlns="<a xmlns:xsi="<a xsi:schemaLocation="<a >http://java.sun.com/xml/ns/j2ee</a> <a version="2.4"><br />        <display-name>TomcatDemo</display-name><br />       <strong><font color="#ff0000"> <distributable/></font></strong><br /> </web-app></div> <div forimg="1"></div> <div forimg="1">注意Q在你的应用的web.xml加入 <font color="#ff0000"><strong> <distributable/></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>   </div> <div forimg="1"></div> <div forimg="1">新徏一?名称?xiaoluo  ,gؓ cdut 的session,提交查询Q新开一个ieH口Q再提交查询Q如图,可以看到Q两个tomcat 是负载均衡,q且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.tkk7.com/fuhoujun/aggbug/235373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-20 08:49 <a href="http://www.tkk7.com/fuhoujun/archive/2008/10/20/235373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext中FormPanel面板及Form控g横排试(CSS) http://www.tkk7.com/fuhoujun/archive/2008/10/15/234416.htmlLoy FuLoy FuWed, 15 Oct 2008 05:03:00 GMThttp://www.tkk7.com/fuhoujun/archive/2008/10/15/234416.htmlhttp://www.tkk7.com/fuhoujun/comments/234416.htmlhttp://www.tkk7.com/fuhoujun/archive/2008/10/15/234416.html#Feedback0http://www.tkk7.com/fuhoujun/comments/commentRss/234416.htmlhttp://www.tkk7.com/fuhoujun/services/trackbacks/234416.html

在实际的|页开发中Q大部分旉都要涉及到Form表单的处理。在Ext框架中也提供了很多这斚w的控Ӟ而且q有一个专门的FormPanel?局Q该布局默认为放在面板上面的所有控仉是换行放|,而在实际应用中ؓ了美观,有些需要横排,特别是Radio控gQ这个时候就需要我们重新定制这些控 件的布局了,该例子中使用CSS来实现这些功能,先脓Z张效果图?/p>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Ext中FormPanel面板及Form控g横排试(CSS)</title>
<link rel="stylesheet" type="text/css" media="all" href="../ext/resources/css/ext-all.css" />
<style type="text/css" media="all">
.allow-float {clear:none!important;} /* 允许该元素Q?*/
.stop-float {clear:both!important;} /* L该元素Q?*/
.sex-male {float:left;}
.sex-female {float:left;padding:0 0 0 20px;}
.age-field {float:left;padding:0 0 0 58px;*padding:0 0 0 50px!important;*padding:0 0 0 50px;}
</style>
</head>
<body>
<script type="text/javascript" src="../ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../ext/ext-all.js"></script>
<script type="text/javascript" src="../ext/build/locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript">Ext.BLANK_IMAGE_URL = '../ext/resources/images/default/s.gif';</script>
<script type="text/javascript">
Ext.onReady(function() {
//创徏Form面板
var fp = new Ext.form.FormPanel({
buttonAlign:'center',
labelAlign:'right',
labelWidth:40,
frame:true,
bodyStyle:'padding:8px 0 0 0;',
items:[{
xtype:'textfield',
fieldLabel:'姓名',
name:'n_username',
id:'i_username',
width:320
},{
xtype:'radio',
fieldLabel:'性别',
boxLabel:'?,
name:'sex',
id:'male',
itemCls:'sex-male', //向左ҎQ?处理控g横排
clearCls:'allow-float', //允许两边动,在实际生成的HTMLl构中有专门的DIVL动
checked:true
},{
xtype:'radio',
boxLabel:'?,
name:'sex',
id:'female',
itemCls:'sex-female', //向左动,处理控g横排
clearCls:'allow-float', //允许两边动
hideLabel:true //不显C前?性别"的标{?br /> },{
xtype:'textfield',
fieldLabel:'q龄',
name:'n_age',
id:'i_age',
itemCls:'age-field', //向左动,处理控g横排
width:133
},{
xtype:'textfield',
fieldLabel:'住址',
name:'n_address',
id:'i_address',
itemCls:'stop-float', //不允许Q?l束控g横排
width:320
}],
buttons:[{
text:'定',
handler:onOK //实际应用一般是处理fp.getForm.submit()事g
}, {
text:'重置',
handler:function(){ fp.getForm().reset(); }
}],
keys:[{ //处理键盘回R事g
key:Ext.EventObject.ENTER,
fn:onOK,
scope:this
}]
});

//定按钮事g,q里只是单获取各控g?实际应用一般和后台脚本l合
function onOK() {
var strMsg;
strMsg = ‘姓名Q?#8217; + fp.getComponent(’i_username’).getValue() + ‘Q性别Q?#8217;;
if (fp.getComponent(’male’).checked) strMsg += ‘?#8217;;
if (fp.getComponent(’female’).checked) strMsg += ‘?#8217;;
strMsg += ‘Q年龄:’ + fp.getComponent(’i_age’).getValue();
strMsg += ‘Q住址Q?#8217; + fp.getComponent(’i_address’).getValue();
alert(strMsg);
}

//创徏ȝ?br /> new Ext.Window({
title:’Ext中FormPanel面板及Form控g横排试(CSS)’,
width:400,
closable:false,
collapsible:true,
draggable:false,
resizable:false,
modal:true,
border:false,
items:[fp],
buttons:[]
}).show();
});
</script>
</body>
</html>



Loy Fu 2008-10-15 13:03 发表评论
]]>
Java下的框架~程之cglib的应?/title><link>http://www.tkk7.com/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.tkk7.com/fuhoujun/archive/2008/10/08/233074.html</guid><wfw:comment>http://www.tkk7.com/fuhoujun/comments/233074.html</wfw:comment><comments>http://www.tkk7.com/fuhoujun/archive/2008/10/08/233074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fuhoujun/comments/commentRss/233074.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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> </td> </tr> <tr> <td class="d_font4"> <p>Proxy可以看作是微型的AOPQ明白提供了在承和委托之外的第三个代码装途径Q只要有_的想象力Q可以做得非常好玩,Spring的源码里用Proxyq得很随便Q看得我非常眼红。可惜Proxy必须Z接口。因此Spring的做法,Z接口的用proxy,否则qcglib。AOP么,一般小事非compoent一U的׃ȝAspectJ出手了?/p> <p>cglib的Enhancer说v来神奇,用v来一늺不到p完了?/p> <p>它的原理是用Enhancer生成一个原有类的子c,q且讄好callback到proxyQ?则原有类的每个方法调用都会{用实CMethodInterceptor接口的proxy的intercept() 函数Q?/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"> Object intercept(Object o,Method method,Object[] args,MethodProxy proxy)</span></p> </pre> </td> </tr> </tbody> </table> </p> 在intercept()函数里,你可以在执行Object result=proxy.invokeSuper(o,args);来执行原有函敎ͼ在执行前后加入自q东西Q改变它的参数|也可以瞒天过P完全q别的。说白了Q就是AOP中的around advice?<br /> <p>AOP没有出现以前Q该领域l典的设计模式是DecoratorQ像Java IO Stream的设计就是如此。不q,如果为每个DAO, 每个Ҏ的写Decorator函数会写Mh的,所以用上cglib的好处是一ơ过拦截所有方法?nbsp;<br /> <br /> 另外Qcglib除了Enhancer之外Q还有BulkBean和TransformQ都是Hibernate持久化的基础Q但文贫乏Q一时还没去看怎么用?br /> <br /> 1.AOP里讲了一N啊一N的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"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> LogDAOProxy </span><span style="color: #0000ff">implements</span><span style="color: #000000"> MethodInterceptor<br />    {<br />        </span><span style="color: #0000ff">private</span><span style="color: #000000"> Logger 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 />        </span><span style="color: #0000ff">private</span><span style="color: #000000"> Enhancer enhancer</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> Enhancer();<br />         </span><span style="color: #008000">//</span><span style="color: #008000">q回DAO的子c?/span><span style="color: #008000"><br /> </span><span style="color: #000000">       </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object getDAO(Class clz)<br />        {<br />            enhancer.setSuperclass(clz);<br />            enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> enhancer.create();<br />        }<br />        </span><span style="color: #008000">//默认</span><span style="color: #008000">的拦截方?/span><span style="color: #008000"><br /> </span><span style="color: #000000">      </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object intercept(Object o,Method method,Object[] args,</span></p> <p><span style="color: #000000"> MethodProxy proxy) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Throwable<br />       {<br />            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 />            Object result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invokeSuper(o,args);<br />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> result;<br />       }<br />    }</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 proxy <span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> LogDAOProxy();<br />   GoodsDAO  dao </span><span style="color: #000000">=</span><span style="color: #000000"> (GoodsDAO)proxy.getDAO(GoodsDAO.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />   dao.insert(goods);</span></p> </pre> </td> </tr> </tbody> </table> <br /> 2.而在Spring的管理下应该略加修改的高UDecorator</p> <p>上面的例子用<span style="color: #0000ff">return</span><span style="color: #000000"> enhancer.create();创徏子类实例Q但在Spring理下,一些Bean的实例必ȝSpring来创建和理Q而不由enhancer来创建的。所以我对上q用法略加修改,使它真正当一个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"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> LogDAOProxy </span><span style="color: #0000ff">implements</span><span style="color: #000000"> MethodInterceptor<br />   {<br />        </span><span style="color: #0000ff">private</span><span style="color: #000000"> Logger 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 />        </span><span style="color: #0000ff">private</span><span style="color: #000000"> Object dao</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />        </span><span style="color: #0000ff">private</span><span style="color: #000000"> Enhancer enhancer</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> Enhancer();<br />         </span><span style="color: #008000">//</span><span style="color: #008000">q回DAO的子c?/span><span style="color: #008000"><br /> </span><span style="color: #000000">       </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object getDAO(Class clz,Object dao)<br />        {<br />            </span><span style="color: #0000ff">this</span><span style="color: #000000">.dao </span><span style="color: #000000">=</span><span style="color: #000000"> dao;<br />            enhancer.setSuperclass(clz);<br />            enhancer.setCallback(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> enhancer.create();<br />        }      <br />        </span><span style="color: #008000">//</span><span style="color: #008000">默认的拦截方?/span><span style="color: #008000"><br /> </span><span style="color: #000000">      </span><span style="color: #0000ff">public</span><span style="color: #000000"> Object intercept(Object o,Method method,Object[] args,</span></p> <p><span style="color: #000000"> MethodProxy proxy) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Throwable<br />       {<br />            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 />            Object result</span><span style="color: #000000">=</span><span style="color: #000000">proxy.invoke(dao, args);<br />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> result;<br />       }<br /> }</span></p> </pre> </td> </tr> </tbody> </table> <br /> </span>可见Q原来模式里在getDao()时由enhancer创徏daoQ?nbsp;调用intercept时则enhancer创徏的dao以Object o参数传回?br /> 而新模式里,dao在getDao()时从外面传入Qenhancer.create()q回的是一个proxy. 而调用interceptӞ实际会用之前传入的daoq行操作Q而忽略Object o参数传入的proxy?/p> <p>有点遗憾, intercept函数里MethodProxy的Signature是固定的Q即客户如果调用foo(String),你不可以用proxy.invokeh成foo(String,String); </p> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/fuhoujun/aggbug/233074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-08 10:38 <a href="http://www.tkk7.com/fuhoujun/archive/2008/10/08/233074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext-实现带查询以及分늚列表http://www.tkk7.com/fuhoujun/archive/2008/10/04/232399.htmlLoy FuLoy FuSat, 04 Oct 2008 14:43:00 GMThttp://www.tkk7.com/fuhoujun/archive/2008/10/04/232399.htmlhttp://www.tkk7.com/fuhoujun/comments/232399.htmlhttp://www.tkk7.com/fuhoujun/archive/2008/10/04/232399.html#Feedback0http://www.tkk7.com/fuhoujun/comments/commentRss/232399.htmlhttp://www.tkk7.com/fuhoujun/services/trackbacks/232399.html前台Q?

Store:

var resource = new Ext.data.Store({
      fields: ['imgpath','typeImage','title', 'type'],
      url: 'teaching/resource/resourceAction.evi?method=getResourceList',
      reader: new Ext.data.XmlReader(
        {
          record: "Item",
          totalRecords: "TotalCount"
        },
      [{name:'title',mapping: 'title'}, {name:'type',mapping: 'type'},{name:'imgpath',mapping: 'imgpath'},{name:'typeImage',mapping: 'typeImage'} ]
    )
});

resource.addListener('load', function(st, rds, opts) {
        // st 是当前的store, rds是读到的Record[], opts是store的配|?br />    for( var c=0; c<rds.length; c++ ) {
       rds[c].set('typeImage', "<img src='./images/33.gif' width='12' height='12' />");
       //待定cdQ先定死cd囄
      }
});

resource.load({params:{start:0,limit:10}});

var resourceType = new Ext.data.Store({
,
      reader: new Ext.data.XmlReader({
      record: "Item"
     }, [
      {name: 'resourceTypeId', mapping: 'resourceTypeId'},
       {name: 'resourceType', mapping: 'resourceType'}
      ])
   });
resourceType.load();
var languageType = new Ext.data.Store({
,
      reader: new Ext.data.XmlReader({
      record: "Item"
     }, [
       {name: 'languageTypeId', mapping: 'languageTypeId'},
       {name: 'languageType', mapping: 'languageType'}
      ])
   });
languageType.load();

列表Q?

resourcePanel = new Ext.grid.GridPanel({
id: 'resources',
frame: true,
header: false,
width: 288,
autoWidth: true,
autoHeight: true,
loadMask:{msg:'正在加蝲数据Q请E侯……'},
iconCls:'icon-grid',
viewConfig: { forceFit: true },
   columns:[
  {header: " ",dataIndex: 'typeImage' , width:20},
  {header: "资源标题", width: 190, sortable: true, dataIndex: 'title'},
  {header: "cd", width: 80, sortable: true, dataIndex: 'type'}
   ],
  store: resource,
  selModel: new Ext.grid.RowSelectionModel({singleSelect:false}),
     bbar: new Ext.PagingToolbar({
  pageSize: 10,
  store: resource,
  displayInfo: false,
  //displayMsg: '昄W?{0} 条到 {1} 条记录,一?{2} ?,
  emptyMsg: "没有记录" 
      }),
  listeners: {
  rowclick:function(e) {
   try {
    window.parent.parent.Ext.ux.MyTips.msg("提示", "双击该行可预览该资源");
    } catch(e) {}
    },
  rowdblclick:function(g, rIdx, e) {
   var rd = g.getStore().getAt(rIdx);
   var html = "<img src='./images/" + rd.get('imgpath') + "' />";
  window.parent.showWin({
      layout: 'fit',
      maximizable: true,
      title: rd.get('title'),
      width: 400,
      height: 400,
      //modal: true,
      //closeAction: 'hide',
      plain: true,
      items: [ {html: html} ]
    });
  }
}
});

FormPanel:

var rform = new Ext.form.FormPanel({
              id:'rform',
           header: false,
           frame: true,
           hideBorders: false,
           items: [
            new Ext.form.TextField({
             fieldLabel: '关键?,
             name:'keyword'
            }),
            new Ext.form.ComboBox({
             fieldLabel: '资源cd',
             mode: 'local',
             triggerAction: 'all',
             store: resourceType,
             typeAhead: true,
             hiddenName:'resourceTypeId',
             displayField: 'resourceType',
             valueField: 'resourceTypeId',
             readOnly: true,
             selectOnFocus: true
            }),
            new Ext.form.ComboBox({
             fieldLabel: '语言',
             mode: 'local',
             triggerAction: 'all',
             typeAhead: true,
             hiddenName:'languageTypeId',
             displayField:'languageType',
             valueField:'languageTypeId',
             readOnly: true,
             selectOnFocus: true,
             store:languageType
            }),
            new Ext.Panel({
             layout: 'table',
             buttonAlign: 'center',
             layoutConfig: { colspan: 3 },
             buttons:[{text: '?nbsp; ?,
              handler: function() {
                             var keyword = Ext.get('keyword').dom.value;
                             var resourceTypeId = Ext.get('resourceTypeId').dom.value;
                             var languageTypeId = Ext.get('languageTypeId').dom.value;
                      resource.reload({params:{start:0,limit:3,keyword:keyword,resourceTypeId:resourceTypeId,languageTypeId:languageTypeId}});
   //q里不用再写ajaxQExt已经装了ajaxQ只要把参数传进d行了  
              }},
              {
                text: '?nbsp; |?,
                handler: function() {
                   Ext.getCmp('rform').form.reset();
               }
               }
              ]
            })
           ]
          })

后台Q?

public ActionForward getResourceList(ActionMapping mapping,
   ActionForm form, HttpServletRequest request,
   HttpServletResponse response) throws IOException {

  Document document = DocumentHelper.createDocument();
  String start = request.getParameter("start");
  String limit = request.getParameter("limit");
  String keyword = request.getParameter("keyword");
  String resourceTypeId = request.getParameter("resourceTypeId");
  String languageTypeId = request.getParameter("languageTypeId");

  List<HqlCondition> hqlFilter = new LinkedList<HqlCondition>();
  if(keyword != null && keyword.length()>0){
   hqlFilter.add( new HqlCondition("and", "rs.title", "like", "%" + keyword + "%", HqlCondition.String) );
   hqlFilter.add( new HqlCondition("or", "rs.remarks", "like", "%" + keyword + "%", HqlCondition.String) );
  }
  if(resourceTypeId != null && resourceTypeId.length()>0){
   hqlFilter.add( new HqlCondition("and", "rs.resourceType.resourceTypeId", "=", new Long(resourceTypeId), HqlCondition.Long) );
  }
  if(languageTypeId != null && languageTypeId.length()>0){
   hqlFilter.add( new HqlCondition("and", "rs.languageType.languageTypeId", "=", new Integer(languageTypeId), HqlCondition.Integer) );
  }
  int pageno =1;
  int pagesize = 10;
  if(limit != null && limit.length()>0){
      pagesize = Integer.parseInt(limit);
  }

  if(!start.equalsIgnoreCase("0") && start != null && start.length()>0){
     int bpos = Integer.parseInt(start);
     pageno = (bpos + pagesize)/pagesize;
  }
  int total = this.rse.getResourceTotalCount(hqlFilter);
  Collection<BaseVO> coll = this.rse.getResourceList(hqlFilter,pageno,pagesize);
  Iterator<BaseVO> it = coll.iterator();
  while(it != null && it.hasNext()){
   BaseVO bv = it.next();
   ResourceType rt = this.rts.getResourceType(((ResourceType)bv.get("resourceType")).getResourceTypeId());
   bv.set("type", rt.getResourceType());
  }
  document.addElement("type");
  new OutputVOXml().writeXML(total,new LinkedList<BaseVO>(coll), response);
  return null;
}

查看更多_ֽ囄

Loy Fu 2008-10-04 22:43 发表评论
]]>
JSON与struts2 http://www.tkk7.com/fuhoujun/archive/2008/10/04/232324.htmlLoy FuLoy FuSat, 04 Oct 2008 06:45:00 GMThttp://www.tkk7.com/fuhoujun/archive/2008/10/04/232324.htmlhttp://www.tkk7.com/fuhoujun/comments/232324.htmlhttp://www.tkk7.com/fuhoujun/archive/2008/10/04/232324.html#Feedback2http://www.tkk7.com/fuhoujun/comments/commentRss/232324.htmlhttp://www.tkk7.com/fuhoujun/services/trackbacks/232324.html提供的一个插件包Q可以把Action中的数据?/span>JSON做个装然后q回?/span>

它会整?/span>action中的变量转化?/span>JSON数据(根对象在JSON中数据添加一?/span>”root”标识)。如果要使用它,Action必须遵@以下几点Q?/span>

1.       q回的页面类型中”content-type”必须?/span>”application/json”.(q个已经Internet Community采用).

2.       JSON内容必须是符合格式要求的.

3.       Action?/span>field必须?/span>public?/span>setҎ.(是不是没?/span>setҎ׃会将fieldd?/span>JSON数据中,有待验证).

4.       它支持的cd?/span>: 基本cd(int,long...String), Date, List, Map, Primitive Arrays, 其它class, 对象数组.

5.       ?/span>JSON中Q何的Object会被装?/span>list?/span>map中,数据会被装E?/span>LongQ如果是含有的数据则会被装E?/span>DoubleQ数l会被封装程List.

下面l出JSON的数据格?/span>:

{

   "doubleValue": 10.10,

   "nestedBean": {

      "name": "Mr Bean"

   },

   "list": ["A", 10, 20.20, {

      "firstName": "El Zorro"

   }],

   "array": [10, 20]

}

说明:

a.       q个插g支持以下几个注释:

注释?/span>

?/span>

默认?/span>

序列?/span>

反序列化

name

配置JSON?/span>name

empty

yes

no

serialize

?/span>serialization?/span>

true

yes

no

deserialize

?/span>deserialization?/span>

true

no

yes

format

格式?/span>Date字段

"yyyy-MM-dd'T'HH:mm:ss"

yes

yes

可以通过配置来显C指攑֜JSON?/span>fieldQ其中有个自q验证规则需要研I?/span>.

<!-- Result fragment -->

<result type="json">

 <param name="excludeProperties">

    login.password,

    studentList.*".sin

 </param>

</result>

<!-- Interceptor fragment -->

<interceptor-ref name="json">

 <param name="enableSMD">true</param>

 <param name="excludeProperties">

    login.password,

    studentList.*".sin

 </param>

</interceptor-ref>

b.       根对?/span>

 <result type="json">

 <param name="root">

    person.job

 </param>

</result>

也可以用拦截器配置操作父对?/span>

<interceptor-ref name="json">

 <param name="root">bean1.bean2</param>

</interceptor-ref>

c.       ?/span>JSON数据用注释封?/span>

如果wrapWithComments讄?/span>true(默认gؓfalse)Q则生成?/span>JSON数据会变成这P

/* {

   "doubleVal": 10.10,

   "nestedBean": {

      "name": "Mr Bean"

   },

   "list": ["A", 10, 20.20, {

      "firstName": "El Zorro"

   }],

   "array": [10, 20]

} */

q样做可以避?/span>js中一些潜在的风险Q用时需?/span>:

Var responseObject = eval("("+data.substring(data.indexOf(""/"*")+2, data.lastIndexOf(""*"/"))+")");

d.       父类

“root”对象中父cȝfield不会默认存放?/span>JSON数据中,如果不想q样做,需要在配置时指?/span>ignoreHierarchy?/span>false:

<result type="json">

 <param name="ignoreHierarchy">false</param>

</result>

e.       枚Dcd

默认处理枚DcdӞ会被处理?/span>JSON数据?/span>name{于枚D?/span>value?/span>value{于枚D?/span>name.

public enum AnEnum {

     ValueA,

     ValueB

 }

 JSON: "myEnum":"ValueA"

如果在处理枚丄型时Q在xml中配|了enumAsBeanQ则会被当作一?/span>Bean处理Q在JSON数据中会有一个特别的属?/span>”_name”name().q个枚D中的所有属性都会被处理.

public enum AnEnum {

     ValueA("A"),

     ValueB("B");

     private String val;

     public AnEnum(val) {

        this.val = val;

     }

     public getVal() {

        return val;

     }

   }

 JSON: myEnum: { "_name": "ValueA", "val": "A" }

Xml中配|?/span>:

<result type="json">

 <param name="enumAsBean">true</param>

</result>

f.        例子

a)         Action

import java.util.HashMap;

import java.util.Map;

import com.opensymphony.xwork2.Action;

public class JSONExample {

    private String field1 = "str";

    private int[] ints = {10, 20};

    private Map map = new HashMap();

    private String customName = "custom";

    //'transient' fields are not serialized

    private transient String field2;

    //fields without getter method are not serialized

    private String field3;

    public String execute() {

        map.put("John", "Galt");

        return Action.SUCCESS;

    }

    public String getField1() {

        return field1;

    }

    public void setField1(String field1) {

        this.field1 = field1;

    }

    public int[] getInts() {

        return ints;

    }

    public void setInts(int[] ints) {

        this.ints = ints;

    }

    public Map getMap() {

        return map;

    }

    public void setMap(Map map) {

        this.map = map;

    }

    @JSON(name="newName")

    public String getCustomName() {

        return this.customName;

    }

}

b)        Xml配置

 <?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

 <package name="example" extends="json-default">

     <action name="JSONExample" class="example.JSONExample">

        <result type="json"/>

     </action>

 </package>

</struts>

q里有两个地斚w要注?/span>:

1)      需要?/span>json-default?/span>

2)      <result>{定义

c)         JSON数据

 { 

   "field1" : "str",

   "ints": [10, 20],

   "map": {

       "John":"Galt"

   },

   "newName": "custom"

}

d)        JSON RPC

JSON插g可以?/span>js中调?/span>actionҎQ返回执行结果。这个已l在dojo中有了实玎ͼ可以?/span>Simple Method Definition调用q程服务。来一L看下面的例子Q?/span>

首先写一?/span>ActionQ?/span>

package smd;

import com.googlecode.jsonplugin.annotations.SMDMethod;

import com.opensymphony.xwork2.Action;

public class SMDAction {

    public String smd() {

        return Action.SUCCESS;

    }

    @SMDMethod

    public Bean doSomething(Bean bean, int quantity) {

        bean.setPrice(quantity * 10);

        return bean;

    }

}

e)         Ҏ必须?/span>SMDMethod加上注解Q这h能被q程调用Qؓ了安全因素。这个方法会产生一?/span>bean对象Q实C改h格的功能?/span>Action被添加上SMD注解会生成一?/span>SMDQ同时参C会被加上SMDMethodParameter注解。像你所看到的,Action中定义了一个空ҎQ?/span>smd。这个方法是作ؓSimple Method Definition (定义class中提供的服务)Q在struts.xml配置<result>时?/span>type属性gؓ”json”?/span>

下面?/span>bean的定义:

package smd;

public class Bean {

    private String type;

    private int price;

    public String getType() {

        return type;

    }

    public void setType(String type) {

        this.type = type;

    }

    public int getPrice() {

        return price;

    }

    public void setPrice(int price) {

        this.price = price;

    }

}

Xml文g:

<package name="RPC" namespace="/nodecorate" extends="json-default">

    <action name="SMDAction" class="smd.SMDAction" method="smd">

        <interceptor-ref name="json">

            <param name="enableSMD">true</param>

        </interceptor-ref>

        <result type="json">

             <param name="enableSMD">true</param>

        </result>

    </action>

</package>

q里需要注意一?/span>:” enableSMD”q个必须?/span>interceptor?/span>result都要配置.

Js代码:

<s:url id="smdUrl" namespace="/nodecorate" action="SMDAction" />

<script type="text/javascript">

    //load dojo RPC

    dojo.require("dojo.rpc.*");

    //create service object(proxy) using SMD (generated by the json result)

    var service = new dojo.rpc.JsonService("${smdUrl}");

    //function called when remote method returns

    var callback = function(bean) {

        alert("Price for " + bean.name + " is " + bean.price);

    };

    //parameter

    var bean = {name: "Mocca"};

    //execute remote method

    var defered = service.doSomething(bean, 5);

    //attach callback to defered object

    defered.addCallback(callback);

</script>

JsonService会发Z个请求到action加蝲SMDQ同时远E方法会q回一?/span>JSON对象Q这个过E是Dojol?/span>action中的Ҏ创徏了一?/span>Proxy。因是异步调用过E,当远E方法执行的时候,它会q回一个对象到callbackҎ中?/span>

f)         代理的对?/span>

当用的注解不是l承?/span>JavaQ可能你使用代理会出C些问题。比如:当你使用aop拦截你的action的时候。在q种情况下,q个插g不会自动发现注解的方法。ؓ了避免这U情况发生,你需要在xml中配|?/span>ignoreInterfaces?/span>falseQ这h件会自己查找注解的所有接口和父类?/span>

注意Q这个参数只有在Action执行的过E是通过注解来运行的时候才应该设ؓfalse?/span>

<action name="contact" class="package.ContactAction" method="smd">

   <interceptor-ref name="json">

      <param name="enableSMD">true</param>

      <param name="ignoreInterfaces">false</param>

   </interceptor-ref>

   <result type="json">

      <param name="enableSMD">true</param>

      <param name="ignoreInterfaces">false</param>

   </result>

   <interceptor-ref name="default"/>

</action>



Loy Fu 2008-10-04 14:45 发表评论
]]>
extjs+struts2+spring例子http://www.tkk7.com/fuhoujun/archive/2008/10/04/232319.htmlLoy FuLoy FuSat, 04 Oct 2008 06:35:00 GMThttp://www.tkk7.com/fuhoujun/archive/2008/10/04/232319.htmlhttp://www.tkk7.com/fuhoujun/comments/232319.htmlhttp://www.tkk7.com/fuhoujun/archive/2008/10/04/232319.html#Feedback2http://www.tkk7.com/fuhoujun/comments/commentRss/232319.htmlhttp://www.tkk7.com/fuhoujun/services/trackbacks/232319.htmlstruts2?span class="hilite2">json plugin的位|在Qhttp://code.google.com/p/jsonplugin/
下蝲json plugin的jar包,攑ֈ/WEB-INF/lib/目录下就可以?br />
Spring + Struts + JPA的项目结构如其他例子中的一?br /> 首先是web.xml
xml 代码
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app id="WebApp_ID" version="2.4"  
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  6.     <display-name>quickstart</display-name>  
  7.     <filter>  
  8.         <filter-name>struts2</filter-name>  
  9.         <filter-class>  
  10.             org.apache.struts2.dispatcher.FilterDispatcher  
  11.         </filter-class>  
  12.     </filter>  
  13.     <filter>  
  14.         <filter-name>jpaFilter</filter-name>  
  15.         <filter-class>  
  16.             org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter  
  17.         </filter-class>  
  18.         <init-param>  
  19.             <param-name>entityManagerFactory</param-name>  
  20.             <param-value>entityManagerFactory</param-value>  
  21.         </init-param>  
  22.     </filter>  
  23.     <filter-mapping>  
  24.         <filter-name>jpaFilter</filter-name>  
  25.         <url-pattern>*.action</url-pattern>  
  26.     </filter-mapping>  
  27.     <filter-mapping>  
  28.         <filter-name>struts2</filter-name>  
  29.         <url-pattern>/*</url-pattern>  
  30.     </filter-mapping>  
  31.     <welcome-file-list>  
  32.         <welcome-file>index.jsp</welcome-file>  
  33.     </welcome-file-list>  
  34.     <listener>  
  35.         <listener-class>  
  36.             org.springframework.web.context.ContextLoaderListener  
  37.         </listener-class>  
  38.     </listener>  
  39. </web-app>  

加入jpaFilterQ是Z不让hibernate的sessionq早关闭Q因为有的action会通过ajax动态调用?br /> 下面是struts.xmlQ注意struts.xml需要放在源代码目录下面Q?br />
xml 代码
 
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <constant name="struts.objectFactory" value="spring" />  
  7.     <constant name="struts.devMode" value="true" />  
  8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
  9.     <package name="person" extends="json-default">  
  10.         <action name="list" method="execute" class="personaction">  
  11.             <result type="json"/>  
  12.         </action>         
  13.     </package>  
  14. </struts>  

q里注意Q?/span>
struts.objectFactory告诉struts所有的action都到spring的上下文里面LQ另外还需要注意,我们自己的包要承自json-defaultQ这h可以在result的type属性中使用json?br /> 下面是spring的配|文件applicationContext.xmlQ?br />
xml 代码
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="  
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
  8.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd  
  9.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">  
  10.     <bean  
  11.         class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />  
  12.     <bean id="entityManagerFactory"  
  13.         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
  14.         <property name="dataSource" ref="dataSource" />  
  15.         <property name="jpaVendorAdapter">  
  16.             <bean  
  17.                 class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
  18.                 <property name="database" value="MYSQL" />  
  19.                 <property name="showSql" value="true" />  
  20.             </bean>  
  21.         </property>  
  22.     </bean>  
  23.     <bean id="dataSource"  
  24.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  25.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  26.         <property name="url" value="jdbc:mysql://localhost/extjs" />  
  27.         <property name="username" value="root" />  
  28.         <property name="password" value="" />  
  29.     </bean>  
  30.   
  31.       
  32.     <bean id="transactionManager"  
  33.         class="org.springframework.orm.jpa.JpaTransactionManager">  
  34.         <property name="entityManagerFactory"  
  35.             ref="entityManagerFactory" />  
  36.     </bean>  
  37.     <tx:annotation-driven transaction-manager="transactionManager" />  
  38.     <!--Service 开?nbsp;-->  
  39.     <bean id="personService" class="com.myext.service.impl.PersonServiceJpaImpl"/>  
  40.     <bean id="personaction" class="com.myext.action.PersonPageAction">  
  41.         <property name="person" ref="personService"/>  
  42.     </bean>  
  43. </beans>  

q里的bean personaction和strutx.xml中的action class一致就可以了,下面是代码:
actionQ?br />
java 代码
  1. package com.myext.action;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.myext.service.PersonService;
  5. public class PersonPageAction {
  6. private int limit=10;
  7. private int start=0;
  8. private PersonService person;
  9. private int total=0;
  10. private List persons = new ArrayList();
  11. private boolean success=true;
  12. public boolean getSuccess(){
  13. return this.success;
  14. }
  15. public void setLimit(int limit) {
  16. this.limit = limit;
  17. }
  18. public void setStart(int start) {
  19. this.start = start;
  20. }
  21. public void setPerson(PersonService person) {
  22. this.person = person;
  23. }
  24. public int getTotal() {
  25. return total;
  26. }
  27. public void setTotal(int total) {
  28. this.total = total;
  29. }
  30. public List getPersons() {
  31. return persons;
  32. }
  33. public void setPersons(List persons) {
  34. this.persons = persons;
  35. }
  36. public String execute(){
  37. this.total = person.getTotal();
  38. this.persons = person.getPage(this.start, this.limit);
  39. return "success";
  40. }
  41. }
serviceQ?br />
java 代码
  1. package com.myext.service.impl;
  2. import java.util.List;
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.PersistenceContext;
  5. import javax.persistence.Query;
  6. import com.myext.model.Person;
  7. import com.myext.service.PersonService;
  8. public class PersonServiceJpaImpl implements PersonService {
  9. private EntityManager em;
  10. private static String poname = Person.class.getName();
  11. @PersistenceContext
  12. public void setEntityManager(EntityManager em){
  13. this.em = em;
  14. }
  15. @SuppressWarnings("unchecked")
  16. @Override
  17. public List getPage( int start, int limit) {
  18. Query q = this.em.createQuery("from " + poname );
  19. q.setFirstResult(start);
  20. q.setMaxResults(limit);
  21. return q.getResultList();
  22. }
  23. @Override
  24. public int getTotal() {
  25. return this.em.createQuery("from " + poname).getResultList().size();
  26. }
  27. }
面的代码:
xml 代码
  1. xml version="1.0" encoding="UTF-8" ?>
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"
  3. pageEncoding="UTF-8"%>
  4. >
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  8. <title>Grid3title>
  9. <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
  10. <script type="text/javascript" src="extjs/adapter/ext/ext-base.js">script>
  11. <script type="text/javascript" src="extjs/ext-all.js">script>
  12. <script type="text/javascript" src="extjs/ext-lang-zh_CN.js">script>
  13. head>
  14. <body>
  15. <script type="text/javascript" src="grid3.js">script>
  16. <div id="grid3" >
  17. div>
  18. body>
  19. html>
grid3.js代码
js 代码
  1. /**
  2. * @author fox
  3. */
  4. Ext.onReady(function(){
  5. Ext.BLANK_IMAGE_URL = 'extjs/resources/images/default/s.gif';
  6. Ext.QuickTips.init();
  7. var sm = new Ext.grid.CheckboxSelectionModel(); //CheckBox选择?
  8. var cm = new Ext.grid.ColumnModel([
  9. new Ext.grid.RowNumberer(), //行号?
  10. sm,
  11. {header:'~号',dataIndex:'id'},
  12. {header:'性别',dataIndex:'sex',renderer:function(value){
  13. if(value=='male'){
  14. return "?/span>";
  15. }else{
  16. return "?/span>";
  17. }
  18. }}, //增加性别Q自定义rendererQ即昄的样式,可以加html代码Q来昄囄{?/span>
  19. {header:'名称',dataIndex:'name'},
  20. {header:'描述',dataIndex:'descn'}
  21. ]);
  22. var ds = new Ext.data.Store({
  23. proxy: new Ext.data.HttpProxy({url:'list.action'}),//调用的动?
  24. reader: new Ext.data.JsonReader({
  25. totalProperty: 'total',
  26. root: 'persons',
  27. successProperty :'success'
  28. }, [
  29. {name: 'id',mapping:'id',type:'int'},
  30. {name: 'sex',mapping:'sex',type:'string'},
  31. {name: 'name',mapping:'name',type:'string'},
  32. {name: 'descn',mapping:'descn',type:'string'} //列的映射
  33. ])
  34. });
  35. var grid = new Ext.grid.GridPanel({
  36. el: 'grid3',
  37. ds: ds,
  38. sm: sm,
  39. cm: cm,
  40. width:700,
  41. height:280,
  42. bbar: new Ext.PagingToolbar({
  43. pageSize: 10,
  44. store: ds,
  45. displayInfo: true,
  46. displayMsg: '昄W?{0} 条到 {1} 条记录,一?{2} ?,
  47. emptyMsg: "没有记录"
  48. }) //脚昄分页
  49. });
  50. //el:指定html元素用于昄grid
  51. grid.render();//渲染表格
  52. ds.load({params:{start:0, limit:10}}); //加蝲数据
  53. });
注意Q这里的gridpanel一定要讄高度Q否则数据是昄不出来的?br /> 最后启动tomcatQ在览器里输入http://localhost:8080/extjs/grid3.jsp,可以看到效?br />


Loy Fu 2008-10-04 14:35 发表评论
]]>
struts2中结合json的?/title><link>http://www.tkk7.com/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.tkk7.com/fuhoujun/archive/2008/10/04/232318.html</guid><wfw:comment>http://www.tkk7.com/fuhoujun/comments/232318.html</wfw:comment><comments>http://www.tkk7.com/fuhoujun/archive/2008/10/04/232318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fuhoujun/comments/commentRss/232318.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fuhoujun/services/trackbacks/232318.html</trackback:ping><description><![CDATA[     摘要: http://prototype.conio.net/dist/ 下蝲(对Ajax支持的prototype--js函数?Q? prototype-1.4.0.js ? prototype-1.4.0.tar.gz   http://code.google.com/p/jsonplugin/downloads/list 下蝲(Struts2...  <a href='http://www.tkk7.com/fuhoujun/archive/2008/10/04/232318.html'>阅读全文</a><img src ="http://www.tkk7.com/fuhoujun/aggbug/232318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 14:19 <a href="http://www.tkk7.com/fuhoujun/archive/2008/10/04/232318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中的雉|与CoCQConvention over ConfigrationQ?/title><link>http://www.tkk7.com/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.tkk7.com/fuhoujun/archive/2008/10/04/232312.html</guid><wfw:comment>http://www.tkk7.com/fuhoujun/comments/232312.html</wfw:comment><comments>http://www.tkk7.com/fuhoujun/archive/2008/10/04/232312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/fuhoujun/comments/commentRss/232312.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/fuhoujun/services/trackbacks/232312.html</trackback:ping><description><![CDATA[<strong>关键? Struts2 COC</strong> <div id="qqigukk" class="blog_content">摘要Q介lStruts2中的雉|(Zero ConfigurationQ,以及如何用COC来更好地化Struts2的配|。在W一章,我用Maven来创Z个v炚w目;W二章,以该目ZQ讲解如何用Struts2的零配置Q第三章Q论q第二章中的实现方式的缺P然后讲解如何使用COC来改q这些缺Pq进一步简化Struts2的配|。附件是q篇文章用到的示例代码?br /> <br /> <h2>一、从零开?/h2> q里Q我徏立一个新的示例项目,作ؓ讲解的v炏V我使用JDK 6、Maven 2、Eclipse 3.3来徏立这个示例,如果读者对Maven2不熟也没关系Q这只是个示例?br /> 首先Q运行下边的命oQ?br />                 mvn archetype:create -DgroupId=demo.struts -DartifactId=demo-struts-coc -DarchetypeArtifactId=maven-archetype-webapp<br /> q会建立如下的目录结构:<demo-struts-coc><br />  |- POM.xml<br />  |- src<br />      |- main<br />          |- resources<br />          |- webapp<br />              |- index.jsp<br />              |- WEB-INF<br />                  |- web.xml<br /> 然后我们在src/main目录下新Z个名为java的目录,用来攄java代码。在src下徏立test目录Qƈ在test目录下徏立java目录Q用来放|测试代码。另外,我这个示例不想用JSPQ所以我src/main/webapp目录下的index.jsp改ؓindex.html?br /> 现在Q需要配|该目要用到哪些lib。在POM.xml中加入struts2-coreQ?br /> </demo-struts-coc> <div id="ckokcks" class="code_title">xml 代码</div> <div id="cumyaiy" class="dp-highlighter"> <div id="wwyquca" class="bar"> </div> <ol class="dp-xml"> <li id="gqkoiye" class="alt"><span><span id="sauoiog" class="tag"><</span><span id="yugqusa" class="tag-name">dependency</span><span id="siogkay" class="tag">></span><span>  </span></span> <li id="uawqksi" class=""><span>    <span id="mamosqq" class="tag"><</span><span id="mwamgom" class="tag-name">groupId</span><span id="aqcuymw" class="tag">></span><span>org.apache.struts</span><span id="wuoyuay" class="tag"></</span><span id="giswyye" class="tag-name">groupId</span><span id="wmeiayg" class="tag">></span><span>  </span></span> <li id="uscgaye" class="alt"><span>    <span id="kuoimsq" class="tag"><</span><span id="qwakwuu" class="tag-name">artifactId</span><span id="euoguka" class="tag">></span><span>struts2-core</span><span id="ciuoaig" class="tag"></</span><span id="kikmyee" class="tag-name">artifactId</span><span id="kyuoqqe" class="tag">></span><span>  </span></span> <li id="yyswqwu" class=""><span>    <span id="usuyygo" class="tag"><</span><span id="qeycouo" class="tag-name">version</span><span id="umgsuuq" class="tag">></span><span>2.0.9</span><span id="ooqackk" class="tag"></</span><span id="cysmiio" class="tag-name">version</span><span id="ysegiqo" class="tag">></span><span>  </span></span> <li id="cieoyww" class="alt"><span><span id="sammsyw" class="tag"></</span><span id="wsqkeea" class="tag-name">dependency</span><span id="yoiewui" class="tag">></span><span>  </span></span> </li> </ol> </div> <br /> 另外Q我惛_Eclipse里用jetty来启动项目ƈq行试Q所以在POM.xml中再加入jetty、jetty-util、servlet-api{的依赖Q详情见附g?br /> 我希望用Eclipse来作个项目的IDEQ所以,我在命o行状态下Q进入这个项目所在的目录Q运行:<br />                 mvn eclipse:eclipse<br /> 然后使用Eclipse导入q个目。如果你是第一ơ用Eclipse导入用Maven生成的项目,那你需要在Eclipse里配|一个名叫M2_REPO的VariableQ指向你的Maven 2的repository目录。缺省情况下Q它应该位于${user.home}/.m2/repository?br /> OKQ现在我们已l可以在Eclipse中进行工作了?br /> 修改src/main/webapp/WEB-INF/web.xmlQ加入struts2的FilterDispatcherq设|filter-mapping。在q个CZ中我url-pattern设ؓ"/app/*"Q也是_url的匹配是Z路径来做的。这只是我的个h喜好而已Q你也可以将它设?*"?br /> 既然是在讲struts2的零配置Q当然是可以不要M配置文g的。但是ؓ了更好地q行“配置”Q我q是建立了struts.xml文gQ在src/main/resources目录下)。我不喜Ƣurl最后都有个action后缀Q现在,我在struts.xml中配|struts.action.extensionQ将q个后缀LQ?br /> <div id="msogmka" class="code_title">xml 代码</div> <div id="ggcgkaq" class="dp-highlighter"> <div id="wcwqsaa" class="bar"> </div> <ol class="dp-xml"> <li id="ukmoaiq" class="alt"><span><span id="aawgsag" class="tag"><</span><span id="oewyksi" class="tag-name">struts</span><span id="ywaswmy" class="tag">></span><span>  </span></span> <li id="saeaska" class=""><span>    <span id="sqkuwmu" class="tag"><</span><span id="gwaceuu" class="tag-name">constant</span><span> </span><span id="iieqaqg" class="attribute">name</span><span>=</span><span id="qoiuwmg" class="attribute-value">"struts.action.extension"</span><span> </span><span id="agsmyye" class="attribute">value</span><span>=</span><span id="kuyicii" class="attribute-value">""</span><span> </span><span id="iaumoee" class="tag">/></span><span>  </span></span> <li id="usoqmsi" class="alt"><span><span id="iiugaom" class="tag"></</span><span id="aisugew" class="tag-name">struts</span><span id="ioskooe" class="tag">></span><span>  </span></span> </li> </ol> </div> <br /> 然后我在src/test/java下徏立demo/RunJetty.java文gQmainҎ如下Q?br /> <div id="kuysuca" class="code_title">java 代码</div> <div id="gwiaukk" class="dp-highlighter"> <div id="gwyiwka" class="bar"> </div> <ol class="dp-j"> <li id="sceiuci" class="alt"><span><span id="ukeqkyq" class="keyword">public</span><span> </span><span id="gysuyog" class="keyword">static</span><span> </span><span id="iamgaiy" class="keyword">void</span><span> main(String[] args) </span><span id="iiswyem" class="keyword">throws</span><span> Exception {  </span></span> <li id="ywqaguc" class=""><span>    Server server = <span id="augamsy" class="keyword">new</span><span> Server(</span><span id="esmosgg" class="number">8080</span><span>); </span><span id="ukmoioo" class="comment">//也可以改成其它端?/span><span>  </span></span> <li id="cuqimkq" class="alt"><span>    File rootDir = <span id="sycmwwe" class="keyword">new</span><span> File(RunJetty.</span><span id="sacmiog" class="keyword">class</span><span>.getResource(</span><span id="kkosmks" class="string">"/"</span><span>).getPath()).getParentFile().getParentFile();  </span></span> <li id="wmogsai" class=""><span>    String webAppPath = <span id="ooyswey" class="keyword">new</span><span> File(rootDir, </span><span id="gyswygc" class="string">"src/main/webapp"</span><span>).getPath();  </span></span> <li id="iikmyem" class="alt"><span>    <span id="wmicwek" class="keyword">new</span><span> WebAppContext(server, webAppPath, </span><span id="ueykock" class="string">"/"</span><span>);  </span></span> <li id="cakeyoo" class=""><span>    server.start();  </span> <li id="eugaess" class="alt"><span>}  </span> </li> </ol> </div> <br /> 现在Q在Eclipse里运行或调试q个RunJetty.javaQ用览器打开http://localhost:8080/看看吧。如果不出问题,应该可以讉K到webapp目录下的index.html了。有了JettyQ你q在用MyEclipse或其它插件么Q?br /> <br /> <h2>二、零配置</h2> 首先要澄清一点,q里说的雉|ƈ不是一炚w|都没有Q只是说配置很少而已?br /> Struts2Q我只用qStruts 2.0.6?.0.9Q不清楚其它版本是否支持雉|)引入了零配置的新Ҏ,元数据可以通过规则和注解来表达QA "Zero Configuration" Struts application or plugin uses no additional XML or properties files. Metadata is expressed through convention and annotation.<br /> 目前Q这个新Ҏ还在测试阶D,但经q一D|间的使用Q我觉得q个Ҏ已l可用。下面我讲一下如何用它?br /> 1. Actions的定?br /> 以前需要在xml配置文g中配|Action的name和classQ如果用零配置Q所带来的一个问题就是如何定位这些Action。我们需要在web.xml中找到struts2的filter的配|,增加一个名为actionPackages的init-paramQ它的值是一个以逗号分隔的Java包名列表Q比如:demo.actions1,demo.actions2。struts2会扫描q些包(包括q些包下边的子包Q,在这些包下,所有实CAction接口的或者是cd?#8220;Action”l尾的类都会被检查到Qƈ被当做Action?br /> 以前Q我们写Action必须要实现Action接口或者承ActionSupport。但是,上面提到的类名以"Action"l尾的类q不需要这样做Q它可以是一个POJOQStruts2支持POJO ActionQ?br /> 下面是actionPackages的配|示例:<br /> <div id="mumkemk" class="code_title">xml 代码</div> <div id="aauoygo" class="dp-highlighter"> <div id="wsmoksg" class="bar"> </div> <ol class="dp-xml"> <li id="cmykoms" class="alt"><span><span id="mmgaciq" class="tag"><</span><span id="geisywk" class="tag-name">filter</span><span id="uuykwes" class="tag">></span><span>  </span></span> <li id="weoscaa" class=""><span>  <span id="ckwqssy" class="tag"><</span><span id="mcgswki" class="tag-name">filter-name</span><span id="kakoiwo" class="tag">></span><span>struts2</span><span id="igqkyeu" class="tag"></</span><span id="ueakeec" class="tag-name">filter-name</span><span id="iqkmyew" class="tag">></span><span>  </span></span> <li id="agqcgws" class="alt"><span>  <span id="qqkuyks" class="tag"><</span><span id="sosuqwe" class="tag-name">filter-class</span><span id="wuqqouk" class="tag">></span><span>org.apache.struts2.dispatcher.FilterDispatcher</span><span id="weyceca" class="tag"></</span><span id="wcoauss" class="tag-name">filter-class</span><span id="esugciq" class="tag">></span><span>  </span></span> <li id="yymgamc" class=""><span>  <span id="kyaeqem" class="tag"><</span><span id="useekqw" class="tag-name">init-param</span><span id="csoiuci" class="tag">></span><span>  </span></span> <li id="qgkkomk" class="alt"><span>    <span id="weqkeuc" class="tag"><</span><span id="kceqssg" class="tag-name">param-name</span><span id="omyqusa" class="tag">></span><span>actionPackages</span><span id="ymgcwwk" class="tag"></</span><span id="yqumgou" class="tag-name">param-name</span><span id="wuyiuia" class="tag">></span><span>  </span></span> <li id="geykges" class=""><span>    <span id="iymgyom" class="tag"><</span><span id="momyayq" class="tag-name">param-value</span><span id="oueymka" class="tag">></span><span>demo.actions1,demo.actions2</span><span id="skyamkk" class="tag"></</span><span id="uueqsqo" class="tag-name">param-value</span><span id="qgacymc" class="tag">></span><span>  </span></span> <li id="iswiuay" class="alt"><span>  <span id="emyamkc" class="tag"></</span><span id="wmisouc" class="tag-name">init-param</span><span id="ucikmsq" class="tag">></span><span>  </span></span> <li id="mkmyksa" class=""><span><span id="ekmysiw" class="tag"></</span><span id="cuikwka" class="tag-name">filter</span><span id="eceykig" class="tag">></span><span>  </span></span> </li> </ol> </div> <br /> 2. CZ<br /> 现在我们建立demo.actions1.app.person和demo.actions2.app.group两个包,在demo.actions1.app.person包下建立ListPeopleAction.javaQ在demo.actions2.app.group下徏立ListGroupAction.java。作为示例,q两个类只是包含一个executeҎQ返?success"?error"Q其它什么都不做Q?br /> <div id="iqimoem" class="code_title">java 代码</div> <div id="oocgqqe" class="dp-highlighter"> <div id="msmosyg" class="bar"> </div> <ol class="dp-j"> <li id="iyikqew" class="alt"><span><span id="qyuwqow" class="keyword">public</span><span> String execute() {  </span></span> <li id="ioimouk" class=""><span>    <span id="gegcwek" class="keyword">return</span><span> </span><span id="iqwokio" class="string">"success"</span><span>;  </span></span> <li id="kscgays" class="alt"><span>}  </span> </li> </ol> </div> <br /> 在Filter的配|中Q我指定actionPackages为demo.actions1,demo.actions2Q当pȝ启动ӞStruts2׃在这两个包下扫描到demo.actions1.app.person.ListPeopleAction和demo.actions2.app.group.ListGroupAction?br /> <br /> 3. Action and Package name<br /> Struts2扫描到Action后,从actionPackages指定的包开始,子包名会成ؓq个Action的namespaceQ而Action的name则由q个Action的类名决定。将cd首字母小写,如果cd以Actionl尾Q则L"Action"后缀QŞ成的名字是q个Action的名字。在如上所q的CZ中,actionPackages指定为demo.actions1,demo.actions2Q那么你可以q样讉Kdemo.actions1.app.person.ListPeopleActionQ?br />                 http://localhost:8080/app/person/listPeople<br /> <br /> 4. Results<br /> Struts2是通过"Result"?Results"两个cȝ别的annotations来指定Results的?br /> 作ؓCZQ我们在webapp目录下徏两个html文gQsuccess.html和error.htmlQ随便写点什么内定w可以。现在假设我们访?app/person/listPeopleӞ或Actionq回successp{到success.html面Q若是errorp{到error.html面Q这只需要在ListPeopleActioncM加上一D|解就可以了:<br /> <div id="igikqem" class="code_title">java 代码</div> <div id="wwiaemk" class="dp-highlighter"> <div id="geokkka" class="bar"> </div> <ol class="dp-j"> <li id="caueqym" class="alt"><span><span id="meykwck" class="annotation">@Results</span><span>({  </span></span> <li id="siugqwe" class=""><span>    <span id="qwicymk" class="annotation">@Result</span><span>(name=</span><span id="ueysyec" class="string">"success"</span><span>, type=NullResult.</span><span id="mcoikqy" class="keyword">class</span><span>, value = </span><span id="yuyiwki" class="string">"/success.html"</span><span>, params = {}),  </span></span> <li id="ikuysgo" class="alt"><span>    <span id="kiawowm" class="annotation">@Result</span><span>(name=</span><span id="aqkuqgy" class="string">"error"</span><span>, type=NullResult.</span><span id="owswqwu" class="keyword">class</span><span>, value = </span><span id="siueoeu" class="string">"/error.html"</span><span>, params = {})  </span></span> <li id="ckmyayy" class=""><span>})  </span> <li id="mwqcoua" class="alt"><span><span id="aqkcyme" class="keyword">public</span><span> </span><span id="iyamyow" class="keyword">class</span><span> ListPeopleAction {  </span></span> <li id="ogsuwwk" class=""><span>    <span id="euwisia" class="keyword">public</span><span> String execute() {  </span></span> <li id="ciumkiy" class="alt"><span>        <span id="gycoaoo" class="keyword">return</span><span> </span><span id="kacwqws" class="string">"success"</span><span>;  </span></span> <li id="aqaeigc" class=""><span>    }  </span> <li id="scyqeka" class="alt"><span>}  </span> </li> </ol> </div> <br /> 同上Q我们给ListGroupAction也加上注解?br /> 现在Q我们已l完成了一个零配置的示例。我们ƈ没有在xml文g里配|ListPeopleAction和ListGroupActionQ但它们已经可以工作了!<br /> 用Eclipseq行RunJettyQ然后用览器访问http://localhost:8080/app/person/listPeople和http://localhost:8080/app/group/listGroup看看Q是不是正是success.htmlQ或error.htmlQ的内容Q?br /> <br /> 5. Namespaces<br /> 如上所qͼnamespace由包名所形成Q但我们可以使用"Namespace"注解来自己指定namespace?br /> <br /> 6. Parent Package<br /> q个配置用得较少。Struts2提供一?ParentPackage"注解来标识Action应该是属于哪个package?br /> <br /> <h2>三、用COC</h2> 如上所qͼStruts2用注解来实现雉|。然而,q不是我喜欢的方式。在我看来,q不q是配|从XML格式换成了注解方式,q不是真的零配置。而且Q这U方式也未必比XML形式的配|更好。另外,对元数据的修改必然会D目的重新编译和部v。还有,现在的Struts2版本g对Result注解中的params的处理有些问题?br /> 其实QStruts2的actionPackages配置已经使用了COCQ那Z么不能ؓResults也实现COCQ从而去除这些每个Action都要写的注解Q?br /> 在严谨的目中,package、action的名U和面的\径、名UC定存在着某种关系。比如,面的\径可能和package是对应的Q页面的名称可能和action的名U是对应的,或是Ҏ某种法则q算得到。我们知道webwork2和struts2有个配置叫global-results。我们ؓ什么不能根据这些对应规则写个ResultQ将它配到global-results中,从而真正免去result的配|?<br /> 事实上,我推荐Struts2的用者只用Struts2输出XML或JSONQ放弃UIQ页面这层还是用标准的HTML、CSS和一些JSlg来展现。许多h反映Struts2慢,实QStruts2是慢Q很慢!慢在哪儿Q很大一部分因素是UIq层引v的,特别是用了q多的Struts2的tagQƈ使用了ajax theme。但是,如果我们攑ּ了Struts2的笨拙的UIQResult只输出XML或JSONQUI则用标准的HTML+CSSQ用JSlgQDOJO、Adobe Spry Framework、YUI-Ext{)来操作Struts2的输出数据,情况会如何Q我们会得到一个高性能、高可配的、UI和应用服务器的职责分割更为明、合理的、更易于静态化部v的开发组合?br /> q似乎是阉割了Struts2Q但是这样阉割过的Struts2摆脱了性能低下的包袱,更轻、更C化?br /> 有些扯远了,a归正传,不管是让Struts2输出XML或JSONQ还是输出页面,我们都有办法Ҏ目的规则写一个ResultQ将它配到global-results中,从而大大减Result的配|?br /> 假设我们让Struts2只输出JSONQ有个jsonplugin可以做这件事。用JsonResultӞ不再需要知道页面的位置、名U等信息Q它仅仅是数据输出,那么我们可以将q个Result配成全局的,大部分Action不再需要Result的配|?br /> 作ؓCZQ我假设我的例子中输出的两个html面Qsuccess.html和error.htmlQ是JSONQ我们看看怎么免去我例子中的两个Action的Result注解?br /> 首先Q我们删去ListPeopleAction和ListGroupAction两个Action的注解,q修改struts.xml文gQ加入:<br /> <div id="kismywi" class="code_title">xml 代码</div> <div id="emoauck" class="dp-highlighter"> <div id="gwiegwc" class="bar"> </div> <ol class="dp-xml"> <li id="ccmoigg" class="alt"><span><span id="gwacwmc" class="tag"><</span><span id="eyamgyq" class="tag-name">package</span><span> </span><span id="ywacmuk" class="attribute">name</span><span>=</span><span id="mcogkks" class="attribute-value">"demo-default"</span><span> </span><span id="ggseiym" class="attribute">extends</span><span>=</span><span id="iismyew" class="attribute-value">"struts-default"</span><span id="qgycyoe" class="tag">></span><span>  </span></span> <li id="gsyicsq" class=""><span><span id="aqamoec" class="tag"><</span><span id="uuwosam" class="tag-name">global-results</span><span id="yyceiqo" class="tag">></span><span>  </span></span> <li id="ieqaucs" class="alt"><span><span id="qgqsymc" class="tag"><</span><span id="ewaumes" class="tag-name">result</span><span> </span><span id="gewicai" class="attribute">name</span><span>=</span><span id="moikeek" class="attribute-value">"success"</span><span id="yqwoaig" class="tag">></span><span>/success.html</span><span id="uueosqo" class="tag"></</span><span id="ckeyuso" class="tag-name">result</span><span id="mmqsoek" class="tag">></span><span>  </span></span> <li id="iqiuomu" class=""><span><span id="uiugaqw" class="tag"></</span><span id="ocgawkk" class="tag-name">global-results</span><span id="uiuomom" class="tag">></span><span>  </span></span> <li id="mkoiukk" class="alt"><span><span id="wwcwgew" class="tag"></</span><span id="okwisqq" class="tag-name">package</span><span id="kquoayo" class="tag">></span><span>  </span></span> </li> </ol> </div> <br /> <font color="#ff0000">误住这只是一个示例,Z方便Q我没在目中加入jsonplugin来作真实的演C,我只是假设这个success是json输出Q读者可以自行用jsonplugin来作实验?/font><br /> <br /> 现在Q离成功不远了,但是目仍然不能正常q行。我们的Actionq回successQ但q不会匹配到global-results中配|。ؓ什么呢Q因为,我们q里是把global-results配置?demo-default"q个package下的Q而Struts2ҎactionPackages扑ֈ的Action不会匚w到这个package上。解军_法也很简单,q记得上面讲到的Parent Package吧?lAction加个注解Q指定ParentPackage?demo-default"。但q样可不是我喜欢的,其实有更好的办法Q我们在struts.xml中加个constant好了:<br /> <div id="ygceaqe" class="code_title">xml 代码</div> <div id="gwysmuc" class="dp-highlighter"> <div id="mkugssy" class="bar"> </div> <ol class="dp-xml"> <li id="owicwou" class="alt"><span><span id="yyskoum" class="tag"><</span><span id="cysuqwe" class="tag-name">constant</span><span> </span><span id="skokmks" class="attribute">name</span><span>=</span><span id="cimeigw" class="attribute-value">"struts.configuration.classpath.defaultParentPackage"</span><span> </span><span id="agkmqwe" class="attribute">value</span><span>=</span><span id="sceiciq" class="attribute-value">"demo-default"</span><span> </span><span id="mkmqayy" class="tag">/></span><span>  </span></span> </li> </ol> </div> <br /> 现在Q大功告成!q行RunJetty来测试下吧!你可以访?app/person/listPeopleQ可以访?app/group/listGroupQ而所有的配置仅仅是web.xml和struts.xml中的几行Q我们的Java代码中也没有加注解。如果再加上几百个Action呢?配置仍然p几行?br /> 可是Q某些Action实需要配|怎么办?对这些ActionQ你可以加注解,也可以针对这些Action来写些XML配置。一个项目中Q大部分Action的配|是可以遵从一定规则的Q可以用规则来化配|,只有部分需要配|,q就是COC?br /> <br /> </div> <img src ="http://www.tkk7.com/fuhoujun/aggbug/232312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/fuhoujun/" target="_blank">Loy Fu</a> 2008-10-04 14:08 <a href="http://www.tkk7.com/fuhoujun/archive/2008/10/04/232312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://w6626.com" target="_blank">ѹۿƵվ</a>| <a href="http://zhuanjiao521.com" target="_blank">ۺa</a>| <a href="http://yuanzhouxh.com" target="_blank">þaaëƬѲŰ</a>| <a href="http://3333kkkk.com" target="_blank">һëƬƵѹۿ</a>| <a href="http://7788xxx.com" target="_blank">һȫٸɫƬ </a>| <a href="http://www-091w.com" target="_blank">ëƬһAPP</a>| <a href="http://xvwenyue.com" target="_blank">AVAVպAVվ</a>| <a href="http://888xxss.com" target="_blank">aƵ߹ۿ</a>| <a href="http://lzqzvip.com" target="_blank">Ƶ߿</a>| <a href="http://hzsprfm.com" target="_blank">һӰȷɫԴ</a>| <a href="http://0917xzb.com" target="_blank">޳xxxxxӰ</a>| <a href="http://831055.com" target="_blank">ɫóվ߹ۿ</a>| <a href="http://wwwhaole10.com" target="_blank">޹ҹ߲</a>| <a href="http://www55xx.com" target="_blank">ҹ³˿ƬAV</a>| <a href="http://0149545.com" target="_blank">ƷѸ</a>| <a href="http://800141.com" target="_blank">18վ</a>| <a href="http://53reniao.com" target="_blank">Ļ</a>| <a href="http://www-777730.com" target="_blank">88avѹۿ</a>| <a href="http://yw835.com" target="_blank">ѸƵ</a>| <a href="http://jinguwj.com" target="_blank">Ļ1515hhþ</a>| <a href="http://chch12.com" target="_blank">˼˼reѾƷƵ66</a>| <a href="http://blcvs.com" target="_blank">ѿٶ޵վ</a>| <a href="http://by23336.com" target="_blank">Ұ</a>| <a href="http://ww11axax.com" target="_blank">žžžƷƵ</a>| <a href="http://txtmp3.com" target="_blank">߹ۿѸƵ</a>| <a href="http://maopiandao163.com" target="_blank">һѹۿwwwƵ</a>| <a href="http://www132126.com" target="_blank">jizzjizz߲</a>| <a href="http://shaiyahx.com" target="_blank">ɫվַ</a>| <a href="http://3344by.com" target="_blank">aѹۿ</a>| <a href="http://alodaba.com" target="_blank">100018ѷ˸</a>| <a href="http://zjj100.com" target="_blank">Ļ߹ۿձ </a>| <a href="http://www045888.com" target="_blank">ëƬƵ߹ۿ</a>| <a href="http://ax445.com" target="_blank">ëƬѹۿƵ</a>| <a href="http://aa7852.com" target="_blank">aëƬƵۿ</a>| <a href="http://alankell.com" target="_blank">պѲ</a>| <a href="http://3x79.com" target="_blank">?v˿߹ۿ</a>| <a href="http://dfcnpc.com" target="_blank">޳ƬۿĻ</a>| <a href="http://laosanqq.com" target="_blank">޹Ʒ۲ӰԺ߹ۿ </a>| <a href="http://linanhotel.com" target="_blank">һƵ</a>| <a href="http://6711wan.com" target="_blank">߹ۿƵ</a>| <a href="http://600c28.com" target="_blank">ŮˬˬˬˬˬƵ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>