對(duì)hibernate的新認(rèn)識(shí)
posted @ 2008-01-30 11:14 船夫 閱讀(1965) | 評(píng)論 (7) | 編輯 收藏
愚人碼頭知恥而后勇,知不足而進(jìn)
隨筆 - 33, 文章 - 1, 評(píng)論 - 26, 引用 - 0
|
轉(zhuǎn):提升JSP應(yīng)用程序的七大絕招
提升JSP應(yīng)用程序的七大絕招
你時(shí)常被客戶抱怨JSP頁(yè)面響應(yīng)速度很慢嗎?你想過(guò)當(dāng)客戶訪問(wèn)次數(shù)劇增時(shí),你的WEB應(yīng)用能承受日益增加的訪 問(wèn)量嗎?本文講述了調(diào)整JSP和servlet的一些非常實(shí)用的方法,它可使你的servlet和JSP頁(yè)面響應(yīng)更快,擴(kuò)展性更強(qiáng)。而且在用戶數(shù)增加的情 況下,系統(tǒng)負(fù)載會(huì)呈現(xiàn)出平滑上長(zhǎng)的趨勢(shì)。在本文中,我將通過(guò)一些實(shí)際例子和配置方法使得你的應(yīng)用程序的性能有出人意料的提升。其中,某些調(diào)優(yōu)技術(shù)是在你的 編程工作中實(shí)現(xiàn)的。而另一些技術(shù)是與應(yīng)用服務(wù)器的配置相關(guān)的。在本文中,我們將詳細(xì)地描述怎樣通過(guò)調(diào)整servlet和JSP頁(yè)面,來(lái)提高你的應(yīng)用程序的 總體性能。在閱讀本文之前,假設(shè)你有基本的servlet和JSP的知識(shí)。 方法一:在servlet的init()方法中緩存數(shù)據(jù) 當(dāng)應(yīng)用服務(wù)器初始化servlet實(shí)例之后,為客戶端請(qǐng)求提供服務(wù)之前,它會(huì)調(diào)用這個(gè)servlet的init()方法。在一個(gè)servlet的生命周 期中,init()方法只會(huì)被調(diào)用一次。通過(guò)在init()方法中緩存一些靜態(tài)的數(shù)據(jù)或完成一些只需要執(zhí)行一次的、耗時(shí)的操作,就可大大地提高系統(tǒng)性能。 例如,通過(guò)在init()方法中建立一個(gè)JDBC連接池是一個(gè)最佳例子,假設(shè)我們是用jdbc2.0的DataSource接口來(lái)取得數(shù)據(jù)庫(kù)連接,在通 常的情況下,我們需要通過(guò)JNDI來(lái)取得具體的數(shù)據(jù)源。我們可以想象在一個(gè)具體的應(yīng)用中,如果每次SQL請(qǐng)求都要執(zhí)行一次JNDI查詢的話,那系統(tǒng)性能將 會(huì)急劇下降。解決方法是如下代碼,它通過(guò)緩存DataSource,使得下一次SQL調(diào)用時(shí)仍然可以繼續(xù)利用它: public class ControllerServlet extends HttpServlet { private javax.sql.DataSource testDS = null; public void init(ServletConfig config) throws ServletException { super.init(config); Context ctx = null; try { ctx = new InitialContext(); testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS"); } catch(NamingException ne) { ne.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } public javax.sql.DataSource getTestDS() { return testDS; } ... ... } 方法 2:禁止servlet和JSP 自動(dòng)重載(auto-reloading) Servlet/JSP提供了一個(gè)實(shí)用的技術(shù),即自動(dòng)重載技術(shù),它為開(kāi)發(fā)人員提供了一個(gè)好的開(kāi)發(fā)環(huán)境,當(dāng)你改變servlet和JSP頁(yè)面后而不必重啟 應(yīng)用服務(wù)器。然而,這種技術(shù)在產(chǎn)品運(yùn)行階段對(duì)系統(tǒng)的資源是一個(gè)極大的損耗,因?yàn)樗鼤?huì)給JSP引擎的類裝載器(classloader)帶來(lái)極大的負(fù)擔(dān)。因 此關(guān)閉自動(dòng)重載功能對(duì)系統(tǒng)性能的提升是一個(gè)極大的幫助。 方法 3: 不要濫用HttpSession 在很多應(yīng) 用中,我們的程序需要保持客戶端的狀態(tài),以便頁(yè)面之間可以相互聯(lián)系。但不幸的是由于HTTP具有天生無(wú)狀態(tài)性,從而無(wú)法保存客戶端的狀態(tài)。因此一般的應(yīng)用 服務(wù)器都提供了session來(lái)保存客戶的狀態(tài)。在JSP應(yīng)用服務(wù)器中,是通過(guò)HttpSession對(duì)像來(lái)實(shí)現(xiàn)session的功能的,但在方便的同 時(shí),它也給系統(tǒng)帶來(lái)了不小的負(fù)擔(dān)。因?yàn)槊慨?dāng)你獲得或更新session時(shí),系統(tǒng)者要對(duì)它進(jìn)行費(fèi)時(shí)的序列化操作。你可以通過(guò)對(duì)HttpSession的以下 幾種處理方式來(lái)提升系統(tǒng)的性能: ? 如果沒(méi)有必要,就應(yīng)該關(guān)閉JSP頁(yè)面中對(duì)HttpSession的缺省設(shè)置: 如果你沒(méi)有明確指定的話,每個(gè)JSP頁(yè)面都會(huì)缺省地創(chuàng)建一個(gè)HttpSession。如果你的JSP中不需要使用session的話,那可以通過(guò)如下的JSP頁(yè)面指示符來(lái)禁止它: <%@ page session="false"%> ? 不要在HttpSession中存放大的數(shù)據(jù)對(duì)像:如果你在HttpSession中存放大的數(shù)據(jù)對(duì)像的話,每當(dāng)對(duì)它進(jìn)行讀寫時(shí),應(yīng)用服務(wù)器都將對(duì)其進(jìn)行 序列化,從而增加了系統(tǒng)的額外負(fù)擔(dān)。你在HttpSession中存放的數(shù)據(jù)對(duì)像越大,那系統(tǒng)的性能就下降得越快。 ? 當(dāng)你不需要HttpSession時(shí),盡快地釋放它:當(dāng)你不再需要session時(shí),你可以通過(guò)調(diào)用HttpSession.invalidate()方法來(lái)釋放它。 ? 盡量將session的超時(shí)時(shí)間設(shè)得短一點(diǎn):在JSP應(yīng)用服務(wù)器中,有一個(gè)缺省的session的超時(shí)時(shí)間。當(dāng)客戶在這個(gè)時(shí)間之后沒(méi)有進(jìn)行任何操作的話, 系統(tǒng)會(huì)將相關(guān)的session自動(dòng)從內(nèi)存中釋放。超時(shí)時(shí)間設(shè)得越大,系統(tǒng)的性能就會(huì)越低,因此最好的方法就是盡量使得它的值保持在一個(gè)較低的水平。 方法 4: 將頁(yè)面輸出進(jìn)行壓縮 壓縮是解決數(shù)據(jù)冗余的一個(gè)好的方法,特別是在網(wǎng)絡(luò)帶寬不夠發(fā)達(dá)的今天。有的瀏覽器支持gzip(GNU zip)進(jìn)行來(lái)對(duì)HTML文件進(jìn)行壓縮,這種方法可以戲劇性地減少HTML文件的下載時(shí)間。因此,如果你將servlet或JSP頁(yè)面生成的HTML頁(yè)面 進(jìn)行壓縮的話,那用戶就會(huì)覺(jué)得頁(yè)面瀏覽速度會(huì)非常快。但不幸的是,不是所有的瀏覽器都支持gzip壓縮,但你可以通過(guò)在你的程序中檢查客戶的瀏覽器是否支 持它。下面就是關(guān)于這種方法實(shí)現(xiàn)的一個(gè)代碼片段: public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { OutputStream out = null String encoding = request.getHeader("Accept-Encoding"); if (encoding != null && encoding.indexOf("gzip") != -1) { request.setHeader("Content-Encoding" , "gzip"); out = new GZIPOutputStream(request.getOutputStream()); } else if (encoding != null && encoding.indexOf("compress") != -1) { request.setHeader("Content-Encoding" , "compress"); out = new ZIPOutputStream(request.getOutputStream()); } else { out = request.getOutputStream(); } ... ... } 方法 5: 使用線程池 應(yīng)用服務(wù)器缺省地為每個(gè)不同的客戶端請(qǐng)求創(chuàng)建一個(gè)線程進(jìn)行處理,并為它們分派service()方法,當(dāng)service()方法調(diào)用完成后,與之相應(yīng)的 線程也隨之撤消。由于創(chuàng)建和撤消線程會(huì)耗費(fèi)一定的系統(tǒng)資源,這種缺省模式降低了系統(tǒng)的性能。但所幸的是我們可以通過(guò)創(chuàng)建一個(gè)線程池來(lái)改變這種狀況。另外, 我們還要為這個(gè)線程池設(shè)置一個(gè)最小線程數(shù)和一個(gè)最大線程數(shù)。在應(yīng)用服務(wù)器啟動(dòng)時(shí),它會(huì)創(chuàng)建數(shù)量等于最小線程數(shù)的一個(gè)線程池,當(dāng)客戶有請(qǐng)求時(shí),相應(yīng)地從池從 取出一個(gè)線程來(lái)進(jìn)行處理,當(dāng)處理完成后,再將線程重新放入到池中。如果池中的線程不夠地話,系統(tǒng)會(huì)自動(dòng)地增加池中線程的數(shù)量,但總量不能超過(guò)最大線程數(shù)。 通過(guò)使用線程池,當(dāng)客戶端請(qǐng)求急劇增加時(shí),系統(tǒng)的負(fù)載就會(huì)呈現(xiàn)的平滑的上升曲線,從而提高的系統(tǒng)的可伸縮性。 方法 6: 選擇正確的頁(yè)面包含機(jī)制 在JSP中有兩種方法可以用來(lái)包含另一個(gè)頁(yè)面:1、使用include指示符(<%@ includee file=”test.jsp” %>)。2、使用jsp指示符(<jsp:includee page=”test.jsp” flush=”true”/>)。在實(shí)際中我發(fā)現(xiàn),如果使用第一種方法的話,可以使得系統(tǒng)性能更高。 方法 7:正確地確定javabean的生命周期 JSP的一個(gè)強(qiáng)大的地方就是對(duì)javabean的支持。通過(guò)在JSP頁(yè)面中使用<jsp:useBean>標(biāo)簽,可以將javabean直接插入到一個(gè)JSP頁(yè)面中。它的使用方法如下: <jsp:useBean id="name" scope="page|request|session|application" class= "package.className" type="typeName"> </jsp:useBean> 其中scope屬性指出了這個(gè)bean的生命周期。缺省的生命周期為page。如果你沒(méi)有正確地選擇bean的生命周期的話,它將影響系統(tǒng)的性能。 舉例來(lái)說(shuō),如果你只想在一次請(qǐng)求中使用某個(gè)bean,但你卻將這個(gè)bean的生命周期設(shè)置成了session,那當(dāng)這次請(qǐng)求結(jié)束后,這個(gè)bean將仍然 保留在內(nèi)存中,除非session超時(shí)或用戶關(guān)閉瀏覽器。這樣會(huì)耗費(fèi)一定的內(nèi)存,并無(wú)謂的增加了JVM垃圾收集器的工作量。因此為bean設(shè)置正確的生命 周期,并在bean的使命結(jié)束后盡快地清理它們,會(huì)使用系統(tǒng)性能有一個(gè)提高 其它一些有用的方法 ? 在字符串連接操作中盡量不使用“+”操作符:在java編程中,我們常常使用“+”操作符來(lái)將幾個(gè)字符串連接起來(lái),但你或許從來(lái)沒(méi)有想到過(guò)它居然會(huì)對(duì)系統(tǒng) 性能造成影響吧?由于字符串是常量,因此JVM會(huì)產(chǎn)生一些臨時(shí)的對(duì)像。你使用的“+”越多,生成的臨時(shí)對(duì)像就越多,這樣也會(huì)給系統(tǒng)性能帶來(lái)一些影響。解決 的方法是用StringBuffer對(duì)像來(lái)代替“+”操作符。 ? 避免使用System.out.println()方法:由于System.out.println()是一種同步調(diào)用,即在調(diào)用它時(shí),磁盤I/O操作必 須等待它的完成,因此我們要盡量避免對(duì)它的調(diào)用。但我們?cè)谡{(diào)試程序時(shí)它又是一個(gè)必不可少的方便工具,為了解決這個(gè)矛盾,我建議你最好使用Log4j工具 (http://Jakarta.apache.org ),它既可以方便調(diào)試,而不會(huì)產(chǎn)生System.out.println()這樣的方法。 ? ServletOutputStream 與 PrintWriter的權(quán)衡:使用PrintWriter可能會(huì)帶來(lái)一些小的開(kāi)銷,因?yàn)樗鼘⑺械脑驾敵龆嫁D(zhuǎn)換為字符流來(lái)輸出,因此如果使用它來(lái)作為 頁(yè)面輸出的話,系統(tǒng)要負(fù)擔(dān)一個(gè)轉(zhuǎn)換過(guò)程。而使用ServletOutputStream作為頁(yè)面輸出的話就不存在一個(gè)問(wèn)題,但它是以二進(jìn)制進(jìn)行輸出的。因 此在實(shí)際應(yīng)用中要權(quán)衡兩者的利弊。 總結(jié) 本文的目的是通過(guò)對(duì)servlet和JSP的一些調(diào)優(yōu)技術(shù)來(lái)極大地提高你 的應(yīng)用程序的性能,并因此提升整個(gè)J2EE應(yīng)用的性能。通過(guò)這些調(diào)優(yōu)技術(shù),你可以發(fā)現(xiàn)其實(shí)并不是某種技術(shù)平臺(tái)(比如J2EE和.NET之爭(zhēng))決定了你的應(yīng) 用程序的性能,重要是你要對(duì)這種平臺(tái)有一個(gè)較為深入的了解,這樣你才能從根本上對(duì)自己的應(yīng)用程序做一個(gè)優(yōu)化! Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1448910 posted @ 2007-12-25 17:04 船夫 閱讀(237) | 評(píng)論 (0) | 編輯 收藏 JSP編譯過(guò)程很久以來(lái),都知道JSP其實(shí)就是Servlet,今天心血來(lái)潮,想把里面的具體代碼看一遍,并記錄心得。
其核心方法為:一個(gè)編譯好的JSP類如下: public final class index_jsp extends HttpJspBase implements JspSourceDependent //上述類為index.jsp被編譯后得到的類 //HttpJspBase是extends HttpServlet的一個(gè)類 //JspSourceDependent是一個(gè)接口,只聲明了一個(gè)方法、、getDependants(),返回當(dāng)前page所依賴的文件的名稱,文件包括以下幾種 //1) files that are included by page directives //2) files that are included by include-prelude and include-coda in jsp:config //3) files that are tag files and referenced //4) TLDs referenced public void _jspService(HttpServletRequest request, HttpServletResponse response)
該方法重載HttpJspBase中的_jspService方法,進(jìn)行頁(yè)面解析,包括對(duì)scriptlet的加載,html的生成,自定義Tag的解析等等throws IOException, ServletException{ ![]() ![]() ![]() ![]() ![]() ![]() } HttpJspBase的service再對(duì)_jspService再進(jìn)行調(diào)用,最終生成HTML頁(yè)面 posted @ 2007-12-18 12:06 船夫 閱讀(1920) | 評(píng)論 (1) | 編輯 收藏 Annotation初步了解
今天在看Tapestry代碼的時(shí)候,突然想了解一下annotation到底是干什么的,有什么好處?花了3個(gè)小時(shí)的時(shí)間,從JDK API開(kāi)始,大致了解了一下。
annotation實(shí)際上就是給一些特定的類和其屬性,方法等加上一些注釋(annotation),這些注釋是以屬性name,value進(jìn)行設(shè)置的,這些屬性在Annotation Class中以方法的形式存在,如下: @Documented //是否需要產(chǎn)生javadoc
以上為自定義的annotation,是應(yīng)用在成員變量上的,使用該annotation情況如下@Target(java.lang.annotation.ElementType.METHOD) //應(yīng)用目標(biāo),這里是應(yīng)用到field屬性上面 @Retention(RetentionPolicy.RUNTIME) //該策略指明該注釋會(huì)被加載到j(luò)vm中,即在運(yùn)行時(shí),我們可以得到該注釋的內(nèi)容,另外兩個(gè)策略,SOURCE, CLASS都不會(huì)加載到j(luò)vm中 public @interface TestAnnoation { String value(); //屬性value String time(); //屬性time } public class Test {
@TestAnnoation(time="12:30",value="20") public String test(){ System.out.println("test!"); return null; }; } 可以使用java的反射來(lái)進(jìn)行獲取,通過(guò): Class cls = Class.forName("Test");
cls.isAnnotationPresent(AnnotationClass.class);//判斷是否存在annotation TestAnnotation ta = (TestAnnotation)cls.getAnnotation(AnnotationClass.class);//獲得AnnotationClass實(shí)例,后調(diào)用這個(gè)實(shí)例可以獲得在AnnotationClass中定義的一些屬性 System.out.println(ta.time()); //輸出注釋time內(nèi)容 System.out.println(ta.value()); //輸出注釋value內(nèi)容 我個(gè)人認(rèn)為annotation的好處是將一些配置直接寫在代碼上,很直觀;以前在使用hibernate的時(shí)候,PO對(duì)象和對(duì)應(yīng)的mapping xml是分開(kāi)的,不夠直觀,若是使用annotation就會(huì)很直觀的看出這個(gè)對(duì)象的映射屬性以及它的一些特殊屬性(如lazy=true)之類的,在JPA中就把這種配置方式換成了annotation。 在JE上有很多關(guān)于使用annotation和xml的爭(zhēng)論,我認(rèn)為在小規(guī)模使用上可以使用annotation,就像JPA這種,每個(gè)PO上面都需要進(jìn)行配置,即使使用XML也不能簡(jiǎn)化;而在大規(guī)模使用,如spring所維護(hù)的一些service的事務(wù)配置上避免使用annotation,因?yàn)槊總€(gè)service類中都需要配置,而使用AOP根據(jù)XML配置可以一下就搞定。 關(guān)于ElementType的其他屬性: TYPE(類型), FIELD(屬性), METHOD(方法), PARAMETER(參數(shù)), CONSTRUCTOR(構(gòu)造函數(shù)),LOCAL_VARIABLE(局部變量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(類型)是指可以用在Class,Interface,Enum和 Annotation類型上. posted @ 2007-12-17 16:33 船夫 閱讀(333) | 評(píng)論 (1) | 編輯 收藏 禁食了,腎結(jié)石患者還能吃什么?
當(dāng)腎結(jié)石、膀胱結(jié)石發(fā)生以后,患者在劇烈的疼痛中常向醫(yī)生討教:腎臟、尿道里那來(lái)的石頭呢?手術(shù)之后要怎樣才能預(yù)防它復(fù)發(fā)呢?
腎結(jié)石的形成,主要原因就是飲食。它是由飲食中可形成結(jié)石的有關(guān)成分?jǐn)z入過(guò)多引起的。再細(xì)一點(diǎn)解釋是: 草酸積存過(guò)多。體內(nèi)草酸的大量積存,是導(dǎo)致腎尿結(jié)石的 因素之一。如菠菜、豆類、葡萄、可可、茶葉、桔子、番茄、土豆、李子、竹筍等這些人們普遍愛(ài)吃的東西,正是含草酸較高的食物。醫(yī)生通過(guò)研究發(fā)現(xiàn):200克 菠菜中,含草酸725.6毫克,如果一人一次將200克菠菜全部吃掉,食后8小時(shí),檢查尿中草酸排泄量為20-25毫克,相當(dāng)于正常人24小時(shí)排出的草酸 平均總量。 嘌呤代謝失常。動(dòng)物內(nèi)臟、海產(chǎn)食品、花生、豆角、菠菜等,均含有較多的嘌呤成分。嘌呤進(jìn)入體內(nèi)后,要進(jìn)行新陳代謝,它代謝的最終產(chǎn)物是尿酸。尿酸可促使尿中草酸鹽沉淀。如果,一次過(guò)多地食用了含嘌呤豐富的食物,嘌呤的代謝又失常,草酸鹽便在尿中沉積而形成尿結(jié)石。 脂肪攝取太多。各種動(dòng)物的肉類,尤其是肥豬肉,都是脂肪多的食品。多吃了體內(nèi)脂肪必然增高,脂肪會(huì)減少腸道中可結(jié)合的鈣,因而引起對(duì)草酸鹽的吸收增多,如果一旦出現(xiàn)排泄功能故障,如出汗多、喝水少,尿量少,腎結(jié)石很可能就在這種情況下形成。所以,醫(yī)生們常講,為了預(yù)防得結(jié)石病,熱天要多喝點(diǎn)水,吃了油水多的食物時(shí),也要多喝點(diǎn)水,以促進(jìn)排尿暢通,稀釋尿液成分,就減少了得結(jié)石的危險(xiǎn)。 糖分增高。糖是人體的重要養(yǎng)分,要經(jīng)常適量增補(bǔ),但一下子增加太多,尤其是乳糖,也會(huì)使結(jié)石形成創(chuàng)造條件。專家們發(fā)現(xiàn):不論正常人或結(jié)石病人,在食用100克蔗糖后,過(guò)2小時(shí)去檢查他們的尿,發(fā)現(xiàn)尿中的鈣和草酸濃度均上升,若是服用乳糖,它更能促進(jìn)鈣的吸收,更可能導(dǎo)致草酸鈣在體內(nèi)的積存而形成尿結(jié)石。 蛋白質(zhì)過(guò)量。對(duì)腎結(jié)石成分進(jìn)行化驗(yàn)分析,發(fā)現(xiàn)結(jié)石中的草酸鈣占87.5%。這么大比重的草酸鈣的來(lái)源就是因?yàn)榈鞍踪|(zhì)里除含有草酸的原料——甘氨酸、羥脯氨酸之外,蛋白質(zhì)還能促進(jìn)腸道功能對(duì)鈣的吸收。如果經(jīng)常過(guò)量食用高蛋白質(zhì)的食物,便使腎臟和尿中的鈣、草酸、尿酸的成分普遍增高。如果不能及時(shí)有效地通過(guò)腎臟功能把多余的鈣、草酸、尿酸排出體外,這樣,得腎臟結(jié)石、輸尿管結(jié)石癥的條件就形成了。當(dāng)今世界經(jīng)濟(jì)發(fā)達(dá)國(guó)家腎結(jié)石發(fā)病率增高的主要原因就是如此。 從以上幾種易形成腎結(jié)石的因素來(lái)看,要預(yù)防腎結(jié)石病 的發(fā)生,就必須改變只顧單求一種營(yíng)養(yǎng)和追求營(yíng)養(yǎng)過(guò)甚的觀念。這就是說(shuō),在人類的日常飲食中,不能因?yàn)槟撤N食物好吃、營(yíng)養(yǎng)價(jià)值高,就一味地只顧去吃這種食 物。必須注意食物的搭配,各種食物都適量進(jìn)食,即使是檢查出身體缺乏某種營(yíng)養(yǎng)素需要某種食物來(lái)補(bǔ)充時(shí),也不宜一次大量進(jìn)食,因?yàn)槿梭w的消化、吸收功能是有限的。消化、吸收不了的養(yǎng)分就要通過(guò)排泄器官排泄出去,這樣也會(huì)增加泌尿系統(tǒng)的負(fù)擔(dān),即便不患腎結(jié)石病,也對(duì)健康不利。特別是當(dāng)檢查出確認(rèn)是腎結(jié)石癥時(shí),在患病期間,要限制病人吃那些易促使結(jié)石形成的食物。 腎結(jié)石是尿石癥的一種,多在炎熱的夏天形成,因?yàn)橄奶齑罅砍龊梗踔馏w內(nèi)脫水,使排尿減少,再加之夏季暴露于陽(yáng)光下時(shí)間長(zhǎng),紫外線照射皮膚有助于體內(nèi)維生素D和維生素A合成增多,維生素D和維生素A可促進(jìn)小腸吸收鈣離子,尿液中排泄鈣增多,尿內(nèi)結(jié)石物質(zhì)易產(chǎn)生結(jié)晶核,從而形成結(jié)石。冬季天氣寒冷,人的尿量增多,已形成的小結(jié)石被尿液沖刷,向下移動(dòng),此時(shí)引起腎絞痛癥狀。所以,腎結(jié)石常為“夏季形成冬季發(fā)病”。 人們的飲食品種是多樣的,人體新陳代謝是復(fù)雜的,所以腎結(jié)石的成分也是多樣的。常見(jiàn)結(jié)石按成分可分為五種:一草酸鈣結(jié)石:最為常見(jiàn),占腎結(jié)石的80以上,在酸性或中性尿中形成,發(fā)病多為青壯年,以男性多見(jiàn)。二磷酸鈣結(jié)石:占結(jié)石的6-9,在堿性尿中形成,也以男性青壯年多發(fā)。三尿酸結(jié)石:占結(jié)石的6,在酸性尿中形成,當(dāng)尿PH值大于6.7時(shí)結(jié)石溶解,以男性多見(jiàn)。四磷酸鎂胺結(jié)石:占結(jié)石的10,在堿性尿中形成,尿PH值小于7.2時(shí)結(jié)石溶解,以女性多見(jiàn)。五胱氨酸結(jié)石:少見(jiàn),約占結(jié)石的1-2,在酸性尿中形成,尿PH值大于7.0時(shí)結(jié)石溶解。 大量飲水對(duì)所有成分尿石都有防治作用。在炎熱的夏天,每日尿量少于1200毫升時(shí),尿石生長(zhǎng)的危險(xiǎn)性顯著增大。如能使每日飲水量在2000-4000毫升,這樣可維持每日尿量在2000毫升以上。磁化水對(duì)防治草酸鈣結(jié)石更有效,可將全日飲水量分別于晨起、餐間、睡前給予。清晨飲水量可達(dá)500-1000毫升。為了保持夜間尿量,睡前飲水500毫升,睡眠中起床排尿后再飲水300-500毫升,余下水分別于餐間飲服。大量飲水可促使小的結(jié)石排出,稀釋尿液可防止尿石結(jié)晶形成,并能延緩結(jié)石增長(zhǎng)速度。 1985年國(guó)外學(xué)者Vehlensieck認(rèn)為,多飲水和飲食療法可使2/3復(fù)發(fā)結(jié)石病人不再生新結(jié)石。下面介紹幾種腎結(jié)石的飲食療法。 ⑴草酸鈣結(jié)石:宜低鈣及低草酸飲食。少食牛奶及乳制品、豆制品、肉類、動(dòng)物內(nèi)臟(如肝、心臟、腎、腸等),還有巧克力、濃茶、芝麻醬、蛋黃、香菇、菠菜、蝦皮、蘿卜、可可、芹菜、土豆等。近年來(lái)發(fā)現(xiàn)食物中纖維素可減少尿鈣的形成,如麥麩食品中的麥麩面包、米糠也有同樣作用,對(duì)復(fù)發(fā)性高鈣尿結(jié)石有效,維生素B1、維生素B6缺乏使尿草酸增多,應(yīng)增加富含此類維生素的食物,如谷物、干果、硬果等。 ⑵磷酸鈣結(jié)石及磷酸鎂銨結(jié)石:其低鈣飲食同草酸鈣結(jié)石相同。在低磷食物中,宜少食肉類、魚類及骨頭湯。 ⑶尿結(jié)石: 應(yīng)限制蛋白質(zhì)的攝入量,每日蛋白質(zhì)的總攝入量應(yīng)在48-80克(0.8-1.0克/公斤/日)之間。一般帶葉的蔬菜每市斤約含10克蛋白質(zhì)、瘦肉類每50 克約含蛋白質(zhì)10克、谷類每市斤含蛋白質(zhì)35-60克。要增加新鮮蔬菜和水果的食量。蔬菜和水果含維生素B1及維生素C,它們?cè)隗w內(nèi)最后代謝產(chǎn)物是堿性 的,尿酸在堿性尿內(nèi)易于溶解,故有利于治療。常規(guī)治療:每隔1-2日用一次清涼飲食(生水果、果汁及生菜),至少每周1次清涼飲食。少食或忌用肉類、動(dòng)物 內(nèi)臟、肉湯、肉汁、沙丁魚、蟹、菠菜、濃茶、咖啡,烈性的香料及調(diào)味品也宜少用。 現(xiàn)實(shí)生活中很多疾病的發(fā)生和日常飲食是密切相關(guān)的,如果能做到起居有時(shí),飲食有節(jié),甚至大部分癌癥也可能避免。現(xiàn)在就腎結(jié)石病這一頑癥來(lái)提醒大家如何用飲食來(lái)預(yù)防,或使已經(jīng)患了腎結(jié)石者,結(jié)石增大的速度減慢,甚至縮小、溶解而排出體外。 (一)多飲白開(kāi)水 多飲水使尿液得到稀釋,鈣離子和草酸根的濃度就會(huì)降低,形成不了草酸鈣結(jié)石。研究表明,增加50%的尿量,可使腎結(jié)石發(fā)病率下降86%。 (二)合理補(bǔ)鈣,尤其飲食上補(bǔ)鈣 腎結(jié)石患者往往“談鈣色變”,錯(cuò)誤地認(rèn)為腎結(jié)石的元兇是鈣,其實(shí)不然,腎結(jié)石患者也需要補(bǔ)鈣。目前醫(yī)學(xué)界從兩個(gè)不同的角度來(lái)解釋,腎結(jié)石患者為什么要補(bǔ)鈣。 第一是補(bǔ)充鈣能與胃腸道中蔬菜含有的草酸結(jié)合成不溶性的草酸鈣,隨糞便排出體外,減少了部分被腸胃吸收和經(jīng)腎臟排出體外的草酸,從而減少了形成腎結(jié)石的幾率。 第二是日本學(xué)者提出的“酸堿平衡學(xué)說(shuō)”。即血液呈酸性時(shí),結(jié)石容易形成。呈堿性時(shí),抑制結(jié)石形成。缺鈣時(shí)血液偏酸性,合理補(bǔ)鈣,血液偏堿,這樣反而有利于抑制結(jié)石形成。 (三)限量攝入糖類 美國(guó)科學(xué)家最新一項(xiàng)研究結(jié)果表明,高糖食品的攝入,可以使患腎結(jié)石的機(jī)會(huì)增加,因此,要注意少吃甜食。 (四)少吃草酸鹽含量高的食物 含草酸鹽高的食物有番茄、菠菜、草莓、甜菜、巧克力等,過(guò)高的草酸鹽攝入也是導(dǎo)致腎結(jié)石的主要原因之一。 (五)少吃豆制品 大豆食品含草酸鹽和磷酸鹽都高,能同腎臟中的鈣融合,形成結(jié)石。 (六)睡前慎喝牛奶 睡眠不好的人,睡前喝杯牛奶有助于睡眠。但在睡眠后,尿量減少、濃縮,尿中各種有形物質(zhì)增加。而飲牛奶后2~3小時(shí),正是鈣通過(guò)腎臟排泄的高峰。鈣通過(guò)腎臟在短時(shí)間內(nèi)驟然增多,容易形成結(jié)石。因此腎結(jié)石患者,睡前就不應(yīng)喝含鈣高的牛奶。 (七)勿過(guò)量服用魚肝油 魚肝油富含維生素D,有促進(jìn)腸膜對(duì)鈣磷吸收的功能,驟然增加尿液中鈣磷的排泄,勢(shì)必產(chǎn)生沉淀,容易形成結(jié)石。 (八)多食黑木耳 黑木耳中富含多種礦物質(zhì)和微量元素,能對(duì)各種結(jié)石產(chǎn)生強(qiáng)烈的化學(xué)反應(yīng),使結(jié)石剝脫、分化、溶解,排出體外。 posted @ 2007-12-17 12:04 船夫 閱讀(1407) | 評(píng)論 (0) | 編輯 收藏 XSL取得當(dāng)前循環(huán)的位置
最近在一個(gè)項(xiàng)目中用到了XSLT,目的是將返回的XML數(shù)據(jù)記錄通過(guò)XSL轉(zhuǎn)換為HTML,在for-each的循環(huán)中取得當(dāng)前記錄的位置,通過(guò)實(shí)踐,找到了解決的辦法,主要是使用xsl的position函數(shù)
1 <xsl:for-each select="QRoleInline-list/QRoleInline">
使用position函數(shù)可以取得當(dāng)前行在循環(huán)中的位置,從1開(kāi)始。上述代碼是判斷如果位置為第一個(gè), 則需要加逗號(hào)。2 <xsl:if test="not(position() = 1)"><xsl:text>,</xsl:text></xsl:if><xsl:value-of select="@roleName"/> 3 </xsl:for-each> 還有一個(gè)函數(shù)current()是負(fù)責(zé)取到當(dāng)前節(jié)點(diǎn)對(duì)象的。 posted @ 2007-12-14 11:33 船夫 閱讀(530) | 評(píng)論 (0) | 編輯 收藏 走出ClassLoader迷局 --轉(zhuǎn)至sharajava的博克http://www.aygfsteel.com/sharajava/archive/2006/07/25/59946.html答 : 這個(gè)問(wèn)題經(jīng)常出現(xiàn)在編寫框架代碼 , 需要?jiǎng)討B(tài)加載很多類和資源的時(shí)候 . 通常當(dāng)你需要?jiǎng)討B(tài)加載資源的時(shí)候 , 你至少有三個(gè) ClassLoader 可以選擇 : 2??????? 系統(tǒng)類加載器或叫作應(yīng)用類加載器 (system classloader or application classloader) 2??????? 當(dāng)前類加載器 2??????? 當(dāng)前線程類加載器 上面的問(wèn)題指的是最后一種類加載器 . 哪種類加載器是正確的選擇呢 ? 第一種選擇可以很容易地排除 : 系統(tǒng)類加載器 (system classloader). 這個(gè)類加載器處理 -classpath 下的類加載工作 , 可以通過(guò) ClassLoader.getSystemClassLoader() 方法調(diào)用 . ClassLoader 下所有的 getSystemXXX() 的靜態(tài)方法都是通過(guò)這個(gè)方法定義的 . 在你的代碼中 , 你應(yīng)該盡量少地調(diào)用這個(gè)方法 , 以其它的類加載器作為代理 . 否則你的代碼將只能工作在簡(jiǎn)單的命令行應(yīng)用中 , 這個(gè)時(shí)候系統(tǒng)類加載器 (system classloader) 是 JVM 最后創(chuàng)建的類加載器 . 一但你把代碼移到 EJB, Web 應(yīng)用或 Java Web Start 應(yīng)用中 , 一定會(huì)出問(wèn)題 .
?????
所以我們來(lái)看第二種選擇
:
當(dāng)前上下文環(huán)境下的類加載器
.
根據(jù)定義
,
當(dāng)前類加載器就是你當(dāng)前方法所屬的類的加載器
.
在運(yùn)行時(shí)類之間動(dòng)態(tài)聯(lián)編
,
及調(diào)用
Class.forName,() Class.getResource()
等類似方法時(shí)
,
這個(gè)類加載器會(huì)被隱含地使用
.
It is also used by syntactic constructs like X.class class literals.
???
線程上下文類型加載器是在Java 2平臺(tái)上被引入的. 每一個(gè)線程都有一個(gè)類加載器與之對(duì)應(yīng)(除非這個(gè)線程是被本地代碼創(chuàng)建的). 這個(gè)類加載器是通過(guò)Thread.setContextClassLoaser()方法設(shè)置的. 如果你不在線程構(gòu)造后調(diào)用這個(gè)方法, 這個(gè)線程將從它的父線程中繼承相應(yīng)的上下文類加載器. 如果在整個(gè)應(yīng)用中你不做任何特殊設(shè)置, 所有的線程將都以系統(tǒng)類加載器(system classloader)作為自己的線程上下文類加載器. 自從Web和J2EE應(yīng)用服務(wù)器使用成熟的類加載器機(jī)制來(lái)實(shí)現(xiàn)諸如JNDI, 線程池, 組件熱部署等功能以來(lái), 這種在整個(gè)應(yīng)用中不做任何線程類加載器設(shè)置的情況就很少了.
???
為什么線程上下文類加載器存在于如此重要的位置呢? 這個(gè)概念在J2SE中的引入并不引人注目. 很多開(kāi)發(fā)人員對(duì)這一概念迷惑的原因是Sun公司在這方面缺乏適當(dāng)?shù)闹敢臀臋n.
???
事實(shí)上, 上下文類加載器提供了類加載機(jī)制的后門, 這一點(diǎn)也在J2SE中被引入了. 通常, 在JVM中的所有類加載器被組織成了有繼承層次的結(jié)構(gòu), 每一個(gè)類加載器(除了引導(dǎo)JVM的原始類加載器)都有一個(gè)父加載器. 每當(dāng)被請(qǐng)示加載類時(shí), 類加載器都會(huì)首先請(qǐng)求其父類加載器, 只有當(dāng)父類加載器不能加載時(shí), 才會(huì)自己進(jìn)行類加載.
??
有時(shí)候這種類加載的順序安排不能正常工作, 通常當(dāng)必須動(dòng)態(tài)加載應(yīng)用程序開(kāi)發(fā)人員提供的資源的時(shí)候. 以JNDI為例: 它的內(nèi)容(從J2SE1.3開(kāi)始)就在rt.jar中的引導(dǎo)類中實(shí)現(xiàn)了, 但是這些JNDI核心類需要?jiǎng)討B(tài)加載由獨(dú)立廠商實(shí)現(xiàn)并部署在應(yīng)用程序的classpath下的JNDI提供者. 這種情況就要求一個(gè)父classloader(本例, 就是引導(dǎo)類加載器)去加載對(duì)于它其中一個(gè)子classloader(本例, 系統(tǒng)類加載器)可見(jiàn)的類. 這時(shí)通常的類加載代理機(jī)制不能實(shí)現(xiàn)這個(gè)要求. 解決的辦法(workaround)就是, 讓JNDI核心類使用當(dāng)前線程上下文的類加載器, 這樣, 就基本的類加載代理機(jī)制的相反方向建立了一條有效的途徑.
???
另外, 上面一段可能讓你想起一些其它的事情: XML解析Java API(JAXP). 是的, 當(dāng)JAXP只是J2SE的擴(kuò)展進(jìn), 它很自然地用當(dāng)前類加載器來(lái)引導(dǎo)解析器的實(shí)現(xiàn). 而當(dāng)JAXP被加入到J2SE1.4的核心類庫(kù)中時(shí), 它的類加載也就改成了用當(dāng)前線程類加載器, 與JNDI的情況完全類似(也使很多程序員很迷惑). 明白為什么我說(shuō)來(lái)自Sun的指導(dǎo)很缺乏了吧?
??
在以上的介紹之后, 我們來(lái)看關(guān)鍵問(wèn)題: 這兩種選擇(當(dāng)前類加載器和當(dāng)前線程類加載器)都不是在所有環(huán)境下都適用. 有些人認(rèn)為當(dāng)前線程類加載器應(yīng)該成為新的標(biāo)準(zhǔn)策略. 但是, 如果這樣, 當(dāng)多個(gè)線程通過(guò)共享數(shù)據(jù)進(jìn)行交互的時(shí), 將會(huì)呈現(xiàn)出一幅極其復(fù)雜的類加載的畫面, 除非它們?nèi)渴褂昧送粋€(gè)上下文的類加載器. 進(jìn)一步說(shuō), 在某些遺留下來(lái)的解決方案中, 委派到當(dāng)前類加載器的方法已經(jīng)是標(biāo)準(zhǔn). 比如對(duì)Class.forName(String)的直接調(diào)用(這也是我為什么推薦盡量避免對(duì)這個(gè)方法進(jìn)行調(diào)用的原因). 即使你努力去只調(diào)用上下文相關(guān)的類加載器, 仍然會(huì)有一些代碼會(huì)不由你控制. 這種不受控制的類加載委派機(jī)制是混入是很危險(xiǎn)的.
???
更嚴(yán)重的問(wèn)題, 某些應(yīng)用服務(wù)器把環(huán)境上下文及當(dāng)前類加載器設(shè)置到不同的類加載器實(shí)例上, 而這些類加載器有相同的類路徑但卻沒(méi)有委派機(jī)制中的父子關(guān)系. 想想這為什么十分可怕. 要知道類加載器定義并加載的類實(shí)例會(huì)帶有一個(gè)JVM內(nèi)部的ID號(hào). 如果當(dāng)前類加載器加載一個(gè)類X的實(shí)例, 這個(gè)實(shí)例調(diào)用JNDI查找類Y的實(shí)例, 些時(shí)的上下文的類加載器也可以定義了加載類Y實(shí)例. 這個(gè)類Y的定義就與當(dāng)前類加載器看到的類Y的定義不同. 如果進(jìn)行強(qiáng)制類型轉(zhuǎn)換, 則產(chǎn)生異常.
??
這種混亂的情況還將在Java中存在一段時(shí)間. 對(duì)于那些需要?jiǎng)討B(tài)加載資源的J2SE的API, 我們來(lái)猜想它們的類加策略. 例如:
?????????
JNDI
使用線程上下文類加載器
?????????
Class.getResource()
和Class.forName()使用當(dāng)前類加載器
?????????
JAXP(J2SE 1.4
及之后)使用線程上下文類加載器
?????????
java.util.ResourceBundle
使用調(diào)用者的當(dāng)前類加載器
?????????
URL protocol handlers specified via java.protocol.handler.pkgs system property are looked up in the bootstrap and system classloaders only
?????????
Java
序列化API默認(rèn)使用調(diào)用者當(dāng)前的類加載器
這些類及資源的加載策略問(wèn)題, 肯定是J2SE領(lǐng)域中文檔最及說(shuō)明最缺乏的部分了. posted @ 2006-07-27 15:23 船夫 閱讀(319) | 評(píng)論 (0) | 編輯 收藏 看星星的日子
今天晚上吃完晚飯,往回走的路上,不經(jīng)意間抬頭,看到了很多的星星,我跟同事都停下腳步,抬頭分辨哪個(gè)是北極星,哪里是北斗七星,聊得非常興起。
想起來(lái)自從到了成都之后,算上這次都只看過(guò)兩次星星,第一次是大一軍訓(xùn)的時(shí)候,在華陽(yáng)看到的,第二次就是今天晚上了。成都市里面不要指望會(huì)看到星星,因?yàn)闈饷艿脑瓢阉械男切嵌颊谧×恕?br />昨天聽(tīng)老唐說(shuō)他看到夜空中有一條“白帶”,他說(shuō)好像是銀河,他之前從來(lái)都沒(méi)有看過(guò)銀河,跟他比起來(lái)我真可以算是幸運(yùn)多了。小時(shí)候,到了夏天,家里人和鄰居都跑到院子里面納涼,我就躺在母親的懷里面,邊享受母親扇子帶來(lái)的涼爽,邊抬頭看星星,東北的星空真的是非常清晰,那時(shí)候,母親給我講哪個(gè)是銀河,哪個(gè)是牛郎織女,哪個(gè)是勺子星(北斗七星),還給我講牛郎織女的故事,說(shuō)一到了七月初七就會(huì)下雨,那是因?yàn)榕@珊涂椗鄷?huì)的淚水,還說(shuō)從來(lái)沒(méi)說(shuō)過(guò)謊的小孩子趴在黃瓜架下面可以聽(tīng)到他們的哭聲,想想現(xiàn)在認(rèn)識(shí)的那幾顆星星都是那個(gè)時(shí)候記下來(lái)的,書本上學(xué)的好像都不知道被我丟到哪里去了。那時(shí)候看到的星空現(xiàn)在回想起來(lái)真的是非常漂亮,就像冰心在繁星中描述的一樣。 已經(jīng)很多年沒(méi)在家里面過(guò)夏天了,過(guò)年的時(shí)候倒是有回去,但是天氣太冷,實(shí)在沒(méi)那種興致去看星星。 長(zhǎng)大了,反而覺(jué)得快樂(lè)只存在于回憶中了,這是成長(zhǎng)的代價(jià)嗎? posted @ 2006-07-25 23:53 船夫 閱讀(268) | 評(píng)論 (0) | 編輯 收藏 惰性已經(jīng)在充分的滋長(zhǎng)已經(jīng)封閉開(kāi)發(fā)了近三個(gè)月了,由剛開(kāi)始的熱情高漲到現(xiàn)在的熱情全無(wú),我已經(jīng)逐漸被自己的惰性所吞噬,已經(jīng)快慢慢的丟失了真正的自我。 posted @ 2006-07-25 23:22 船夫 閱讀(231) | 評(píng)論 (0) | 編輯 收藏 項(xiàng)目中遇到的一個(gè)Spring事務(wù)管理的問(wèn)題
今天從CVS上checkout項(xiàng)目的時(shí)候,出現(xiàn)了一個(gè)問(wèn)題,我以前寫的模塊功能本來(lái)是好的,但是checkout之后就出了問(wèn)題,我想一定是配置文件更新出錯(cuò)了,努力尋找,發(fā)現(xiàn)沒(méi)有問(wèn)題.后來(lái)經(jīng)同事說(shuō)他更改了一個(gè)方法,而我的代碼中有對(duì)那個(gè)方法的調(diào)用,終于知道了問(wèn)題的所在.
程序中拋出的異常是 ![]() 這個(gè)問(wèn)題只要把他的那個(gè)方法修改一下,或者從我的service方法中移出就可以解決. 我想spring中肯定應(yīng)該有些配置能使兩個(gè)service方法處于同一個(gè)事務(wù)中,但是我還沒(méi)找到.希望知道的高手能提點(diǎn)一下,謝謝 posted @ 2006-07-24 18:40 船夫 閱讀(659) | 評(píng)論 (0) | 編輯 收藏 在WSAD 5.1中使用log4j遇到的問(wèn)題使用log4j作為日志輸出工具,設(shè)置根級(jí)別為warn,然后分別設(shè)置了hibernate和spring等的級(jí)別為debug,自己項(xiàng)目的級(jí)別也設(shè)置為debug,但是很奇怪的事情出現(xiàn)了: posted @ 2006-07-21 01:23 船夫 閱讀(558) | 評(píng)論 (4) | 編輯 收藏 累
好久沒(méi)有思考過(guò)什么了,整個(gè)大腦都仿佛已經(jīng)失去了這個(gè)能力,每天忙著要么是做項(xiàng)目,要么就是忙著發(fā)呆,發(fā)呆自己能想些什么,做些什么,腦袋真的已經(jīng)生銹了。
整個(gè)人再也沒(méi)有高中時(shí)候的那種反應(yīng),看來(lái)這個(gè)大學(xué)讀的是虧了,直到現(xiàn)在還改變不了這種壞習(xí)慣。其實(shí)我很清楚,我這樣對(duì)自己說(shuō)完全是找個(gè)借口,這樣才能使自己感到?jīng)]有那么的空虛,少些對(duì)自己的自責(zé)。不過(guò)我發(fā)現(xiàn),很久以來(lái),都沒(méi)有那種自責(zé)的心理了,不會(huì)在為自己的懶散感到自責(zé),真的是很奇怪,在高中的時(shí)候,中午或周末多玩兒了一會(huì)兒,或是做錯(cuò)了一道不該做錯(cuò)的題,都會(huì)感到非常的愧疚,為此而一直自責(zé)。現(xiàn)在長(zhǎng)大了,每天充斥在腦子里面的都是,怎樣才能賺錢,學(xué)什么才能讓自己更加有發(fā)展,思考的越來(lái)越現(xiàn)實(shí),反而發(fā)現(xiàn)自己的動(dòng)力越來(lái)越不足,天哪,我是怎么了? 買房子,結(jié)婚?現(xiàn)實(shí)圍繞在我的身邊,把我壓得好緊,女友說(shuō)我脾氣太好,沒(méi)有男子氣概?難道我對(duì)她發(fā)脾氣才是好的嗎??jī)傻胤志樱瑸榱松畛鋈ケ疾ǎM苜嵒貋?lái)一棟房子,難道我愿意嗎?她爸和她媽對(duì)我的印象也不是很好,我知道我這個(gè)人太笨了,不會(huì)說(shuō)話,不會(huì)討別人喜歡,啊~~~~~~~~~~~我實(shí)在是受不了了,我已經(jīng)對(duì)自己失望透頂了,誰(shuí)能告訴我這個(gè)時(shí)候應(yīng)該能做什么????? 我要改變這一切,我要改變自己,我要提高自己的能力,我要改變他人對(duì)我的看法,我要做一個(gè)讓所有人都滿意的人,我他媽的是為了什么活得這么累啊,愛(ài)情,不是應(yīng)該兩個(gè)人之間事嗎?干嘛有那么多外在因素要影響我呢? 25歲,這個(gè)世界讓我變得衰老~~~ posted @ 2006-07-21 01:14 船夫 閱讀(205) | 評(píng)論 (0) | 編輯 收藏 表的外鍵約束[ZT]1。創(chuàng)建測(cè)試表
SQL> create table lesson(lesson_name varchar2(20), classroom varchar2(10)); 表已創(chuàng)建。 SQL> create table teacher(name varchar2(20),lesson_name varchar2(20)); 表已創(chuàng)建。 SQL> alter table lesson add constraint pk_lesson primary key(lesson_name); 表已更改。 SQL> alter table teacher add constraint fk_lessonname foreign key(lesson_name) 表已更改。
已創(chuàng)建 1 行。 SQL> insert into lesson values('music','class 2'); 已創(chuàng)建 1 行。
SQL> insert into teacher values('wang','music'); 已創(chuàng)建 1 行。 SQL> insert into teacher values('wang',null); 已創(chuàng)建 1 行。
posted @ 2006-03-16 15:44 船夫 閱讀(332) | 評(píng)論 (0) | 編輯 收藏 outer和left outer join有什么區(qū)別??
outer和left outer join有什么區(qū)別??
使用關(guān)系代數(shù)合并數(shù)據(jù) 1 關(guān)系代數(shù) 合并數(shù)據(jù)集合的理論基礎(chǔ)是關(guān)系代數(shù),它是由E.F.Codd于1970年提出的。 在關(guān)系代數(shù)的形式化語(yǔ)言中: ? 用表、或者數(shù)據(jù)集合表示關(guān)系或者實(shí)體。 ? 用行表示元組。 ? 用列表示屬性。 關(guān)系代數(shù)包含以下8個(gè)關(guān)系運(yùn)算符 ? 選取――返回滿足指定條件的行。 ? 投影――從數(shù)據(jù)集合中返回指定的列。 ? 笛卡爾積――是關(guān)系的乘法,它將分別來(lái)自兩個(gè)數(shù)據(jù)集合中的行以所有可能的方式進(jìn)行組合。 ? 并――關(guān)系的加法和減法,它可以在行的方向上合并兩個(gè)表中的數(shù)據(jù),就像把一個(gè)表壘在另一個(gè)表之上一樣。 ? 交――返回兩個(gè)數(shù)據(jù)集合所共有的行。 ? 差――返回只屬于一個(gè)數(shù)據(jù)集合的行。 ? 連接――在水平方向上合并兩個(gè)表,其方法是:將兩個(gè)表中在共同數(shù)據(jù)項(xiàng)上相互匹配的那些行合并起來(lái)。 ? 除――返回兩個(gè)數(shù)據(jù)集之間的精確匹配。 此外,作為一種實(shí)現(xiàn)現(xiàn)代關(guān)系代數(shù)運(yùn)算的方法,SQL還提供了: ? 子查詢――類似于連接,但更靈活;在外部查詢中,方式可以使用表達(dá)式、列表或者數(shù)據(jù)集合的地方都可以使用子查詢的結(jié)果。 本章將主要講述多種類型的連接、簡(jiǎn)單的和相關(guān)的子查詢、幾種類型的并、關(guān)系除以及其他的內(nèi)容。 2 使用連接 2.1 連接類型 在關(guān)系代數(shù)中,連接運(yùn)算是由一個(gè)笛卡爾積運(yùn)算和一個(gè)選取運(yùn)算構(gòu)成的。首先用笛卡爾積完成對(duì)兩個(gè)數(shù)據(jù)集合的乘運(yùn)算,然后對(duì)生成的結(jié)果集合進(jìn)行選取運(yùn)算,確保只把分別來(lái)自兩個(gè)數(shù)據(jù)集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個(gè)數(shù)據(jù)集合(通常是表),并產(chǎn)生一個(gè)新的結(jié)果集合,其方法是將一個(gè)數(shù)據(jù)源中的行于另一個(gè)數(shù)據(jù)源中和它匹配的行組合成一個(gè)新元組。 SQL提供了多種類型的連接方式,它們之間的區(qū)別在于:從相互交疊的不同數(shù)據(jù)集合中選擇用于連接的行時(shí)所采用的方法不同。 連接類型 定義 內(nèi)連接 只連接匹配的行 左外連接 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行 右外連接 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行 全外連接 包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行。 (H)(theta)連接 使用等值以外的條件來(lái)匹配左、右兩個(gè)表中的行 交叉連接 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個(gè)數(shù)據(jù)源中的每個(gè)行與另一個(gè)數(shù)據(jù)源的每個(gè)行都一一匹配 在INFORMIX中連接表的查詢 如果FROM子句指定了多于一個(gè)表引用,則查詢會(huì)連接來(lái)自多個(gè)表的行。連接條件指定各列之間(每個(gè)表至少一列)進(jìn)行連接的關(guān)系。因?yàn)檎诒容^連接條件中的列,所以它們必須具有一致的數(shù)據(jù)類型。 SELECT語(yǔ)句的FROM子句可以指定以下幾種類型的連接 FROM子句關(guān)鍵字 相應(yīng)的結(jié)果集 CROSS JOIN 笛卡爾乘積(所有可能的行對(duì)) INNER JOIN 僅對(duì)滿足連接條件的CROSS中的列 LEFT OUTER JOIN 一個(gè)表滿足條件的行,和另一個(gè)表的所有行 RIGHT OUTER JOIN 與LEFT相同,但兩個(gè)表的角色互換 FULL OUTER JOIN LEFT OUTER 和 RIGHT OUTER中所有行的超集 2.2 內(nèi)連接(Inner Join) 內(nèi)連接是最常見(jiàn)的一種連接,它頁(yè)被稱為普通連接,而E.FCodd最早稱之為自然連接。 下面是ANSI SQL-92標(biāo)準(zhǔn) select * from t_institution i inner join t_teller t on i.inst_no = t.inst_no where i.inst_no = "5801" 其中inner可以省略。 等價(jià)于早期的連接語(yǔ)法 select * from t_institution i, t_teller t where i.inst_no = t.inst_no and i.inst_no = "5801" 2.3 外連接 2.3.1 左外連接(Left Outer Jion) select * from t_institution i left outer join t_teller t on i.inst_no = t.inst_no 其中outer可以省略。 2.3.2 右外連接(Rigt Outer Jion) select * from t_institution i right outer join t_teller t on i.inst_no = t.inst_no 2.3.3 全外連接(Full Outer) 全外連接返回參與連接的兩個(gè)數(shù)據(jù)集合中的全部數(shù)據(jù),無(wú)論它們是否具有與之相匹配的行。在功能上,它等價(jià)于對(duì)這兩個(gè)數(shù)據(jù)集合分別進(jìn)行左外連接和右外連接,然后再使用消去重復(fù)行的并操作將上述兩個(gè)結(jié)果集合并為一個(gè)結(jié)果集。 在現(xiàn)實(shí)生活中,參照完整性約束可以減少對(duì)于全外連接的使用,一般情況下左外連接就足夠了。在數(shù)據(jù)庫(kù)中沒(méi)有利用清晰、規(guī)范的約束來(lái)防范錯(cuò)誤數(shù)據(jù)情況下,全外連接就變得非常有用了,你可以使用它來(lái)清理數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 select * from t_institution i full outer join t_teller t on i.inst_no = t.inst_no 2.3.4 外連接與條件配合使用 當(dāng)在內(nèi)連接查詢中加入條件是,無(wú)論是將它加入到j(luò)oin子句,還是加入到where子句,其效果是完全一樣的,但對(duì)于外連接情況就不同了。當(dāng)把條件加入到j(luò)oin子句時(shí),SQL Server、Informix會(huì)返回外連接表的全部行,然后使用指定的條件返回第二個(gè)表的行。如果將條件放到where子句中,SQL Server將會(huì)首先進(jìn)行連接操作,然后使用where子句對(duì)連接后的行進(jìn)行篩選。下面的兩個(gè)查詢展示了條件放置位子對(duì)執(zhí)行結(jié)果的影響: 條件在join子句 select * from t_institution i left outer join t_teller t on i.inst_no = t.inst_no and i.inst_no = “5801” 結(jié)果是: inst_no inst_name inst_no teller_no teller_name 5801 天河區(qū) 5801 0001 tom 5801 天河區(qū) 5801 0002 david 5802 越秀區(qū) 5803 白云區(qū) 條件在where子句 select * from t_institution i left outer join t_teller t on i.inst_no = t.inst_no where i.inst_no = “5801” 結(jié)果是: inst_no inst_name inst_no teller_no teller_name 5801 天河區(qū) 5801 0001 tom 5801 天河區(qū) 5801 0002 david 2.4 自身連接 自身連接是指同一個(gè)表自己與自己進(jìn)行連接。這種一元連接通常用于從自反關(guān)系(也稱作遞歸關(guān)系)中抽取數(shù)據(jù)。例如人力資源數(shù)據(jù)庫(kù)中雇員與老板的關(guān)系。 下面例子是在機(jī)構(gòu)表中查找本機(jī)構(gòu)和上級(jí)機(jī)構(gòu)的信息。 select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name from t_institution i join t_institution s on i.superior_inst = s.inst_no 結(jié)果是: superior_inst sup_inst_name inst_no inst_name 800 廣州市 5801 天河區(qū) 800 廣州市 5802 越秀區(qū) 800 廣州市 5803 白云區(qū) 2.5 交叉(無(wú)限制) 連接 交叉連接用于對(duì)兩個(gè)源表進(jìn)行純關(guān)系代數(shù)的乘運(yùn)算。它不使用連接條件來(lái)限制結(jié)果集合,而是將分別來(lái)自兩個(gè)數(shù)據(jù)源中的行以所有可能的方式進(jìn)行組合。數(shù)據(jù)集合中一的每個(gè)行都要與數(shù)據(jù)集合二中的每一個(gè)行分別組成一個(gè)新的行。例如,如果第一個(gè)數(shù)據(jù)源中有5個(gè)行,而第二個(gè)數(shù)據(jù)源中有4個(gè)行,那么在它們之間進(jìn)行交叉連接就會(huì)產(chǎn)生20個(gè)行。人們將這種類型的結(jié)果集稱為笛卡爾乘積。 大多數(shù)交叉連接都是由于錯(cuò)誤操作而造成的;但是它們卻非常適合向數(shù)據(jù)庫(kù)中填充例子數(shù)據(jù),或者預(yù)先創(chuàng)建一些空行以便為程序執(zhí)行期間所要填充的數(shù)據(jù)保留空間。 select * from t_institution i cross join t_teller t 在交叉連接中沒(méi)有on條件子句 3 APPENDIX 3.1 A 參考資料與資源 ? 《Microsoft SQL Server 2000 Bile》Paul Nielsen ? Paul Nielsen的Web站點(diǎn) www.isnotnull.com 3.2 注文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1測(cè)試通過(guò) posted @ 2006-03-06 13:02 船夫 閱讀(1644) | 評(píng)論 (0) | 編輯 收藏 HTML中Target的四個(gè)保留字
_parent:在當(dāng)前FRAMESET位置顯示新href。
_top:在當(dāng)前整個(gè)窗口位置顯示新href,比如本身FRAMESET位于另一個(gè)FRAMESET中。 _self:強(qiáng)制在當(dāng)前FRAME中顯示新href。 _blank:在新窗口中顯示href posted @ 2005-12-21 09:40 船夫 閱讀(2047) | 評(píng)論 (0) | 編輯 收藏 java實(shí)現(xiàn)文件傳輸
摘要: 1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.*; 4import javax.swing.event.*; 5i... 閱讀全文
posted @ 2005-12-20 11:22 船夫 閱讀(3064) | 評(píng)論 (5) | 編輯 收藏 Document 和 Document.all 分別什么時(shí)候用
如果與a,form對(duì)象,image對(duì)象,applet對(duì)象相對(duì)應(yīng)的html標(biāo)記中設(shè)定了name性質(zhì),它的值將被用作document對(duì)象的屬性名,用來(lái)引用相應(yīng)的對(duì)象,其他的對(duì)象則不可以。
另外,input等如果作為form的子元素,則直接用inputName或者document.inputName來(lái)引用此對(duì)象就是錯(cuò)誤的,必須使用formName.inputName引用,否則就可以使用inputName來(lái)引用. 另外應(yīng)該注意到有很多平時(shí)用的元素都沒(méi)有name. 如果想引用一個(gè)有id的元素,只能用Id或者document.getElementById,document.all.id來(lái)引用 linkid.href; all是一個(gè)集合,包含所有html對(duì)像的集合,寫一個(gè)程式,可以存取到所有的對(duì)像。像這樣: <script language="javascript"> 注意要把程式放到</html>之后哦。 作者: 來(lái)源:CSDN
posted @ 2005-12-20 10:24 船夫 閱讀(687) | 評(píng)論 (0) | 編輯 收藏 氣死老師的試卷答案1.地理 posted @ 2005-12-15 11:18 船夫 閱讀(396) | 評(píng)論 (0) | 編輯 收藏 Velocity 簡(jiǎn)介1.Velocity 的使用
Velocity是一個(gè)開(kāi)放源嗎的模版引擎,由apache.org小組負(fù)責(zé)開(kāi)發(fā),現(xiàn)在最新的版本是Velocity1.3.1,http://jakarta.apache.org/velocity/index.html 可以了解Velocity的最新信息。 Velocity允許我們?cè)谀0嬷性O(shè)定變量,然后在運(yùn)行時(shí),動(dòng)態(tài)的將數(shù)據(jù)插入到模版中,替換這些變量。 例如: <html> <body>HELLO $CUSTOMERNAME</body> </html> 我們可以在運(yùn)行時(shí)得到客戶的名字,然后把它插入到這個(gè)模版中替換變量$CUSTOMERNAME,整個(gè)替換過(guò)程是由Velocity進(jìn)行控制的,而且java的調(diào)用代碼也非常簡(jiǎn)單,如我們可以在java代碼中這樣調(diào)用 /***********************************************************/ //這個(gè)文件中設(shè)定了Velocity使用的log4j的配置和Velocity的模版文件所在的目錄 Velocity.init("D:\\Template\\resource\\jt.properties"); //模版文件名,模版文件所在的路徑在上一條語(yǔ)句中已經(jīng)設(shè)置了 Template template = Velocity.getTemplate("hello.vm", "gb2312"); //實(shí)例化一個(gè)Context VelocityContext context = new VelocityContext(); //把模版變量的值設(shè)置到context中 context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity."); //開(kāi)始模版的替換 template.merge(context, writer); //寫到文件中 PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true); filewriter.println(writer.toString()); filewriter.close(); /***********************************************************/ 這就是整個(gè)java的代碼,非常的簡(jiǎn)單。如果我們有多個(gè)模版變量,我們僅需要把這些模版變量的值設(shè)置到context中。 下面我們簡(jiǎn)單的分析一下,Velocity引擎讀取模板文件時(shí),它直接輸出文件中所有的文本,但以$字符開(kāi)頭的除外,$符號(hào)標(biāo)識(shí)著一個(gè)模版變量位置, context.put("CUSTOMERNAME", "My First Template Engine ---- Velocity."); 當(dāng) Velocity 模板引擎解析并輸出模板的結(jié)果時(shí),模板中所有出現(xiàn)$CUSTOMERNAME的地方都將插入客戶的名字,即被加入到VelocityContext的對(duì)象的toString()方法返回值將替代Velocity變量(模板中以$開(kāi)頭的變量)。 模板引擎中最強(qiáng)大、使用最頻繁的功能之一是它通過(guò)內(nèi)建的映像(Reflection)引擎查找對(duì)象信息的能力。這個(gè)映像引擎允許用一種方便的Java“.”類似的操作符,提取任意加入到VelocityContext的對(duì)象的任何公用方法的值,或?qū)ο蟮娜我鈹?shù)據(jù)成員。 映像引擎還帶來(lái)了另外一個(gè)改進(jìn):快速引用JavaBean的屬性。使用JavaBean屬性的時(shí)候,我們可以忽略get方法和括號(hào)。請(qǐng)看下面這個(gè)模板的例子。 <html> <body> Name:$Customer.Name() Address:$Customer.Address() Age:$Customer.Age() </body> </html> java的代碼: /***********************************************************/ //設(shè)置客戶信息 Customer mycustomer = new Customer(); mycustomer.setName("Velocity"); mycustomer.setAddress("jakarta.apache.org/velocity/index.html"); mycustomer.setAge(2); //這個(gè)文件中設(shè)定了 Velocity 使用的 Log4j 的配置和Velocity的模版文件所在的目錄Velocity.init("D:\\Template\\resource\\jt.properties"); //模版文件名,模版文件所在的路徑在上一條語(yǔ)句中已經(jīng)設(shè)置了 Template template = Velocity.getTemplate("hello.vm", "gb2312"); //實(shí)例化一個(gè)Context VelocityContext context = new VelocityContext(); //把模版變量的值設(shè)置到context中 context.put("Customer", mycustomer); //開(kāi)始模版的替換 template.merge(context, writer); //寫到文件中 PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true); filewriter.println(writer.toString()); filewriter.close(); 輸出結(jié)果: <html> <body> Name:Velocity Address:jakarta.apache.org/velocity/index.html Age:2 </body> </html> 除了替換變量之外,象Velocity高級(jí)引擎還能做其他許多事情,它們有用來(lái)比較和迭代的內(nèi)建指令,通過(guò)這些指令我們可以完成程序語(yǔ)言中的條件判斷語(yǔ)句和循環(huán)語(yǔ)句等。 例如,我們想要輸出年齡等于2的所有客戶的信息,我們可以這樣定義我們的模版 模版: <html> <body> <table> <tr> <td>名稱</td> <td>地址</td> <td>年齡</td> </tr> #foreach ($Customer in $allCustomer) #if($Customer.Age()=="2") <tr> <td>$Customer.Name()</td> <td>$Customer.Address()</td> <td>$Customer.Age()</td> </tr> #end #end </table> </body> </html> java的代碼: /******************************************************/ //設(shè)置客戶信息 ArrayList allMyCustomer = new ArrayList(); //客戶1 Customer mycustomer1 = new Customer(); mycustomer1.setName("Velocity"); mycustomer1.setAddress("jakarta.apache.org/velocity/index.html"); mycustomer1.setAge(2); //客戶2 Customer mycustomer2 = new Customer(); mycustomer2.setName("Tomcat"); mycustomer2.setAddress("jakarta.apache.org/tomcat/index.html"); mycustomer2.setAge(3); //客戶3 Customer mycustomer3 = new Customer(); mycustomer3.setName("Log4J"); mycustomer3.setAddress("jakarta.apache.org/log4j/docs/index.html"); mycustomer3.setAge(2); //添加到allMyCustomer(ArrayList)中. allMyCustomer.add(mycustomer1); allMyCustomer.add(mycustomer2); allMyCustomer.add(mycustomer3); //這個(gè)文件中設(shè)定了Velocity使用的log4j的配置和Velocity的模版文件所在的目 Velocity.init("D:\\Template\\resource\\jt.properties"); //模版文件名,模版文件所在的路徑在上一條語(yǔ)句中已經(jīng)設(shè)置了 Template template =Velocity.getTemplate("hello.vm", "gb2312"); //實(shí)例化一個(gè)Context VelocityContext context = new VelocityContext(); /** 注意這里我們僅僅需要給一個(gè)模版變量負(fù)值 */ context.put("allCustomer", allMyCustomer); //開(kāi)始模版的替換 template.merge(context, writer); //寫到文件中 PrintWriter filewriter = new PrintWriter(new FileOutputStream(outpath),true); filewriter.println(writer.toString()); filewriter.close(); /******************************************************/ 結(jié)果: <html> <body> <table> <tr> <td>名稱</td> <td>地址</td> <td>年齡</td> </tr> <tr> <td>Velocity</td> <td>jakarta.apache.org/velocity/index.html</td> <td>2</td> </tr> <tr> <td>Log4J</td> <td>jakarta.apache.org/log4j/docs/index.html</td> <td>2</td> </tr> </table> </body> </html> #if 語(yǔ)句完成邏輯判斷,這個(gè)我想不用多說(shuō)了。 allCustomer對(duì)象包含零個(gè)或者多個(gè)Customer對(duì)象。由于ArrayList (List, HashMap, HashTable, Iterator, Vector等)屬于Java Collections Framework的一部分,我們可以用#foreach指令迭代其內(nèi)容。我們不用擔(dān)心如何定型對(duì)象的類型——映像引擎會(huì)為我們完成這個(gè)任務(wù)。#foreach指令的一般格式是“#foreach in ”。#foreach指令迭代list,把list中的每個(gè)元素放入item參數(shù),然后解析#foreach塊內(nèi)的內(nèi)容。對(duì)于list內(nèi)的每個(gè)元素,#foreach塊的內(nèi)容都會(huì)重復(fù)解析一次。從效果上看,它相當(dāng)于告訴模板引擎說(shuō):“把list中的每一個(gè)元素依次放入item變量,每次放入一個(gè)元素,輸出一次#foreach塊的內(nèi)容”。 2.MVC設(shè)計(jì)模型 使用模板引擎最大的好處在于,它分離了代碼(或程序邏輯)和表現(xiàn)(輸出)。由于這種分離,你可以修改程序邏輯而不必?fù)?dān)心郵件消息本身;類似地,你(或公關(guān)部門的職員)可以在不重新編譯程序的情況下,重新編寫客戶列表。實(shí)際上,我們分離了系統(tǒng)的數(shù)據(jù)模式(Data Model,即提供數(shù)據(jù)的類)、控制器(Controller,即客戶列表程序)以及視圖(View,即模板)。這種三層體系稱為Model-View-Controller模型(MVC)。 如果遵從MVC模型,代碼分成三個(gè)截然不同的層,簡(jiǎn)化了軟件開(kāi)發(fā)過(guò)程中所有相關(guān)人員的工作。 結(jié)合模板引擎使用的數(shù)據(jù)模式可以是任何Java對(duì)象,最好是使用Java Collection Framework的對(duì)象。控制器只要了解模板的環(huán)境(如VelocityContext),一般這種環(huán)境都很容易使用。 一些關(guān)系數(shù)據(jù)庫(kù)的“對(duì)象-關(guān)系”映射工具能夠和模板引擎很好地協(xié)同,簡(jiǎn)化JDBC操作;對(duì)于EJB,情形也類似。 模板引擎與MVC中視圖這一部分的關(guān)系更為密切。模板語(yǔ)言的功能很豐富、強(qiáng)大,足以處理所有必需的視圖功能,同時(shí)它往往很簡(jiǎn)單,不熟悉編程的人也可以使用它。模板語(yǔ)言不僅使得設(shè)計(jì)者從過(guò)于復(fù)雜的編程環(huán)境中解脫出來(lái),而且它保護(hù)了系統(tǒng),避免了有意或無(wú)意帶來(lái)危險(xiǎn)的代碼。例如,模板的編寫者不可能編寫出導(dǎo)致無(wú)限循環(huán)的代碼,或侵占大量?jī)?nèi)存的代碼。不要輕估這些安全機(jī)制的價(jià)值;大多數(shù)模板編寫者不懂得編程,從長(zhǎng)遠(yuǎn)來(lái)看,避免他們接觸復(fù)雜的編程環(huán)境相當(dāng)于節(jié)省了你自己的時(shí)間。 許多模板引擎的用戶相信,在采用模板引擎的方案中,控制器部分和視圖部分的明確分離,再加上模板引擎固有的安全機(jī)制,使得模板引擎足以成為其他內(nèi)容發(fā)布系統(tǒng)(比如JSP)的替代方案。因此,Java模板引擎最常見(jiàn)的用途是替代JSP也就不足為奇了。 3.HTML處理 由于人們總是看重模板引擎用來(lái)替換JSP的作用,有時(shí)他們會(huì)忘記模板還有更廣泛的用途。到目前為止,模板引擎最常見(jiàn)的用途是處理HTML Web內(nèi)容。但我還用模板引擎生成過(guò)SQL、email、XML甚至Java源代碼。 posted @ 2005-12-01 08:36 船夫 閱讀(532) | 評(píng)論 (0) | 編輯 收藏 一篇關(guān)于web.xml配置的詳細(xì)說(shuō)明1 定義頭和根元素 posted @ 2005-11-29 17:38 船夫 閱讀(388) | 評(píng)論 (0) | 編輯 收藏 ↑→40種網(wǎng)頁(yè)常用小技巧(javascript)←↓------[不時(shí)之需](轉(zhuǎn)自CJSDN)1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽鼠標(biāo)右鍵 <table border oncontextmenu=return(false)><td>no</table> 可用于Table 2. <body onselectstart="return false"> 取消選取、防止復(fù)制 3. onpaste="return false" 不準(zhǔn)粘貼 4. oncopy="return false;" oncut="return false;" 防止復(fù)制 5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址欄前換成自己的圖標(biāo) 6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夾中顯示出你的圖標(biāo) 7. <input style="ime-mode:disabled"> 關(guān)閉輸入法 8. 永遠(yuǎn)都會(huì)帶著框架 <script language="JavaScript"><!-- if (window == top)top.location.href = "frames.htm"; //frames.htm為框架網(wǎng)頁(yè) // --></script> 9. 防止被人frame <SCRIPT LANGUAGE=JAVASCRIPT><!-- if (top.location != self.location)top.location=self.location; // --></SCRIPT> 10. 網(wǎng)頁(yè)將不能被另存為 <noscript><iframe src=*.html></iframe></noscript> 11. <input type=button value=查看網(wǎng)頁(yè)源代碼 onclick="window.location = "view-source:"+ "http://www.pconline.com.cn""> 12.刪除時(shí)確認(rèn) <a href="javascript:if(confirm("確實(shí)要?jiǎng)h除嗎?"))location="boos.asp?&areyou=刪除&page=1"">刪除</a> 13. 取得控件的絕對(duì)位置 //Javascript <script language="Javascript"> function getIE(e){ var t=e.offsetTop; var l=e.offsetLeft; while(e=e.offsetParent){ t+=e.offsetTop; l+=e.offsetLeft; } alert("top="+t+"/nleft="+l); } </script> //VBScript <script language="VBScript"><!-- function getIE() dim t,l,a,b set a=document.all.img1 t=document.all.img1.offsetTop l=document.all.img1.offsetLeft while a.tagName<>"BODY" set a = a.offsetParent t=t+a.offsetTop l=l+a.offsetLeft wend msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置" end function --></script> 14. 光標(biāo)是停在文本框文字的最后 <script language="javascript"> function cc() { var e = event.srcElement; var r =e.createTextRange(); r.moveStart("character",e.value.length); r.collapse(true); r.select(); } </script> <input type=text name=text1 value="123" onfocus="cc()"> 15. 判斷上一頁(yè)的來(lái)源 javascript: document.referrer 16. 最小化、最大化、關(guān)閉窗口 <object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> <param name="Command" value="Minimize"></object> <object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> <param name="Command" value="Maximize"></object> <OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"> <PARAM NAME="Command" VALUE="Close"></OBJECT> <input type=button value=最小化 onclick=hh1.Click()> <input type=button value=最大化 onclick=hh2.Click()> <input type=button value=關(guān)閉 onclick=hh3.Click()> 本例適用于IE 17.屏蔽功能鍵Shift,Alt,Ctrl <script> function look(){ if(event.shiftKey) alert("禁止按Shift鍵!"); //可以換成ALT CTRL } document.onkeydown=look; </script> 18. 網(wǎng)頁(yè)不會(huì)被緩存 <META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"> 或者<META HTTP-EQUIV="expires" CONTENT="0"> 19.怎樣讓表單沒(méi)有凹凸感? <input type=text style="border:1 solid #000000"> 或 <input type=text style="border-left:none; border-right:none; border-top:none; border-bottom: 1 solid #000000"></textarea> 20.<div><span>&<layer>的區(qū)別? <div>(division)用來(lái)定義大段的頁(yè)面元素,會(huì)產(chǎn)生轉(zhuǎn)行 <span>用來(lái)定義同一行內(nèi)的元素,跟<div>的唯一區(qū)別是不產(chǎn)生轉(zhuǎn)行 <layer>是ns的標(biāo)記,ie不支持,相當(dāng)于<div> 21.讓彈出窗口總是在最上面: <body onblur="this.focus();"> 22.不要滾動(dòng)條? 讓豎條沒(méi)有: <body style="overflow:scroll;overflow-y:hidden"> </body> 讓橫條沒(méi)有: <body style="overflow:scroll;overflow-x:hidden"> </body> 兩個(gè)都去掉?更簡(jiǎn)單了 <body scroll="no"> </body> 23.怎樣去掉圖片鏈接點(diǎn)擊后,圖片周圍的虛線? <a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a> 24.電子郵件處理提交表單 <form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain"> <input type=submit> </form> 25.在打開(kāi)的子窗口刷新父窗口的代碼里如何寫? window.opener.location.reload() 26.如何設(shè)定打開(kāi)頁(yè)面的大小 <body onload="top.resizeTo(300,200);"> 打開(kāi)頁(yè)面的位置<body onload="top.moveBy(300,200);"> 27.在頁(yè)面中如何加入不是滿鋪的背景圖片,拉動(dòng)頁(yè)面時(shí)背景圖不動(dòng) <STYLE> body {background-image:url(logo.gif); background-repeat:no-repeat; background-position:center;background-attachment: fixed} </STYLE> 28. 檢查一段字符串是否全由數(shù)字組成 <script language="Javascript"><!-- function checkNum(str){return str.match(//D/)==null} alert(checkNum("1232142141")) alert(checkNum("123214214a1")) // --></script> 29. 獲得一個(gè)窗口的大小 document.body.clientWidth; document.body.clientHeight 30. 怎么判斷是否是字符 if (/[^/x00-/xff]/g.test(s)) alert("含有漢字"); else alert("全是字符"); 31.TEXTAREA自適應(yīng)文字行數(shù)的多少 <textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight"> </textarea> 32. 日期減去天數(shù)等于第二個(gè)日期 <script language=Javascript> function cc(dd,dadd) { //可以加上錯(cuò)誤處理 var a = new Date(dd) a = a.valueOf() a = a - dadd * 24 * 60 * 60 * 1000 a = new Date(a) alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日") } cc("12/23/2002",2) </script> 33. 選擇了哪一個(gè)Radio <HTML><script language="vbscript"> function checkme() for each ob in radio1 if ob.checked then window.alert ob.value next end function </script><BODY> <INPUT name="radio1" type="radio" value="style" checked>Style <INPUT name="radio1" type="radio" value="barcode">Barcode <INPUT type="button" value="check" onclick="checkme()"> </BODY></HTML> 34.腳本永不出錯(cuò) <SCRIPT LANGUAGE="JavaScript"> <!-- Hide function killErrors() { return true; } window.onerror = killErrors; // --> </SCRIPT> 35.ENTER鍵可以讓光標(biāo)移到下一個(gè)輸入框 <input onkeydown="if(event.keyCode==13)event.keyCode=9"> 36. 檢測(cè)某個(gè)網(wǎng)站的鏈接速度: 把如下代碼加入<body>區(qū)域中: <script language=Javascript> tim=1 setInterval("tim++",100) b=1 var autourl=new Array() autourl[1]="www.njcatv.net" autourl[2]="javacool.3322.net" autourl[3]="www.sina.com.cn" autourl[4]="www.nuaa.edu.cn" autourl[5]="www.cctv.com" function butt(){ document.write("<form name=autof>") for(var i=1;i<autourl.length;i++) document.write("<input type=text name=txt"+i+" size=10 value=測(cè)試中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO onclick=window.open(this.form.url"+i+".value)><br>") document.write("<input type=submit value=刷新></form>") } butt() function auto(url){ document.forms[0]["url"+b].value=url if(tim>200) {document.forms[0]["txt"+b].value="鏈接超時(shí)"} else {document.forms[0]["txt"+b].value="時(shí)間"+tim/10+"秒"} b++ } function run(){for(var i=1;i<autourl.length;i++)document.write("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1 onerror=auto("http://"+autourl+"")>")} run()</script> 37. 各種樣式的光標(biāo) auto :標(biāo)準(zhǔn)光標(biāo) default :標(biāo)準(zhǔn)箭頭 hand :手形光標(biāo) wait :等待光標(biāo) text :I形光標(biāo) vertical-text :水平I形光標(biāo) no-drop :不可拖動(dòng)光標(biāo) not-allowed :無(wú)效光標(biāo) help :?幫助光標(biāo) all-scroll :三角方向標(biāo) move :移動(dòng)標(biāo) crosshair :十字標(biāo) e-resize n-resize nw-resize w-resize s-resize se-resize sw-resize 38.頁(yè)面進(jìn)入和退出的特效 進(jìn)入頁(yè)面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)"> 推出頁(yè)面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)"> 這個(gè)是頁(yè)面被載入和調(diào)出時(shí)的一些特效。duration表示特效的持續(xù)時(shí)間,以秒為單位。transition表示使用哪種特效,取值為 1-23: 0 矩形縮小 1 矩形擴(kuò)大 2 圓形縮小 3 圓形擴(kuò)大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 豎百葉窗 9 橫百葉窗 10 錯(cuò)位橫百葉窗 11 錯(cuò)位豎百葉窗 12 點(diǎn)擴(kuò)散 13 左右到中間刷新 14 中間到左右刷新 15 中間到上下 16 上下到中間 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 橫條 22 豎條 23 以上22種隨機(jī)選擇一種 39.在規(guī)定時(shí)間內(nèi)跳轉(zhuǎn) <META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com"> 40.網(wǎng)頁(yè)是否被檢索 <meta name="ROBOTS" content="屬性值"> 其中屬性值有以下一些: 屬性值為"all": 文件將被檢索,且頁(yè)上鏈接可被查詢; 屬性值為"none": 文件不被檢索,而且不查詢頁(yè)上的鏈接; 屬性值為"index": 文件將被檢索; 屬性值為"follow": 查詢頁(yè)上的鏈接; 屬性值為"noindex": 文件不檢索,但可被查詢鏈接; 屬性值為"nofollow": 文件不被檢索,但可查詢頁(yè)上的鏈接。 posted @ 2005-11-29 09:27 船夫 閱讀(237) | 評(píng)論 (0) | 編輯 收藏 |
||