﻿<?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-像一颗晨土</title><link>http://www.blogjava.net/aichan/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 04:32:22 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 04:32:22 GMT</pubDate><ttl>60</ttl><item><title>google chart in house</title><link>http://www.blogjava.net/aichan/archive/2008/01/16/175804.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Wed, 16 Jan 2008 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2008/01/16/175804.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/175804.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2008/01/16/175804.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/175804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/175804.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 著名的Java图表软件jfreechart的作者模仿Google chart api的风格（样式和URL）开发出了一套Servlet－－EastWood。让Google chart可以脱离Google和在线服务了。该项目的图表效果和Google chart api的效果相差无几，鉴于Google chart api是第三方在线服务而存在一些风险和不便，在实际开发当中您可以选择使用“伊士活”来作为Google chart的代替品，来一个google chart in house。&nbsp;&nbsp;<a href='http://www.blogjava.net/aichan/archive/2008/01/16/175804.html'>阅读全文</a><img src ="http://www.blogjava.net/aichan/aggbug/175804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2008-01-16 23:47 <a href="http://www.blogjava.net/aichan/archive/2008/01/16/175804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍ExtremeTable的下一代Jmesa</title><link>http://www.blogjava.net/aichan/archive/2007/08/01/133692.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Tue, 31 Jul 2007 17:31:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2007/08/01/133692.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/133692.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2007/08/01/133692.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/133692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/133692.html</trackback:ping><description><![CDATA[说到<a href="http://www.extremecomponents.org/extremesite/index.jsp">ExtremeTable</a>(以下简称ET,呃,,,ET.....),可以说不知道的人甚少.不过估计用的也未必多罢了.今天,给大家介绍一个由ET的作者重新实现的一套关于Table的API.<a href="http://code.google.com/p/jmesa/">JMesa</a>.<br>
我是一个偶然的机会知道Jmesa,我在做一个数据展现系统的时候想寻找ET的帮忙,但发现ET己不再更新,作者把精力转移到了新的项目中,也就是这个
JMesa.这个项目的目的是为开发者提供更有效的表格展现的API,而不是简单的TagLib.无论从灵活性,易扩展性,易用性,均比ET上了一个层
次.最近Release的版本里面,并不包括TagLib.而在下一个版本(2.1.0)将会加入TagLib,目前TagLib己经可用,在SVN里已
有.只是等待下一个版本的发布,其间会有一些更新,不过会兼容目前的TagLib的.<br>
假如我从API开始介绍JMesa,恐怕并不是个好的办法,像我以前的文章里面有介绍,结果反响不大.这次决定从TagLib入手,来给大家介绍一下Jmesa.<br>
大家可以从附件里拿到一个Demo.注意Demo依赖JMesa以及其他Lib.在Lib文件夹下有详细说明.<br>
现在来看看JMesa的使用:
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt">&lt;jm:table&nbsp;id="product"&nbsp;items="products"&nbsp;caption="product&nbsp;listing"&gt;&nbsp;&nbsp;</li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&lt;jm:column&nbsp;property="name"&nbsp;sortable="true"&nbsp;filterable="true"/&gt;&nbsp;&nbsp;</li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&lt;jm:column&nbsp;property="price"&nbsp;/&gt;&nbsp;&nbsp;</li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&lt;jm:column&nbsp;property="createdTime"&nbsp;/&gt;&nbsp;&nbsp;</li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&lt;jm:column&nbsp;property="id"&nbsp;title="edit"&gt;&nbsp;&nbsp;</li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="viewProduct.action?id="&lt;jm:property/&gt;"&gt;&lt;jm:property&nbsp;name="name"/&gt;&lt;/a&gt;&nbsp;&nbsp;</li>
    <li class="alt">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/jm:column&gt;&nbsp;&nbsp;</li>
    <li class="">&lt;/jm:table&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<br>
估计比较容易看得懂的代码吧.<br>
Jmesa
的检签规范当中只有三个Tag:Table,Row,Column.而当前的TagLib实现中只实现了Table和Column两个(Row是可选
的).另加一个Property的Tag.此阶段,Property的Tag是很有用的,其起到的作用与Webwork的PropertyTag相差无
几, 用来获得对象的某个属性.之所以使用Property
Tag是因为当前的TagLib有个限制就是暂时不支持如JSTL的${}这种写法.将来会支持,届时Property
Tag也会继续获得兼容.Jeff比较倾向于使用迭代的方式实现Tag,那样可以支持${}这样的写法.不过作为TagLib的开始,问题不大.有时间再
重构一下TagLib,支持JSTL的写法.<br>
好了,来说一说这些Tag的使用方法:<br>
<strong> Table:</strong> <br>
<table>
    <tbody>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""><strong> Attribute</strong>  </td>
            <td 170,="" 170);="" padding:="" 5px;=""> <strong> Description</strong>  </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> id </td>
            <td 170,="" 170);="" padding:="" 5px;="">表格的ID(必须) </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> items </td>
            <td 170,="" 170);="" padding:="" 5px;=""> 对象或者Map的集合 (必须)</td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> caption </td>
            <td 170,="" 170);="" padding:="" 5px;=""> 表格的标题 <br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> theme </td>
            <td 170,="" 170);="" padding:="" 5px;="">  表格的主题,自定义样式<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> exportTypes </td>
            <td 170,="" 170);="" padding:="" 5px;="">使用逗号分割导出的类型,目前支持导出类型有CSV,Excel <br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> width </td>
            <td 170,="" 170);="" padding:="" 5px;="">  表格宽度<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> style </td>
            <td 170,="" 170);="" padding:="" 5px;="">  即表格的Style属性<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> styleClass </td>
            <td 170,="" 170);="" padding:="" 5px;="">  使用的Css的Class名字<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> border </td>
            <td 170,="" 170);="" padding:="" 5px;="">  表格宽<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> cellpadding </td>
            <td 170,="" 170);="" padding:="" 5px;="">  表格属性<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> cellspacing </td>
            <td 170,="" 170);="" padding:="" 5px;="">  表格属性<br>
            </td>
        </tr>
    </tbody>
</table>
实际上,真正Release的版本里面将会加上var以及Limit属性.<br>
var属性值即在Column标签里可以获得的对象变量.<br>
Limit属性是保存在当前请求的Limit的对象名.<br>
<strong> Row:</strong> <br>
<table>
    <tbody>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""><strong> Attribute</strong>  </td>
            <td 170,="" 170);="" padding:="" 5px;=""> <strong> Description</strong>  </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> highlighter </td>
            <td 170,="" 170);="" padding:="" 5px;="">  是否高亮显示<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> onclick </td>
            <td 170,="" 170);="" padding:="" 5px;="">  点击事件<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> onmouseout </td>
            <td 170,="" 170);="" padding:="" 5px;="">  鼠标移出事件<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> onmouseover </td>
            <td 170,="" 170);="" padding:="" 5px;="">  鼠标移入事件<br>
            </td>
        </tr>
    </tbody>
</table>
该Tag是可选的.实际上Jmesa提供了一系列默认的事件响应,有必要的情况下才使用.<br>
<strong> Column:</strong> <br>
<table>
    <tbody>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""><strong> Attribute</strong>  </td>
            <td 170,="" 170);="" padding:="" 5px;=""> <strong> Description</strong>  </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> property </td>
            <td 170,="" 170);="" padding:="" 5px;="">Java对象或Map的属性名 </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> title </td>
            <td 170,="" 170);="" padding:="" 5px;=""> 列的名称 <br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> filterable </td>
            <td 170,="" 170);="" padding:="" 5px;="">  是否可按过滤条件查找<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> sortable </td>
            <td 170,="" 170);="" padding:="" 5px;="">  是否要排序<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> width </td>
            <td 170,="" 170);="" padding:="" 5px;="">  列宽<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> style </td>
            <td 170,="" 170);="" padding:="" 5px;="">  Style属性<br>
            </td>
        </tr>
        <tr>
            <td 170,="" 170);="" padding:="" 5px;=""> styleClass </td>
            <td 170,="" 170);="" padding:="" 5px;="">  使用的Css的Class的名字<br>
            </td>
        </tr>
    </tbody>
</table>
ColumnTag的使用方法有下面几种:
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt">&lt;jm:column&nbsp;property="name"/&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<br>
将仅仅输出对象中Name属性值.列名是Name
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt">&lt;jm:column&nbsp;property="name"&nbsp;title="名字"&nbsp;sortable="true"&nbsp;filterable="false"/&gt;&nbsp;&nbsp;</li>
</ol>
</div>
<br>
这样可以得到自定义的列名,可以让列可查找,可排序,当然你Server端需要相应提供排序及查找功能.不过就算你不提供,客户端也会把当前结果排序和查找的.
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt">&lt;jm:column&nbsp;property="id"&nbsp;title="edit"&gt;&nbsp;&nbsp;&nbsp;</li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="viewProduct.action?id="&lt;jm:property/&gt;"&gt;&lt;jm:property&nbsp;name="name"/&gt;&lt;/a&gt;&nbsp;&nbsp;&nbsp;</li>
    <li class="alt">&lt;/jm:column&gt;&nbsp;&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
<br>
这里结合了PropertyTag.实现自定义列显示.可以灵活定制自己的单元格.<br>
在ColumnTag里面,使用PropertyTag的时候,可以指定Name属性,如果不指定则使用当前Column的Property属性值.<br>
以后将支持:<br>
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt">&lt;jm:column&nbsp;property="id"&nbsp;title="edit"&gt;&nbsp;&nbsp;&nbsp;</li>
    <li class="">&nbsp;&nbsp;&nbsp;&nbsp;&lt;a&nbsp;href="viewProduct.action?id=${id}"&gt;${name}&lt;/a&gt;&nbsp;&nbsp;&nbsp;</li>
    <li class="alt">&lt;/jm:column&gt;&nbsp;&nbsp;&nbsp;&nbsp;</li>
</ol>
</div>
这样的写法.当然会继续兼容PropertyTag,尽管不是Tag规范里的东西.<br>
<br>
相信经过上面的一番介绍,大家对Jmesa有一定的感性认识了吧.还没有?下载Demo,扔进Tomcat 的App里跑一下就明白了.<br>
有什么建议,请一定要告诉我 :).<br><br>附件在:http://www.javaeye.com/topics/download/4eaaa38d-e838-459d-aef2-3be6c4d043df
<br>
<strong>
</strong>
<br><img src ="http://www.blogjava.net/aichan/aggbug/133692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2007-08-01 01:31 <a href="http://www.blogjava.net/aichan/archive/2007/08/01/133692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pager-taglib 体验</title><link>http://www.blogjava.net/aichan/archive/2006/06/27/55248.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Mon, 26 Jun 2006 18:22:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2006/06/27/55248.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/55248.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2006/06/27/55248.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/55248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/55248.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 可能是自已习惯了用自已的分页组件。一直不知道有这样一个现成的分页标签。直到那天，白衣跟我提起了一下，我Search了一下，发现了Pager-taglib这个东东。支持多种风格的分页显示。       先简单介绍一下Pager-taglib。实际上，她是一个Jsp标签库，为在JSP上显示分页信息而设计的一套标签，通过这些标签的不同的组合，会形成多种不一样的分页页面，风格各异，她自带的DEMO就有七种...&nbsp;&nbsp;<a href='http://www.blogjava.net/aichan/archive/2006/06/27/55248.html'>阅读全文</a><img src ="http://www.blogjava.net/aichan/aggbug/55248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2006-06-27 02:22 <a href="http://www.blogjava.net/aichan/archive/2006/06/27/55248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP 在DWR安全上的应用</title><link>http://www.blogjava.net/aichan/archive/2006/05/24/47735.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Tue, 23 May 2006 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2006/05/24/47735.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/47735.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2006/05/24/47735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/47735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/47735.html</trackback:ping><description><![CDATA[<font size="1"><font size="2">在<a href="http://www.blogjava.net/aichan/archive/2006/05/10/45321.html">上一篇文章</a>里提到了可以让 DWR自动往Service里面注入一个与Servlet相关的对象，作为参数。只是这样，要每个Service都加上这样的一个参数，奇丑无比！想了 想，决定就让DWR污染一下，Service保留原样。只是增加一个MethodBeforeAdvice（正是它让DWR的API污染了一下。），来对 Service的方法进行拦截，可以在Service的调用之前对操作进行所谓的身份验证，授权之类的操作。完整的拦截模块几个类文件加个Spring配 置文件搞定。</font></font>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;  实现拦截功能的类有：</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp; 一、MainInteceptor，主拦截器，所以DWR的远程调用都会被拦截，当然， 调用是细到方法级的，可配置的，该类实现了Spring AOP的MethodBeforeAdvice接口，该类有一个集合成员变量，成员为IInteceptor。</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp; 二、IInteceptor，是一个接口，仅有一个execute(AopContext context)函数。该接口是拦截器（与前面的主拦截器不同，本接口定义的拦截器是可以由用户去实现，并且可以有多个）。实现接口只需要实现方法。这些 拦截器会被主拦截器回调。 比如要实现一个身份验证的拦截，SecuityInteceptor，在配置文件中把这个拦截器设置为主拦截器的属性即可获得回调。</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 三、AopContext，Aop上下文。在主拦截器调用IInteceptor的对象时，把这个上下文对象作为参数来调用子拦截器。从该上下文可获得一系列信息，如HttpSession，HttpRequest等。甚至你可以自已设置属性。&nbsp;</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp;  &nbsp; 下面看一些代码片断:<br /><strong> MainInteceptor:</strong></font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;private List&lt;IInterceptor&gt; interceptors;//定义一系列的子拦截器</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">public void setInterceptors(List&lt;IInterceptor&gt; interceptors) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;this.interceptors = interceptors;<br />&nbsp;&nbsp;&nbsp; }</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">在before(Method method, Object[] params, Object target)方法里：</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebContext ctx = WebContextFactory.get();//唯一被DWR污染的地方<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;HttpSession session = ctx.getSession();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;AopContext context = new AopContext(); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; context.setSession(session);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;for(Iterator it = interceptors.iterator(); it.hasNext();){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;IInterceptor interceptor = (IInterceptor) it.next();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;interceptor.execute(context);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} <br /></font></font></p>
<p style="text-align: left;"><strong><font size="1"><font size="2">&nbsp;</font></font><font size="1"><font size="2">IInterceptor：</font></font></strong></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;public interface IInterceptor {<br />&nbsp;&nbsp;&nbsp; public void execute(AopContext context);<br />}</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">AopContext就不必贴出来了， 随自已定义些什么属性，不过就内置了一个Map，用来保存数据罢了。</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">下面来看看配置文件：</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&lt;beans&gt;</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp; &lt;!--将要暴露给DWR的Service--&gt;<br />&nbsp;&nbsp; &nbsp; &lt;bean id=&quot;bookManager&quot; class=&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;proxyInterfaces&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;net.jf.ajax.business.BookManager&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;target&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;bookManagerImpl&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptorNames&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;dwrAdvisor&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp; &lt;/bean&gt;<br /><br />&nbsp; &lt;bean id=&quot;bookManagerImpl&quot; class=&quot;net.jf.ajax.business.impl.BookManagerImpl&quot;/&gt;<br />&lt;!--装配器？如果看不懂，先看看Spring的Aop吧 ：P--&gt;<br />&nbsp; &lt;bean id=&quot;dwrAdvisor&quot; class=&quot;org.springframework.aop.support.RegexpMethodPointcutAdvisor&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;advice&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;dwrInterceptor&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;patterns&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;list&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;value&gt;.*.*&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp; &lt;/bean&gt;</font></font></p>
<font size="2"><br /></font>
<p style="text-align: left;"><font size="1"><font size="2">&lt;!--主拦截器，给它设置子拦截器--&gt;<br />&nbsp; &lt;bean id=&quot;dwrInterceptor&quot; class=&quot;net.jf.ajax.iterceptor.MainInterceptor&quot;&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name=&quot;interceptors&quot;&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;list&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;test&quot;/&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp; &lt;/bean&gt;<br />&nbsp; &lt;!--其中一个子拦截器的实现--&gt;<br />&nbsp; &lt;bean id=&quot;test&quot; class=&quot;net.jf.ajax.iterceptor.TestInterceptor&quot;/&gt;<br />&lt;/beans&gt;</font></font><br /></p>
<p><font size="2">就 这样，在配置DWR的配置文件时，配置&lt;creator&gt;时使用Spring的Creator就可以直接使用上面的Service了。当 DWR远程请求时，在配置范围内的方法的调用都会被主拦截器拦截，并且遍历、执行所有子拦截器。原有的Service不需要改动，只需要多加一个 Spring的配置文件，将原有的Service再加一层Aop的轻纱。</font></p>
<p><font size="2">这是一种实现方法。如果有别的方法让DWR更安全、有效，请一定告知。：） <br /></font></p><img src ="http://www.blogjava.net/aichan/aggbug/47735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2006-05-24 00:26 <a href="http://www.blogjava.net/aichan/archive/2006/05/24/47735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于DWR与Servlet、安全</title><link>http://www.blogjava.net/aichan/archive/2006/05/10/45321.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Tue, 09 May 2006 17:18:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2006/05/10/45321.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/45321.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2006/05/10/45321.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/45321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/45321.html</trackback:ping><description><![CDATA[使用DWR做Remote，完全绕过传统的MVC框架，如Struts、Webwork，单用一个DWRServlet来做控制器。DWR向客户端 暴露了服务端的服务接口，很有可能有没有任何限制的情况下被客户端调用所暴露的接口。如果使用传统的MVC框架，可以很方便地解决很多问题诸如身份验证、 权限控制等。而DWR提供的功能是给客户端暴露服务接口。上面所涉及的问题却少有牵涉。不过，解决方案还是有的。其中之一就是使用AOP，自已实现一些拦 截功能，例如结合Spring，使用DWR的Spring整合功能，给客户端提供一个Spring的Bean，而这个Bean是经过代理的 （Proxy）。实际上已经保证了身份认证等动作完成了。而我们要多做的是，写一些Spring的Bean来作拦截器。再在原有的服务上再加上一些 AOP。当然，DWR对于安全的还是提供了些设施的，基于J2EE的安全策略之上。感觉不是十分良好，所以没用，也没深入研究。：P
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 很多时候，在做身份验证及授权的时候可能会用到应用的环境，如ServletContext，Session等。那么在DWR中的服务或拦截器需要用到Session这些东西的时候，获取是一件很简单的事。通常有两个办法<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 一、使用DWR的API。其实是一个静态的方法，极其不推荐。所以示例也就免了。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 二、让DWR自已注入需要的元素，这里讲的元素仅限于：</p>
<ul>
    <li>HttpServletRequest</li>
    <li>HttpServletResponse</li>
    <li>HttpSession</li>
    <li>ServletContext</li>
    <li>ServletConfig</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 做法是在服务里定义方法的时候，把以上的元素作为参数。在方法体内直接使用即可。而不必担心它的来源，来源是DWR会自已根据参数的类型注入。在客户端调 用的时候不需要提供这个参数。ServletContext之类的东西作为ThreadLocal的变量保存起来的。简单的示例。</p>
<p>1、服务代码&nbsp;</p>
<p><code><font color="#7f0055"><strong>package&nbsp;</strong></font><font color="#000000">net.jf.ajax.session;</font><br /><br /><font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">javax.servlet.http.HttpSession;</font><br /><br /><font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">Store&nbsp;</font><font color="#000000">{</font><br /><font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">setAttribute</font><font color="#000000">(</font><font color="#000000">String&nbsp;name,String&nbsp;value,HttpSession&nbsp;session</font><font color="#000000">){</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">session.setAttribute</font><font color="#000000">(</font><font color="#000000">name,value</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br /><font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">String&nbsp;getAttribute</font><font color="#000000">(</font><font color="#000000">String&nbsp;name,HttpSession&nbsp;session</font><font color="#000000">){</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">String</font><font color="#000000">)&nbsp;</font><font color="#000000">session.getAttribute</font><font color="#000000">(</font><font color="#000000">name</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br /><font color="#000000">}</font></code> <font size="3" /></p>
<p><font size="1"><font size="2">2、spring配置文件</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp; &lt;beans&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;bean id=&quot;store&quot; class=&quot;net.jf.ajax.session.Store&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/beans&gt;</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">3、dwr.xml&nbsp;</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&lt;dwr&gt;<br />&nbsp; &lt;allow&gt;<br />&nbsp;&nbsp;&nbsp; &lt;create creator=&quot;spring&quot; javascript=&quot;store&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;param name=&quot;beanName&quot; value=&quot;store&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/create&gt;<br />&nbsp; &lt;/allow&gt;<br />&lt;/dwr&gt;</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">以 上的代码及配置文件可以达到目的：DWR与Spring结合，DWR直接使用Spring管理的Bean作为服务，当然，受Spring管理的Bean功 能一点都不减，复杂的如有着事务管理的Bean同样有用。 而且尽管是Spring管理的Bean，方法的参数中有Servlet相关的参数，DWR同样自动注入。</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 现在去调试页面看看我们暴露的接口及效果如何！在调试页面找到store的服务，点击进去，可以见到暴露的方法有两个：</font></font></p>
<p class="separator" style="text-align: center; clear: both;"><a href="http://bbmyth.googlepages.com/store.JPG/store-full.jpg" style="border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;"><img src="http://bbmyth.googlepages.com/store.JPG/store-medium.jpg" alt="" /></a></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 一个是SetAttribute(&quot;&quot;,&quot;&quot;,AUTO)，第三个参数表明自动注入，客户端只需要提供前两个参数即可。</font></font></p>
<p style="text-align: left;"><font size="1"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 一个是GetAttribute（&ldquo;&rdquo;，AUTO），第二个参数表明自动注入，客户只需要提供一个名字参数取值即可。</font></font></p>
<font size="1"><font size="2">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在测试页面提供的输入框中测试两个函数，SetAttribute填入name,jeff提交成功，在GetAttribute函数中填入name获得一个返回值，正是jeff。至此，尝试成功！ </font></font><img src ="http://www.blogjava.net/aichan/aggbug/45321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2006-05-10 01:18 <a href="http://www.blogjava.net/aichan/archive/2006/05/10/45321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 中使用资源</title><link>http://www.blogjava.net/aichan/archive/2006/04/13/40859.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Thu, 13 Apr 2006 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2006/04/13/40859.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/40859.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2006/04/13/40859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/40859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/40859.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在Web应用中如果自已的程序里面需要用到外部资源文件（配置文件），一般会把配置文件放在classes下面或WEB-INF下面。如果加载这结文件的话通常有两种办法。一是写绝对路径，这是最不推荐的方法。二是引入ServletContext，从相对路径中获得绝对路径。写相对路径的时候使用ServletContext是免不了的，我的应用服务器是Tomcat，使用相对路径找文件都是在Tomcat的Bin文件夹下面找，所以我只能用ServletContext来找。后来，为了使程序能脱离Servlet容器运行，就引入了Spring的资源管理机制。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  Spring为资源管理提供了一个Resource接口，并提供了几个Resource的实现。它们都需要一个String表示的资源的实际位置。依据这个String，Spring将会自动为你选择正确的Resource实现。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  下面一段代码，我为了得到一个资源的位置，定义了个属性，一个是file代表文件的路径（相对或绝对），一个是Resouce接口的属性。在Spring的任何Context中都可以通过设置Resource的属性来得到资源的位置。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <code><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#000000">String&nbsp;file;</font><br /><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#000000">Resource&nbsp;resource;<br /><br /></font><font color="#3f5fbf" /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">setResource</font><font color="#000000">(</font><font color="#000000">Resource&nbsp;resource</font><font color="#000000">)&nbsp;{</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.resource&nbsp;=&nbsp;resource;</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>try&nbsp;</strong></font><font color="#000000">{</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.file&nbsp;=&nbsp;resource.getFile</font><font color="#000000">()</font><font color="#000000">.getAbsolutePath</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>catch&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">IOException&nbsp;e</font><font color="#000000">)&nbsp;{</font><font color="#000000" /><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>throw&nbsp;new&nbsp;</strong></font><font color="#000000">RuntimeException</font><font color="#000000">(</font><font color="#000000">e.getMessage</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><font color="#000000" /><br /><font color="#3f5fbf" /><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">setFile</font><font color="#000000">(</font><font color="#000000">String&nbsp;file</font><font color="#000000">)&nbsp;{</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.file&nbsp;=&nbsp;file;</font><br /><font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font></code> <br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  Spring配置文件如下：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &lt;bean id=&quot;mybean&quot; class=&quot;net.jf.mybean&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name=&quot;resource&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;value&gt;/WEB-INF/config.xml&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/bean&gt;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 上面的例子是在WebApplicationAContext中的。Spring会根据Context的运行环境决定去哪里加载资源。如果是Application程序。即使用类似ClassPathXmlApplicationContext这样的Context，Spring则会使用ClassPathSource来代表资源。将会在程序运行时的ClassPath中寻找资源。但要注意一点。Spring目前能找到的资源是在FileSystem中的。而不能找到Jar包里面的资源，就算你的资源的确在ClassPath当中。这一点在JavaDoc里有说明。我又是在犯是同样的错误后才想到去查找文档。。。嘿。教训啊。<br />&nbsp;&nbsp;&nbsp; 这些只是很粗浅的用法。记下来以备忘 。。如果有不正确或不妥当的地方还望指正。：）<br />&nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.blogjava.net/aichan/aggbug/40859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2006-04-13 12:30 <a href="http://www.blogjava.net/aichan/archive/2006/04/13/40859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webwork2.2.2 重返Client Validation</title><link>http://www.blogjava.net/aichan/archive/2006/03/30/38279.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Thu, 30 Mar 2006 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2006/03/30/38279.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/38279.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2006/03/30/38279.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/38279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/38279.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 自Webwork2.2发布以后，Webwork的验证机制就全部改由Ajax验证。验证的原理是一个需要验证的表单域在onblur时发送一次请求到服务器端进行验证，然后实时提醒。虽然这样达到验证目的，但在我看来，这恶心死了。如果我有一个表单几十个域需要验证，我在各个域之间切换的话，我的服务器还不累得够呛？可怜原来有的客户端验证功能没了。。我只好手写Javascript了。。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  到了Webwork2.2.2这个版本，有个好消息来了。Webwork重新支持客户端验证。于是马上抢先试了试。<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  客户端验证的例子可见Webwork自还的例子&ldquo;showcase&rdquo;。使用客户端验证大体上跟以前的服务器端验证相似，只是多了一些步骤。完整的有以下几个步骤：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<font color="#ff0000">  一、编写XXXAction-alias-validation.xml－－验证配置文件。</font>文件放在需要验证的Action类同一目录下，alias是可选项，如果有几个Action使用了同一个Action类。而你想对其中一个Action进行验证，那么alias就是那个Action的名字。如：PersonAction.java，被editPerson,savePerson,deletePerson等Action使用到，而仅需要对savePerson这个动作来验证时，配置文件名字就是：PersonAction-savePerson-validation.xml。Webwork支持的客户端验证类型有：
<ul>
    <li>required validator</li>
    <li>requiredstring validator</li>
    <li>stringlength validator</li>
    <li>regex validator</li>
    <li>email validator</li>
    <li>url validator</li>
    <li>int validator</li>
    <li>double validator</li>
</ul>
<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <font color="#ff0000">二、配置Xwork.xml，保证拦截器栈里有Validation的拦截器</font><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <font color="#ff0000">三、编写Jsp（VM或FTL）。</font>这里有几个需要注意的地方。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <font color="#0000ff">1.在Jsp加上一个Head标签，</font>&lt;ww:head/&gt;的结果是生成两个Css样式的链接：<br />&lt;link rel=&quot;stylesheet&quot; href=&quot;/bean/webwork/xhtml/styles.css&quot; type=&quot;text/css&quot;/&gt;<br />&lt;link rel=&quot;stylesheet&quot; href=&quot;/bean/webwork/jscalendar/calendar-blue.css&quot; type=&quot;text/css&quot;/&gt;<br />主要是获取显示错误是的样式。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<font color="#0000ff">  2、使用&lt;ww:form&gt;</font>，很遗憾我们只能够用Webwork的UI标签，这样才能使用到她的客户端验证机制。在这里要抱怨一下。。&lt;ww:form&gt;的标签是挺方便，但是在特定的场合，我们必须使用自已的样式和风格的布局。而Webwork默认的XHTML主题的标签会把布局搞乱。当然，我可以使用Simple主题的。但是在需要客户端验证的时候，Simple主题是行不通的。也就是说要求主题必须是XHTML以上。。或者自定义的主题（自已提供错误信息报告功能）。呵。没办法，先将就着用XHTML吧。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 在&lt;ww:form&gt;的标签里使用namespace 及Action属性。如果你的Action是/foo/bar/new.action那么，你必须这样写：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <font color="#339966">&lt;ww:form namespace=&quot;/foo/bar&quot; action=&quot;new&quot;&nbsp; validate=&quot;true&quot;/&gt;<br /><font color="#000000">validate=&quot;true&quot;一句将会在客户端生成一句：</font><br />&nbsp;&nbsp; &lt;script src=&quot;/bean/webwork/xhtml/validation.js&quot;&gt;&lt;/script&gt;<br /></font>如果你这样写：<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <font color="#339966">&lt;ww:form action=&quot;/foo/bar/new.action&quot; validate=&quot;true&quot;/&gt;</font>，你将得不到客户端验证。要注意，这个细节不容忽视。我被这个小问题搞大头了。后来查文档的时候才知道Webwork已经提醒我们要像上一种写法那样写。因为她要知道哪个名字空间下的哪个Action需要被验证！看吧。这是心急的错。不看文档后果就自负。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  以上两种写法，在页面上生成Js的结果是不一样的。第一种写法会在页面上生成相应的验证规则。第二种写法生成的Js，只是简单清楚报错信息然后提交请求到服务器，由服务器来验证。<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  只需要这三步，Webwork2.2.2的客户端验证功能就算是使用了。感觉还不错。唯一纳闷的还是Webwork强制我什么使用她的模板。<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <font color="#ff0000">Ps:</font>有很多示例代码没同贴出来，是有原因D。现在编辑是使用FCKEditor，另外两个Editor在我的机子上变成了白痴。出错、完全不能编辑。。。手上又没有好的&ldquo;XML到 HTML&rdquo;的好工具。。所以没把代码贴上来。。详情，可以看Webwork的Showcase。这东西太出彩了。：P<img src ="http://www.blogjava.net/aichan/aggbug/38279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2006-03-30 16:47 <a href="http://www.blogjava.net/aichan/archive/2006/03/30/38279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webwork Forward 2 html</title><link>http://www.blogjava.net/aichan/archive/2006/03/26/37420.html</link><dc:creator>艾尘</dc:creator><author>艾尘</author><pubDate>Sat, 25 Mar 2006 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/aichan/archive/2006/03/26/37420.html</guid><wfw:comment>http://www.blogjava.net/aichan/comments/37420.html</wfw:comment><comments>http://www.blogjava.net/aichan/archive/2006/03/26/37420.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/aichan/comments/commentRss/37420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/aichan/services/trackbacks/37420.html</trackback:ping><description><![CDATA[<p style="text-align: left;"><font size="4"><font color="#006600"><font size="2">Web浏览器是否能正确显示一个Web页通常依赖两个条件：<br />一、页面的编码（文件编码）.</font></font></font><font size="4"><font color="#006600"><font size="2"><br />二、该页定义的contentType.</font></font></font></p>
<p style="text-align: left;"><font size="4"><font color="#006600"><font size="2">其中页面的编码是决定性的因素。两者一致是，浏览器会正常显示内容，否则有可能产生乱码现像。</font></font></font></p>
<p style="text-align: left;"><font size="4"><font color="#006600"><font size="2">如果一个Html文件，文件编码为UTF-8。contentType设为相同。则使用IE或Firefox查看，两者都会自动选择正确的编码形式来解释。当我将contentType设为GB2312，以为会造成乱码，结果不会。我认为原因是这样的：文件编码起决定作用，加上Utf-8包括了GB该有的字符，所以这种情况是以大的来认识小的。没问题。（不知是否有理解错误  ：P）。</font></font></font></p>
<p style="text-align: left;"><font size="4"><font color="#006600"><font size="2">上述情况为使用浏览器直接把开网页文件的结果。当我使用Webwork的Action时，将Html文件作为结果时（结果类型为dispatcher），乱码出现了！文件编码为UTF-8，页面定义的ContentType为UTF-8。但是偏偏使用IE及FireFox均得到乱码的结果。郁闷中用Firefox查看了页面的属性，惊奇地发现页面编码居然是GB2312。我猜想是Webwork在Dispatch页面的时候使用了默认的编码，把本来UTF-8编码的页面重新用GB2312编码一次。于是试着在Action里面获得Response并把字符编码改为UTF-8。最后发现结果依然一样。这时，我觉得在Action完成后，Webwork接下来使用了Response，我的设置被重置了。于是决定自已写一个Servlet，指定字符编码为UTF-8，结果直接Forward到我的Html页面。结果正确了！再查看页面信息，两者都是UTF-8了。<br /></font></font></font></p>
<p><font color="#006600">平时使用Webwork来Dispatch的都是Jsp，不曾出现过这样的情况。原因是Jsp仍需要编译，编译时会读取Jsp页面指定的ContentType来决定Response里的字符编码。HTML文件则不一样。这时只能使用默认编码。如果我的工程是Gb2312，那根本就不存在刚才所讲的问题的。</font><font size="4"><strong><font color="#006600"><br /></font></strong></font></p><img src ="http://www.blogjava.net/aichan/aggbug/37420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/aichan/" target="_blank">艾尘</a> 2006-03-26 00:33 <a href="http://www.blogjava.net/aichan/archive/2006/03/26/37420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>