ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区三区av在线,jizz久久精品永久免费,麻豆影视在线http://www.aygfsteel.com/aichan/archive/2008/01/16/175804.html艑ְ˜è‰‘Ö°˜Wed, 16 Jan 2008 15:47:00 GMThttp://www.aygfsteel.com/aichan/archive/2008/01/16/175804.htmlhttp://www.aygfsteel.com/aichan/comments/175804.htmlhttp://www.aygfsteel.com/aichan/archive/2008/01/16/175804.html#Feedback2http://www.aygfsteel.com/aichan/comments/commentRss/175804.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/175804.html阅读全文

艑ְ˜ 2008-01-16 23:47 发表评论
]]>
介绍ExtremeTable的下一代Jmesahttp://www.aygfsteel.com/aichan/archive/2007/08/01/133692.html艑ְ˜è‰‘Ö°˜Tue, 31 Jul 2007 17:31:00 GMThttp://www.aygfsteel.com/aichan/archive/2007/08/01/133692.htmlhttp://www.aygfsteel.com/aichan/comments/133692.htmlhttp://www.aygfsteel.com/aichan/archive/2007/08/01/133692.html#Feedback11http://www.aygfsteel.com/aichan/comments/commentRss/133692.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/133692.htmlExtremeTable(以下½Ž€¿U°ET,å‘?,,ET.....),可以说不知道的äh甚少.不过估计用的也未必多¾|¢äº†.今天,¾l™å¤§å®¶ä»‹¾lä¸€ä¸ªç”±ET的作者重新实现的一套关于Tableçš„API.JMesa.
我是一个偶然的æœÞZ¼šçŸ¥é“Jmesa,我在做一个数据展现系¾lŸçš„æ—¶å€™æƒ³å¯ÀL‰¾ET的帮å¿?但发现ETå·×ƒ¸å†æ›´æ–?作者把¾_‘ÖŠ›è½¬ç§»åˆîCº†æ–°çš„™å¹ç›®ä¸?也就是这ä¸? JMesa.˜q™ä¸ª™å¹ç›®çš„目的是为开发者提供更有效的表格展现的API,而不是简单的TagLib.无论从灵‹zÀL€?易扩展æ€?易用æ€?均比ET上了一个层 ‹Æ?最˜q‘Release的版本里é?òq¶ä¸åŒ…括TagLib.而在下一个版æœ?2.1.0)ž®†ä¼šåŠ å…¥TagLib,目前TagLibå·Þq»å¯ç”¨,在SVN里已 æœ?只是½{‰å¾…下一个版本的发布,å…‰™—´ä¼šæœ‰ä¸€äº›æ›´æ–?不过会兼容目前的TagLibçš?
假如我从API开始介¾lJMesa,ææ€•åÆˆä¸æ˜¯ä¸ªå¥½çš„åŠžæ³?像我以前的文章里面有介绍,¾l“果反响不大.˜q™æ¬¡å†›_®šä»ŽTagLib入手,来给大家介绍一下Jmesa.
大家可以从附仉™‡Œæ‹¿åˆ°ä¸€ä¸ªDemo.注意Demo依赖JMesa以及其他Lib.在Libæ–‡äšg夹下有详¾l†è¯´æ˜?
现在来看看JMesaçš„ä‹Éç”?
  1. <jm:table id="product" items="products" caption="product listing">  
  2.     <jm:column property="name" sortable="true" filterable="true"/>  
  3.     <jm:column property="price" />  
  4.     <jm:column property="createdTime" />  
  5.     <jm:column property="id" title="edit">  
  6.         <a href="viewProduct.action?id="<jm:property/>"><jm:property name="name"/></a>  
  7.     </jm:column>  
  8. </jm:table>  

估计比较å®ÒŽ˜“看得懂的代码å?
Jmesa 的检½{¾è§„范当中只有三个Tag:Table,Row,Column.而当前的TagLib实现中只实现了Tableå’ŒColumn两个(Row是可é€? çš?.另加一个Propertyçš„Tag.此阶ŒD?Propertyçš„Tag是很有用çš?å…¶è“v到的作用与Webworkçš„PropertyTag相差æ—? å‡? 用来获得对象的某个属æ€?之所以ä‹É用Property Tag是因为当前的TagLib有个限制ž®±æ˜¯æš‚时不支持如JSTLçš?{}˜q™ç§å†™æ³•.ž®†æ¥ä¼šæ”¯æŒ?届时Property Tag也会¾l§ç®‹è޷得兼容.Jeff比较們֐‘于ä‹É用è„P代的方式实现Tag,那样可以支持${}˜q™æ ·çš„写æ³?ä¸è¿‡ä½œäØ“TagLib的开å§?问题不大.有时间再 重构一下TagLib,支持JSTL的写æ³?
好了,来说一说这些Tagçš„ä‹É用方æ³?
Table:
Attribute Description
id 表格的ID(必须)
items 对象或者Map的集�(必须)
caption 表格的标�
theme 表格的主�自定义样�br>
exportTypes 使用逗号分割导出的类åž?目前支持导出¾cÕdž‹æœ‰CSV,Excel
width 表格宽度
style 卌™¡¨æ ¼çš„Style属æ€?br>
styleClass 使用的Css的Class名字
border 表格�br>
cellpadding 表格属�br>
cellspacing 表格属�br>
实际�真正Release的版本里面将会加上var以及Limit属�
var属性值即在Column标签里可以获得的对象变量.
Limit属性是保存在当前请求的Limit的对象名.
Row:
Attribute Description
highlighter 是否高亮昄¡¤º
onclick 点击事äšg
onmouseout é¼ æ ‡¿UÕd‡ºäº‹äšg
onmouseover é¼ æ ‡¿UÕd…¥äº‹äšg
该Tag是可选的.实际上Jmesa提供了一¾pÕdˆ—默认的事件响åº?有必要的情况下才使用.
Column:
Attribute Description
property Java对象或Map的属性名
title 列的名称
filterable 是否可按˜q‡æ×o条äšg查找
sortable 是否要排�br>
width 列宽
style Style属�br>
styleClass 使用的Css的Class的名�br>
ColumnTagçš„ä‹É用方法有下面几种:
  1. <jm:column property="name"/>  

ž®†ä»…仅输出对象中Name属性å€?列名是Name
  1. <jm:column property="name" title="名字" sortable="true" filterable="false"/>  

˜q™æ ·å¯ä»¥å¾—到自定义的列名,可以让列可查æ‰?可排åº?当然你Server端需要相应提供排序及查找功能.不过ž®Þq®—你不提供,客户端也会把当前¾l“果排序和查扄¡š„.
  1. <jm:column property="id" title="edit">   
  2.     <a href="viewProduct.action?id="<jm:property/>"><jm:property name="name"/></a>   
  3. </jm:column>    

˜q™é‡Œ¾l“合了PropertyTag.实现自定义列昄¡¤º.可以灉|´»å®šåˆ¶è‡ªå·±çš„单元格.
在ColumnTag里面,使用PropertyTag的时�可以指定Name属�如果不指定则使用当前Column的Property属性�
以后ž®†æ”¯æŒ?
  1. <jm:column property="id" title="edit">   
  2.     <a href="viewProduct.action?id=${id}">${name}</a>   
  3. </jm:column>    
˜q™æ ·çš„写æ³?当然会ç‘ô¾l­å…¼å®¹PropertyTag,ž®½ç®¡ä¸æ˜¯Tag规范里的东西.

ç›æ€¿¡¾lè¿‡ä¸Šé¢çš„一番介¾l?大家对Jmesa有一定的感性认识了å?˜q˜æ²¡æœ?下蝲Demo,扔进Tomcat çš„App里跑一下就明白äº?
有什么徏�请一定要告诉�:).

附äšgåœ?http://www.javaeye.com/topics/download/4eaaa38d-e838-459d-aef2-3be6c4d043df



艑ְ˜ 2007-08-01 01:31 发表评论
]]>
pager-taglib 体验http://www.aygfsteel.com/aichan/archive/2006/06/27/55248.html艑ְ˜è‰‘Ö°˜Mon, 26 Jun 2006 18:22:00 GMThttp://www.aygfsteel.com/aichan/archive/2006/06/27/55248.htmlhttp://www.aygfsteel.com/aichan/comments/55248.htmlhttp://www.aygfsteel.com/aichan/archive/2006/06/27/55248.html#Feedback7http://www.aygfsteel.com/aichan/comments/commentRss/55248.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/55248.html阅读全文

艑ְ˜ 2006-06-27 02:22 发表评论
]]>
Spring AOP 在DWR安全上的应用http://www.aygfsteel.com/aichan/archive/2006/05/24/47735.html艑ְ˜è‰‘Ö°˜Tue, 23 May 2006 16:26:00 GMThttp://www.aygfsteel.com/aichan/archive/2006/05/24/47735.htmlhttp://www.aygfsteel.com/aichan/comments/47735.htmlhttp://www.aygfsteel.com/aichan/archive/2006/05/24/47735.html#Feedback0http://www.aygfsteel.com/aichan/comments/commentRss/47735.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/47735.htmlåœ?a href="http://www.aygfsteel.com/aichan/archive/2006/05/10/45321.html">上一½‹‡æ–‡ç«?/a>里提åˆîCº†å¯ä»¥è®?DWR自动往Service里面注入一个与Servletç›¸å…³çš„å¯¹è±¡ï¼Œä½œäØ“å‚æ•°ã€‚åªæ˜¯è¿™æ øP¼Œè¦æ¯ä¸ªService都加上这æ ïLš„一个参敎ͼŒå¥‡ä¸‘无比åQæƒ³äº?惻I¼Œå†›_®šž®Þp®©DWR污染一下,Service保留原样。只是增加一个MethodBeforeAdviceåQˆæ­£æ˜¯å®ƒè®©DWRçš„API污染了一下。)åQŒæ¥å¯?Service的方法进行拦截,可以在Service的调用之前对操作˜q›è¡Œæ‰€è°“çš„íw«ä†¾éªŒè¯åQŒæŽˆæƒä¹‹¾cÈš„æ“ä½œã€‚完整的拦截模块几个¾cÀL–‡ä»¶åŠ ä¸ªSpringé…?¾|®æ–‡ä»¶æžå®šã€?/font>

     实现拦截功能的类有:

    一、MainInteceptoråQŒä¸»æ‹¦æˆªå™¨ï¼Œæ‰€ä»¥DWR的远½E‹è°ƒç”¨éƒ½ä¼šè¢«æ‹¦æˆªåQŒå½“ç„Óž¼Œ 调用是细到方法çñ”的,可配¾|®çš„åQŒè¯¥¾cÕd®žçŽîCº†Spring AOPçš„MethodBeforeAdvice接口åQŒè¯¥¾cÀLœ‰ä¸€ä¸ªé›†åˆæˆå‘˜å˜é‡ï¼Œæˆå‘˜ä¸ºIInteceptorã€?/font>

    二、IInteceptoråQŒæ˜¯ä¸€ä¸ªæŽ¥å£ï¼Œä»…有一个execute(AopContext context)函数。该接口是拦截器åQˆä¸Žå‰é¢çš„主拦截器不同,本接口定义的拦截器是可以ç”Þq”¨æˆ·åŽ»å®žçŽ°åQŒåƈ且可以有多个åQ‰ã€‚实现接口只需要实现方法。这äº?拦截器会被主拦截器回调ã€?比如要实çŽîC¸€ä¸ªèín份验证的拦截åQŒSecuityInteceptoråQŒåœ¨é…ç½®æ–‡äšg中把˜q™ä¸ªæ‹¦æˆªå™¨è®¾¾|®äØ“ä¸ÀL‹¦æˆªå™¨çš„属性即可获得回调ã€?/font>

     三、AopContextåQŒAop上下文。在ä¸ÀL‹¦æˆªå™¨è°ƒç”¨IInteceptor的对象时åQŒæŠŠ˜q™ä¸ªä¸Šä¸‹æ–‡å¯¹è±¡ä½œä¸ºå‚数来调用子拦截器。从该上下文可获得一¾pÕdˆ—信息åQŒå¦‚HttpSessionåQŒHttpRequest½{‰ã€‚甚至你可以自已讄¡½®å±žæ€§ã€?nbsp;

      下面看一些代码片æ–?
MainInteceptor:

 private List<IInterceptor> interceptors;//定义一¾pÕdˆ—的子拦截å™?/font>

public void setInterceptors(List<IInterceptor> interceptors) {
        this.interceptors = interceptors;
    }

在before(Method method, Object[] params, Object target)æ–ÒŽ³•里:

        WebContext ctx = WebContextFactory.get();//唯一被DWR污染的地æ–?br />        HttpSession session = ctx.getSession();
        AopContext context = new AopContext();        context.setSession(session);
        for(Iterator it = interceptors.iterator(); it.hasNext();){
            IInterceptor interceptor = (IInterceptor) it.next();
            interceptor.execute(context);
        }

 IInterceptoråQ?/font>

 public interface IInterceptor {
    public void execute(AopContext context);
}

AopContextž®×ƒ¸å¿…脓出来了, 随自已定义些什么属性,不过ž®±å†…¾|®äº†ä¸€ä¸ªMapåQŒç”¨æ¥ä¿å­˜æ•°æ®çŞ了ã€?/font>

下面来看看配¾|®æ–‡ä»Óž¼š

 <beans>

    <!--ž®†è¦æš´éœ²¾l™DWRçš„Service-->
     <bean id="bookManager" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>net.jf.ajax.business.BookManager</value>
    </property>
    <property name="target">
      <ref local="bookManagerImpl"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>dwrAdvisor</value>
      </list>
    </property>
  </bean>

  <bean id="bookManagerImpl" class="net.jf.ajax.business.impl.BookManagerImpl"/>
<!--装配器?如果看不懂,先看看Springçš„Aopå?åQšP-->
  <bean id="dwrAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
      <ref local="dwrInterceptor"/>
    </property>
    <property name="patterns">
        <list>
            <value>.*.*</value>
          </list>
    </property>
  </bean>


<!--ä¸ÀL‹¦æˆªå™¨åQŒç»™å®ƒè®¾¾|®å­æ‹¦æˆªå™?->
  <bean id="dwrInterceptor" class="net.jf.ajax.iterceptor.MainInterceptor">
      <property name="interceptors">
          <list>
              <ref bean="test"/>
          </list>
      </property>
  </bean>
  <!--其中一个子拦截器的实现-->
  <bean id="test" class="net.jf.ajax.iterceptor.TestInterceptor"/>
</beans>

ž®?˜q™æ ·åQŒåœ¨é…ç½®DWR的配¾|®æ–‡ä»¶æ—¶åQŒé…¾|?lt;creator>æ—¶ä‹É用Springçš„Creatorž®±å¯ä»¥ç›´æŽ¥ä‹É用上面的Service了。当 DWR˜qœç¨‹è¯äh±‚æ—Óž¼Œåœ¨é…¾|®èŒƒå›´å†…的方法的调用都会被主拦截器拦截,òq¶ä¸”遍历、执行所有子拦截器。原有的Service不需要改动,只需要多加一ä¸?Spring的配¾|®æ–‡ä»Óž¼Œž®†åŽŸæœ‰çš„Service再加一层Aop的轻¾U±ã€?/font>

˜q™æ˜¯ä¸€¿Uå®žçŽ°æ–¹æ³•ã€‚å¦‚æžœæœ‰åˆ«çš„æ–ÒŽ³•让DWR更安全、有效,请一定告知。:åQ?



]]>
关于DWR与Servlet、安å…?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/aichan/archive/2006/05/10/45321.html</guid><wfw:comment>http://www.aygfsteel.com/aichan/comments/45321.html</wfw:comment><comments>http://www.aygfsteel.com/aichan/archive/2006/05/10/45321.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.aygfsteel.com/aichan/comments/commentRss/45321.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/aichan/services/trackbacks/45321.html</trackback:ping><description><![CDATA[使用DWR做RemoteåQŒå®Œå…¨ç»•˜q‡ä¼ ¾lŸçš„MVC框架åQŒå¦‚Struts、WebworkåQŒå•用一个DWRServlet来做控制器。DWR向客æˆïL«¯ 暴露了服务端的服务接口,很有可能有没有ä“Q何限制的情况下被客户端调用所暴露的接口。如果ä‹É用传¾lŸçš„MVC框架åQŒå¯ä»¥å¾ˆæ–¹ä¾¿åœ°è§£å†›_¾ˆå¤šé—®é¢˜è¯¸å¦‚èín份验证ã€?权限控制½{‰ã€‚而DWR提供的功能是¾l™å®¢æˆïL«¯æš´éœ²æœåŠ¡æŽ¥å£ã€‚ä¸Šé¢æ‰€æ¶‰åŠçš„é—®é¢˜å´ž®‘有牉|¶‰ã€‚不˜q‡ï¼Œè§£å†³æ–ÒŽ¡ˆ˜q˜æ˜¯æœ‰çš„。其中之一ž®±æ˜¯ä½¿ç”¨AOPåQŒè‡ªå·²å®žçŽîC¸€äº›æ‹¦ 截功能,例如¾l“合SpringåQŒä‹É用DWRçš„Spring整合功能åQŒç»™å®¢æˆ·ç«¯æä¾›ä¸€ä¸ªSpringçš„BeanåQŒè€Œè¿™ä¸ªBean是经˜q‡ä»£ç†çš„ åQˆProxyåQ‰ã€‚实际上已经保证了èín份认证等动作完成了。而我们要多做的是åQŒå†™ä¸€äº›Springçš„Bean来作拦截器。再在原有的服务上再加上一äº?AOP。当ç„Óž¼ŒDWR对于安全的还是提供了些设施的åQŒåŸºäºŽJ2EE的安全策略之上。感觉不是十分良好,所以没用,也没深入研究。:P <p>        很多时候,在做íw«ä†¾éªŒè¯åŠæŽˆæƒçš„æ—¶å€™å¯èƒ½ä¼šç”¨åˆ°åº”用的环境,如ServletContextåQŒSession½{‰ã€‚那么在DWR中的服务或拦截器需要用到Session˜q™äº›ä¸œè¥¿çš„æ—¶å€™ï¼ŒèŽ·å–æ˜¯ä¸€ä»¶å¾ˆ½Ž€å•的事。通常有两个办æ³?br />        一、ä‹É用DWRçš„API。其实是一个静态的æ–ÒŽ³•åQŒæžå…¶ä¸æŽ¨èã€‚所以示例也ž®±å…äº†ã€?br />        二、让DWR自已注入需要的元素åQŒè¿™é‡Œè®²çš„元素仅限于åQ?/p> <ul> <li>HttpServletRequest</li> <li>HttpServletResponse</li> <li>HttpSession</li> <li>ServletContext</li> <li>ServletConfig</li> </ul> <p>        åšæ³•æ˜¯åœ¨æœåŠ¡é‡Œå®šä¹‰æ–¹æ³•çš„æ—¶å€™ï¼ŒæŠŠä»¥ä¸Šçš„å…ƒç´ ä½œäØ“å‚æ•°ã€‚åœ¨æ–ÒŽ³•体内直接使用卛_¯ã€‚而不必担心它的来源,来源是DWR会自已根据参数的¾cÕdž‹æ³¨å…¥ã€‚在客户端调 用的时候不需要提供这个参数。ServletContext之类的东西作为ThreadLocal的变量保存è“v来的。简单的½CÞZ¾‹ã€?/p> <p>1、服务代ç ?nbsp;</p> <p><code><font color="#7f0055"><strong>package </strong></font><font color="#000000">net.jf.ajax.session;</font><br /><br /><font color="#7f0055"><strong>import </strong></font><font color="#000000">javax.servlet.http.HttpSession;</font><br /><br /><font color="#7f0055"><strong>public class </strong></font><font color="#000000">Store </font><font color="#000000">{</font><br /><font color="#ffffff">  </font><font color="#7f0055"><strong>public </strong></font><font color="#7f0055"><strong>void </strong></font><font color="#000000">setAttribute</font><font color="#000000">(</font><font color="#000000">String name,String value,HttpSession session</font><font color="#000000">){</font><br /><font color="#ffffff">    </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">  </font><font color="#000000">}</font><br /><font color="#ffffff">  </font><font color="#7f0055"><strong>public </strong></font><font color="#000000">String getAttribute</font><font color="#000000">(</font><font color="#000000">String name,HttpSession session</font><font color="#000000">){</font><br /><font color="#ffffff">    </font><font color="#7f0055"><strong>return </strong></font><font color="#000000">(</font><font color="#000000">String</font><font color="#000000">) </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">  </font><font color="#000000">}</font><br /><font color="#000000">}</font></code> <font size="3" /></p> <p><font size="1"><font size="2">2、spring配置文äšg</font></font></p> <p style="text-align: left;"><font size="1"><font size="2">      <beans><br />            <bean id="store" class="net.jf.ajax.session.Store"><br />            </bean><br />        </beans></font></font></p> <p style="text-align: left;"><font size="1"><font size="2">3、dwr.xml </font></font></p> <p style="text-align: left;"><font size="1"><font size="2"><dwr><br />  <allow><br />    <create creator="spring" javascript="store"><br />        <param name="beanName" value="store"/><br />    </create><br />  </allow><br /></dwr></font></font></p> <p style="text-align: left;"><font size="1"><font size="2">ä»?上的代码及配¾|®æ–‡ä»¶å¯ä»¥è¾¾åˆ°ç›®çš„:DWR与Spring¾l“合åQŒDWR直接使用Spring½Ž¡ç†çš„Beanä½œäØ“æœåŠ¡åQŒå½“ç„Óž¼Œå—Spring½Ž¡ç†çš„BeanåŠ?能一炚wƒ½ä¸å‡åQŒå¤æ‚的如有着事务½Ž¡ç†çš„Bean同样有用ã€?而且ž®½ç®¡æ˜¯Spring½Ž¡ç†çš„BeanåQŒæ–¹æ³•的参数中有Servlet相关的参敎ͼŒDWR同样自动注入ã€?/font></font></p> <p style="text-align: left;"><font size="1"><font size="2">         现在去调试页面看看我们暴露的接口及效果如何!在调试页面找到store的服务,点击˜q›åŽ»åQŒå¯ä»¥è§åˆ°æš´éœ²çš„æ–ÒŽ³•有两个:</font></font></p> <p class="separator" style="text-align: center; clear: both;"><a 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">         一个是SetAttribute("","",AUTO)åQŒç¬¬ä¸‰ä¸ªå‚数表明自动注入åQŒå®¢æˆïL«¯åªéœ€è¦æä¾›å‰ä¸¤ä¸ªå‚数卛_¯ã€?/font></font></p> <p style="text-align: left;"><font size="1"><font size="2">        一个是GetAttributeåQ?ldquo;”åQŒAUTOåQ‰ï¼Œ½W¬äºŒä¸ªå‚数表明自动注入,客户只需要提供一个名字参数取值即可ã€?/font></font></p> <font size="1"><font size="2">        在测试页面提供的输入框中‹¹‹è¯•两个函数åQŒSetAttributeå¡«å…¥name,jeff提交成功åQŒåœ¨GetAttribute函数中填入name获得一个返回å€û|¼Œæ­£æ˜¯jeff。至此,ž®è¯•成功åQ?</font></font><img src ="http://www.aygfsteel.com/aichan/aggbug/45321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/aichan/" target="_blank">艑ְ˜</a> 2006-05-10 01:18 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/aichan/archive/2006/04/13/40859.html</guid><wfw:comment>http://www.aygfsteel.com/aichan/comments/40859.html</wfw:comment><comments>http://www.aygfsteel.com/aichan/archive/2006/04/13/40859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/aichan/comments/commentRss/40859.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/aichan/services/trackbacks/40859.html</trackback:ping><description><![CDATA[        在Web应用中如果自已的½E‹åºé‡Œé¢éœ€è¦ç”¨åˆ°å¤–部资源文ä»Óž¼ˆé…ç½®æ–‡äšgåQ‰ï¼Œä¸€èˆ¬ä¼šæŠŠé…¾|®æ–‡ä»¶æ”¾åœ¨classes下面或WEB-INF下面。如果加载这¾l“文件的话通常有两¿UåŠžæ³•ã€‚ä¸€æ˜¯å†™¾lå¯¹è·¯å¾„åQŒè¿™æ˜¯æœ€ä¸æŽ¨èçš„æ–ÒŽ³•。二是引入ServletContextåQŒä»Žç›¸å¯¹è·¯å¾„中获得绝对èµ\径。写相对路径的时候ä‹É用ServletContext是免不了的,我的应用服务器是TomcatåQŒä‹É用相对èµ\径找文äšg都是在Tomcatçš„Binæ–‡äšg夹下面找åQŒæ‰€ä»¥æˆ‘只能用ServletContext来找。后来,ä¸ÞZº†ä½¿ç¨‹åºèƒ½è„Þq¦»Servlet容器˜qè¡ŒåQŒå°±å¼•入了Spring的资源管理机制ã€?br />       Spring䏸™µ„源管理提供了一个Resource接口åQŒåƈ提供了几个Resource的实现。它们都需要一个String表示的资源的实际位置。依据这个StringåQŒSpringž®†ä¼šè‡ªåЍä¸ÞZ½ é€‰æ‹©æ­£ç¡®çš„Resource实现ã€?br />       下面一ŒDµä»£ç ï¼Œæˆ‘äØ“äº†å¾—åˆîC¸€ä¸ªèµ„源的位置åQŒå®šä¹‰äº†ä¸ªå±žæ€§ï¼Œä¸€ä¸ªæ˜¯file代表文äšgçš„èµ\径(相对或绝对)åQŒä¸€ä¸ªæ˜¯Resouce接口的属性。在Springçš„ä“Q何Context中都可以通过讄¡½®Resource的属性来得到资源的位¾|®ã€?br />       <code><font color="#7f0055"><strong>private </strong></font><font color="#000000">String file;</font><br /><br /><font color="#ffffff">    </font><font color="#7f0055"><strong>private </strong></font><font color="#000000">Resource resource;<br /><br /></font><font color="#3f5fbf" /><font color="#ffffff">    </font><font color="#7f0055"><strong>public </strong></font><font color="#7f0055"><strong>void </strong></font><font color="#000000">setResource</font><font color="#000000">(</font><font color="#000000">Resource resource</font><font color="#000000">) {</font><br /><font color="#ffffff">        </font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.resource = resource;</font><br /><font color="#ffffff">        </font><font color="#7f0055"><strong>try </strong></font><font color="#000000">{</font><br /><font color="#ffffff">            </font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.file = resource.getFile</font><font color="#000000">()</font><font color="#000000">.getAbsolutePath</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">} </font><font color="#7f0055"><strong>catch </strong></font><font color="#000000">(</font><font color="#000000">IOException e</font><font color="#000000">) {</font><font color="#000000" /><br /><font color="#ffffff">            </font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#7f0055"><strong>throw new </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">        </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><font color="#000000" /><br /><font color="#3f5fbf" /><br /><font color="#ffffff">    </font><font color="#7f0055"><strong>public </strong></font><font color="#7f0055"><strong>void </strong></font><font color="#000000">setFile</font><font color="#000000">(</font><font color="#000000">String file</font><font color="#000000">) {</font><br /><font color="#ffffff">        </font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.file = file;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code> <br />    <br />       Spring配置文äšg如下åQ?br />       <bean id="mybean" class="net.jf.mybean"><br />            <property name="resource"><br />                <value>/WEB-INF/config.xml</value><br />            </property><br />        </bean>    <br />    上面的例子是在WebApplicationAContext中的。Spring会根据Context的运行环境决定去哪里加蝲资源。如果是Application½E‹åºã€‚即使用¾cÖM¼¼ClassPathXmlApplicationContext˜q™æ ·çš„ContextåQŒSpring则会使用ClassPathSource来代表资源。将会在½E‹åº˜qè¡Œæ—¶çš„ClassPath中寻找资源。但要注意一炏V€‚Spring目前能找到的资源是在FileSystem中的。而不能找到Jar包里面的资源åQŒå°±½Ž—你的资源的¼‹®åœ¨ClassPath当中。这一点在JavaDoc里有说明。我又是在犯是同æ ïLš„错误后才惛_ˆ°åŽÀLŸ¥æ‰¾æ–‡æ¡£ã€‚。。嘿。教训啊ã€?br />    ˜q™äº›åªæ˜¯å¾ˆç²—‹¹…的用法。记下来以备å¿?。。如果有不正¼‹®æˆ–不妥当的地方˜q˜æœ›æŒ‡æ­£ã€‚:åQ?br />    <img src ="http://www.aygfsteel.com/aichan/aggbug/40859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/aichan/" target="_blank">艑ְ˜</a> 2006-04-13 12:30 <a href="http://www.aygfsteel.com/aichan/archive/2006/04/13/40859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webwork2.2.2 重返Client Validationhttp://www.aygfsteel.com/aichan/archive/2006/03/30/38279.html艑ְ˜è‰‘Ö°˜Thu, 30 Mar 2006 08:47:00 GMThttp://www.aygfsteel.com/aichan/archive/2006/03/30/38279.htmlhttp://www.aygfsteel.com/aichan/comments/38279.htmlhttp://www.aygfsteel.com/aichan/archive/2006/03/30/38279.html#Feedback9http://www.aygfsteel.com/aichan/comments/commentRss/38279.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/38279.html       åˆîCº†Webwork2.2.2˜q™ä¸ªç‰ˆæœ¬åQŒæœ‰ä¸ªå¥½æ¶ˆæ¯æ¥äº†ã€‚Webwork重新支持客户端验证。于是马上抢先试了试ã€?br />
       客户端验证的例子可见Webwork自还的例å­?ldquo;showcase”。ä‹É用客æˆïL«¯éªŒè¯å¤§ä½“上跟以前的服务器端验证相ä¼û|¼Œåªæ˜¯å¤šäº†ä¸€äº›æ­¥éª¤ã€‚完整的有以下几个步骤:
       一、编写XXXAction-alias-validation.xmlåQï¼éªŒè¯é…ç½®æ–‡äšgã€?/font>æ–‡äšg攑֜¨éœ€è¦éªŒè¯çš„Action¾cÕdŒä¸€ç›®å½•下,alias是可选项åQŒå¦‚果有几个Action使用了同一个Action¾c…R€‚而你惛_¯¹å…¶ä¸­ä¸€ä¸ªAction˜q›è¡ŒéªŒè¯åQŒé‚£ä¹ˆaliasž®±æ˜¯é‚£ä¸ªAction的名字。如åQšPersonAction.javaåQŒè¢«editPerson,savePerson,deletePerson½{‰Action使用刎ͼŒè€Œä»…需要对savePerson˜q™ä¸ªåŠ¨ä½œæ¥éªŒè¯æ—¶åQŒé…¾|®æ–‡ä»¶åå­—就是:PersonAction-savePerson-validation.xml。Webwork支持的客æˆïL«¯éªŒè¯¾cÕdž‹æœ‰ï¼š
  • required validator
  • requiredstring validator
  • stringlength validator
  • regex validator
  • email validator
  • url validator
  • int validator
  • double validator

       二、配¾|®Xwork.xmlåQŒä¿è¯æ‹¦æˆªå™¨æ ˆé‡Œæœ‰Validation的拦截器
       三、编写JspåQˆVM或FTLåQ‰ã€?/font>˜q™é‡Œæœ‰å‡ ä¸ªéœ€è¦æ³¨æ„çš„地方ã€?br />       1.在Jsp加上一个Head标签åQ?/font><ww:head/>的结果是生成两个Css样式的链接:
<link rel="stylesheet" href="/bean/webwork/xhtml/styles.css" type="text/css"/>
<link rel="stylesheet" href="/bean/webwork/jscalendar/calendar-blue.css" type="text/css"/>
主要是获取显½Cºé”™è¯¯æ˜¯çš„æ ·å¼ã€?br />       2、ä‹Éç”?lt;ww:form>åQŒå¾ˆé—憾我们只能够用Webworkçš„UI标签åQŒè¿™æ äh‰èƒ½ä‹É用到她的客户端验证机制。在˜q™é‡Œè¦æŠ±æ€¨ä¸€ä¸‹ã€‚ã€?lt;ww:form>的标½{¾æ˜¯æŒºæ–¹ä¾¿ï¼Œä½†æ˜¯åœ¨ç‰¹å®šçš„场合åQŒæˆ‘们必™åÖM‹É用自已的样式和风格的布局。而Webwork默认的XHTML主题的标½{¾ä¼šæŠŠå¸ƒå±€æžäؕ。当ç„Óž¼Œæˆ‘可以ä‹É用Simple主题的。但是在需要客æˆïL«¯éªŒè¯çš„æ—¶å€™ï¼ŒSimple主题是行不通的。也ž®±æ˜¯è¯´è¦æ±‚主题必™åÀL˜¯XHTML以上。。或者自定义的主题(自已提供错误信息报告功能åQ‰ã€‚呵。没办法åQŒå…ˆž®†å°±ç€ç”¨XHTML吧ã€?br />       åœ?lt;ww:form>的标½{ùN‡Œä½¿ç”¨namespace 及Action属性。如果你的Actionæ˜?foo/bar/new.action那么åQŒä½ å¿…é¡»˜q™æ ·å†™ï¼š
       <ww:form namespace="/foo/bar" action="new"  validate="true"/>
validate="true"一句将会在客户端生成一句:
   <script src="/bean/webwork/xhtml/validation.js"></script>
如果你这样写åQ?br />       <ww:form action="/foo/bar/new.action" validate="true"/>åQŒä½ ž®†å¾—不到客户端验证。要注意åQŒè¿™ä¸ªç»†èŠ‚ä¸å®¹å¿½è§†ã€‚æˆ‘è¢«è¿™ä¸ªå°é—®é¢˜æžå¤§å¤´äº†ã€‚åŽæ¥æŸ¥æ–‡æ¡£çš„æ—¶å€™æ‰çŸ¥é“Webwork已经提醒我们要像上一¿Uå†™æ³•那样写。因为她要知道哪个名字空间下的哪个Action需要被验证åQçœ‹å§ã€‚这是心急的错。不看文档后果就自负ã€?br />       以上两种写法åQŒåœ¨™åµé¢ä¸Šç”ŸæˆJs的结果是不一æ ïLš„。第一¿Uå†™æ³•会在页面上生成相应的验证规则。第二种写法生成的JsåQŒåªæ˜¯ç®€å•清楚报错信息然后提交请求到服务器,由服务器来验证ã€?br />
       只需要这三步åQŒWebwork2.2.2的客æˆïL«¯éªŒè¯åŠŸèƒ½ž®Þq®—是ä‹É用了。感觉还不错。唯一¾U³é—·çš„还是Webwork强制我什么ä‹É用她的模æÑ€?br />       Ps:有很多示例代码没同脓出来åQŒæ˜¯æœ‰åŽŸå› D。现在编辑是使用FCKEditoråQŒå¦å¤–两个Editor在我的机子上变成了白痴。出错、完全不能编辑。。。手上又没有好的“XMLåˆ?HTML”的好工具。。所以没把代码脓上来。。详情,可以看Webworkçš„Showcase。这东西太出彩了。:P

]]>
Webwork Forward 2 htmlhttp://www.aygfsteel.com/aichan/archive/2006/03/26/37420.html艑ְ˜è‰‘Ö°˜Sat, 25 Mar 2006 16:33:00 GMThttp://www.aygfsteel.com/aichan/archive/2006/03/26/37420.htmlhttp://www.aygfsteel.com/aichan/comments/37420.htmlhttp://www.aygfsteel.com/aichan/archive/2006/03/26/37420.html#Feedback4http://www.aygfsteel.com/aichan/comments/commentRss/37420.htmlhttp://www.aygfsteel.com/aichan/services/trackbacks/37420.htmlWeb‹¹è§ˆå™¨æ˜¯å¦èƒ½æ­£ç¡®æ˜„¡¤ºä¸€ä¸ªWeb™åµé€šå¸¸ä¾èµ–两个条äšgåQ?br />一、页面的¾~–码åQˆæ–‡ä»¶ç¼–码).
二、该™åµå®šä¹‰çš„contentType.

其中™åµé¢çš„编码是军_®šæ€§çš„因素。两者一致是åQŒæµè§ˆå™¨ä¼šæ­£å¸¸æ˜¾½Cºå†…容,否则有可能äñ”ç”ŸäØ•ç çŽ°åƒã€?/font>

如果一个Htmlæ–‡äšgåQŒæ–‡ä»¶ç¼–ç äØ“UTF-8。contentTypeè®¾äØ“ç›¸åŒã€‚åˆ™ä½¿ç”¨IE或Firefox查看åQŒä¸¤è€…都会自动选择正确的编码åŞ式来解释。当我将contentTypeè®¾äØ“GB2312åQŒä»¥ä¸ÞZ¼šé€ æˆä¹Þq åQŒç»“æžœä¸ä¼šã€‚æˆ‘è®¤äØ“åŽŸå› æ˜¯è¿™æ ïLš„åQšæ–‡ä»¶ç¼–ç è“v军_®šä½œç”¨åQŒåŠ ä¸ŠUtf-8包括了GB该有的字½W¦ï¼Œæ‰€ä»¥è¿™¿Uæƒ…冉|˜¯ä»¥å¤§çš„æ¥è®¤è¯†ž®çš„。没问题。(不知是否有理解错è¯? åQšPåQ‰ã€?/font>

上述情况ä¸ÞZ‹É用浏览器直接把开¾|‘页文äšg的结果。当我ä‹É用Webworkçš„Actionæ—Óž¼Œž®†Htmlæ–‡äšgä½œäØ“¾l“æžœæ—Óž¼ˆ¾l“æžœ¾cÕdž‹ä¸ºdispatcheråQ‰ï¼Œä¹Þq å‡ºçŽ°äº†ï¼æ–‡äšg¾~–码为UTF-8åQŒé¡µé¢å®šä¹‰çš„ContentType为UTF-8。但是偏偏ä‹É用IE及FireFox均得åˆîCؕ码的¾l“果。郁闷中用Firefox查看了页面的属性,惊奇地发现页面编码居然是GB2312。我猜想是Webwork在Dispatch™åµé¢çš„æ—¶å€™ä‹É用了默认的编码,把本来UTF-8¾~–码的页面重新用GB2312¾~–码一‹Æ¡ã€‚于是试着在Action里面获得Responseòq¶æŠŠå­—符¾~–ç æ”¹äØ“UTF-8。最后发现结果依然一栗÷€‚è¿™æ—Óž¼Œæˆ‘觉得在Action完成后,Webwork接下来ä‹É用了ResponseåQŒæˆ‘的设¾|®è¢«é‡ç½®äº†ã€‚于是决定自已写一个ServletåQŒæŒ‡å®šå­—½W¦ç¼–ç äØ“UTF-8åQŒç»“果直接Forward到我的Html™åµé¢ã€‚结果正¼‹®äº†åQå†æŸ¥çœ‹™åµé¢ä¿¡æ¯åQŒä¸¤è€…都是UTF-8了ã€?br />

òqÏx—¶ä½¿ç”¨Webwork来Dispatch的都是JspåQŒä¸æ›‘Ö‡ºçŽ°è¿‡˜q™æ ·çš„æƒ…å†üc€‚原因是Jsp仍需要编译,¾~–译时会è¯Õd–Jsp™åµé¢æŒ‡å®šçš„ContentType来决定Response里的字符¾~–码。HTMLæ–‡äšg则不一栗÷€‚这时只能ä‹É用默认编码。如果我的工½E‹æ˜¯Gb2312åQŒé‚£æ ÒŽœ¬ž®×ƒ¸å­˜åœ¨åˆšæ‰æ‰€è®²çš„问题的ã€?/font>



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º äÓÆÖÏØ| ÓÀÈÊÏØ| ÈýºÓÊÐ| ÒÍÁ¼ÏØ| ˼ÄÏÏØ| ËçÄþÏØ| ×óÈ¨ÏØ| À¼Æº| ӥ̶ÊÐ| ÍþÔ¶ÏØ| °²Î÷ÏØ| »ÆÆÖÇø| Çå½§ÏØ| Î÷·áÏØ| Íû½­ÏØ| ÀóÆÖÏØ| С½ðÏØ| ÑÓÊÙÏØ| ÅíÔóÏØ| ½­¶¼ÊÐ| ÄÚÏçÏØ| Ì©ÄþÏØ| í¸É½ÏØ| ãôºéÏØ| ºªµ¦ÊÐ| ʯ¾°É½Çø| ÁøÖÝÊÐ| ÀóÆÖÏØ| ÑÀ¿ËʯÊÐ| Á¹É½| Ä˶«ÏØ| ³¤ÁëÏØ| ÑâÉ½ÏØ| ÓÑÒêÏØ| ÕòÆ½ÏØ| ¶¼ÔÈÊÐ| ¿µ±£ÏØ| ºÓ¼äÊÐ| ӥ̶ÊÐ| ËÉÏªÏØ| À´°²ÏØ|