posts - 22, comments - 32, trackbacks - 0, articles - 73
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          搜索

          •  

          最新評論

           

          Hiberante3 一級緩存總結

          1.             Session 級別的緩存,它同session邦定。它的生命周期和session相同。Session消毀,它也同時消毀;管理一級緩存,一級緩存無法取消,用兩個方法管理,clear(),evict()

          2.             兩個session 不能共享一級緩存,因它會伴隨session的生命周期的創建和消毀;

          3.             Session緩存是實體級別的緩存,就是只有在查詢對象級別的時候才使用,如果

          使用HQLSQL是查詢屬性級別的,是不使用一級緩存的!切記!!!!

          4 .  iterate 查詢使用緩存,會發出查詢IdSQLHQL語句,但不會發出查實體的,

          它查詢完會把相應的實體放到緩存里邊,一些實體查詢如果緩存里邊有,就從緩存中查詢,但還是會發出查詢idSQLHQL語句。如果緩存中沒有它會數據庫中查詢,然后將查詢到的實體一個一個放到緩存中去,所以會有N+1問題出現。

          5 . List()iterate 查詢區別:

          使用iterate,list查詢實體對象*N+1問題,在默認情況下,使用query.iterate查詢,有可以能出現N+1問題

          所謂的N+1是在查詢的時候發出了N+1sql語句1:首先發出一條查詢對象id列表的sqlN:

          根據id列表到緩存中查詢,如果緩存中不存在與之匹配的數據,那么會根據id發出相應的sql語句listiterate的區別?

          list每次都會發出sql語句,list會向緩存中放入數據,而不利用緩存中的數據

          iterate:在默認情況下iterate利用緩存數據,但如果緩存中不存在數據有可以能出現N+1問題

          6Get()load(),iterate方法都會使用一級緩存,

           

          7.hiberate3 session 存儲過程如下:

                 例如 object 對象

                 Session.save(object);

                 這時候不會把數據放到數據庫,會先放到session緩存中去,數據庫中沒有相應記錄,session.flush();才發SQLHQL語句,數據庫中有了相應記錄,

                 但是數據庫用select查不到,這是跟數據庫事物級別有關系,(這里在說下數據庫的事務隔離級別一共四種如下:)
              數據庫隔離級別:
                  隔離級別                       是否存在臟讀  是否存在不可重復讀     是否存在幻讀;
              Read UnCommited(未提交讀)               Y            Y                     Y
              Read Commited (提交讀 oraclel默認)      N            Y                     Y
              Repeatable Read(不可重復讀(Msql默認))  N            N                     Y 
              Serializable(使用很少)                  N            N                     N

              


                 Session.beginTrransaction().commit();

                 事物提交后可以查詢到了。

          Session.flush()語句但是為什么不寫呢,因為commit()會默認調用flush();


          Hiberante3 二級緩存總結

          1.Hibernate3的(sessionFactory)二級緩存和session級別的緩存一樣都只對實體對象做緩存,不對屬性級別的查詢做緩存;二級緩存的生命周期和sessionFactory的生命周期是一樣的,sessionFactory可以管理二級緩存;

          2.sessionFactory級別的緩存,需要手動配置;所有的session可以共享sessionFactory 級別的緩存;(一般把一些不經常變化的實體對象放到sessionFactory級別的緩存中,適合放不經常變化的實體對象。)

          3.Hiberante3二級緩存的配置和使用方法如下:

          1. 必須把ehcache.jar包導入,然后到Hibernate3.2etc文件下把ehcache.xml復制到工程src目錄下(ehcache.xml里邊的參數里邊有詳細英文說明);

          (說明:ehcache.jar是第三方法的緩存產品,hiberante只是把它做了集成,還有好多第三方hibernate集成的緩存產品,相關說明請查閱hiberante3開發手冊;ehcache支持分布應用的(這個和Hibernate3.2開發手冊有出入,經過官網查證確實支持了),如果有分布式需求,請換成支持分布式的二級緩存產品,hiberate3開發手冊都有相頭說明。配置方法都類似);

          4.Hibernate3的二級緩存默認是開起的,也可以指定開起。在hibernate.cfg.xml 文件下配置如下:

          *修改hibernate.cfg.xml文件,開戶二級緩存;

                               <property name=”hibernate.cache.use_second_level_cache”>true</property>

                               *指定二級緩存產品的提供商;

          <property name=”hibernate.cache.provider_class”> org.hibernate.cache.EhCacheProvider

          </property>

          要讓那些實體使用二級緩存,在hibernate.cfg.xml配置文件中加入:

          <!—

          讓這個實體用二級緩存 也可以在實體中映射文件去配置即:

          <cache usage="read-only"/>

          -->

          <class-cache class=”com.zzz.hibernate.ClassT” usage=”read-only”/>

          Read-only一般使用這個策略,其它的hibernate3開發手冊中也有詳細介紹;

          CacheModehibernate3開發手冊中搜索這個關鍵字,可以找到一級緩存和二級緩存交互使用的問題;

          posted @ 2009-08-11 23:01 為自己代言 閱讀(7897) | 評論 (3)編輯 收藏

          這里為什么使用struts2.0.14這個版本呢??請看官網的文章如下:

          24 November 2008 - Struts 2.0.14 General Availability Release

          The latest release of Struts 2 is Struts 2.0.14, which was promoted to "General Availability" on 24 November 2008.

          For changes included in Struts 2.0.14, see the release notes. Struts 2.0.14 is a bugfix release for version 2.0.12, which provided important security fixes. Struts 2.0.14 addresses two major bugs introduced with these security fixes, keeping the FilterDispatcher from serving built in static resources, and keeping conversion error messages from being displayed. All developers are strongly encouraged to update existing Struts 2 applications to Struts 2.0.14.

          如果你的英語不差的話,自己去看下吧.這段英語的大概意思是,Struts 2.0.14修正了Struts 2.0.12 的兩個主要的bug ;并且建議開發者更新到Struts 2.0.14
          這個版本.Struts 2.0.14 General Availability Release 這是個通用的開發版本.
          其實我在整合這個S2SH時,struts2 的最新版本是struts2.1.16 這個也是穩家版本,不過最新的版本網上資料很少.所以...........! 如果自己學的話可以選擇這個兩個版本.
          下邊是整合的全過程:
          主要是jar包的引入,我個人比較不喜歡用IDE 工具自動引入jar包,所以下邊是自己用的jar的引入,這樣可以省去相關jar 的沖突;

          1:首先struts2.0.14所需要的jar包如下:
          commons-logging-1.0.4  ;
          freemarker-2.3.8
           ognl-2.6.11
          struts2-core-2.0.14
          xwork-2.0.7
          struts2-spring-plugin-2.0.14  這是整合spring 必需的jar 包,從它的名字就可以看出來了!   

          2:hiberante3.2 jar 包如下 這是我的工程必需的,如果你的工程要用到其它的jar包可以去看一看hibernate 的必讀文件那里有很詳細的解釋;
                      這個是做一般的工程,引入最少的jar 了,一般的項目都可以了!

          antlr-2.7.6         cglib-2.1.3     commons-collections-2.1.1    commons-logging-1.0.4      dom4j-1.6.1  
          ehcache-1.2.3    hibernate3     jaas        jaxen-1.1-beta-7     jdbc2_0-stdext     jta    log4j-1.2.11  
          xml-apis             asm             asm-attrs 

          如果你自己不做整合的,就是單獨做hibernate 學習,本人建議你把所有jar 都導入項目的lib目錄下!這里不在做任何解釋了!

          3:  spring 2.5.6  相關的jar 也是做項目最少引入的jar包了,如果自己還需要特定的自己去引入;

              aspectjrt    aspectjweaver   ( 這兩個是AOP 相關的jar包,因為spring  2.5的AOP實現,沒有自己去做,也用到了第三方組件,分開了,這好像和2.0版本有出入!有關細節,請自己去查閱相關文檔)
              spring

          好的,這三個框架所有jar 包,都介紹完了,(不要奇怪我的所有jar 包沒有后綴名,是我自己給隱藏了)

          好的進入主題了(順序最好 hibernate --->spring---->struts)

          1:把相關的hibernate  jar 包導入項目lib 目錄下!
          2: 把spring  相關jar   包導入項目lib 目錄下!
          3: 把struts2相關jar   包導入項目lib 目錄下!

          三者整合:
          web.xml文件如下里邊都有解釋自己看吧:

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

           <!-- 配置spring監聽器和上下文變量 -->
           <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext-*.xml</param-value>
           </context-param>

           <listener>
            <listener-class>
             org.springframework.web.context.ContextLoaderListener
            </listener-class>
           </listener>
           <!-- spring end -->

          <!-- 配置字符過濾器-->
           <filter>
            <filter-name>encodingFilter</filter-name>
            <filter-class>
             org.springframework.web.filter.CharacterEncodingFilter
            </filter-class>
            <init-param>
             <param-name>encoding</param-name>
             <param-value>GBK</param-value>
            </init-param>
           </filter>
           <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>

           <!--讓spring來過濾管理Hiberante中的session-->
           <filter>
            <filter-name>lazyLoadingFilter</filter-name>
            <filter-class>
             org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
            </filter-class>
           </filter>

           <!-- spring end -->

           <!-- 增加struts2所需要的過濾器,以便在服務器啟動時,攔截URL請求 -->
           <filter>
            <filter-name>struts2</filter-name>
            <filter-class>
             org.apache.struts2.dispatcher.FilterDispatcher
            </filter-class>
           </filter>

           <filter-mapping>
            <filter-name>lazyLoadingFilter</filter-name>
            <url-pattern>*.action</url-pattern>
           </filter-mapping>


           <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>
            </web-app>


          applicationContext-common.xml 文件:其中我使用了,DBCP數據庫連接波,如果你自己想用,
                                     還的去下載相關的jar 包( commons-dbcp-1.2.2   commons-pool-1.3)記著引入哦!

          我下邊注釋掉的就是沒有用數據庫連接池的,也就是不把src目錄下的hibernate.cfg.xml刪除.上邊用到的數據庫連接池的,就不用這個文件了,直接都用spring來管理啦!!!!

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
                     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
           <!-- 用DBCP數據庫連接波來配置hibernate數據庫連接 -->
           
            <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName"
            value="com.mysql.jdbc.Driver">
            </property>
            <property name="url" value="jdbc:mysql://localhost/oa"></property>
            <property name="username" value="root"></property>
            <property name="password" value="root"></property>
            </bean>
           
           <!-- 配置sessionFactory -->
            
            <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource">
            <ref bean="dataSource" />
            </property>
            <property name="hibernateProperties">
            <props>
            <prop key="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
            </prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
            </property>
            <property name="mappingResources">
            <list>
            <value>com/oa/model/Person.hbm.xml</value>
            <value>com/oa/model/Organization.hbm.xml</value>
            </list>
            </property>
            </bean>
            
          <!-- 讓spring管理sessionFactory的加一種方法 ,就是不刪除hibernate.cfg.xml文件;
           <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation">
             <value>classpath:hibernate.cfg.xml</value>
            </property>
           </bean>
          --> 
            
           <!-- 配置hibernate事物讓spring來管理 -->
           <bean id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory">
             <ref bean="sessionFactory" />
            </property>
           </bean>
           <!-- 配置事物的傳播特性 -->
           <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
             <tx:method name="add*" propagation="REQUIRED" />
             <tx:method name="delete*" propagation="REQUIRED" />
             <tx:method name="update*" propagation="REQUIRED" />
             <tx:method name="*" read-only="true" />
            </tx:attributes>
           </tx:advice>
           <!-- 那些類的那些方法需要事物; -->
           <aop:config>
            <aop:pointcut id="allManagerMethod"
             expression="execution(* com.oa.manager.*.*(..))" />
            <aop:advisor pointcut-ref="allManagerMethod"
             advice-ref="txAdvice" />
           </aop:config>
          </beans>

          對了還需要注意的一個地方就是如果用了,我這種數據庫連接池技術,得把你的數據庫驅動類,復制tomcat lib 目錄下.不然會報錯的!

          好了三個東西整合好,我也是費了九牛二虎之力才整合成功的.
          如果有什么問題發我的郵箱一起交流:zzzlyr@163.com



          posted @ 2009-07-11 00:03 為自己代言 閱讀(1656) | 評論 (1)編輯 收藏

          下面以三個頁面分別命名為framedemo.html,left.html,right.html為例來具體說明如何做。

          其中framedemo.html由左右兩個頁面組成,代碼如下:

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
          <HTML>
          <HEAD>
          <TITLE> frameDemo </TITLE>
          </HEAD>
          <frameset cols="200,*">
          <frame name=top src="left.html">
          <frame name=button src="right.html">
          </frameset>
          </HTML>

          現在假設left.html即上面的頁面有一個button來實現對下面頁面的刷新,可以用以下七種語句,哪個好用自己看著辦了。

          語句1. window.parent.frames[1].location.reload();

          語句2. window.parent.frames.bottom.location.reload();

          語句3. window.parent.frames["bottom"].location.reload();

          語句4. window.parent.frames.item(1).location.reload();

          語句5. window.parent.frames.item('bottom').location.reload();

          語句6. window.parent.bottom.location.reload();

          語句7. window.parent['bottom'].location.reload();

          解釋一下:

          1.window指代的是當前頁面,例如對于此例它指的是top.html頁面。

          2.parent指的是當前頁面的父頁面,也就是包含它的框架頁面。例如對于此例它指的是framedemo.html。

          3.frames是window對象,是一個數組。代表著該框架內所有子頁面。

          4.item是方法。返回數組里面的元素。

          5.如果子頁面也是個框架頁面,里面還是其它的子頁面,那么上面的有些方法可能不行。
          top.html源代碼;(頁面上有七個按鈕,功能都是刷新下面的框架頁面)

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
          <HTML>
          <HEAD>
          </HEAD>
          <BODY>
          <input type=button value="刷新1" onclick="window.parent.frames[1].location.reload()"><br>
          <input type=button value="刷新2" onclick="window.parent.frames.bottom.location.reload()"><br>
          <input type=button value="刷新3" onclick="window.parent.frames['bottom'].location.reload()"><br>
          <input type=button value="刷新4" onclick="window.parent.frames.item(1).location.reload()"><br>
          <input type=button value="刷新5" onclick="window.parent.frames.item('bottom').location.reload()"><br>
          <input type=button value="刷新6" onclick="window.parent.bottom.location.reload()"><br>
          <input type=button value="刷新7" onclick="window.parent['bottom'].location.reload()"><br>
          </BODY>
          </HTML>

          下面是right.html頁面源代碼,為了證明下方頁面的確被刷新了,在裝載完頁面彈出一個對話框。

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
          <HTML>
          <HEAD>
          </HEAD>
          <BODY onload="alert('我被加載了!')">
          <h1>This is the content in button.html.</h1>
          </BODY>
          </HTML>

          經我測試,只能1 和4 顯示效果,別的好像不對喲
          ============================

          附:
          Javascript刷新頁面的幾種方法:
          1    history.go(0)
          2    location.reload()
          3    location=location
          4    location.assign(location)
          5    document.execCommand('Refresh')
          6    window.navigate(location)
          7    location.replace(location)
          8    document.URL=location.href

           

           

           

          自動刷新頁面的方法:
          1.頁面自動刷新:把如下代碼加入<head>區域中
          <meta http-equiv="refresh" content="20">
          其中20指每隔20秒刷新一次頁面.

          2.頁面自動跳轉:把如下代碼加入<head>區域中
          <meta http-equiv="refresh" content="20;url=http://www.wyxg.com">
          其中20指隔20秒后跳轉到http://www.wyxg.com頁面

          3.頁面自動刷新js版
          <script language="JavaScript">
          function myrefresh()
          {
                 window.location.reload();
          }
          setTimeout('myrefresh()',1000); //指定1秒刷新一次
          </script>

          ASP.NET如何輸出刷新父窗口腳本語句
          1.   this.response.write("<script>opener.location.reload();</script>");  

          2.   this.response.write("<script>opener.window.location.href = opener.window.location.href;</script>");   

          3.   Response.Write("<script language=javascript>opener.window.navigate(''你要刷新的頁.asp'');</script>")


          JS刷新框架的腳本語句

          //如何刷新包含該框架的頁面用   
          <script language=JavaScript>
             parent.location.reload();
          </script>   

          //子窗口刷新父窗口
          <script language=JavaScript>
              self.opener.location.reload();
          </script>

          ( 或 <a href="javascript:opener.location.reload()">刷新</a>   )

          //如何刷新另一個框架的頁面用   
          <script language=JavaScript>
             parent.另一FrameID.location.reload();
          </script>

          如果想關閉窗口時刷新或者想開窗時刷新的話,在<body>中調用以下語句即可。

          <body onload="opener.location.reload()">
          開窗時刷新
          <body onUnload="opener.location.reload()">
          關閉時刷新

          <script language="javascript">
          window.opener.document.location.reload()
          </script>

          posted @ 2009-05-22 22:55 為自己代言 閱讀(4618) | 評論 (0)編輯 收藏

          <!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=gb2312" />
          <title>js退出使用!</title>
           <script language="javascript">
            function logout(){
            if( confirm("你確實要退出嗎??")){
             window.parent.location.;
            }
            else{
             return;
            }
           }
           </script>
          </head>
           <p> <a href="javascript:logout()"> 退出</a></p>
          <a href="javascript:history.back();">返回</a>
          <body>
          </body>
          </html>

          posted @ 2009-05-22 22:44 為自己代言 閱讀(5104) | 評論 (0)編輯 收藏

          <%@include file="/common/taglib.jsp"%>
          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
          <title>網站后臺管理系統</title>
           <%@include file="/common/metadata.jsp"%>
           <link href="${ctx}/admin/style/css_body.css" rel="stylesheet" type="text/css" />
           <script type="text/javascript">
                function del(id){
                  if(confirm("您確認要刪除該項嗎?")){
                    document.location.href="${ctx}/NewsManage?action=deleteNews&id="+id;
                  }else{
                    return;
                  }
                }
                function pagging(pageNo){
                   document.location.href="${ctx}/MemeberRegisterServlet?action=list&pageNo="+pageNo;
               }
              </script>
          </head>
          <body>
           
            <div class="bodytitle">
              <div>
                <span class="bodytitletxt">新聞列表</span>
              </div>
            </div>
           
            <div class="list-div">
            <table border="0" cellpadding="10" cellspacing="1">
             <tr>
              <td align="center"><a href="${ctx}/NewsManage?action=refresh">刷新新聞列表</a></td>
              </tr>
            </table>
           
              <table border="0" cellpadding="10" cellspacing="1">
            
                <tr>
                  <th>新聞編號</th>
                  <th>新聞名稱</th>
                  <th>發布者</th>
                  <th>發布時間</th>
                  <th>修改時間</th>
                  <th>瀏覽次數</th>
                  <th>操作</th>
                </tr>
                <c:forEach items="${newsList}" var="news">
                <tr>
                  <td align="center">${news.id}</td>
                  <td align="center"><a href="${ctx}/BrowerNewsServlet?action=browerNews&id=${news.id}">${news.topic}</a></td>
                  <td align="center">${news.publishuser}</td>
                  <td align="center">${news.publishtimes}</td>
                  <td align="center">${news.modifytimes}</td>
                  <td align="center">${news.hits}</td>
                 <td align="center">
                    <a href="${ctx}/NewsManage?action=modifyNews&id=${news.id}"><img src="${ctx}/icons/icon_edit.gif"></a>
                    &nbsp;&nbsp;|&nbsp;&nbsp;
                    <a href="javascript:del(${news.id})"><img src="${ctx}/icons/icon_drop.gif"></a>
                  </td>
                </tr>
                </c:forEach>
                <tr>
                  <td align="right" bgcolor="#f9ffe6" colspan="7"><%@include file="/common/paggingDiv.jsp" %></td>
                </tr>
              </table>
             
            </div>
           
            <div id="footer"><br />版權所有 &copy; 2005-2008 Onest's Studio 工作室,并保留所有權利。</div>

          </body>
          </html>

          posted @ 2009-05-22 22:18 為自己代言 閱讀(1866) | 評論 (0)編輯 收藏

          今天去面試了問我最簡單的JS對話框的使用,我竟然沒有回答上來!丟人,回來看了一個晚上的JS!好像懂點了。

          <!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=gb2312" />
          <title>三種彈出對話框的用法實例</title>
          <script language="javascript">
          function ale()
          {//這個基本沒有什么說的,就是彈出一個提醒的對話框 ,這個方法也可以帶參數的
              alert("提示對話框!");
          }
          function firm()
          {//利用對話框返回的值 (true 或者 false)
              if(confirm("你確信要轉去 天轟穿的博客?"))
              {//如果是true ,那么就把頁面轉向thcjp.cnblogs.com
                  location.;
              }
              else
              {//否則說明下了,赫赫
                  alert("你按了取消,那就是返回false");
              }
          }
          function prom()
          {
              var name=prompt("請輸入您的名字","");//將輸入的內容賦給變量 name ,
              //這里需要注意的是,prompt有兩個參數,前面是提示的話,后面是當對話框出來后,在對話框里的默認值
              if(name)//如果返回的有內容
              {
                  alert("歡迎您:"+ name)
              }
          }
          </script>
          </head>

          <body>
          <p>對話框有三種</p>
          <p>1:只是提醒,不能對腳本產生任何改變;</p>
          <p>2:一般用于確認,返回 true 或者 false ,所以可以輕松用于 ifelse判斷 </p>
          <p>3: 一個帶輸入的對話框,可以返回用戶填入的字符串,常見于某些留言本或者論壇輸入內容那里的 插入UBB格式圖片 </p>
          <p>下面我們分別演示:</p>
          <p>演示一:提醒 對話框</p>
          <p>
            <input type="submit" name="Submit" value="提交" onclick="ale()" />
          </p>
          <p>演示二 :確認對話框 </p>
          <p>
            <input type="submit" name="Submit2" value="提交" onclick="firm()" />
          </p>
          <p>演示三 :要求用戶輸入,然后給個結果</p>
          <p>
            <input type="submit" name="Submit3" value="提交" onclick="prom()" />
          </p>
          </body>
          </html>

          posted @ 2009-05-22 22:15 為自己代言 閱讀(2590) | 評論 (0)編輯 收藏

          一、抽象類:

          抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明于抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。

          二、接口:

          接口是引用類型的,類似于類,和抽象類的相似之處有三點:

          1、不能實例化;

          2、包含未實現的方法聲明;

          3、派生類必須實現未實現的方法,抽象類是抽象方法,接口則是所有成員(不僅是方法包括其他成員);

          另外,接口有如下特性:
          接口除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、構造函數、析構函數、靜態成員。一個類可以直接繼承多個接口,但只能直接繼承一個類(包括抽象類)。

          三、抽象類和接口的區別:

          1.類是對對象的抽象,可以把抽象類理解為把類當作對象,抽象成的類叫做抽象類.而接口只是一個行為的規范或規定,微軟的自定義接口總是后帶able字段,證明其是表述一類類“我能做。。。”.抽象類更多的是定義在一系列緊密相關的類間,而接口大多數是關系疏松但都實現某一功能的類中.

          2.接口基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法;    

          3.一個類一次可以實現若干個接口,但是只能擴展一個父類    

          4.接口可以用于支持回調,而繼承并不具備這個特點.    

          5.抽象類不能被密封。  

          6.抽象類實現的具體方法默認為虛的,但實現接口的類中的接口方法卻默認為非虛的,當然您也可以聲明為虛的.

          7.(接口)與非抽象類類似,抽象類也必須為在該類的基類列表中列出的接口的所有成員提供它自己的實現。但是,允許抽象類將接口方法映射到抽象方法上。  

          8.抽象類實現了oop中的一個原則,把可變的與不可變的分離。抽象類和接口就是定義為不可變的,而把可變的座位子類去實現。

          9.好的接口定義應該是具有專一功能性的,而不是多功能的,否則造成接口污染。如果一個類只是實現了這個接口的中一個功能,而不得不去實現接口中的其他方法,就叫接口污染。  

          10.盡量避免使用繼承來實現組建功能,而是使用黑箱復用,即對象組合。因為繼承的層次增多,造成最直接的后果就是當你調用這個類群中某一類,就必須把他們全部加載到棧中!后果可想而知.(結合堆棧原理理解)。同時,有心的朋友可以留意到微軟在構建一個類時,很多時候用到了對象組合的方法。比如asp.net中,Page類,有Server Request等屬性,但其實他們都是某個類的對象。使用Page類的這個對象來調用另外的類的方法和屬性,這個是非常基本的一個設計原則。  

          11.如果抽象類實現接口,則可以把接口中方法映射到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現接口中方法.

          四、抽象類和接口的使用:

          1. 如果預計要創建組件的多個版本,則創建抽象類。抽象類提供簡單的方法來控制組件版本。

          2.如果創建的功能將在大范圍的全異對象間使用,則使用接口。如果要設計小而簡練的功能塊,則使用接口。

          3.如果要設計大的功能單元,則使用抽象類.如果要在組件的所有實現間提供通用的已實現功能,則使用抽象類。  

          4.抽象類主要用于關系密切的對象;而接口適合為不相關的類提供通用功能。

          以下是我在網上看到的幾個形象比喻,真的非常不錯,呵呵:

          1.飛機會飛,鳥會飛,他們都繼承了同一個接口“飛”;但是F22屬于飛機抽象類,鴿子屬于鳥抽象類。

          2. 就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態);而且只能是門,你不能說它是窗(單繼承);一個門可以有鎖(接口)也可以有門鈴(多實現)。 門(抽象類)定義了你是什么,接口(鎖)規定了你能做什么(一個接口最好只能做一件事,你不能要求鎖也能發出聲音吧(接口污染)

          posted @ 2009-05-12 11:06 為自己代言 閱讀(1473) | 評論 (0)編輯 收藏

               摘要:   閱讀全文

          posted @ 2009-05-11 09:09 為自己代言 閱讀(490) | 評論 (1)編輯 收藏

               摘要:   閱讀全文

          posted @ 2009-04-01 11:18 為自己代言 閱讀(2465) | 評論 (5)編輯 收藏

          僅列出標題
          共2頁: 上一頁 1 2 
          主站蜘蛛池模板: 千阳县| 新丰县| 雅安市| 望都县| 醴陵市| 方城县| 云和县| 韶山市| 如皋市| 孟津县| 阳高县| 朝阳县| 海安县| 昭通市| 化隆| 涿州市| 延吉市| 扎赉特旗| 开封县| 临安市| 任丘市| 昆明市| 梓潼县| 卢湾区| 军事| 遂溪县| 福安市| 皮山县| 文登市| 高碑店市| 兴义市| 横峰县| 彭山县| 台安县| 涟源市| 甘肃省| 格尔木市| 文水县| 禹城市| 清新县| 花莲市|