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

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

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

    ourday

    ourday

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      8 Posts :: 2 Stories :: 11 Comments :: 0 Trackbacks

    2008年9月20日 #

    JPA是什么

     

    定義 Java Persistence API

    JPA通過JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實體對象持久化到數(shù)據(jù)庫中。

    起源

    Sun引入新的JPA ORM規(guī)范出于兩個原因:其一,簡化現(xiàn)有Java EE和Java SE應(yīng)用的對象持久化的開發(fā)工作;其二,Sun希望整合對ORM技術(shù),實現(xiàn)天下歸一。

    JPA由EJB 3.0軟件專家組開發(fā),作為JSR-220實現(xiàn)的一部分。但它不囿于EJB 3.0,你可以在Web應(yīng)用、甚至桌面應(yīng)用中使用。JPA的宗旨是為POJO提供持久化標(biāo)準(zhǔn)規(guī)范,由此可見,經(jīng)過這幾年的實踐探索,能夠脫離容器獨(dú)立運(yùn) 行,方便開發(fā)和測試的理念已經(jīng)深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實現(xiàn)。

    JPA的總體思想和現(xiàn)有Hibernate、TopLink,JDO等ORM框架大體一致??偟膩碚f,JPA包括以下3方面的技術(shù):

    ORM映射元數(shù)據(jù)

    JPA支持XML和JDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對象和表之間的映射關(guān)系,框架據(jù)此將實體對象持久化到數(shù)據(jù)庫表中;

    JPA 的API

    用來操作實體對象,執(zhí)行CRUD操作,框架在后臺替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。

    查詢語言

    這是持久化操作中很重要的一個方面,通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的查詢語言查詢數(shù)據(jù),避免程序的SQL語句緊密耦合。

    JPA的優(yōu)勢

    1 標(biāo)準(zhǔn)化

    JPA 是 JCP 組織發(fā)布的 Java EE 標(biāo)準(zhǔn)之一,因此任何聲稱符合 JPA 標(biāo)準(zhǔn)的框架都遵循同樣的架構(gòu),提供相同的訪問 API,這保證了基于JPA開發(fā)的企業(yè)應(yīng)用能夠經(jīng)過少量的修改就能夠在不同的JPA框架下運(yùn)行。

    2 對容器級特性的支持

    JPA 框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級事務(wù),這使得 JPA 超越了簡單持久化框架的局限,在企業(yè)應(yīng)用發(fā)揮更大的作用。

    3 簡單易用,集成方便

    JPA的主要目標(biāo)之一就是提供更加簡單的編程模型:在JPA框架下創(chuàng)建實體和創(chuàng)建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進(jìn)行注釋;JPA的框架和接口也都非常簡單,沒有太多特別的規(guī)則和設(shè)計模式的要求,開發(fā)者可以很容易的 掌握。JPA基于非侵入式原則設(shè)計,因此可以很容易的和其它框架或者容器集成。

    4 可媲美JDBC的查詢能力

    JPA的查詢語言是面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的,它以面向?qū)ο蟮淖匀徽Z法構(gòu)造查詢語句,可以看成 是Hibernate HQL的等價物。JPA定義了獨(dú)特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴(kuò)展,它是針對實體的一種查詢語言,操作對象是實體,而不是關(guān)系數(shù)據(jù)庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

    5 支持面向?qū)ο蟮母呒壧匦?/p>

    JPA 中能夠支持面向?qū)ο蟮母呒壧匦?,如類之間的繼承、多態(tài)和類之間的復(fù)雜關(guān)系,這樣的支持能夠讓開發(fā)者最大限度的使用面向?qū)ο蟮哪P驮O(shè)計企業(yè)應(yīng)用,而不需要自行處理這些特性在關(guān)系數(shù)據(jù)庫的持久化。

    JPA的供應(yīng)商

    JPA 的目標(biāo)之一是制定一個可以由很多供應(yīng)商實現(xiàn)的API,并且開發(fā)人員可以編碼來實現(xiàn)該API,而不是使用私有供應(yīng)商特有的API。因此開發(fā)人員只需使用供應(yīng) 商特有的API來獲得JPA規(guī)范沒有解決但應(yīng)用程序中需要的功能。盡可能地使用JPA API,但是當(dāng)需要供應(yīng)商公開但是規(guī)范中沒有提供的功能時,則使用供應(yīng)商特有的API。

    1 Hibernate

    JPA是需要Provider來實現(xiàn)其功能的,Hibernate就是JPA Provider中很強(qiáng)的一個,目前來說應(yīng)該無人能出其右。從功能上來說,JPA現(xiàn)在就是Hibernate功能的一個子集。Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認(rèn)證。

    只要熟悉Hibernate或者其他ORM框架,在使用JPA時會發(fā)現(xiàn)其實非常容易上手。例如 實體對象的狀態(tài),在Hibernate有自由、持久、游離三種,JPA里有new,managed,detached,removed,明眼人一看就知 道,這些狀態(tài)都是一一對應(yīng)的。再如flush方法,都是對應(yīng)的,而其他的再如說Query query = manager.createQuery(sql),它在Hibernate里寫法上是session,而在JPA中變成了manager,所以從 Hibernate到JPA的代價應(yīng)該是非常小的

    同樣,JDO,也開始兼容JPA。在ORM的領(lǐng)域中,看來JPA已經(jīng)是王道,規(guī)范就是規(guī)范。在各大廠商的支持下,JPA的使用開始變得廣泛。

    2 Spring

    Spring + Hibernate 常常被稱為 Java Web 應(yīng)用人氣最旺的框架組合。而在 JCP 通過的 Web Beans JSR ,卻欲將JSF + EJB + JPA 、來自 JBoss Seam(Spring 除外)的一些組件和EJB 3(目前能夠提供有基本攔截和依賴注入功能的簡化 Session Bean 框架)的一個 Web 組合進(jìn)行標(biāo)準(zhǔn)化。如今的 Spring 2.0 為 JPA 提供了完整的 EJB 容器契約,允許 JPA在任何環(huán)境內(nèi)可以在 Spring 管理的服務(wù)層使用(包括 Spring 的所有 AOP 和 DI 增強(qiáng))。同時,關(guān)于下一個Web應(yīng)用組合會是 EJB、Spring + Hibernate 還是 Spring + JPA 的論戰(zhàn),早已充斥于耳。

    在Spring 2.0.1中,正式提供對JPA的支持,這也促成了JPA的發(fā)展,要知道JPA的好處在于可以分離于容器運(yùn)行,變得更加的簡潔。

    3 OpenJPA

    OpenJPA 是 Apache 組織提供的開源項目,它實現(xiàn)了 EJB 3.0 中的 JPA 標(biāo)準(zhǔn),為開發(fā)者提供功能強(qiáng)大、使用簡單的持久化數(shù)據(jù)管理框架。OpenJPA 封裝了和關(guān)系型數(shù)據(jù)庫交互的操作,讓開發(fā)者把注意力集中在編寫業(yè)務(wù)邏輯上。OpenJPA 可以作為獨(dú)立的持久層框架發(fā)揮作用,也可以輕松的與其它 Java EE 應(yīng)用框架或者符合 EJB 3.0 標(biāo)準(zhǔn)的容器集成。

    4 其它

    目前支持的實現(xiàn)包括Toplink、Hibernate Entitymanager等。TopLink以前需要收費(fèi),如今開源了。OpenJPA雖然免費(fèi),但功能、性能、普及性等方面更加需要加大力度。

    對于EJB來說,實體Bean一直是被批評的對象,由于其太復(fù)雜和龐大。JPA的出現(xiàn),很大程度的分離了復(fù)雜性。這讓EJB的推廣也變得容易。

    總而言之,JPA規(guī)范主要關(guān)注的僅是API的行為方面,而由各種實現(xiàn)完成大多數(shù)性能有關(guān)的調(diào)優(yōu)。盡管如此,所有可靠的實現(xiàn)都應(yīng)該擁有某種數(shù)據(jù)緩存,以作為選擇。但愿不久的將來,JPA能成為真正的標(biāo)準(zhǔn)。

    小結(jié)

    EJB 3.0和JPA 毫無疑問將是Java EE 5的主要賣點。在某些領(lǐng)域中,它們給Java社區(qū)帶來了競爭優(yōu)勢,并使Java 在其他領(lǐng)域與競爭對手不分伯仲(因為,不可否認(rèn),目前某些領(lǐng)域尚不存在基于標(biāo)準(zhǔn)的方法)。

    過去數(shù)年來,Spring Framework一直是EJB在企業(yè)領(lǐng)域的主要競爭對手。EJB3.0規(guī)范解決了很多促進(jìn)Spring興起的問題。隨著它的出現(xiàn),EJB3.0毫無疑問比Spring提供了更好的開發(fā)體驗——最引人注目的優(yōu)勢是它不需要配置文件。

    JPA提供一種標(biāo)準(zhǔn)的OR映射解決方案,該解決方案完全集成到EJB3。0兼容的容器中。JPA的前輩將會繼續(xù)穩(wěn)定發(fā)展,但是業(yè)務(wù)應(yīng)用程序中的 raw 使用將可能會減少。實現(xiàn) JPA 兼容的實體管理器似乎很可能是此類技術(shù)的發(fā)展方向。

    Java EE系列規(guī)范的較大問題與JPA沒有任何關(guān)系。Java EE 系列規(guī)范的問題涉及到 Web和EJB容器之間的集成。Spring在此領(lǐng)域仍然具有主要競爭優(yōu)勢。JBoss的Seam項目嘗試使用自定義的方法來解決這一問題。Caucho Resin應(yīng)用服務(wù)器試圖擴(kuò)展容器邊界并支持在Web容器中使用@EJB注釋。我們希望Java EE 5.1將解決層集成的問題,為我們提供一個全面而標(biāo)準(zhǔn)的依賴性注入方法。

    在不久的將來,Sun可能會將JPA作為一個單獨(dú)的JSR對待,同時JPA還可能作為Java SE的一部分。不過這些都不太重要,重要的是,我們現(xiàn)在已經(jīng)可以在脫離容器的情況下、在Java SE應(yīng)用中使用JPA了。

    JPA已經(jīng)作為一項對象持久化的標(biāo)準(zhǔn),不但可以獲得Java EE應(yīng)用服務(wù)器的支持,還可以直接在Java SE中使用。開發(fā)者將無需在現(xiàn)有多種ORM框架中艱難地選擇,按照Sun的預(yù)想,現(xiàn)有ORM框架頭頂?shù)墓猸h(huán)將漸漸暗淡,不再具有以往的吸引力。

    值得注意的是Java Persistence API并不是J2EE環(huán)境

    專用,而是在java中的通用API。意味著我們可以在任何需要訪問關(guān)系數(shù)據(jù)庫的地方使用JPA,

    甚至包括面應(yīng)用。JPA也不要求一定在J2EE容器中才能運(yùn)行,而是任何有JVM的環(huán)境都可以運(yùn)用。

    這就使得我們可以很容易的把JPA作為一個持久化組件自由的和各種容器/框架(EJB3容器, Spring等等)組合。

       JPA最主要的是一個統(tǒng)一的persistence.xml配置文件,可以放到每一個jar的META-INF/目錄下面,配置內(nèi)容主要有

    (以hibernate為例)

    1、數(shù)據(jù)庫連接的配置文件

    2、數(shù)據(jù)庫方言、連接URL、用戶名、密碼

    3、ORM映射的列表(Class)

    4、配置其它的Hibernate屬性(其他的Provider屬性)

    5、cache

    主要內(nèi)容,詳細(xì)內(nèi)容請看hibernate的reference

    xml 代碼

    1. xml version="1.0" encoding="UTF-8"?>  
    2. <persistence>  
    3.    <persistence-unit name="TestEntityManager" transaction-type="RESOURCE_LOCAL">  
    4.       <provider>org.hibernate.ejb.HibernatePersistenceprovider>     
    5.       <class>com.jl.sub1.mapping.Productclass>  
    6.       <class>com.jl.sub1.mapping.ProductItemclass>  
    7.         
    8.       <properties>  
    9.           <property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />  
    10.           <property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2Driver" />  
    11.           <property name="hibernate.connection.password" value="db2admin" />  
    12.           <property name="hibernate.connection.url" value="jdbc:db2://10.1.1.10:50000/dbjl" />  
    13.           <property name="hibernate.connection.username" value="db2admin" />  
    14.           <property name="hibernate.ejb.autodetection" value="class" />  
    15.     properties>               
    16.    persistence-unit>  
    17. persistence>  
    18.   
    19.   
    20.   
    21.   
    22. <property name="kodo.ConnectionDriverName" value="..."/>  
    23. <property name="kodo.ConnectionURL" value="..."/>  
    24. <property name="kodo.ConnectionUserName" value="..."/>  
    25. <property name="kodo.ConnectionPassword" value="..."/>  
    26. <property name="kodo.Log" value="DefaultLevel=INFO, Runtime=DEBUG, Tool=INFO"/>  
    27.              

     

    spring配置

    xml 代碼

    1. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">  
    2.     <property name="entityManagerName"         value="TestEntityManager" />     
    3.     <property name="jpaProperties">  
    4.         <props></props>  
    5.     </property>  
    6.       
    7. </bean>  
    8. <!-- 此處的名字要和persistence.xml中定義的name一致-->  
    9. <!-- jpaProperties此屬性必須要加,hibernate3.1.2的一個bug,否則會拋NullPointerException,springframework論壇告訴我的:)-->  
    10.   
    11. <bean class=  
    12.     "org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>  
    13.     <!--貌似這個部分所有spring配置文件還是僅允許一個,可以配置到公共的xml中-->  
    14.       
    15. <!--引用上面建立的entityManagerFactory-->  
    16. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">  
    17.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
    18.           
    19. </bean>  
    20.   
    21. <bean id="transactionInterceptor"  
    22.     class="org.springframework.transaction.interceptor.TransactionInterceptor">  
    23.     <property name="transactionManager" ref="transactionManager" />  
    24.     <property name="transactionAttributeSource">  
    25.     <bean class=  
    26.     "org.springframework.transaction.annotation.AnnotationTransactionAttributeSource" />  
    27.     </property>  
    28. </bean>  
    29.   
    30. <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">  
    31.     <property name="transactionInterceptor" ref="transactionInterceptor" />  
    32. </bean>  
    33.   
    34. <!--自定義DAO-->  
    35. <bean id="numberDao" class="dao.JpaNumberDAO">  
    36.     <property name="entityManagerFactory“ ref="entityManagerFactory" />  
    37. </bean>  
    38. <!--DAO需繼承自org.springframework.orm.jpa.support.JpaDaoSupport-->  
    39. <!--DAO中可以通過getJpaTemplate()的各種方法進(jìn)行持久化操作-->  

     

    這樣就好了,可以使用entitymanager,每個jar里面可以相互不用影響,而且這個也符合我們新過程改進(jìn)推進(jìn)的每個子系統(tǒng)用jar發(fā)布的原則,當(dāng)然這里的還有作service層,對于子系統(tǒng)之間的交互,我覺得,原則上應(yīng)該僅允許他們在service的層面上進(jìn)行,在DAO之間不應(yīng)該有相互的交叉,不過隱約覺

    得還有很多東西要做,嗯,很晚了,肚子餓,明天再想,呵呵

    哦,對了,Spring真是好東西,封裝了這么多東西給我們用,真是期待更好的版本出來啊,

    還有,在j2se環(huán)境里,也可以通過代碼的方式取得JPA的api

    java 代碼

    1. EntityManagerFactory emf =  
    2. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
    3. //此處的名字要和persistence.xml中  
    4.   
    5. //定義的name一致  
    6.   
    7.   
    8. EntityManager em = emf.createEntityManager();  
    9. ...//使用  
    10. em.close();  
    11. ...  
    12. emf.close();  
    13. EntityManagerFactory emf =  
    14. Peristence.createEntityManagerFactory(“TestEntityManager”) ;  
    15. EntityManager em = emf.createEntityManager();  
    16. ...//使用  
    17. em.close();  
    18. ...  
    19. emf.close();  

    posted @ 2010-05-09 15:02 ourday 閱讀(1793) | 評論 (1)編輯 收藏

    使用注解元數(shù)據(jù)
    基本注解:
    例子:
    @Entity(name = "T_TOPIC") ①
    public class Topic implements Serializable ...{

    @Id ② -1

    @GeneratedValue(strategy = GenerationType.TABLE) ② -2

    @Column(name = "TOPIC_ID") ② -3

    private int topicId;

    @Column(name = "TOPIC_TITLE", length = 100) ③
    private String topicTitle;

    @Column(name = "TOPIC_TIME") @Temporal(TemporalType.DATE) ④
    private Date topicTime;

    @Column(name = "TOPIC_VIEWS")

    private int topicViews;

    ...

    }



    解釋:
    ① Entity 標(biāo)明該類 (Topic) 為一個實體類,它對應(yīng)數(shù)據(jù)庫中的表表名是 T_TOPIC ,這里也可以寫成: @Entity

    @Table(name = "T_TOPIC") 其作用都是一樣的
    ② -1 Id 標(biāo)明該屬性對應(yīng)數(shù)據(jù)表中的主鍵
    ② -2 GeneratedValue 通過 strategy 屬性指明主鍵生成策略,默認(rèn)情況下, JPA 自動選擇一個最適合底層數(shù)據(jù)庫的主鍵生成策略。在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略:
    1) IDENTITY :表自增鍵字段, Oracle 不支持這種方式;
    2) AUTO : JPA 自動選擇合適的策略,是默認(rèn)選項;
    3) SEQUENCE :通過序列產(chǎn)生主鍵,通過 @SequenceGenerator 注解指定序列名, MySql 不支持這種方式;
    4) TABLE :通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植。
    ② -3 Column 標(biāo)明這個屬性是數(shù)據(jù)表中的一列,該列的名字是 TOPIC_ID

    ③ Column 的一個屬性 length 指明的是該屬性的允許的長度。 ( 個人認(rèn)為設(shè)定該屬性只是對于程序中操作該屬性時增加了一驗證過程,對數(shù)據(jù)庫中該列原來的設(shè)置并沒有影響,但是 length 屬性指定的值必須不能大于數(shù)據(jù)庫創(chuàng)建表時給該列限制的最大長度否則會出錯 )

    ④ Temporal(TemporalType.DATE) :如果屬性是時間類型,因為數(shù)據(jù)表對時間類型有更嚴(yán)格的劃分,所以必須指定具體時間類型。在 javax.persistence.TemporalType 枚舉中定義了 3 種時間類型:
    1) DATE :等于 java.sql.Date

    2) TIME :等于 java.sql.Time

    3) TIMESTAMP :等于 java.sql.Timestamp



    繼承關(guān)系注解:
    對繼承關(guān)系進(jìn)行注解,必須在 父類 中聲明繼承實體的映射策略。
    例子:
    @Entity(name = "T_TOPIC")

    @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ① @DiscriminatorColumn(name = "TOPIC_TYPE", discriminatorType =

    DiscriminatorType.INTEGER, length = 1) ②
    @DiscriminatorValue(value="1") ③
    public class Topic implements Serializable ...{ … }



    解釋:
    ① Inheritance 通過 strategy 屬性指明實體的繼承策略。
    在 javax.persistence.InheritanceType 定義了 3 種映射策略:
    1) SINGLE_TABLE :父子類都保存到同一個表中,通過字段值進(jìn)行區(qū)分。
    2) JOINED :父子類相同的部分保存在同一個表中,不同的部分分開存放,通過表連接獲取完整數(shù)據(jù);
    3) TABLE_PER_CLASS :每一個類對應(yīng)自己的表,一般不推薦采用這種方式。
    ② DiscriminatorColumn 如果繼承策略采用第一種繼承策略,則需要指明區(qū)分父子類的字段, DiscriminatorColumn 就是用來指明區(qū)分字段的注解。
    ③ DiscriminatorValue 同樣的采用第一種繼承策略通過字段區(qū)分父子類,則用這個注解給該實體的區(qū)分字段賦值在這里賦的值為 ”1”.



    關(guān)聯(lián)關(guān)系注解:
    例子:
    @Entity @DiscriminatorValue(value="2") ①
    public class PollTopic extends Topic ...{ ②繼承于 Topic 實體
    private boolean multiple; ③
    @Column(name = "MAX_CHOICES")

    private int maxChoices; @OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④
    private Set options = new HashSet();

    // 省略 get/setter 方法
    }

    解釋 :

    ① 通過 @DiscriminatorValue 將區(qū)分字段 TOPIC_TYPE 的值為 2 。由于 PollTopic 實體繼承于 Topic 實體,其它的元數(shù)據(jù)信息直接從 Topic 獲得。
    ④ OneToMany 指定了一個一對多的關(guān)聯(lián)關(guān)系, mappedBy 屬性指定 “Many” 方類引用 “One” 方類 的屬性名; cascade 屬性指明了級聯(lián)方式(如果這里不指定為 CascadeType.ALL 的話,那么有關(guān)聯(lián)關(guān)系的兩個對象在做保存和刪除操作時要分別來進(jìn)行) 建議 :盡可能使用 cascade=CascadeType.ALL 來減少持久化操作的復(fù)雜性和代碼量
    注意 : JPA 規(guī)范規(guī)定任何屬性都默認(rèn)映射到表中,所以雖然我們沒有給③處的 multiple 屬性提供注解信息,但 JPA 將按照 默認(rèn)的規(guī)則對該字段進(jìn)行映射:字段名和屬性名相同,類型相同。如果我們不希望將某個屬性持久化到數(shù)據(jù)表中,則可以通過 @Transient 注解顯式指定:
    @Transient

    private boolean tempProp1;





    @Entity(name="T_POLL_OPTION")

    Public class PollOption implements Serializable ...{

    @Id

    @GeneratedValue(strategy = GenerationType.TABLE)

    @Column(name = "OPTION_ID")

    private int optionId;

    @Column(name = "OPTION_ITEM")

    private String optionItem;

    @ManyToOne ①
    @JoinColumn(name="TOPIC_ID", nullable=false) ②
    private PollTopic pollTopic;

    }



    解釋:
    ① ManyToOne 描述了多對一的關(guān)聯(lián)關(guān)系,他是對該類引用的 ”One” 類 (PollTopic) 的屬性( pollTopic )進(jìn)行注解的。
    ② JoinColumn 指定關(guān)聯(lián) ”One”(PollTopic) 實體所對應(yīng)表的 “ 外鍵 ” 。


    Lob 字段的注解:
    在 JPA 中 Lob 類型類型的持久化很簡單,僅需要通過特殊的 Lob 注解就可以達(dá)到目的。
    例子:


    @Lob ① -1

    @Basic(fetch = FetchType.EAGER) ① -2

    @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ① -3

    private String postText;



    @Lob

    @Basic(fetch = FetchType. LAZY) ② -2

    @Column(name = "POST_ATTACH", columnDefinition = "BLOB") ② -3

    private byte[] postAttach;



    解釋:
    ① -1 JPA 通過 @Lob 將屬性標(biāo)注為 Lob 類型 ;
    ① -2 通過 @Basic 指定 Lob 類型數(shù)據(jù)的獲取策略, FetchType.EAGER 表示非延遲 加載,而 FetchType. LAZY 表示延遲加載 ;
    ① -3 通過 @Column 的 columnDefinition 屬性指定數(shù)據(jù)表對應(yīng)的 Lob 字段類型。






    使用 XML 元數(shù)據(jù)


    除了使用注解提供元數(shù)據(jù)信息外, JPA 也允許我們通過 XML 提供元數(shù)據(jù)信息。按照 JPA 的規(guī)范, 如果你提供了 XML 元數(shù)據(jù)描述信息,它將覆蓋實體類中的注解元數(shù)據(jù)信息 。 XML 元數(shù)據(jù)信息以 orm.xml 命名,放置在類路徑的 META-INF 目錄下。


    <?xml version="1.0" encoding="UTF-8"?>

    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

    version="1.0">

    ①實體對象所在的包
    <package>com.baobaotao.domain</package>

    <entity class="Topic">

    ② Topic 實體配置

    <table name="T_TOPIC" />

    <attributes>

    <id name="topicId">

    <column name="TOPIC_ID"/>

    <generated-value strategy="TABLE" />

    </id>

    <basic name="topicTitle">

    <column name="TOPIC_TITLE" length="30" />

    </basic>

    <basic name="topicTime">

    <column name="TOPIC_TIME" />

    <temporal>DATE</temporal>

    </basic>

    <basic name="topicViews">

    <column name="TOPIC_VIEWS" />

    </basic>

    </attributes>

    </entity>

    <entity class="PollTopic">

    ② PollTopic 實體配置

    <discriminator-value>2</discriminator-value>

    <attributes>

    <basic name="maxChoices">

    <column name="MAX_CHOICES" />

    </basic>

    <one-to-many name="options" mapped-by="pollTopic">

    <cascade>

    <cascade-all/>

    </cascade>

    </one-to-many>

    </attributes>

    </entity>

    <entity class="PollOption">

    ② PollOption 實體配置

    <table name="T_POLL_OPTION" />

    <attributes>

    <id name="optionId">

    <column name="OPTION_ID" />

    <generated-value strategy="TABLE" />

    </id>

    <basic name="optionItem">

    <column name="OPTION_ITEM"/>

    </basic>

    <many-to-one name="pollTopic" >

    <join-column name="TOPIC_ID" nullable="false"/>

    </many-to-one>

    </attributes>

    </entity>

    <entity class="Post">

    ② Post 實體配置

    <table name="T_POST" />

    <attributes>

    <id name="postId">

    <column name="POST_ID" />

    <generated-value strategy="TABLE" />

    </id>

    <basic name="postText" fetch="EAGER">

    <column name="POST_TEXT" column-definition="LONGTEXT NOT NULL"/>

    <lob/>

    </basic>

    <basic name="postAttach" fetch="LAZY">

    <column name="POST_ATTACH" column-definition="BLOB"/>

    <lob/>

    </basic>

    </attributes>

    </entity>

    </entity-mappings>



    使用這個 orm.xml 來描述實體信息的話,這里并沒有標(biāo)明兩個繼承類之間的關(guān)系,其繼承信息將從實體類反射信息獲取。


    到這里我們的實體描述結(jié)束了,當(dāng)然我們只是做了比較簡單的描述,對于那些復(fù)雜的信息描述并沒有進(jìn)行講述。實體描述結(jié)束了,有人會問如果我要來操作這些實體該怎么操作?這就是我們接下來要講述的問題。


    EntityManager 介紹

    實體對象由實體管理器進(jìn)行管理, JPA 使用 javax.persistence.EntityManager 代表實體管理器。實體管理器和持久化上下文關(guān)聯(lián),持久化上下文是一系列實體的管理環(huán)境,我們通過 EntityManager 和持久化上下文進(jìn)
    posted @ 2010-05-09 14:57 ourday 閱讀(1341) | 評論 (0)編輯 收藏

    通過dateadd和case..when...then.else函數(shù)來比較開始考試日期,考試結(jié)束日期與當(dāng)前時間來確定是否可以參加考試.
    select   name,test_num,test_paper,begin_date,end_date,
          valid=case   when   begin_date>dateadd(dd,0,getdate()) or end_date<dateadd(dd,0,getdate()) then   0   else   1   end    
    from test where id=1
    或者
    SELECT    'valid '=
          CASE         
           WHEN datediff(dd,begin_date,getdate())<0 THEN 0
           WHEN datediff(dd,end_date,getdate())>0 THEN 0
    else 1     
          END,
    name,test_num,test_paper,begin_date,end_date
    from test where id=1

    Mysql中的獲取最后一條插入ID的函數(shù)是Last_INSERT_ID(),而MSSql2000的函數(shù)有以下三個.
    IDENT_CURRENT() 返回為任何會話和任何作用域中的特定表最后生成的標(biāo)識值。  
    @@IDENTITY 返回為當(dāng)前會話的所有作用域中的任何表最后生成的標(biāo)識值。   
    推薦使用:SCOPE_IDENTITY () 返回為當(dāng)前會話和當(dāng)前作用域中的任何表最后生成的標(biāo)識值。(防止返回觸發(fā)器中的insert的IDENTITY值)  

    時間轉(zhuǎn)換函數(shù)
    SELECT convert(varchar(10),mn_test.begin_date,23)+'至'+convert(varchar(10),mn_test.end_date,23) as testtime FROM test LEFT OUTER JOIN grade ON (test.grade_note = grade.note)

    對查詢結(jié)果隨機(jī)排序
    SELECT * FROM Northwind..Orders ORDER BY NEWID()
    SELECT TOP 10 * FROM Northwind..Orders ORDER BY NEWID()

    附1:SQLServer和Oracle的常用函數(shù)對比

      1.絕對值

      S:select abs(-1) value

      O:select abs(-1) value from dual

      2.取整(大)

      S:select ceiling(-1.001) value

      O:select ceil(-1.001) value from dual

      3.取整(小)

      S:select floor(-1.001) value

      O:select floor(-1.001) value from dual

      4.取整(截?。?/p>

      S:select cast(-1.002 as int) value

      O:select trunc(-1.002) value from dual

      5.四舍五入

      S:select round(1.23456,4) value 1.23460

      O:select round(1.23456,4) value from dual 1.2346

      6.e為底的冪

      S:select Exp(1) value 2.7182818284590451

      O:select Exp(1) value from dual 2.71828182

      7.取e為底的對數(shù)

      S:select log(2.7182818284590451) value 1

      O:select ln(2.7182818284590451) value from dual; 1

      8.取10為底對數(shù)

      S:select log10(10) value 1

      O:select log(10,10) value from dual; 1

      9.取平方

      S:select SQUARE(4) value 16

      O:select power(4,2) value from dual 16

      10.取平方根

      S:select SQRT(4) value 2

      O:select SQRT(4) value from dual 2

      11.求任意數(shù)為底的冪

      S:select power(3,4) value 81

      O:select power(3,4) value from dual 81

      12.取隨機(jī)數(shù)

      S:select rand() value

      O:select sys.dbms_random.value(0,1) value from dual;

      13.取符號

      S:select sign(-8) value -1

      O:select sign(-8) value from dual -1

      ----------數(shù)學(xué)函數(shù)

      14.圓周率

      S:SELECT PI() value 3.1415926535897931

      O:不知道

      15.sin,cos,tan 參數(shù)都以弧度為單位

      例如:select sin(PI()/2) value 得到1(SQLServer)

      16.Asin,Acos,Atan,Atan2 返回弧度

      17.弧度角度互換(SQLServer,Oracle不知道)

      DEGREES:弧度-〉角度

      RADIANS:角度-〉弧度

      ---------數(shù)值間比較

      18. 求集合最大值

      S:select max(value) value from

      (select 1 value

      union

      select -2 value

      union

      select 4 value

      union

      select 3 value)a

      O:select greatest(1,-2,4,3) value from dual

      19. 求集合最小值

      S:select min(value) value from

      (select 1 value

      union

      select -2 value

      union

      select 4 value

      union

      select 3 value)a

      O:select least(1,-2,4,3) value from dual

      20.如何處理null值(F2中的null以10代替)

      S:select F1,IsNull(F2,10) value from Tbl

      O:select F1,nvl(F2,10) value from Tbl

    --------數(shù)值間比較

      21.求字符序號

      S:select ascii('a') value

      O:select ascii('a') value from dual

      22.從序號求字符

      S:select char(97) value

      O:select chr(97) value from dual

      23.連接

      S:select '11'+'22'+'33' value

      O:select CONCAT('11','22')||33 value from dual

      23.子串位置 --返回3

      S:select CHARINDEX('s','sdsq',2) value

      O:select INSTR('sdsq','s',2) value from dual

      23.模糊子串的位置 --返回2,參數(shù)去掉中間%則返回7

      S:select patindex('%d%q%','sdsfasdqe') value

      O:oracle沒發(fā)現(xiàn),但是instr可以通過第四霾問 刂瞥魷執(zhí)問?BR>  select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

      24.求子串

      S:select substring('abcd',2,2) value

      O:select substr('abcd',2,2) value from dual

      25.子串代替 返回aijklmnef

      S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value

      O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

      26.子串全部替換

      S:沒發(fā)現(xiàn)

      O:select Translate('fasdbfasegas','fa','我' ) value from dual

      27.長度

      S:len,datalength

      O:length

      28.大小寫轉(zhuǎn)換 lower,upper

      29.單詞首字母大寫

      S:沒發(fā)現(xiàn)

      O:select INITCAP('abcd dsaf df') value from dual

      30.左補(bǔ)空格(LPAD的第一個參數(shù)為空格則同space函數(shù))

      S:select space(10)+'abcd' value

      O:select LPAD('abcd',14) value from dual

      31.右補(bǔ)空格(RPAD的第一個參數(shù)為空格則同space函數(shù))

      S:select 'abcd'+space(10) value

      O:select RPAD('abcd',14) value from dual

      32.刪除空格

      S:ltrim,rtrim

      O:ltrim,rtrim,trim

      33. 重復(fù)字符串

      S:select REPLICATE('abcd',2) value

      O:沒發(fā)現(xiàn)

      34.發(fā)音相似性比較(這兩個單詞返回值一樣,發(fā)音相同)

      S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')

      O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual

      SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差

      返回0-4,4為同音,1最高

      --------------日期函數(shù)

      35.系統(tǒng)時間

      S:select getdate() value

      O:select sysdate value from dual

      36.前后幾日

      直接與整數(shù)相加減

      37.求日期

      S:select convert(char(10),getdate(),20) value

      O:select trunc(sysdate) value from dual

      select to_char(sysdate,'yyyy-mm-dd') value from dual

      38.求時間

      S:select convert(char(8),getdate(),108) value

      O:select to_char(sysdate,'hh24:mm:ss') value from dual

      39.取日期時間的其他部分

      S:DATEPART 和 DATENAME 函數(shù) (第一個參數(shù)決定)

      O:to_char函數(shù) 第二個參數(shù)決定

    參數(shù)---------------------------------下表需要補(bǔ)充

      year yy, yyyy

      quarter qq, q (季度)

      month mm, m (m O無效)

      dayofyear dy, y (O表星期)

      day dd, d (d O無效)

      week wk, ww (wk O無效)

      weekday dw (O不清楚)

      Hour hh,hh12,hh24 (hh12,hh24 S無效)

      minute mi, n (n O無效)

      second ss, s (s O無效)

      millisecond ms (O無效)

      ----------------------------------------------

      40.當(dāng)月最后一天

      S:不知道

      O:select LAST_DAY(sysdate) value from dual

      41.本星期的某一天(比如星期日)

      S:不知道

      O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

      42.字符串轉(zhuǎn)時間

      S:可以直接轉(zhuǎn)或者select cast('2004-09-08'as datetime) value

      O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

      43.求兩日期某一部分的差(比如秒)

      S:select datediff(ss,getdate(),getdate()+12.3) value

      O:直接用兩個日期相減(比如d1-d2=12.3)

      SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

      44.根據(jù)差值求新的日期(比如分鐘)

      S:select dateadd(mi,8,getdate()) value

      O:SELECT sysdate+8/60/24 vaule FROM DUAL;

      45.求不同時區(qū)時間

      S:不知道

      O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

      -----時區(qū)參數(shù),北京在東8區(qū)應(yīng)該是Ydt-------

      AST ADT 大西洋標(biāo)準(zhǔn)時間

      BST BDT 白令海標(biāo)準(zhǔn)時間

      CST CDT 中部標(biāo)準(zhǔn)時間

      EST EDT 東部標(biāo)準(zhǔn)時間

      GMT 格林尼治標(biāo)準(zhǔn)時間

      HST HDT 阿拉斯加—夏威夷標(biāo)準(zhǔn)時間

      MST MDT 山區(qū)標(biāo)準(zhǔn)時間

      NST 紐芬蘭標(biāo)準(zhǔn)時間

      PST PDT 太平洋標(biāo)準(zhǔn)時間

      YST YDT YUKON標(biāo)準(zhǔn)時間

    Oracle支持的字符函數(shù)和它們的Microsoft SQL Server等價函數(shù):

    函數(shù) Oracle Microsoft SQL Server

    把字符轉(zhuǎn)換為ASCII ASCII ASCII

    字串連接 CONCAT (expression + expression)

    把ASCII轉(zhuǎn)換為字符 CHR CHAR

    返回字符串中的開始字符(左起) INSTR CHARINDEX

    把字符轉(zhuǎn)換為小寫 LOWER LOWER

    把字符轉(zhuǎn)換為大寫 UPPER UPPER

    填充字符串的左邊 LPAD N/A

    清除開始的空白 LTRIM LTRIM

    清除尾部的空白 RTRIM RTRIM

    字符串中的起始模式(pattern) INSTR PATINDEX

    多次重復(fù)字符串 RPAD REPLICATE

    字符串的語音表示 SOUNDEX SOUNDEX

    重復(fù)空格的字串 RPAD SPACE

    從數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù) TO_CHAR STR

    子串 SUBSTR SUBSTRING

    替換字符 REPLACE STUFF

    將字串中的每個詞首字母大寫 INITCAP N/A

    翻譯字符串 TRANSLATE N/A

    字符串長度 LENGTH DATELENGTH or LEN

    列表中最大的字符串 GREATEST N/A

    列表中最小的字符串 LEAST N/A

    如果為NULL則轉(zhuǎn)換字串 NVL ISNULL

     

    日期函數(shù)

    函數(shù) Oracle Microsoft SQL Server

    日期相加 (date column +/- value) or

    ADD_MONTHS DATEADD

    兩個日期的差 (date column +/- value) or

    MONTHS_BETWEEN DATEDIFF

    當(dāng)前日期和時間 SYSDATE GETDATE()

    一個月的最后一天 LAST_DAY N/A

    時區(qū)轉(zhuǎn)換 NEW_TIME N/A

    日期后的第一個周日 NEXT_DAY N/A

    代表日期的字符串 TO_CHAR DATENAME

    代表日期的整數(shù) TO_NUMBER

    (TO_CHAR)) DATEPART

    日期舍入 ROUND CONVERT

    日期截斷 TRUNC CONVERT

    字符串轉(zhuǎn)換為日期 TO_DATE CONVERT

    如果為NULL則轉(zhuǎn)換日期 NVL ISNULL

     

    轉(zhuǎn)換函數(shù)

    函數(shù) Oracle Microsoft SQL Server

    數(shù)字轉(zhuǎn)換為字符 TO_CHAR CONVERT

    字符轉(zhuǎn)換為數(shù)字 TO_NUMBER CONVERT

    日期轉(zhuǎn)換為字符 TO_CHAR CONVERT

    字符轉(zhuǎn)換為日期 TO_DATE CONVERT

    16進(jìn)制轉(zhuǎn)換為2進(jìn)制 HEX_TO_RAW CONVERT

    2進(jìn)制轉(zhuǎn)換為16進(jìn)制 RAW_TO_HEX CONVERT

     

    其它行級別的函數(shù)

    函數(shù) Oracle Microsoft SQL Server

    返回第一個非空表達(dá)式 DECODE COALESCE

    當(dāng)前序列值 CURRVAL N/A

    下一個序列值 NEXTVAL N/A

    如果exp1 = exp2, 返回null DECODE NULLIF

    用戶登錄賬號ID數(shù)字 UID SUSER_ID

    用戶登錄名 USER SUSER_NAME

    用戶數(shù)據(jù)庫ID數(shù)字 UID USER_ID

    用戶數(shù)據(jù)庫名 USER USER_NAME

    當(dāng)前用戶 CURRENT_USER CURRENT_USER

    用戶環(huán)境(audit trail) USERENV N/A

    在CONNECT BY子句中的級別 LEVEL N/A

     

    合計函數(shù)

    函數(shù) Oracle Microsoft SQL Server

    Average AVG AVG

    Count COUNT COUNT

    Maximum MAX MAX

    Minimum MIN MIN

    Standard deviation STDDEV STDEV or STDEVP

    Summation SUM SUM

    Variance VARIANCE VAR or VARP

    Oracle還有一個有用的函數(shù)EXTRACT,提取并且返回日期時間或時間間隔表達(dá)式中特定的時間域:

    EXTRACT(YEAR FROM 日期)

    T_SQL命令大全

    --語 句 功 能

    --數(shù)據(jù)操作

    SELECT --從數(shù)據(jù)庫表中檢索數(shù)據(jù)行和列

    INSERT --向數(shù)據(jù)庫表添加新數(shù)據(jù)行

    DELETE --從數(shù)據(jù)庫表中刪除數(shù)據(jù)行

    UPDATE --更新數(shù)據(jù)庫表中的數(shù)據(jù)

    --數(shù)據(jù)定義

    CREATE TABLE --創(chuàng)建一個數(shù)據(jù)庫表

    DROP TABLE --從數(shù)據(jù)庫中刪除表

    ALTER TABLE --修改數(shù)據(jù)庫表結(jié)構(gòu)

    CREATE VIEW --創(chuàng)建一個視圖

    DROP VIEW --從數(shù)據(jù)庫中刪除視圖

    CREATE INDEX --為數(shù)據(jù)庫表創(chuàng)建一個索引

    DROP INDEX --從數(shù)據(jù)庫中刪除索引

    CREATE PROCEDURE --創(chuàng)建一個存儲過程

    DROP PROCEDURE --從數(shù)據(jù)庫中刪除存儲過程

    CREATE TRIGGER --創(chuàng)建一個觸發(fā)器

    DROP TRIGGER --從數(shù)據(jù)庫中刪除觸發(fā)器

    CREATE SCHEMA --向數(shù)據(jù)庫添加一個新模式

    DROP SCHEMA --從數(shù)據(jù)庫中刪除一個模式

    CREATE DOMAIN --創(chuàng)建一個數(shù)據(jù)值域

    ALTER DOMAIN --改變域定義

    DROP DOMAIN --從數(shù)據(jù)庫中刪除一個域

    --數(shù)據(jù)控制

    GRANT --授予用戶訪問權(quán)限

    DENY --拒絕用戶訪問

    REVOKE --解除用戶訪問權(quán)限

    --事務(wù)控制

    COMMIT --結(jié)束當(dāng)前事務(wù)

    ROLLBACK --中止當(dāng)前事務(wù)

    SET TRANSACTION --定義當(dāng)前事務(wù)數(shù)據(jù)訪問特征

    --程序化SQL

    DECLARE --為查詢設(shè)定游標(biāo)

    EXPLAN --為查詢描述數(shù)據(jù)訪問計劃

    OPEN --檢索查詢結(jié)果打開一個游標(biāo)

    FETCH --檢索一行查詢結(jié)果

    CLOSE --關(guān)閉游標(biāo)

    PREPARE --為動態(tài)執(zhí)行準(zhǔn)備SQL 語句

    EXECUTE --動態(tài)地執(zhí)行SQL 語句

    DESCRIBE --描述準(zhǔn)備好的查詢

     

    ---局部變量

    declare @id char(10)

    --set @id = '10010001'

    select @id = '10010001'

    ---全局變量

    ---必須以@@開頭

    --IF ELSE

    declare @x int @y int @z int

    select @x = 1 @y = 2 @z=3

    if @x > @y

    print 'x > y' --打印字符串'x > y'

    else if @y > @z

    print 'y > z'

    else print 'z > y'

    --CASE

    use pangu

    update employee

    set e_wage =

    case

    when job_level = ’1’ then e_wage*1.08

    when job_level = ’2’ then e_wage*1.07

    when job_level = ’3’ then e_wage*1.06

    else e_wage*1.05

    end

    --WHILE CONTINUE BREAK

    declare @x int @y int @c int

    select @x = 1 @y=1

    while @x < 3

    begin

    print @x --打印變量x 的值

    while @y < 3

    begin

    select @c = 100*@x + @y

    print @c --打印變量c 的值

    select @y = @y + 1

    end

    select @x = @x + 1

    select @y = 1

    end

    --WAITFOR

    --例 等待1 小時2 分零3 秒后才執(zhí)行SELECT 語句

    waitfor delay ’01:02:03’

    select * from employee

    --例 等到晚上11 點零8 分后才執(zhí)行SELECT 語句

    waitfor time ’23:08:00’

    select * from employee

     

    ***SELECT***

    select *(列名) from table_name(表名) where column_name operator value

    ex 宿主)

    select * from stock_information where stockid = str(nid)

    stockname = 'str_name'

    stockname like '% find this %'

    stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)

    stockname like '[^F-M]%' --------- (^排除指定范圍)

    --------- 只能在使用like關(guān)鍵字的where子句中使用通配符)

    or stockpath = 'stock_path'

    or stocknumber < 1000

    and stockindex = 24

    not stocksex = 'man'

    stocknumber between 20 and 100

    stocknumber in(10,20,30)

    order by stockid desc(asc) --------- 排序,desc-降序,asc-升序

    order by 1,2 --------- by列號

    stockname = (select stockname from stock_information where stockid = 4)

    --------- 子查詢

    --------- 除非能確保內(nèi)層select只返回一個行的值,

    --------- 否則應(yīng)在外層where子句中用一個in限定符

    select distinct column_name form table_name --------- distinct指定檢索獨(dú)有的列值,不重復(fù)

    select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name

    select stockname , "stocknumber" = count(*) from table_name group by stockname

    --------- group by 將表按行分組,指定列中有相同的值

    having count(*) = 2 --------- having選定指定的組

    select *

    from table1, table2

    where table1.id *= table2.id -------- 左外部連接,table1中有的而table2中沒有得以null表示

    table1.id =* table2.id -------- 右外部連接

    select stockname from table1

    union [all] ----- union合并查詢結(jié)果集,all-保留重復(fù)行

    select stockname from table2

    --STDEV()

    --STDEV()函數(shù)返回表達(dá)式中所有數(shù)據(jù)的標(biāo)準(zhǔn)差

    --STDEVP()

    --STDEVP()函數(shù)返回總體標(biāo)準(zhǔn)差

    --VAR()

    --VAR()函數(shù)返回表達(dá)式中所有值的統(tǒng)計變異數(shù)

    --VARP()

    --VARP()函數(shù)返回總體變異數(shù)

    ----算術(shù)函數(shù)----

    /***三角函數(shù)***/

    SIN(float_expression) --返回以弧度表示的角的正弦

    COS(float_expression) --返回以弧度表示的角的余弦

    TAN(float_expression) --返回以弧度表示的角的正切

    COT(float_expression) --返回以弧度表示的角的余切

    /***反三角函數(shù)***/

    ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角

    ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角

    ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角

    ATAN2(float_expression1,float_expression2)

    --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角

    DEGREES(numeric_expression)

    --把弧度轉(zhuǎn)換為角度返回與表達(dá)式相同的數(shù)據(jù)類型可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    RADIANS(numeric_expression) --把角度轉(zhuǎn)換為弧度返回與表達(dá)式相同的數(shù)據(jù)類型可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    EXP(float_expression) --返回表達(dá)式的指數(shù)值

    LOG(float_expression) --返回表達(dá)式的自然對數(shù)值

    LOG10(float_expression)--返回表達(dá)式的以10 為底的對數(shù)值

    SQRT(float_expression) --返回表達(dá)式的平方根

    /***取近似值函數(shù)***/

    CEILING(numeric_expression) --返回>=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    FLOOR(numeric_expression) --返回<=表達(dá)式的最小整數(shù)返回的數(shù)據(jù)類型與表達(dá)式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    ROUND(numeric_expression) --返回以integer_expression 為精度的四舍五入值返回的數(shù)據(jù)

    --類型與表達(dá)式相同可為INTEGER/MONEY/REAL/FLOAT 類型

    ABS(numeric_expression) --返回表達(dá)式的絕對值返回的數(shù)據(jù)類型與表達(dá)式相同可為

    --INTEGER/MONEY/REAL/FLOAT 類型

    SIGN(numeric_expression) --測試參數(shù)的正負(fù)號返回0 零值1 正數(shù)或-1 負(fù)數(shù)返回的數(shù)據(jù)類型

    --與表達(dá)式相同可為INTEGER/MONEY/REAL/FLOAT 類型

    PI() --返回值為π 即3.1415926535897936

    RAND([integer_expression]) --用任選的[integer_expression]做種子值得出0-1 間的隨機(jī)浮點數(shù)

    ----字符串函數(shù)----

    ASCII() --函數(shù)返回字符表達(dá)式最左端字符的ASCII 碼值

    CHAR() --函數(shù)用于將ASCII 碼轉(zhuǎn)換為字符

    --如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數(shù)會返回一個NULL 值

    LOWER() --函數(shù)把字符串全部轉(zhuǎn)換為小寫

    UPPER() --函數(shù)把字符串全部轉(zhuǎn)換為大寫

    STR() --函數(shù)把數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù)

    LTRIM() --函數(shù)把字符串頭部的空格去掉

    RTRIM() --函數(shù)把字符串尾部的空格去掉

    LEFT(),RIGHT(),SUBSTRING() --函數(shù)返回部分字符串

    CHARINDEX(),PATINDEX() --函數(shù)返回字符串中某個指定的子串出現(xiàn)的開始位置

    SOUNDEX() --函數(shù)返回一個四位字符碼

    --SOUNDEX函數(shù)可用來查找聲音相似的字符串但SOUNDEX函數(shù)對數(shù)字和漢字均只返回0 值

    DIFFERENCE() --函數(shù)返回由SOUNDEX 函數(shù)返回的兩個字符表達(dá)式的值的差異

    --0 兩個SOUNDEX 函數(shù)返回值的第一個字符不同

    --1 兩個SOUNDEX 函數(shù)返回值的第一個字符相同

    --2 兩個SOUNDEX 函數(shù)返回值的第一二個字符相同

    --3 兩個SOUNDEX 函數(shù)返回值的第一二三個字符相同

    --4 兩個SOUNDEX 函數(shù)返回值完全相同

    QUOTENAME() --函數(shù)返回被特定字符括起來的字符串

    /*select quotename('abc', '{') quotename('abc')

    運(yùn)行結(jié)果如下

    ----------------------------------{

    {abc} [abc]*/

    REPLICATE() --函數(shù)返回一個重復(fù)character_expression 指定次數(shù)的字符串

    /*select replicate('abc', 3) replicate( 'abc', -2)

    運(yùn)行結(jié)果如下

    ----------- -----------

    abcabcabc NULL*/

    REVERSE() --函數(shù)將指定的字符串的字符排列順序顛倒

    REPLACE() --函數(shù)返回被替換了指定子串的字符串

    /*select replace('abc123g', '123', 'def')

    運(yùn)行結(jié)果如下

    ----------- -----------

    abcdefg*/

    SPACE() --函數(shù)返回一個有指定長度的空白字符串

    STUFF() --函數(shù)用另一子串替換字符串指定位置長度的子串

    ----數(shù)據(jù)類型轉(zhuǎn)換函數(shù)----

    CAST() 函數(shù)語法如下

    CAST() (<expression> AS <data_ type>[ length ])

    CONVERT() 函數(shù)語法如下

    CONVERT() (<data_ type>[ length ], <expression> [, style])

    select cast(100+99 as char) convert(varchar(12), getdate())

    運(yùn)行結(jié)果如下

    ------------------------------ ------------

    199 Jan 15 2000

    ----日期函數(shù)----

    DAY() --函數(shù)返回date_expression 中的日期值

    MONTH() --函數(shù)返回date_expression 中的月份值

    YEAR() --函數(shù)返回date_expression 中的年份值

    DATEADD(<datepart> ,<number> ,<date> )

    --函數(shù)返回指定日期date 加上指定的額外日期間隔number 產(chǎn)生的新日期

    DATEDIFF(<datepart> ,<number> ,<date> )

    --函數(shù)返回兩個指定日期在datepart 方面的不同之處

    DATENAME(<datepart> , <date> ) --函數(shù)以字符串的形式返回日期的指定部分

    DATEPART(<datepart> , <date> ) --函數(shù)以整數(shù)值的形式返回日期的指定部分

    GETDATE() --函數(shù)以DATETIME 的缺省格式返回系統(tǒng)當(dāng)前的日期和時間

    ----系統(tǒng)函數(shù)----

    APP_NAME() --函數(shù)返回當(dāng)前執(zhí)行的應(yīng)用程序的名稱

    COALESCE() --函數(shù)返回眾多表達(dá)式中第一個非NULL 表達(dá)式的值

    COL_LENGTH(<'table_name'>, <'column_name'> ) --函數(shù)返回表中指定字段的長度值

    COL_NAME(<table_id>, <column_id> ) --函數(shù)返回表中指定字段的名稱即列名

    DATALENGTH() --函數(shù)返回數(shù)據(jù)表達(dá)式的數(shù)據(jù)的實際長度

    DB_ID(['database_name']) --函數(shù)返回數(shù)據(jù)庫的編號

    DB_NAME(database_id) --函數(shù)返回數(shù)據(jù)庫的名稱

    HOST_ID() --函數(shù)返回服務(wù)器端計算機(jī)的名稱

    HOST_NAME() --函數(shù)返回服務(wù)器端計算機(jī)的名稱

    IDENTITY(<data_type>[, seed increment]) [AS column_name]}

    --IDENTITY() 函數(shù)只在SELECT INTO 語句中使用用于插入一個identity column列到新表中

    /*select identity(int, 1, 1) as column_name

    into newtable

    from oldtable*/

    ISDATE() --函數(shù)判斷所給定的表達(dá)式是否為合理日期

    ISNULL(<check_expression>, <replacement_value> ) --函數(shù)將表達(dá)式中的NULL 值用指定值替換

    ISNUMERIC() --函數(shù)判斷所給定的表達(dá)式是否為合理的數(shù)值

    NEWID() --函數(shù)返回一個UNIQUEIDENTIFIER 類型的數(shù)值

    NULLIF(<expression1>, <expression2> )

    --NULLIF 函數(shù)在expression1 與expression2 相等時返回NULL 值若不相等時則返回expression1 的值

    附2:時間轉(zhuǎn)換函數(shù)
    convert(char,date,N)輸出的各中樣式
    convert(varchar(10),字段名,轉(zhuǎn)換格式)
    例:
    select id,convert(varchar(10),date,11) as date from sb

    N 日期樣式
    0 04 2 2005 9:06AM .....
    20 2005-04-02 09:06:18
    21 2005-04-02 09:06:18.857
    22 04/02/05 9:06:18 AM
    23 2005-04-02
    24 09:06:18
    25 2005-04-02 09:06:18.857
    100 04 2 2005 9:06AM
    101 04/02/2005
    102 2005.04.02
    103 02/04/2005
    104 02.04.2005
    105 02-04-2005

    108 09:06:18
    109 04 2 2005 9:06:18:857AM
    110 04-02-2005
    114 09:06:18:857
    120 2005-04-02 09:06:18
    121 2005-04-02 09:06:18.857
    126 2005-04-02T09:06:18.857   

    posted @ 2008-11-01 19:25 ourday 閱讀(693) | 評論 (0)編輯 收藏

    JDK 是整個Java的核心,包括了Java運(yùn)行環(huán)境(Java Runtime Envirnment),一堆Java工具和Java基礎(chǔ)的類庫(rt.jar)。不論什么Java應(yīng)用服務(wù)器實質(zhì)都是內(nèi)置了某個版本的JDK。因此掌握 JDK是學(xué)好Java的第一步。最主流的JDK是Sun公司發(fā)布的JDK,除了Sun之外,還有很多公司和組織都開發(fā)了自己的JDK,例如IBM公司開發(fā)的JDK,BEA公司的Jrocket,還有GNU組織開發(fā)的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)運(yùn)行效率要比Sun JDK包含的JVM高出許多。而專門運(yùn)行在x86平臺的Jrocket在服務(wù)端運(yùn)行效率也要比Sun JDK好很多。但不管怎么說,我們還是需要先把Sun JDK掌握好。
    JDK(Java Development Kit,Java開發(fā)包,Java開發(fā)工具)是一個寫Java的applet和應(yīng)用程序的程序開發(fā)環(huán)境。它由一個處于操作系統(tǒng)層之上的運(yùn)行環(huán)境還有開發(fā)者編譯,調(diào)試和運(yùn)行用Java語言寫的applet和應(yīng)用程序所需的工具組成。
    JDK
    JDK(Java Development Kit)是Sun Microsystems針對Java開發(fā)員的產(chǎn)品。自從Java推出以來,JDK已經(jīng)成為使用最廣泛的Java SDK(Software development kit)。
    JDK包含的基本組件包括:
    ·javac – 編譯器,將源程序轉(zhuǎn)成字節(jié)碼
    ·jar – 打包工具,將相關(guān)的類文件打包成一個文件
    ·javadoc – 文檔生成器,從源碼注釋中提取文檔
    ·jdb – debugger,查錯工具
    ·java – 運(yùn)行編譯后的java程序(.class后綴的)
    JDK中還包括各種例子程序,用以展示Java API中的各部分。
    從初學(xué)者角度來看,采用JDK開發(fā)Java程序能夠很快理解程序中各部分代碼之間的關(guān)系,有利于理解Java面向?qū)ο蟮脑O(shè)計思想。JDK的另一個顯著特點是隨著Java (J2EE、J2SE以及J2ME)版本的升級而升級。但它的缺點也是非常明顯的就是從事大規(guī)模企業(yè)級Java應(yīng)用開發(fā)非常困難,不能進(jìn)行復(fù)雜的Java軟件開發(fā),也不利于團(tuán)體協(xié)同開發(fā)。
    JDK一般有三種版本:
    SE(J2SE),standard edition,標(biāo)準(zhǔn)版,是我們通常用的一個版本
    EE(J2EE),enterpsise edtion,企業(yè)版,使用這種JDK開發(fā)J2EE應(yīng)用程序,
    ME(J2ME),micro edtion,主要用于移動設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序
    Java開發(fā)工具(JDK)是許多Java專家最初使用的開發(fā)環(huán)境。盡管許多編程人員已經(jīng)使用第三方的開發(fā)工具,但JDK仍被當(dāng)作Java開發(fā)的重要工具。
    JDK由一個標(biāo)準(zhǔn)類庫和一組建立,測試及建立文檔的Java實用程序組成。其核心Java
    API是一些預(yù)定義的類庫,開發(fā)人員需要用這些類來訪問Java語言的功能。Java API包括一些重要的語言結(jié)構(gòu)以及基本圖形,網(wǎng)絡(luò)和文件I/O。一般來說,Java API的非I/O部分對于運(yùn)行Java的所有平臺是相同的,而I/O部分則僅在通用Java環(huán)境中實現(xiàn)。
    作為JDK實用程序,工具庫中有七種主要程序。
    Javac:Java編譯器,將Java源代碼轉(zhuǎn)換成字節(jié)碼。
    Java:Java解釋器,直接從類文件執(zhí)行Java應(yīng)用程序字節(jié)代碼。
    appletviewer:小程序瀏覽器,一種執(zhí)行HTML文件上的Java小程序的Java瀏覽器。
    Javadoc:根據(jù)Java源碼及說明語句生成HTML文檔。
    Jdb:Java調(diào)試器,可以逐行執(zhí)行程序,設(shè)置斷點和檢查變量。
    Javah:產(chǎn)生可以調(diào)用Java過程的C過程,或建立能被Java程序調(diào)用的C過程的頭文件。
    Javap:Java反匯編器,顯示編譯類文件中的可訪問功能和數(shù)據(jù),同時顯示字節(jié)代碼含義。
    posted @ 2008-10-11 10:43 ourday 閱讀(978) | 評論 (1)編輯 收藏

    javaMail API(1.3.2)
    http://java.sun.com/products/javamail/downloads/index.html
    javaBeans Activation Framework(1.0.2)
    http://www.javafan.net/down?ID=40&URL=1
    Apache上的javaMail開發(fā)組件(commons-email-1.1):
    http://commons.apache.org
    JSValidation驗證框架的官方網(wǎng)址為:
    http://cosoft.org.cn/projects/jsvalidation
    FCKeditor的網(wǎng)址:
    http://www.fckeditor.net/download
    SQL Server驅(qū)動程序的下載地址:
    http://www.microsoft.com/downloads
    struts的官方網(wǎng)站:
    http://struts.apache.org/
    WebWork的官方網(wǎng)站:
    http://www.opensymphony.com/webwork/
    Spring的官方網(wǎng)站:
    http://www.springframework.org
    Jakarta Taglibs標(biāo)簽庫:
    http://jakarta.apache.org/
    Display tag標(biāo)簽庫:
    http://displaytag.sf.net/
    posted @ 2008-10-11 09:29 ourday 閱讀(306) | 評論 (0)編輯 收藏

    超鏈接標(biāo)簽<A>的href屬性值除了可以使用前面講過的http和mailto等協(xié)議外,還可以使用javascript協(xié)議。
    <a href="javascript: alert(new Date());">javascript</a>
    單擊這個超鏈接,瀏覽器將會執(zhí)行javascript:后面的腳本程序代碼。

    作為屬性值的javascript腳本程的代碼的最后一條語句結(jié)尾處的分號可以省略。
    <input type=button value=test onclick="alert(new Date())">

    在javascript中也可以不事先聲明變量而直接使用。

    在使用內(nèi)聯(lián)樣式表時,HTML4.01標(biāo)準(zhǔn)建議用戶在網(wǎng)頁的<head></head>標(biāo)簽之間增加一個<meta>標(biāo)簽,設(shè)置這個<meta>標(biāo)簽的http-equiv屬性值為Content-Style-Type,content屬性值為text/css。

    document對象的方法clear目前并沒有得到完全的支持,可以用document.write("");document.close();這兩條語句來實現(xiàn)與clear方法同樣的功能。

    js中能過+連接字符。如果用字符+數(shù)值會變成字符連接。

    dataA=(dataB=1,dataC=2,dataD=3)
    先執(zhí)行dataB=1;
    再執(zhí)行dataC=2;
    再執(zhí)行dataD=3;返回這個表達(dá)式的值

    delete myClassmate[2];刪除數(shù)組的第三個元素

    typeof()用于返回變量的類型.

    for...in對象循環(huán)語句可用來遍歷對象

    對象靜態(tài)變量的創(chuàng)建:在函數(shù)內(nèi)部寫函數(shù)名.變量名.

    window對象發(fā)生事件的順序:load事件onfocus事件onblur事件
    其它事件:onresize事件onscroll事件

    文本框的事件有:onfocus\onblur\onchange\onselect

    document對象的集合all:返回對象所包含的元素集合的引用

    img標(biāo)簽的兩個鼠標(biāo)事件:onmouseover事件onmouseout事件

    form的onsubmit()用于直接提交表單.

    event的屬性type:從 event 對象中獲取事件名稱

    event的屬性srcElement:設(shè)置或獲取觸發(fā)事件的對象.

    event的屬性cancelBubble:設(shè)置或獲取當(dāng)前事件是否要在事件句柄中向上冒泡。

    body對象最常用的兩個事件:onselectstart和onscroll

    javascript的注釋:
    //這是單行注釋
    /*這是多行注釋
     *
     */


    javascript的常量通常又稱字面常量,它是不能改變的數(shù)據(jù),與基本的數(shù)據(jù)類型相對應(yīng).
    有以下幾種常量
    <1>整型常量
    可以使用十六進(jìn)制,八進(jìn)制和十進(jìn)制.十六進(jìn)制以O(shè)X或OX開頭,八進(jìn)制以0開頭,十進(jìn)制第一位不能是0.
    <2>實型常量
    有整數(shù)部分和小數(shù)部分.
    <3>布爾值
    有兩種值:true和false
    <4>字符串型常量
    javascript中沒有單獨(dú)的字符常量,而只有表示由若干字符所組成的字符串型常量.用''或""引起來.
    字符串中的特殊字符要用反斜杠(\)后跟一個普通字符來表示.通過"+"把兩個字符串連起來.
    <5>null常量
    表示一個變量所指向的對象為空值,"空"是一個有特殊意義的值。
    <6>undefined常量
    undefined常量用于表示變量還沒有被賦值的狀態(tài)或?qū)ο蟮哪硞€屬性不存在。變量的值還處于未知狀態(tài)。


    在變量是null,undefined 時,在布爾環(huán)境中都為false.
    不管何時,只要對象非空,在布爾環(huán)境中都為true.
    參數(shù)個數(shù)可變的函數(shù):在取傳給函數(shù)的參數(shù)時,可能通過循環(huán)arguments取出傳的值。
    創(chuàng)建動態(tài)函數(shù):
    <script language="javascript">
    var suqare = new Function("x","y","var sum;sum=x*x+y*y;return sum;");
    alert(square(3,2));
    </script>


    系統(tǒng)函數(shù):
    encodeURI 方法返回一個編碼的 URI。如果您將編碼結(jié)果傳遞給 decodeURI,那么將返回初始的字符串。

    encodeURI 方法不會對下列字符進(jìn)行編碼:":"、"/"、";" 和 "?"。請使用 encodeURIComponent 方法對

    這些字符進(jìn)行編碼。
    decodeURI方法將一個已編碼的URI字符串解碼.
    escape 方法返回一個包含了 charstring 內(nèi)容的字符串值( Unicode 格式)。所有空格、標(biāo)點、重音符

    號以及其他非 ASCII 字符都用 %xx 編碼代替,其中 xx 等于表示該字符的十六進(jìn)制數(shù)。例如,空格返回

    的是 "%20" 。
    unescape與上相反.
    eval方法將某個參數(shù)字符串作為一個javascript表達(dá)式執(zhí)行.

    對象與對象實例:
    通過function創(chuàng)建對象:
    function Person(){
    }
    通過new 實例化一個對象:
    var person1 = new Person();
    通過對象名.變量名=XXX;為對象增加屬性或方法.
    person1.age = 19;
    person1.say = sayFunc();
    通過用"對象實例名[屬性名字符串]"的格式來訪問某個對象實例的屬性.例如person1.name可以寫成

    person1["name"]來引用.
    this關(guān)鍵字一般只在用作對象成員方法的函數(shù)中出現(xiàn),它代表某個成員方法執(zhí)行時,引用該方法的當(dāng)前對象

    實例.在對象的構(gòu)造方法使用"this.成員名"的形式,可以為該對象的每個對象實例都增加新的成員.
    <script>
     function Person(name,age)
     {
      this.age = age;
      this.name = name;
      this.say = sayFunc;
     }
     function sayFunc()
     {
      alert(this.name + ":" + this.age);
     }
     var person1 = new Person("zhangsan",18);
     person1.say();
     var person2 = new Person("lisi",20);
     person2.say();
    </script>
    內(nèi)部對象:
    javascript中內(nèi)部對象,按使用方式可分為兩種情況:一種是動態(tài)對象,在引用它的屬性和方法時,必須使用

    new關(guān)鍵字創(chuàng)建一個對象實例,然后使用"對象實例名.成員"的格式來訪問其屬性和方法.另一種是靜態(tài)的對

    象,在引用對象的屬性和方法時不需要使用new關(guān)鍵字創(chuàng)建對象實例,直接使用"對象名.成員"的格式來訪問

    其屬性和方法.
    Object對象
    對象的屬性也可以使用索引運(yùn)算符"[]"訪問.
    String對象
    Math對象
    Date對象
    專門用于對象的語句:
    with(對象名稱)
    {
     執(zhí)行語句塊
    }
    如果一段連續(xù)的程序代碼中,多次使用到了某個對象的許多屬性或方法,那么,只要在with關(guān)鍵字后的小括

    號中定出這個對象的名稱,然后就可以在隨后的大括號中的執(zhí)行語句里直接引用該對象的屬性名或方法名,

    不必再在每個屬性和方法名前都加上對象實例名和點(.)了.
    for(變量in對象
    {
     執(zhí)行語句
    }
    該語句的功能是用于對某個對象的所有屬性進(jìn)行循操作,它將一個對象的所有屬性名稱逐一賦給一個變量,

    根本不需要事先知道對象屬性的個數(shù).
    數(shù)組:
    就是用一個變量來表示一組數(shù)據(jù)的集合,實現(xiàn)對這組數(shù)據(jù)的統(tǒng)一管理,數(shù)組中的每一個數(shù)據(jù)也叫數(shù)組的一個

    元素.
    var arr=["zs",124,"li",3.5];
    數(shù)組列表的每個元素既可以是有效的javascript表達(dá)式,也可以為空(兩個相連的逗號).如果數(shù)組中的某個

    元素為空,該元素的值為undefined.
    var arr = [1,,,,5];
    如果數(shù)組元素本身又是數(shù)組,這就叫數(shù)組的數(shù)組.
    var arr=[["Names","Beansprout","Pumpkin"],["Ages",5,3,2]];
    可以使用"數(shù)組變量名[子數(shù)組索引號][子數(shù)組中的元素索引號]"的格式來訪問數(shù)組的數(shù)組中的元素.
    Array對象:
    javascript中也提供了一個叫Array的內(nèi)部對象來創(chuàng)建數(shù)組,通過調(diào)用Array對象的各種方法,可以方便地對

    數(shù)組進(jìn)行排序,刪除,合并等操作.

    DOM編程:
    程序中創(chuàng)建的對象用來描述現(xiàn)實世界中有形或無形的事物,javascript也將瀏覽器本身,網(wǎng)頁文檔以及網(wǎng)頁

    文檔中的HTML元素等都用相應(yīng)的內(nèi)置對象來表示,其中的一些對象是作為另外的一些對象的屬性而存在的,

    這些對象及對象之間的層次關(guān)系統(tǒng)稱為DOM.
    如何編寫事件處理程序:
    1.在事件源對象所對應(yīng)的HTML標(biāo)簽上增加一個要處理的事件屬性,讓事件屬性值等于處理該事件的函數(shù)名

    或程序代碼.
    <html>
    <head>
    <script language="javascript">
    <!--
     function hideContextmenu(){
      return false;
     }
    //-->
    </script>
    </head>
    <body oncontextmenu="return hideContextmenu()">
    </body>
    </html>
    2.直接在javascript代碼中,設(shè)置元素對象的事件屬性,讓事件屬性等于處理該事件的函數(shù)名或程序代碼.
    <script language="javascript">
    <!--
     document.oncontextmenu=hideContextmenu;
     function hideContextmenu(){
      return false;
     }
    //-->
    </script>

    3.在一個專門的<script>標(biāo)簽對中編寫某個元素對象的某種事件處理程序代碼,并用for屬性指定事件源和

    用event屬性指定事件名,這種<script>標(biāo)簽中的腳本程序只在指定的事件源的指定事件發(fā)生時才被調(diào)用執(zhí)

    行.
    <script language="javascript" for="document" event="oncontextmenu">
     window.event.returnValue = false;
    </script>


    window對象
    window對象的屬性:
    location對象:
    event對象:
    frames數(shù)組對象:
    screen對象:
    clipboardDate對象:
    history對象:
    navigator對象:
    document對象:
    document對象代表瀏覽器窗口中裝載的整個HTML文檔,文檔中的每個HTML元素都可以用一個javascript對

    象來與之對應(yīng),代表HTML元素的對象在javascript中都是作為document對象的直接或間接屬性被引用的.
    body對象的對象屬性:
    form對象:
    注意:item方法,返回代表Form表單中的某個表單字段元素所對應(yīng)的對象,接受的參數(shù)可以是表單字段元素

    的名稱,也可以是表單字段元素在Form表單中的索引序號.item方法不能返回<input type="image....>類

    型的表單字段元素.

     

     

     

    posted @ 2008-10-02 14:52 ourday 閱讀(504) | 評論 (0)編輯 收藏

       

    1.request對象

        客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然后做出響應(yīng)。它是HttpServletRequest類的實例。

    序號 方 法 說 明
    1 object getAttribute(String name) 返回指定屬性的屬性值
    2 Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
    3 String getCharacterEncoding() 返回字符編碼方式
    4 int getContentLength() 返回請求體的長度(以字節(jié)數(shù))
    5 String getContentType() 得到請求體的MIME類型
    6 ServletInputStream getInputStream() 得到請求體中一行的二進(jìn)制流
    7 String getParameter(String name) 返回name指定參數(shù)的參數(shù)值
    8 Enumeration getParameterNames() 返回可用參數(shù)名的枚舉
    9 String[] getParameterValues(String name) 返回包含參數(shù)name的所有值的數(shù)組
    10 String getProtocol() 返回請求用的協(xié)議類型及版本號
    11 String getScheme() 返回請求用的計劃名,如:http.https及ftp等
    12 String getServerName() 返回接受請求的服務(wù)器主機(jī)名
    13 int getServerPort() 返回服務(wù)器接受此請求所用的端口號
    14 BufferedReader getReader() 返回解碼過了的請求體
    15 String getRemoteAddr() 返回發(fā)送此請求的客戶端IP地址
    16 String getRemoteHost() 返回發(fā)送此請求的客戶端主機(jī)名
    17 void setAttribute(String key,Object obj) 設(shè)置屬性的屬性值
    18 String getRealPath(String path) 返回一虛擬路徑的真實路徑
    19    
    20    
         

    <%@ page contentType="text/html;charset=gb2312"%>
    <%request.setCharacterEncoding("gb2312");%>
    <html>
    <head>
    <title>request
    對象_1</title>
    </head>
    <body bgcolor="#FFFFF0">
    <form action="" method="post">
    <input type="text" name="qwe">
    <input type="submit" value="
    提交">
    </form>
    請求方式:<%=request.getMethod()%><br>
    請求的資源:<%=request.getRequestURI()%><br>
    請求用的協(xié)議:<%=request.getProtocol()%><br>
    請求的文件名:<%=request.getServletPath()%><br>
    請求的服務(wù)器的IP<%=request.getServerName()%><br>
    請求服務(wù)器的端口:<%=request.getServerPort()%><br>
    客戶端IP地址:<%=request.getRemoteAddr()%><br>
    客戶端主機(jī)名:<%=request.getRemoteHost()%><br>
    表單提交來的值:<%=request.getParameter("qwe")%><br>
    </body>
    </html>
    <%@ page contentType="text/html;charset=gb2312"%>
    <%request.setCharacterEncoding("gb2312");%>
    <%@ page import="java.util.Enumeration"%>
    <html>
    <head>
    <title>request
    對象_2</title>
    </head>
    <body bgcolor="#FFFFF0">
    <form action="" method="post">
      
    用戶名:<input type="text" name="username">&nbsp;&nbsp;
      
    碼:<input type="text" name="userpass">&nbsp;&nbsp;
       <input type="submit" value="
    進(jìn)入" >
    </form>
    <%
    String str="";
    if(request.getParameter("username")!=null && request.getParameter("userpass")!=null){
       Enumeration enumt = request.getParameterNames();
       while(enumt.hasMoreElements()){
          str=enumt.nextElement().toString();
          out.println(str+":"+request.getParameter(str)+"<br>");
       }
    }
    %>
    </body>
    </html>
    <%@ page contentType="text/html;charset=gb2312"%>
    <%request.setCharacterEncoding("gb2312");%>
    <html>
    <head>
       <title>request
    對象_3</title>
    </head>
    <body bgcolor="#FFFFF0">
    <form action="" method="post">
    擅長:<input type="checkbox" name="cb" value="ON1">VC++&nbsp;
           <input type="checkbox" name="cb" value="ON2">JAVA&nbsp;
           <input type="checkbox" name="cb" value="ON3">DELPHI&nbsp;
           <input type="checkbox" name="cb" value="ON4">VB&nbsp;
           <br>
           <input type="submit" value="
    進(jìn)入" name="qwe">
    </form>
    <%
    if(request.getParameter("qwe")!=null ){
       for(int i=0;i<request.getParameterValues("cb").length;i++){
          out.println("cb"+i+":"+request.getParameterValues("cb")[i]+"<br>");
       }
       out.println(request.getParameter("qwe"));
    }
    %>
    </body>
    </html>
     

     

    2.response對象

        response對象包含了響應(yīng)客戶請求的有關(guān)信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。

    序號 方 法 說 明
    1 String getCharacterEncoding() 返回響應(yīng)用的是何種字符編碼
    2 ServletOutputStream getOutputStream() 返回響應(yīng)的一個二進(jìn)制輸出流
    3 PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象
    4 void setContentLength(int len) 設(shè)置響應(yīng)頭長度
    5 void setContentType(String type) 設(shè)置響應(yīng)的MIME類型
    6 sendRedirect(java.lang.String location) 重新定向客戶端的請求
    7    
    8    
         

    3.session對象

        session對象指的是客戶端與服務(wù)器的一次會話,從客戶連到服務(wù)器的一個WebApplication開始,直到客戶端與服務(wù)器斷開連接為止。它是HttpSession類的實例.

    序號 方 法 說 明
    1 long getCreationTime() 返回SESSION創(chuàng)建時間
    2 public String getId() 返回SESSION創(chuàng)建時JSP引擎為它設(shè)的惟一ID號
    3 long getLastAccessedTime() 返回此SESSION里客戶端最近一次請求時間
    4 int getMaxInactiveInterval() 返回兩次請求間隔多長時間此SESSION被取消(ms)
    5 String[] getValueNames() 返回一個包含此SESSION中所有可用屬性的數(shù)組
    6 void invalidate() 取消SESSION,使SESSION不可用
    7 boolean isNew() 返回服務(wù)器創(chuàng)建的一個SESSION,客戶端是否已經(jīng)加入
    8 void removeValue(String name) 刪除SESSION中指定的屬性
    9 void setMaxInactiveInterval() 設(shè)置兩次請求間隔多長時間此SESSION被取消(ms)
    10    
    11    
    12    
    13    
    14    
    15    
         

    <%@ page contentType="text/html;charset=gb2312"%>
    <%@ page import="java.util.*" %>
    <html>
    <head><title>session對象_例1</title><head>
    <body><br>
       session的創(chuàng)建時間:<%=session.getCreationTime()%>&nbsp;&nbsp;<%=new Date(session.getCreationTime())%><br><br>
       session的Id號:<%=session.getId()%><br><br>
       客戶端最近一次請求時間:<%=session.getLastAccessedTime()%>&nbsp;&nbsp;<%=new java.sql. Time(session.getLastAccessedTime())%><br><br>
       兩次請求間隔多長時間此SESSION被取消(ms):<%=session.getMaxInactiveInterval()%><br><br>
       是否是新創(chuàng)建的一個SESSION:<%=session.isNew()?"是":"否"%><br><br>
    <%
    session.putValue("name","霖苑編程");
    session.putValue("nmber","147369");
    %>
    <%
    for(int i=0;i<session.getValueNames().length;i++)
    out.println(session.getValueNames()[i]+"="+session.getValue(session.getValueNames()[i]));
    %>
    <!--返回的是從格林威治時間(GMT)1970年01月01日0:00:00起到計算當(dāng)時的毫秒數(shù)-->
    </body>
    </html>


    4.out對象

        out對象是JspWriter類的實例,是向客戶端輸出內(nèi)容常用的對象

    序號 方 法 說 明
    1 void clear() 清除緩沖區(qū)的內(nèi)容
    2 void clearBuffer() 清除緩沖區(qū)的當(dāng)前內(nèi)容
    3 void flush() 清空流
    4 int getBufferSize() 返回緩沖區(qū)以字節(jié)數(shù)的大小,如不設(shè)緩沖區(qū)則為0
    5 int getRemaining() 返回緩沖區(qū)還剩余多少可用
    6 boolean isAutoFlush() 返回緩沖區(qū)滿時,是自動清空還是拋出異常
    7 void close() 關(guān)閉輸出流
    8    
    9    
    10    
    11    
    12    
    13    
    14    
    15    
         

    <%@page contentType="text/html;charset=gb2312"%>
    <html><head><title>out對象_例1:緩存測試</title></head>
    <%@page buffer="1kb"%>
    <body>
    <%
    for(int i=0;i<2000;i++)
    out.println(i+"{"+out.getRemaining()+"}");
    %><br>
    緩存大?。?lt;%=out.getBufferSize()%><br>
    剩余緩存大小:<%=out.getRemaining()%><br>
    自動刷新:<%=out.isAutoFlush()%><br>
    <%--out.clearBuffer();--%>
    <%--out.clear();--%>
    <!--缺省情況下:服務(wù)端要輸出到客戶端的內(nèi)容,不直接寫到客戶端,而是先寫到一個輸出緩沖區(qū)中.只有在下面三中情況下,才會把該緩沖區(qū)的內(nèi)容輸出到客戶端上:
    1.該JSP網(wǎng)頁已完成信息的輸出
    2.輸出緩沖區(qū)已滿
    3.JSP中調(diào)用了out.flush()或response.flushbuffer()
    -->
    </body>
    </html>


    5.page對象

        page對象就是指向當(dāng)前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的實例

    序號 方 法 說 明
    1 class getClass 返回此Object的類
    2 int hashCode() 返回此Object的hash碼
    3 boolean equals(Object obj) 判斷此Object是否與指定的Object對象相等
    4 void copy(Object obj) 把此Object拷貝到指定的Object對象中
    5 Object clone() 克隆此Object對象
    6 String toString() 把此Object對象轉(zhuǎn)換成String類的對象
    7 void notify() 喚醒一個等待的線程
    8 void notifyAll() 喚醒所有等待的線程
    9 void wait(int timeout) 使一個線程處于等待直到timeout結(jié)束或被喚醒
    10 void wait() 使一個線程處于等待直到被喚醒
    11 void enterMonitor() 對Object加鎖
    12 void exitMonitor() 對Object開鎖
    13    
    14    
    15    
         

    6.application對象

        application對象實現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量。它開始于服務(wù)器的啟動,直到服務(wù)器的關(guān)閉,在此期間,此對象將一直存在;這樣在用戶的前后連接或不同用戶之間的連接中,可以對此對象的同一屬性進(jìn)行操作;在任何地方對此對象屬性的操作,都將影響到其他用戶對此的訪問。服務(wù)器的啟動和關(guān)閉決定了application對象的生命。它是ServletContext類的實例。

    序號 方 法 說 明
    1 Object getAttribute(String name) 返回給定名的屬性值
    2 Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
    3 void setAttribute(String name,Object obj) 設(shè)定屬性的屬性值
    4 void removeAttribute(String name) 刪除一屬性及其屬性值
    5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本號
    6 String getRealPath(String path) 返回一虛擬路徑的真實路徑
    7 ServletContext getContext(String uripath) 返回指定WebApplication的application對象
    8 int getMajorVersion() 返回服務(wù)器支持的Servlet API的最大版本號
    9 int getMinorVersion() 返回服務(wù)器支持的Servlet API的最大版本號
    10 String getMimeType(String file) 返回指定文件的MIME類型
    11 URL getResource(String path) 返回指定資源(文件及目錄)的URL路徑
    12 InputStream getResourceAsStream(String path) 返回指定資源的輸入流
    13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定資源的RequestDispatcher對象
    14 Servlet getServlet(String name) 返回指定名的Servlet
    15 Enumeration getServlets() 返回所有Servlet的枚舉
    16 Enumeration getServletNames() 返回所有Servlet名的枚舉
    17 void log(String msg) 把指定消息寫入Servlet的日志文件
    18 void log(Exception exception,String msg) 把指定異常的棧軌跡及錯誤消息寫入Servlet的日志文件
    19 void log(String msg,Throwable throwable) 把棧軌跡及給出的Throwable異常的說明信息寫入Servlet的日志文件
    20    
         

    <%@ page contentType="text/html;charset=gb2312"%>
    <html>
    <head><title>APPLICATION對象_例1</title><head>
    <body><br>
    JSP(SERVLET)引擎名及版本號:<%=application.getServerInfo()%><br><br>
    返回/application1.jsp虛擬路徑的真實路徑:<%=application.getRealPath("/application1.jsp")%><br><br>
    服務(wù)器支持的Servlet API的大版本號:<%=application.getMajorVersion()%><br><br>
    服務(wù)器支持的Servlet API的小版本號:<%=application.getMinorVersion()%><br><br>
    指定資源(文件及目錄)的URL路徑:<%=application.getResource("/application1.jsp")%><br><br><!--可以將application1.jsp換成一個目錄-->
    <br><br>
    <%
    application.setAttribute("name","霖苑計算機(jī)編程技術(shù)培訓(xùn)學(xué)校");
    out.println(application.getAttribute("name"));
    application.removeAttribute("name");
    out.println(application.getAttribute("name"));
    %>
    </body>
    </html>
    <%@ page contentType="text/html;charset=gb2312"%>
    <html>
    <head><title>APPLICATION對象_例2</title><head>
    <body><br>
    <!--由于application一直存在于服務(wù)器端,可以利用此特性對網(wǎng)頁記數(shù)-->
    <%
    if(application.getAttribute("count")==null)
    application.setAttribute("count","1");
    else
    application.setAttribute("count",Integer.toString(Integer.valueOf(application.getAttribute("count").toString()).intValue()+1));
    %>
    你是第<%=application.getAttribute("count")%>位訪問者
    </body>
    <!--由于getAttribute()方法得到的是一個Object類型對象,用getString()方法轉(zhuǎn)化為String類型-->
    <!--用Integer類的valueOf()方法把得到的String轉(zhuǎn)化成Integer的對象,在用intValue()方法得到int型,再加1,最后把計算的結(jié)果用Integer.toString()方法轉(zhuǎn)化成setAttribute()方法所要求的String類型-->
    </html>
    <%@ page contentType="text/html;charset=gb2312"%>
    <html>
    <head><title>APPLICATION對象_例3</title><head>
    <body><br>
    <!--由于application一直存在于服務(wù)器端,可以利用此特性對網(wǎng)頁記數(shù)-->
    <%
    String str=application.getAttribute("count").toString();//getAttribute("count")返回的是Object類型
    int i=0;
    if(str==null)
    application.setAttribute("count","1");
    else
    i=Integer.parseInt(str); //out.println(i);
    application.setAttribute("count",++i+"");
    %>
    你是第<%=application.getAttribute("count")%>位訪問者
    </body>
    </html>

    7.exception對象

    exception對象是一個例外對象,當(dāng)一個頁面在運(yùn)行過程中發(fā)生了例外,就產(chǎn)生這個對象。如果一個JSP頁面要應(yīng)用此對象,就必須把isErrorPage設(shè)為true,否則無法編譯。他實際上是java.lang.Throwable的對象

    序號 方 法 說 明
    1 String getMessage() 返回描述異常的消息
    2 String toString() 返回關(guān)于異常的簡短描述消息
    3 void printStackTrace() 顯示異常及其棧軌跡
    4 Throwable FillInStackTrace() 重寫異常的執(zhí)行棧軌跡
    5    
         

    8.pageContext對象

       pageContext對象提供了對JSP頁面內(nèi)所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當(dāng)于頁面中所有功能的集大成者,它的本類名也叫pageContext。

    序號 方 法 說 明
    1 JspWriter getOut() 返回當(dāng)前客戶端響應(yīng)被使用的JspWriter流(out)
    2 HttpSession getSession() 返回當(dāng)前頁中的HttpSession對象(session)
    3 Object getPage() 返回當(dāng)前頁的Object對象(page)
    4 ServletRequest getRequest() 返回當(dāng)前頁的ServletRequest對象(request)
    5 ServletResponse getResponse() 返回當(dāng)前頁的ServletResponse對象(response)
    6 Exception getException() 返回當(dāng)前頁的Exception對象(exception)
    7 ServletConfig getServletConfig() 返回當(dāng)前頁的ServletConfig對象(config)
    8 ServletContext getServletContext() 返回當(dāng)前頁的ServletContext對象(application)
    9 void setAttribute(String name,Object attribute) 設(shè)置屬性及屬性值
    10 void setAttribute(String name,Object obj,int scope) 在指定范圍內(nèi)設(shè)置屬性及屬性值
    11 public Object getAttribute(String name) 取屬性的值
    12 Object getAttribute(String name,int scope) 在指定范圍內(nèi)取屬性的值
    13 public Object findAttribute(String name) 尋找一屬性,返回起屬性值或NULL
    14 void removeAttribute(String name) 刪除某屬性
    15 void removeAttribute(String name,int scope) 在指定范圍刪除某屬性
    16 int getAttributeScope(String name) 返回某屬性的作用范圍
    17 Enumeration getAttributeNamesInScope(int scope) 返回指定范圍內(nèi)可用的屬性名枚舉
    18 void release() 釋放pageContext所占用的資源
    19 void forward(String relativeUrlPath) 使當(dāng)前頁面重導(dǎo)到另一頁面
    20 void include(String relativeUrlPath) 在當(dāng)前位置包含另一文件
    21    
         
          

    <%@page contentType="text/html;charset=gb2312"%>
    <html><head><title>pageContext對象_例1</title></head>
    <body><br>
    <%
    request.setAttribute("name","霖苑編程");
    session.setAttribute("name","霖苑計算機(jī)編程技術(shù)培訓(xùn)");
    //session.putValue("name","計算機(jī)編程");
    application.setAttribute("name","培訓(xùn)");
    %>
    request設(shè)定的值:<%=pageContext.getRequest().getAttribute("name")%><br>
    session設(shè)定的值:<%=pageContext.getSession().getAttribute("name")%><br>
    application設(shè)定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
    范圍1內(nèi)的值:<%=pageContext.getAttribute("name",1)%><br>
    范圍2內(nèi)的值:<%=pageContext.getAttribute("name",2)%><br>
    范圍3內(nèi)的值:<%=pageContext.getAttribute("name",3)%><br>
    范圍4內(nèi)的值:<%=pageContext.getAttribute("name",4)%><br>
    <!--從最小的范圍page開始,然后是reques、session以及application-->
    <%pageContext.removeAttribute("name",3);%>
    pageContext修改后的session設(shè)定的值:<%=session.getValue("name")%><br>
    <%pageContext.setAttribute("name","應(yīng)用技術(shù)培訓(xùn)",4);%>
    pageContext修改后的application設(shè)定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
    值的查找:<%=pageContext.findAttribute("name")%><br>
    屬性name的范圍:<%=pageContext.getAttributesScope("name")%><br>
    </body></html>

    9.config對象

       config對象是在一個Servlet初始化時,JSP引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(shù)(通過屬性名和屬性值構(gòu)成)以及服務(wù)器的有關(guān)信息(通過傳遞一個ServletContext對象)

    序號 方 法 說 明
    1 ServletContext getServletContext() 返回含有服務(wù)器相關(guān)信息的ServletContext對象
    2 String getInitParameter(String name) 返回初始化參數(shù)的值
    3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有參數(shù)的枚舉
    4    
    5   

    posted @ 2008-09-20 11:45 ourday 閱讀(820) | 評論 (1)編輯 收藏

    九大對象:

    內(nèi)置對象(又叫隱含對象,有9個內(nèi)置對象):不需要預(yù)先聲明就可以在腳本代碼和表達(dá)式中隨意使用

    1-out:

     javax.servlet.jsp.JspWriter類型,代表輸出流的對象。作用域為page(頁面執(zhí)行期)

    request:javax.servlet.ServletRequest的子類型,此對象封裝了由WEB瀏覽器或其它客戶端生成地HTTP

    請求的細(xì)節(jié)(參數(shù),屬性,頭標(biāo)和數(shù)據(jù))。作用域為request(用戶請求期)。
    方法由可查看API

    response:javax.servlet.ServletResponse的子類型,此對象封裝了返回到HTTP客戶端的輸出,向頁面

    作者提供設(shè)置響應(yīng)頭標(biāo)和狀態(tài)碼的方式。經(jīng)常用來設(shè)置HTTP標(biāo)題,添加cookie,設(shè)置響應(yīng)內(nèi)容的類型和狀

    態(tài),發(fā)送HTTP重定向和編碼URL。作用域為page(頁面執(zhí)行期)。


    pageContext:javax.servlet.jsp.PageContext(抽象類)類型,作用域為page(頁面執(zhí)行期)。此對象

    提供所有四個作用域?qū)哟蔚膶傩圆樵兒托薷哪芰?,它也提供了轉(zhuǎn)發(fā)請求到其它資源和包含其他資源的方法


    該對象的方法都是抽象方法

    session:javax.servlet.http.HttpSession類型,主要用于跟蹤對話。作用域session(會話期—)。

    HttpSession是一個類似哈希表的與單一WEB瀏覽器會話相關(guān)的對象,它存在于HTTP請求之間,可以存儲任

    何類型的命名對象。
    如果不需要在請求之間跟蹤會話對象,可以通過在page指令中指定session="false"
    需要記住的是pageContext對象也可以與session.getAttribute(),session.setAttribute()一樣的方式取

    得并設(shè)置會話屬性。

    application:javax.servlet.ServletContext類型,servlet的環(huán)境通過調(diào)用getServletConfig

    ().getContext()方法獲得。作用域是application(整個程序運(yùn)行期)。它提供了關(guān)于服務(wù)器版本,應(yīng)用

    級初始化參數(shù)和應(yīng)用內(nèi)資源絕對路徑,注冊信息的方式


    config:javax.servlet.ServletConfig,作用域為page(頁面執(zhí)行期)

    exception:java.lang.Throwable,通過JSP錯誤頁面中一個catch塊已經(jīng)益出但沒有捕獲的

    java.lang.Throwable的任意實例,傳向了errorPage的URI。作用域為page(頁面執(zhí)行期)。注意

    exception只有在page指令中具有屬性isErrorPage="true"時才有效。

    page:java.lang.Object類型,指向頁面自身的方式。作用域為page(頁面執(zhí)行期

     

    JSP中九大內(nèi)置對象為:
    request            請求對象                 類型 javax.servlet.ServletRequest        作用域 Request
    response          響應(yīng)對象                   類型 javax.servlet.SrvletResponse       作用域  Page
    pageContext    頁面上下文對象       類型 javax.servlet.jsp.PageContext      作用域    Page
    session            會話對象                   類型 javax.servlet.http.HttpSession       作用域    Session
    application       應(yīng)用程序?qū)ο?nbsp;         類型 javax.servlet.ServletContext          作用域    Application
    out                   輸出對象                   類型 javax.servlet.jsp.JspWriter             作用域    Page
    config              配置對象                  類型 javax.servlet.ServletConfig            作用域    Page
    page               頁面對象                  類型 javax.lang.Object                            作用域    Page
    exception        例外對象                 類型 javax.lang.Throwable                     作用域    page

    request 對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等,是最常用的對象

    常用的方法有:getParameter、getParameterNames 和getParameterValues 通過調(diào)用這幾個方法來獲取請求對象中所包含的參數(shù)的值。

    response 對象代表的是對客戶端的響應(yīng),也就是說可以通過response 對象來組織發(fā)送到客戶端的數(shù)據(jù)。但是由于組織方式比較底層,所以不建議普通讀者使用,需要向客戶端發(fā)送文字時直接使用

    pageContext 對象直譯時可以稱作“頁面上下文”對象,代表的是當(dāng)前頁面運(yùn)行的一些屬性

    常用的方法有 :findAttribute、getAttribute、getAttributesScope 和getAttributeNamesInScope
    一般情況下pageContext對象用到得也不是很多,只有在項目所面臨的情況比較復(fù)雜的情況下,才會利用到頁面屬性來輔助處理。

    session    對象代表服務(wù)器與客戶端所建立的會話,當(dāng)需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物、客戶軌跡跟蹤等。“session” 對象建立在cookie的基礎(chǔ)上,所以使用時應(yīng)注意判斷一下客戶端是否打開了cookie。常用的方法包括getId、 getValue、 getValueNames和putValue等。

    概要
    HTTP是無狀態(tài)(stateless)協(xié)議;
    Web Server 對每一個客戶端請求都沒有歷史記憶;
    Session用來保存客戶端狀態(tài)信息;
    由Web Server 寫入;
    存于客戶端;
    客戶端的每次訪問都把上次的session記錄傳遞給Web Server;
    Web Server讀取客戶端提交的session來獲取客戶端的狀態(tài)信息

    application 對象負(fù)責(zé)提供應(yīng)用程序在服務(wù)器中運(yùn)行時的一些全局信息,常用的方法有g(shù)etMimeType和getRealPath等。

    out 對象代表了向客戶端發(fā)送數(shù)據(jù)的對象,與“response” 對象不同,通過“out” 對象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容,是文本一級的,可以通過“out” 對象直接向客戶端寫一個由程序動態(tài)生成HTML文件。常用的方法除了pirnt和println之外,還包括clear、clearBuffer、flush、getBufferSize和getRemaining,這是因為“out” 對象內(nèi)部包含了一個緩沖區(qū),所以需要一些對緩沖區(qū)進(jìn)行操作的方法

    “config” 對象提供一些配置信息,常用的方法有g(shù)etInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數(shù)。

    “page” 對象代表了正在運(yùn)行的由JSP文件產(chǎn)生的類對象,不建議一般讀者使用。

    “exception” 對象則代表了JSP文件運(yùn)行時所產(chǎn)生的例外對象,此對象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true "%>”的JSP文件中使用


     


    四個作用域:

    何為作用域
    先讓我們看看效果:


    大概流程是這樣的,我們訪問04-01/index.jsp的時候,分別對pageContext, request, session,

    application四個作用域中的變量進(jìn)行累加。(當(dāng)然先判斷這個變量是不是存在,如果變量不存在,則要

    把變量初始化成1。)計算完成后就從index.jsp執(zhí)行forward跳轉(zhuǎn)到test.jsp。在test.jsp里再進(jìn)行一次

    累加,然后顯示出這四個整數(shù)來。

    從顯示的結(jié)果來看,我們可以直觀的得出結(jié)論:

    page里的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉(zhuǎn)了,它們就不見了。

    request里的變量可以跨越forward前后的兩頁。但是只要刷新頁面,它們就重新計算了。

    session和application里的變量一直在累加,開始還看不出區(qū)別,只要關(guān)閉瀏覽器,再次重啟瀏覽器訪問

    這頁,session里的變量就重新計算了。

    application里的變量一直在累加,除非你重啟tomcat,否則它會一直變大。

    而作用域規(guī)定的是變量的有效期限。

    如果把變量放到pageContext里,就說明它的作用域是page,它的有效范圍只在當(dāng)前jsp頁面里。

    從把變量放到pageContext開始,到j(luò)sp頁面結(jié)束,你都可以使用這個變量。

    如果把變量放到request里,就說明它的作用域是request,它的有效范圍是當(dāng)前請求周期。

    所謂請求周期,就是指從http請求發(fā)起,到服務(wù)器處理結(jié)束,返回響應(yīng)的整個過程。在這個過程中可能使

    用forward的方式跳轉(zhuǎn)了多個jsp頁面,在這些頁面里你都可以使用這個變量。

    如果把變量放到session里,就說明它的作用域是session,它的有效范圍是當(dāng)前會話。

    所謂當(dāng)前會話,就是指從用戶打開瀏覽器開始,到用戶關(guān)閉瀏覽器這中間的過程。這個過程可能包含多個

    請求響應(yīng)。也就是說,只要用戶不關(guān)瀏覽器,服務(wù)器就有辦法知道這些請求是一個人發(fā)起的,整個過程被

    稱為一個會話(session),而放到會話中的變量,就可以在當(dāng)前會話的所有請求里使用。

    如果把變量放到application里,就說明它的作用域是application,它的有效范圍是整個應(yīng)用。

    整個應(yīng)用是指從應(yīng)用啟動,到應(yīng)用結(jié)束。我們沒有說“從服務(wù)器啟動,到服務(wù)器關(guān)閉”,是因為一個服務(wù)

    器可能部署多個應(yīng)用,當(dāng)然你關(guān)閉了服務(wù)器,就會把上面所有的應(yīng)用都關(guān)閉了。

    application作用域里的變量,它們的存活時間是最長的,如果不進(jìn)行手工刪除,它們就一直可以使用。

    與上述三個不同的是,application里的變量可以被所有用戶共用。如果用戶甲的操作修改了application

    中的變量,用戶乙訪問時得到的是修改后的值。這在其他scope中都是不會發(fā)生的,page, request,

    session都是完全隔離的,無論如何修改都不會影響其他人的數(shù)據(jù)。

    我們使用public Object getAttribute(String name)獲得變量值,使用public void setAttribute

    (String name, Object value)將變量值保存到對應(yīng)作用域中。舉個pageContext的例子就是:

    // page
    Integer countPage = (Integer) pageContext.getAttribute("countPage");
    if (countPage == null) {
        pageContext.setAttribute("countPage", 1);
    } else {
        pageContext.setAttribute("countPage", countPage + 1);
    }
    這里先從pageContext中取出名為countPage的整數(shù),因為返回的都是java.lang.Object類型,所以需要強(qiáng)

    制轉(zhuǎn)換成我們需要的整形。這里取得的變量如果不存在就會返回null,通過判斷countPage == null來辨

    別變量是否存在,如果不存在就設(shè)置為1,如果存在就進(jìn)行累加,最后使用setAttribute()方法將修改后

    的變量值放入pageContext。

    將其中的pageContext換成request, session, application就可以操作其他三個作用域中的變量。

    posted @ 2008-09-20 11:41 ourday 閱讀(33778) | 評論 (8)編輯 收藏

    主站蜘蛛池模板: 亚洲午夜精品第一区二区8050| 国产大片91精品免费观看不卡| 日韩久久无码免费毛片软件| 亚洲精品av无码喷奶水糖心| 亚洲乱码一二三四区国产| 亚洲色成人网一二三区| 精品亚洲麻豆1区2区3区| 亚洲男人天堂2017| 日韩精品亚洲人成在线观看| 亚洲一级二级三级不卡| 97se亚洲综合在线| 亚洲精品视频在线观看免费 | 国产裸体美女永久免费无遮挡| 免费视频精品一区二区| 日本中文字幕免费看| 国产激情久久久久影院老熟女免费 | 色片在线免费观看| 在线观看特色大片免费视频| 日韩av无码成人无码免费| 成人免费午夜无码视频| 女人张开腿等男人桶免费视频| 性色av无码免费一区二区三区| 午夜色a大片在线观看免费| 国产免费资源高清小视频在线观看| 又粗又大又硬又爽的免费视频| 亚洲女同成人AⅤ人片在线观看| 亚洲无人区一区二区三区| 亚洲精品高清视频| 亚洲一区二区三区免费在线观看| 伊人久久亚洲综合影院首页| 小说专区亚洲春色校园| 无码精品人妻一区二区三区免费| 中文在线观看免费网站| 亚洲一区免费在线观看| 女人与禽交视频免费看| 国产亚洲av片在线观看18女人| 亚洲毛片在线观看| 亚洲国产av玩弄放荡人妇| xvideos永久免费入口| 99视频在线看观免费| 成年人免费视频观看|