<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    WaveSun

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      17 隨筆 :: 0 文章 :: 3 評論 :: 0 Trackbacks

    2010年3月22日 #

         摘要: 這個滑動條(拖動條)效果,一開始是參考了BlueDestiny的slider和Apple產品展示的樣式,做了程序的原 型。 在做了拖放效果之后,我想應該可以做一個更好的了,所以重做一遍,完善和擴展了一些功能。 礙于時間沒有做得很強大,都是一些基本功能,希望各位多提意見! 效果預覽 0){ this._IsMin = false; }else{ if(!this._IsMin)...  閱讀全文
    posted @ 2010-03-22 15:31 WaveSun 閱讀(611) | 評論 (0)編輯 收藏

    2010年3月9日 #

    Spring入門

    Spring是一個非常優秀的輕量級框架,通過Spring的IoC容器,我們的關注點便放到了需要實現的業務邏輯 上。對AOP的支持則能讓我們動態增強業務方法。編寫普通的業務邏輯Bean是非常容易而且易于測試的,因為它能脫離J2EE容器(如 Servlet,jsp環境)單獨進行單元測試。最后的一步便是在Spring框架中將這些業務Bean以XML配置文件的方式組織起來,它們就按照我們 預定的目標正常工作了!非常容易!

    本文將給出一個基本的Spring入門示例,并演示如何使用Spring的AOP將復雜的業務邏輯分離到每個方面中。

    1.開發環境配置2.編寫Bean接口及其實現3.在Spring中配置Bean并獲得Bean的實例4.編寫Advisor以增強 ServiceBean5.總結

    1.開發環境配置

    首先,需要正確配置Java環境。推薦安裝JDK1.4.2,并正確配置環境變量:

    JAVA_HOME=<JDK安裝目錄>CLASSPATH=.Path=%JAVA_HOME%"bin;……

    我們將使用免費的Eclipse 3.1作為IDE。新建一個Java Project,將Spring的發布包spring.jar以及commons-logging-1.0.4.jar復制到Project目錄下,并在 Project > Properties中配置好Java Build Path:

    Spring入門(圖一)

    點擊查看大圖 2.編寫Bean接口及其實現

    我們實現一個管理用戶的業務Bean。首先定義一個ServiceBean接口,聲明一些業務方法:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    /** * Interface of service facade. *  * @author Xuefeng */public interface ServiceBean {    void addUser(String username, String passWord);    void deleteUser(String username);    boolean findUser(String username);    String getPassword(String username);}

    然后在MyServiceBean中實現接口:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 *  * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    import java.util.*;

    public class MyServiceBean implements ServiceBean {

        private String dir;    private Map map = new HashMap();

        public void setUserDir(String dir) {        this.dir = dir;        System.out.println("Set user dir to: " + dir);    }

        public void addUser(String username, String password) {        if(!map.containsKey(username))            map.put(username, password);        else            throw new RuntimeException("User already exist.");    }

        public void deleteUser(String username) {        if(map.remove(username)==null)            throw new RuntimeException("User not exist.");    }

        public boolean findUser(String username) {        return map.containsKey(username);    }

        public String getPassword(String username) {        return (String)map.get(username);    }}


    為了簡化邏輯,我們使用一個Map保存用戶名和口令。

    現在,我們已經有了一個業務Bean。要測試它非常容易,因為到目前為止,我們還沒有涉及到Spring容器,也沒有涉及到任何Web容器(假定這 是一個Web應用程序關于用戶管理的業務Bean)。完全可以直接進行Unit測試,或者,簡單地寫個main方法測試:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    public class Main {

        public static void main(String[] args) throws Exception {        ServiceBean service = new MyServiceBean();        service.addUser("bill", "hello");        service.addUser("tom", "goodbye");        service.addUser("tracy", "morning");        System.out.println("tom's password is: " + service.getPassword("tom"));        if(service.findUser("tom")) {            service.deleteUser("tom");        }    }}

    執行結果:Spring入門(圖二)

    3.在Spring中配置Bean并獲得Bean的實例

    我們已經在一個main方法中實現了業務,不過,將對象的生命周期交給容器管理是更好的辦法,我們就不必為初始化對象和銷毀對象進行硬編碼,從而獲 得更大的靈活性和可測試性。

    想要把ServiceBean交給Spring來管理,我們需要一個XML配置文件。新建一個beans.xml,放到src目錄下,確保在 classpath中能找到此配置文件,輸入以下內容:

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>    <bean id="service" class="com.crackj2ee.example.spring.MyServiceBean" /></beans>

    以上XML聲明了一個id為service的Bean,默認地,Spring為每個聲明的Bean僅創建一個實例,并通過id來引用這個 Bean。下面,我們修改main方法,讓Spring來管理業務Bean:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.ClassPathResource;

    public class Main {

        public static void main(String[] args) throws Exception {        // init factory:        XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));        // use service bean:        ServiceBean service = (ServiceBean)factory.getBean("service");        service.addUser("bill", "hello");        service.addUser("tom", "goodbye");        service.addUser("tracy", "morning");        System.out.println("tom's password is """ + service.getPassword("tom") + """");        if(service.findUser("tom")) {            service.deleteUser("tom");        }        // close factory:        factory.destroySingletons();    }}


    執行結果: Spring入門(圖三)

    由于我們要通過main方法啟動Spring環境,因此,首先需要初始化一個BeanFactory。紅色部分是初始化Spring的 BeanFactory的典型代碼,只需要保證beans.xml文件位于classpath中。

    然后,在BeanFactory中通過id查找,即可獲得相應的Bean的實例,并將其適當轉型為合適的接口。

    接著,實現一系列業務操作,在應用程序結束前,讓Spring銷毀所有的Bean實例。

    對比上一個版本的Main,可以看出,最大的變化是不需要自己管理Bean的生命周期。另一個好處是在不更改實現類的前提下,動態地為應用程序增加 功能。

    4.編寫Advisor以增強ServiceBean

    所謂AOP即是將分散在各個方法處的公共代碼提取到一處,并通過類似攔截器的機制實現代碼的動態織入。可以簡單地想象成,在某個方法的調用前、返回 前、調用后和拋出異常時,動態插入自己的代碼。在弄清楚Pointcut、Advice之類的術語前,不如編寫一個最簡單的AOP應用來體驗一下。

    考慮一下通常的Web應用程序都會有日志記錄,我們來編寫一個LogAdvisor,對每個業務方法調用前都作一個記錄:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;

    public class LogAdvisor implements MethodBeforeAdvice {    public void before(Method m, Object[] args, Object target) throws Throwable {        System.out.println("[Log] " + target.getClass().getName() + "." + m.getName() + "()");    }}

    然后,修改beans.xml:

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans>    <bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />

        <bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />

        <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">        <property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property>        <property name="target"><ref local="serviceTarget"/></property>        <property name="interceptorNames">            <list>                <value>logAdvisor</value>            </list>        </property>    </bean></beans>

    注意觀察修改后的配置文件,我們使用了一個ProxyFactoryBean作為service來與客戶端打交道,而真正的業務Bean即 MyServiceBean被聲明為serviceTarget并作為參數對象傳遞給ProxyFactoryBean,proxyInterfaces 指定了返回的接口類型。對于客戶端而言,將感覺不出任何變化,但卻動態加入了LogAdvisor,關系如下: Spring入門(圖四)


    運行結果如下,可以很容易看到調用了哪些方法: Spring入門(圖五)

    要截獲指定的某些方法也是可以的。下面的例子將修改getPassword()方法的返回值:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;

    public class PasswordAdvisor implements MethodInterceptor {    public Object invoke(MethodInvocation invocation) throws Throwable {        Object ret = invocation.proceed();        if(ret==null)            return null;        String password = (String)ret;        StringBuffer encrypt = new StringBuffer(password.length());        for(int i=0; i<password.length(); i++)            encrypt.append('*');        return encrypt.toString();    }}

    這個PasswordAdvisor將截獲ServiceBean的getPassword()方法的返回值,并將其改為"***"。繼續 修改beans.xml:

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>    <bean id="serviceTarget" class="com.crackj2ee.example.spring.MyServiceBean" />

        <bean id="logAdvisor" class="com.crackj2ee.example.spring.LogAdvisor" />

        <bean id="passwordAdvisorTarget" class="com.crackj2ee.example.spring.PasswordAdvisor" />

        <bean id="passwordAdvisor" class="org.springframework.aop.support.RegeXPMethodPointcutAdvisor">        <property name="advice">            <ref local="passwordAdvisorTarget"/>        </property>        <property name="patterns">            <list>                <value>.*getPassword</value>            </list>        </property>    </bean>

        <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">        <property name="proxyInterfaces"><value>com.crackj2ee.example.spring.ServiceBean</value></property>        <property name="target"><ref local="serviceTarget"/></property>        <property name="interceptorNames">            <list>                <value>logAdvisor</value>                <value>passwordAdvisor</value>            </list>        </property>    </bean></beans>


    利用Spring提供的一個RegexMethodPointcutAdvisor可以非常容易地指定要截獲的方法。運行結果如下,可以看到返回結果變 為"******": Spring入門(圖六)

    還需要繼續增強ServiceBean?我們編寫一個ExceptionAdvisor,在業務方法拋出異常時能做一些處理:

    /** * Copyright_2006, Liao Xuefeng * Created on 2006-3-9 * For more information, please visit: http://www.crackj2ee.com */package com.crackj2ee.example.spring;

    import org.springframework.aop.ThrowsAdvice;

    public class ExceptionAdvisor implements ThrowsAdvice {    public void afterThrowing(RuntimeException re) throws Throwable {        System.out.println("[Exception] " + re.getMessage());    }}

    將此Advice添加到beans.xml中,然后在業務Bean中刪除一個不存在的用戶,故意拋出異常:

    service.deleteUser("not-exist");

    再次運行,注意到ExceptionAdvisor記錄下了異常: Spring入門(圖七)

    5.總結

    利用Spring非常強大的IoC容器和AOP功能,我們能實現非常靈活的應用,讓Spring容器管理業務對象的生命周期,利用AOP增強功能, 卻不影響業務接口,從而避免更改客戶端代碼。

    為了實現這一目標,必須始終牢記:面向接口編程。而Spring默認的AOP代理也是通過Java的代理接口實現的。雖然Spring也可以用 CGLIB實現對普通類的代理,但是,業務對象只要沒有接口,就會變得難以擴展、維護和測試。

    歡迎來信與作者交流:asklxf@163.com

    可以從此處下載完整的Eclipse工程:

    springbasic.rar

    (出處:http://www.jzwiki.com/article_1215945431010.shtml#)

    posted @ 2010-03-09 13:00 WaveSun 閱讀(258) | 評論 (0)編輯 收藏


    當你在客戶端用view source看JSP生成的代碼時,會發現有很多空行,他們是由<%...%>后的回車換行而生成的,也就是說每一行 由<%...%>包含的JSP代碼到客戶端都變成一個空行,雖然不影響瀏覽,但還是希望能把他們刪掉

    辦法如下:(網上收集整理)

    1. 支持JSP 2.1+ ,在每個要去空行的頁面里包含下面代碼:

      

    <%@ page trimDirectiveWhitespaces="true" %>

    在 Tomcat 6.0.14下測試成功


    2. 支持servlet 2.5+, 即 web.xml的 XSD版本為2.5,在web.xml中加入如下代碼

      

    <jsp-config>
          
    <jsp-property-group>
            
    <url-pattern>*.jsp</url-pattern>
            
    <trim-directive-whitespaces>true</trim-directive-whitespaces>
          
    </jsp-property-group>
        
    </jsp-config>

    在tomcat 6.0.14下測試成功


    3. Tomcat 5.5.x+,在Tomcat安裝目錄/conf/web.xml中找到名叫"jsp"的servlet,添加下面一段代碼:

    <init-param>
            
    <param-name>trimSpaces</param-name>
            
    <param-value>true</param-value>
        
    </init-param>


     

    本人沒測過,不過tomcat中web.xml文件的幫助這么說的

    trimSpaces          Should white spaces in template text between  actions or directives be trimmed?  [false]

    所以應該可行 

    發表于 @ 2008年05月23日 11:40:00 | 評論( 3 ) | 舉報| 收藏

    mcoldice 發 表于2009年2月23日 16:56:39  舉 報回復
    關于第三條:
    1 確實有效
    2 5.0也同樣有效,所以不時必須要5.5.x+
    mcoldice 發 表于2009年2月23日 16:56:53  舉 報回復
    關于第三條:
    1 確實有效
    2 5.0也同樣有效,所以不時必須要5.5.x+
    xuhaiyang 發 表于2009年2月23日 17:55:25  舉 報回復
    因 為沒用5.0測過,所以就沒寫出來。
    謝謝你的補測。
    原文地址:http://blog.csdn.net/xuhaiyang/archive/2008/05/23/2472591.aspx
    posted @ 2010-03-09 10:08 WaveSun 閱讀(986) | 評論 (0)編輯 收藏

    關鍵字: jsp <jsp-config>
    <jsp-config> 包括 <taglib> <jsp-property-group> 兩個子元素。其中<taglib> 元素在JSP 1.2 時就已經存在;而<jsp-property-group>JSP 2.0 新增的元素。<jsp-property-group> 元素主要有八個子元素,它們分別為:
    1.<description>:設定的說明
    2.<display-name>:設定名稱
    3.<url-pattern>:設定值所影響的范圍,如: /CH2 /*.jsp
    4.<el-ignored>:若為 true,表示不支持 EL 語法
    5.<scripting-invalid>:若為 true,表示不支持 <% scripting %>語法
    6.<page-encoding>:設定 JSP 網頁的編碼
    7.<include-prelude>:設置 JSP 網頁的抬頭,擴展名為 .jspf
    8.<include-coda>:設置 JSP 網頁的結尾,擴展名為 .jspf

    一個簡單的<jsp-config> 元素完整配置:

    Xml代碼
    1. <jsp-config>     
    2.   <taglib>     
    3.     <taglib-uri>Taglib</taglib-uri>     
    4.     <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>     
    5.   </taglib>     
    6.   <jsp-property-group>     
    7.     <description>Special property group for JSP Configuration JSP example.</description>     
    8.     <display-name>JSPConfiguration</display-name>     
    9.     <url-pattern>/jsp/* </url-pattern>     
    10.     <el-ignored>true</el-ignored>     
    11.     <page-encoding>GB2312</page-encoding>     
    12.     <scripting-invalid>true</scripting-invalid>     
    13.     <include-prelude>/include/prelude.jspf</include-prelude>     
    14.     <include-coda>/include/coda.jspf</include-coda>     
    15.   </jsp-property-group>     
    16. </jsp-config>  
     
    對于Web 應用程式來說,Scriptlet 是個不樂意被見到的東西,因為它會使得HTMLJava 程式碼交相混雜,對于程式的維護來說相當的麻煩,必要的時候,您可以在web.xml 中加上<script-invalid> 標簽,設定所有的JSP 網頁都不可以使用Scriptlet ,例如:
    Xml代碼
    1. <web-app ..>  
    2.     ....  
    3.     <jsp-config>  
    4.         <jsp-property-group>  
    5.             <url-pattern>*.jsp</url-pattern>  
    6.             <script-invalid>true</script-invalid>  
    7.         </jsp-property-group>  
    8.     </jsp-config>  
    9. ....  
    10. </web-app>  
     
    原文地址:http://janwer.javaeye.com/blog/150217
    posted @ 2010-03-09 09:51 WaveSun 閱讀(605) | 評論 (0)編輯 收藏

    2009年6月16日 #

         摘要:   閱讀全文
    posted @ 2009-06-16 12:02 WaveSun 閱讀(268) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2009-06-16 11:54 WaveSun 閱讀(238) | 評論 (0)編輯 收藏

    2009年6月9日 #

         摘要:   閱讀全文
    posted @ 2009-06-09 18:38 WaveSun 閱讀(227) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2009-06-09 11:22 WaveSun 閱讀(224) | 評論 (0)編輯 收藏

    2009年6月8日 #



    posted @ 2009-06-08 16:44 WaveSun 閱讀(219) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2009-06-08 10:56 WaveSun 閱讀(1206) | 評論 (0)編輯 收藏

    僅列出標題  下一頁
    主站蜘蛛池模板: 免费一级毛片在线播放不收费| 成人毛片18女人毛片免费| 中文字幕第一页亚洲| 日本亚洲中午字幕乱码| 国产嫩草影院精品免费网址| 亚洲精品永久在线观看| 天天操夜夜操免费视频| 亚洲欧美日韩中文二区| 日产乱码一卡二卡三免费| 美女被免费网站在线视频免费| 免费人成视网站在线观看不卡| 国产亚洲精品美女久久久久| 日韩精品电影一区亚洲| 香蕉视频在线免费看| 亚洲天天做日日做天天看| 国产在线jyzzjyzz免费麻豆| 亚洲日本VA午夜在线影院| 免费大学生国产在线观看p| 手机永久免费的AV在线电影网| 亚洲无码在线播放| 88av免费观看| 亚洲中文无码永久免| 四虎永久免费网站免费观看| 九九热久久免费视频| 久久精品国产亚洲av麻| 中国在线观看免费国语版| 国产亚洲综合一区二区三区| 亚洲欧洲无码AV电影在线观看| 日韩精品内射视频免费观看| 亚洲午夜精品在线| mm1313亚洲精品无码又大又粗| 99久久婷婷免费国产综合精品| 色婷婷亚洲十月十月色天| 大陆一级毛片免费视频观看i| 特a级免费高清黄色片 | 爱情岛论坛网亚洲品质自拍| 中文字幕无码免费久久| 亚洲中文字幕日本无线码 | 中文字幕亚洲一区| 日韩亚洲国产高清免费视频| 色婷婷综合缴情综免费观看|