欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
請問(wèn)什么是struts,Spring,Hibernate?

Topic: 請問(wèn)什么是struts?

  Print this page

1.請問(wèn)什么是struts? Copy to clipboard
Posted by: ccic134302
Posted on: 2003-06-26 11:10

請問(wèn)什么是struts?它能干嗎?jbuilder7和weblogic6.1能寫(xiě)嗎?

2.Re:請問(wèn)什么是struts? [Re: ccic134302] Copy to clipboard
Posted by: hone
Posted on: 2003-06-26 14:27

Struts是雅加達的一個(gè)項目,它提供了一個(gè)方法,可以在一個(gè)Web應用程序中一起使用JavaServer
Pages(JSP)和servlets。它的目的是要解決完全由JSP或完全由servlet實(shí)現的應用程序中的固有的問(wèn)
題。 例如,servelts可以生成HTML頁(yè)面,但這么做很麻煩。另一方面,JSP可以很容易地用于傳統的
HTML頁(yè)面,但JSP頁(yè)面有其它的缺點(diǎn)。特別是,用JSP很難將內容同內容的顯示分開(kāi)。 很容易將Java 代
碼同HTML混在一起,結果做出的東西又慢又難以維護。

你可以到http://jakarta.apache.org/struts上看看

3.Re:請問(wèn)什么是struts? [Re: ccic134302]
Posted by: floater
Posted on: 2003-06-26 21:53
 
什么是spring?什么是hibernate?

什么是spring?什么是hibernate?他們的作用是什么呢?高手指點(diǎn)!謝謝
darkattack(居士)于2005-7-22 17:14:18

Spring是一種Framework,就像struts是framework一樣。
hibernate是一種“數據庫-對象”映射的解決方案,就是你只要寫(xiě)一句SQL語(yǔ)句,它就自動(dòng)把SQL語(yǔ)句的結果封裝成對象...當然,理論上這樣,實(shí)際上并不是你想象的那么理想,實(shí)際還是要做很多工作的。類(lèi)似的還有iBatis.
先進(jìn)的開(kāi)發(fā)框架—理解什么是Spring [轉貼 2006-04-30 11:55:46 ] 發(fā)表者: yushujiang
 
 

一、    Spring誕生
Spring是一個(gè)開(kāi)源框架,目前在開(kāi)源社區的人氣很旺,被認為是最有前途的開(kāi)源框架之一。她是由Rod Johnson創(chuàng )建的,她的誕生是為了簡(jiǎn)化企業(yè)級系統的開(kāi)發(fā)。說(shuō)道Spring就不得不說(shuō)EJB,因為Spring在某種意義上是EJB的替代品,她是一種輕量級的容器。用過(guò)EJB的人都知道EJB很復雜,為了一個(gè)簡(jiǎn)單的功能你不得不編寫(xiě)多個(gè)Java文件和部署文件,他是一種重量級的容器。也許你不了解EJB,你可能對“輕(重)量級”和“容器”比較陌生,那么這里我簡(jiǎn)單介紹一下。
1、什么是容器
“容器”,這個(gè)概念困擾我好久。從學(xué)習Tomcat開(kāi)始就一直對此感到困惑。感性的來(lái)講,容器就是可以用來(lái)裝東西的物品。那么在編程領(lǐng)域就是指用來(lái)裝對象(OO的思想,如果你連OO都不了解,建議你去學(xué)習OO先)的對象。然而這個(gè)對象比較特別,它不僅要容納其他對象,還要維護各個(gè)對象之間的關(guān)系。這么講可能還是太抽象,來(lái)看一個(gè)簡(jiǎn)單的例子:
代碼片斷1:
  1. public class Container 
  2. {
  3.     public void init()
  4.     {
  5.     Speaker s = new Speaker();
  6.     Greeting g = new Greeting(s);
  7.     }
  8. }


可以看到這里的Container類(lèi)(容器)在初始化的時(shí)候會(huì )生成一個(gè)Speaker對象和一個(gè)Greeting對象,并且維持了它們的關(guān)系,當系統要用這些對象的時(shí)候,直接問(wèn)容器要就可以了。這就是容器最基本的功能,維護系統中的實(shí)例(對象)。如果到這里你還是感到模糊的話(huà),別擔心,我后面還會(huì )有相關(guān)的解釋。

2、輕量級與重量級
所謂“重量級”是相對于“輕量級”來(lái)講的,也可以說(shuō)“輕量級”是相對于重量級來(lái)講的。在Spring出現之前,企業(yè)級開(kāi)發(fā)一般都采用EJB,因為它提供的事務(wù)管理,聲明式事務(wù)支持,持久化,分布計算等等都“簡(jiǎn)化”了企業(yè)級應用的開(kāi)發(fā)。我這里的“簡(jiǎn)化”打了雙引號,因為這是相對的。重量級容器是一種入侵式的,也就是說(shuō)你要用EJB提供的功能就必須在你的代碼中體現出來(lái)你使用的是EJB,比如繼承一個(gè)接口,聲明一個(gè)成員變量。這樣就把你的代碼綁定在EJB技術(shù)上了,而且EJB需要JBOSS這樣的容器支持,所以稱(chēng)之為“重量級”。
相對而言“輕量級”就是非入侵式的,用Spring開(kāi)發(fā)的系統中的類(lèi)不需要依賴(lài)Spring中的類(lèi),不需要容器支持(當然Spring本身是一個(gè)容器),而且Spring的大小和運行開(kāi)支都很微量。一般來(lái)說(shuō),如果系統不需要分布計算或者聲明式事務(wù)支持那么Spring是一個(gè)更好的選擇。

二、    幾個(gè)核心概念
在我看來(lái)Spring的核心就是兩個(gè)概念,反向控制(IoC),面向切面編程(AOP)。還有一個(gè)相關(guān)的概念是POJO,我也會(huì )略帶介紹。
1、POJO
我所看到過(guò)的POJO全稱(chēng)有兩個(gè),Plain Ordinary Java Object,Plain Old Java Object,兩個(gè)差不多,意思都是普通的Java類(lèi),所以也不用去管誰(shuí)對誰(shuí)錯。POJO可以看做是簡(jiǎn)單的JavaBean(具有一系列Getter,Setter方法的類(lèi))。嚴格區分這里面的概念沒(méi)有太大意義,了解一下就行。
2、    IoC
IoC的全稱(chēng)是Inversion of Control,中文翻譯反向控制或者逆向控制。這里的反向是相對EJB來(lái)講的。EJB使用JNDI來(lái)查找需要的對象,是主動(dòng)的,而Spring是把依賴(lài)的對象注入給相應的類(lèi)(這里涉及到另外一個(gè)概念“依賴(lài)注入”,稍后解釋?zhuān)?,是被?dòng)的,所以稱(chēng)之為“反向”。先看一段代碼,這里的區別就很容易理解了。
代碼片段2:

  1. public void greet()
  2. {
  3. Speaker s = new Speaker();
  4. s.sayHello();
  5. }


代碼片段3:

  1. public void greet()
  2. {
  3. Speaker s = (Speaker)context.lookup("ejb/Speaker");
  4. s.sayHello();
  5. }


代碼片段4:

  1. public class Greeting 
  2. {
  3.     public Speaker s;
  4.     public Greeting(Speaker s)
  5.     {
  6.         this.s = s;
  7.     }
  8.     public void greet()
  9.     {
  10.         s.sayHello();
  11.     }
  12. }

我們可以對比一下這三段代碼。其中片段2是不用容器的編碼,片段3是EJB編碼,片段4是Spring編碼。結合代碼片段1,你能看出來(lái)Spring編碼的優(yōu)越之處嗎?也許你會(huì )覺(jué)得Spring的編碼是最復雜的。不過(guò)沒(méi)關(guān)系,我在后面會(huì )解釋Spring編碼的好處。
這里我想先解釋一下“依賴(lài)注入”。根據我給的例子可以看出,Greeting類(lèi)依賴(lài)Speaker類(lèi)。片段2和片段3都是主動(dòng)的去獲取Speaker,雖然獲取的方式不同。但是片段4并沒(méi)有去獲取或者實(shí)例化Speaker類(lèi),而是在greeting函數中直接使用了s。你也許很容易就發(fā)現了,在構造函數中有一個(gè)s被注入(可能你平時(shí)用的是,傳入)。在哪里注入的呢?請回頭看一下代碼片段1,這就是使用容器的好處,由容器來(lái)維護各個(gè)類(lèi)之間的依賴(lài)關(guān)系(一般通過(guò)Setter來(lái)注入依賴(lài),而不是構造函數,我這里是為了簡(jiǎn)化示例代碼)。Greeting并不需要關(guān)心Speaker是哪里來(lái)的或是從哪里獲得Speaker,只需要關(guān)注自己分內的事情,也就是讓Speaker說(shuō)一句問(wèn)候的話(huà)。
3、    AOP
AOP全稱(chēng)是Aspect-Oriented Programming,中文翻譯是面向方面的編程或者面向切面的編程。你應該熟悉面向過(guò)程的編程,面向對象的編程,但是面向切面的編程你也許是第一次聽(tīng)說(shuō)。其實(shí)這些概念聽(tīng)起來(lái)很玄,說(shuō)到底也就是一句話(huà)的事情。
現在的系統往往強調減小模塊之間的耦合度,AOP技術(shù)就是用來(lái)幫助實(shí)現這一目標的。舉例來(lái)說(shuō),假如上文的Greeting系統含有日志模塊,安全模塊,事務(wù)管理模塊,那么每一次greet的時(shí)候,都會(huì )有這三個(gè)模塊參與,以日志模塊為例,每次greet之后,都要記錄下greet的內容。而對于Speaker或者Greeting對象來(lái)說(shuō),它們并不知道自己的行為被記錄下來(lái)了,它們還是像以前一樣的工作,并沒(méi)有任何區別。只是容器控制了日志行為。如果這里你有點(diǎn)糊涂,沒(méi)關(guān)系,等講到具體Spring配置和實(shí)現的時(shí)候你就明白了。
假如我們現在為Greeting系統加入一個(gè)Valediction功能,那么AOP模式的系統結構如下:
G|RET|TIN|G
V|ALE|DIT|ION
|   |   |
日志 安全 事務(wù)

這些模塊是貫穿在整個(gè)系統中的,為系統的不同的功能提供服務(wù),可以稱(chēng)每個(gè)模塊是一個(gè)“切面”。其實(shí)“切面”是一種抽象,把系統不同部分的公共行為抽取出來(lái)形成一個(gè)獨立的模塊,并且在適當的地方(也就是切入點(diǎn),后文會(huì )解釋?zhuān)┌堰@些被抽取出來(lái)的功能再插入系統的不同部分。
從某種角度上來(lái)講“切面”是一個(gè)非常形象的描述,它好像在系統的功能之上橫切一刀,要想讓系統的功能繼續,就必須先過(guò)了這個(gè)切面。這些切面監視并攔截系統的行為,在某些(被指定的)行為執行之前或之后執行一些附加的任務(wù)(比如記錄日志)。而系統的功能流程(比如Greeting)并不知道這些切面的存在,更不依賴(lài)于這些切面,這樣就降低了系統模塊之間的耦合度。

三、    Spring初體驗
這一節我用一個(gè)具體的例子Greeting,來(lái)說(shuō)明使用Spring開(kāi)發(fā)的一般流程和方法,以及Spring配置文件的寫(xiě)法。
首先創(chuàng )建一個(gè)Speaker類(lèi),你可以把這個(gè)類(lèi)看做是POJO。
代碼片段5:

  1. public class Speaker 
  2. {
  3.     public void sayHello()
  4.     {
  5.         System.out.println("Hello!");
  6.     }
  7. }

再創(chuàng )建一個(gè)Greeting類(lèi)。
代碼片段6:

  1. public class Greeting 
  2. {
  3.     private Speaker speaker;
  4.     public void setSpeaker(Speaker speaker)
  5.     {
  6.         this.speaker = speaker;
  7.     }
  8.     public void greet()
  9.     {
  10.         speaker.sayHello();
  11.     }
  12. }


然后要創(chuàng )建一個(gè)Spring的配置文件把這兩個(gè)類(lèi)關(guān)聯(lián)起來(lái)。
代碼片段7(applicationContext.xml):

  1. <>"1.0" encoding="UTF-8"?>
  2. "-//SPRING//DTD BEAN//EN" 
  3.     "http://www.springframework.org/dtd/spring-beans.dtd">
  4.     <>"Speaker" class="Speaker">
  5.     <>"Greeting" class="Greeting">
  6.          <>"speaker">
  7.             <>"Speaker"/>
  8.         

    要用Spring Framework必須把Spring的包加入到Classpath中,我用的是Eclipse+MyEclipse,這些工作是自動(dòng)完成的。推薦用Spring的配置文件編輯器來(lái)編輯,純手工編寫(xiě)很容易出錯。我先分析一下這個(gè)xml文件的結構,然后再做測試。從節點(diǎn)開(kāi)始,先聲明了兩個(gè),第二個(gè)bean有一個(gè)speaker屬性(property)要求被注入,注入的內容是另外一個(gè)bean Speaker。這里的命名是符合JavaBean規范的,也就是說(shuō)如果是speaker屬性,那么Spring容器就會(huì )調用setSpeaker()來(lái)注入這個(gè)屬性。是reference的意思,表示引用另外一個(gè)bean。
    下面看一段簡(jiǎn)單的測試代碼:
    代碼片段8:

    1. public static void main(String[] args) 
    2. {
    3.         ApplicationContext context = 
    4.             New ClassPathXmlApplicationContext("applicationContext.xml");
    5.         Greeting greeting = (Greeting)context.getBean("Greeting");
    6.         greeting.greet();
    7. }

    這段代碼很簡(jiǎn)單,如果你上文都看懂了,那么這里應該沒(méi)有問(wèn)題。值得注意的是Spring有兩種方式來(lái)創(chuàng )建容器(我們不再用上文我們自己編寫(xiě)的Container),一種是ApplicationContext,另外一種是BeanFactory。ApplicationContext更強大一些,而且使用上兩者沒(méi)有太大區別,所以一般說(shuō)來(lái)都用ApplicationContext。Spring容器幫助我們維護我們在配置文件中聲明的Bean以及它們之間的依賴(lài)關(guān)系,我們的Bean只需要關(guān)注自己的核心業(yè)務(wù)。

    四、    面向接口的編程
    看了這么多,也許你并沒(méi)有覺(jué)得Spring給開(kāi)發(fā)帶來(lái)了很多便利。那是因為我舉的例子還不能突出Spring的優(yōu)越之處,接下來(lái)我將通過(guò)接口編程來(lái)體現Spring的強大。
    假如現在要求擴展Greeting的功能,要讓Speaker用不同的語(yǔ)言來(lái)問(wèn)候,也就是說(shuō)有不同的Speaker,比如ChineseSpeaker, EnglishSpeaker。那么對上文提到的三種編碼方式(代碼片段2、3、4)分別加以修改,你會(huì )發(fā)現很麻煩。假如下次又要加入一個(gè)西班牙語(yǔ),又得重復勞動(dòng)。很自然的會(huì )考慮到使用一個(gè)ISpeaker接口來(lái)簡(jiǎn)化工作,,更改后的代碼如下(這里沒(méi)有列出接口的相關(guān)代碼,我想你應該明白怎么寫(xiě)):         

    代碼片段9:
    1. public void greet()
    2. {
    3. ISpeaker s = new ChineseSpeaker();
    4. s.sayHello();
    5. }

    代碼片段10:
    1. public void greet()
    2. {
    3. ISpeaker s = (ISpeaker)context.lookup("ejb/ChineseSpeaker");
    4. s.sayHello();
    5. }

    代碼片段11:
    1. public class Greeting 
    2. {
    3.     public ISpeaker s;
    4.     public Greet(ISpeaker s)
    5.     {
    6.         this.s = s;
    7.     }
    8.     public void greet()
    9.     {
    10.         s.sayHello();
    11.     }
    12. }
    對比三段代碼,你會(huì )發(fā)現,第一種方法還是把具體的Speaker硬編碼到代碼中了,第二中方法稍微好一點(diǎn),但是沒(méi)有本質(zhì)改變,而第三種方法就不一樣了,代碼中并沒(méi)有關(guān)于具體Speaker的信息。也就是說(shuō),如果下次還有什么改動(dòng)的話(huà),第三種方法的Greeting類(lèi)是不需要修改,編譯的。根據上文Spring的使用介紹,只需要改動(dòng)xml文件就能給Greeting注入不同的Speaker了,這樣代碼的擴展性是不是提高了很多?
    關(guān)于Spring的接口編程還有很多東西可以去挖掘,后文還會(huì )提到有關(guān)Spring Proxy的接口編程,我這里先介紹這么多,有興趣話(huà)可以去google更多的資料。

    五、    應用Spring中的切面
    Spring生來(lái)支持AOP,首先來(lái)看幾個(gè)概念:
    1、    切面(Aspect):切面是系統中抽象出來(lái)的的某一個(gè)功能模塊,上文已經(jīng)有過(guò)介紹,這里不再多說(shuō)。
    2、    通知(Advice):通知是切面的具體實(shí)現。也就是說(shuō)你的切面要完成什么功能,具體怎么做就是在通知里面完成的。這個(gè)名稱(chēng)似乎有點(diǎn)讓人費解,等后面看了代碼就明白了。
    3、    切入點(diǎn)(Pointcut):切入點(diǎn)定義了通知應該應用到系統的哪些地方。Spring只能控制到方法(有的AOP框架可以控制到屬性),也就是說(shuō)你能在方法調用之前或者之后選擇切入,執行額外的操作。
    4、    目標對象(Target):目標對象是被通知的對象。它可以是任何類(lèi),包括你自己編寫(xiě)的或者第三方類(lèi)。有了AOP以后,目標對象就只需要關(guān)注自己的核心業(yè)務(wù),其他的功能,比如日志,就由AOP框架支持完成。
    5、    代理(Proxy):簡(jiǎn)單的講,代理就是將通知應用到目標對象后產(chǎn)生的對象。Spring在運行時(shí)會(huì )給每個(gè)目標對象生成一個(gè)代理對象,以后所有對目標對象的操作都會(huì )通過(guò)代理對象來(lái)完成。只有這樣通知才可能切入目標對象。對系統的其他部分來(lái)說(shuō),這個(gè)過(guò)程是透明的,也就是看起來(lái)跟沒(méi)用代理一樣。
    我為了簡(jiǎn)化,只介紹這5個(gè)概念。通過(guò)這幾個(gè)概念應該能夠理解Spring的切面編程了。如果需要深入了解Spring AOP的話(huà)再去學(xué)習其他概念也很快的。
    下面通過(guò)一個(gè)實(shí)際的例子來(lái)說(shuō)明Spring的切面編程。繼續上文Greeting的例子,我們想在Speaker每次說(shuō)話(huà)之前記錄Speaker被調用了。
    首先創(chuàng )建一個(gè)LogAdvice類(lèi):
    代碼片段12:
    1. public class LogAdvice implements MethodBeforeAdvice 
    2. {
    3.     public void before(Method arg0, Object[] arg1, Object arg2)throws Throwable 
    4.     {
    5.         System.out.println("Speaker called!");
    6.     }
    7. }

      這里涉及到一個(gè)類(lèi),MethodBeforeAdvice,這個(gè)類(lèi)是Spring類(lèi)庫提供的,類(lèi)似的還有AfterReturningAdvice等等,從字面就能理解它們的含義。先不急著(zhù)理解這個(gè)類(lèi),我稍后解釋。我們繼續看如何把這個(gè)類(lèi)應用到我們的系統中去。
      代碼片段13:

      1.     <>"Speaker" class="Speaker"/>
      2.     <>"Greeting" class="Greeting">
      3.          <>"speaker">
      4.             <>"SpeakerProxy"/>
      5.         
      6.     
  9.     <>"LogAdvice" class="LogAdvice"/>
  10.     <>"SpeakerProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  11.          <>"proxyInterfaces">
  12.             ISpeaker
  13.         
  14.          <>"interceptorNames">
  15.             
  16.                 LogAdvice
  17.             
  18.         
  19.          <>"target">
  20.             <>"Speaker"/>
  21.         
  22.     

  23. 可以看到我們的配置文件中多了兩個(gè)bean,一個(gè)LogAdvice,另外一個(gè)SpeakerProxy。LogAdvice很簡(jiǎn)單。我著(zhù)重分析一下SpeakerProxy。這個(gè)Bean實(shí)際上是由Spring提供的ProxyFactoryBean實(shí)現。下面定義了三個(gè)依賴(lài)注入的屬性。
    1、    proxyInterfactes:這個(gè)屬性定義了這個(gè)Proxy要實(shí)現哪些接口,可以是一個(gè),也可以是多個(gè)(多個(gè)的話(huà),要用list標簽)。我前面講過(guò)Proxy是在運行是動(dòng)態(tài)創(chuàng )建的,那么這個(gè)屬性就告訴Spring創(chuàng )建這個(gè)Proxy的時(shí)候實(shí)現哪些接口。
    2、    interceptorNames:這個(gè)屬性定義了Proxy被切入了哪些通知,這里只有一個(gè)LogAdvice。
    3、    target:這個(gè)屬性定義了被代理的對象。在這個(gè)例子中target是Speaker。
    這樣的定義實(shí)際上約束了被代理的對象必須實(shí)現一個(gè)接口,這與上文講的面向接口的編程有點(diǎn)類(lèi)似。其實(shí)可以這樣理解,接口的定義可以讓系統的其他部分不受影響,以前用ISpeaker接口來(lái)調用,現在加入了Proxy還是一樣的。但實(shí)際上內容已經(jīng)不一樣了,以前是Speaker,現在是一個(gè)Proxy。而target屬性讓proxy知道具體的方法實(shí)現在哪里。Proxy可以看作是target的一個(gè)包裝。當然Spring并沒(méi)有強制要求用接口,通過(guò)CGLIB(一個(gè)高效的代碼生成開(kāi)源類(lèi)庫)也可以直接根據目標對象生成子類(lèi),但這種方式并不推薦。
    我們還像以前一樣的測試我們的Greeting系統,測試代碼和代碼片段8是一樣的。運行結果如下:
    Speaker called!
    Hello!

    看到效果了吧!而且你可以發(fā)現,我們加入Log功能并沒(méi)有改變以前的代碼,甚至測試代碼都沒(méi)有改變,這就是AOP的魅力所在!我們更改的只是配置文件。
    下面解釋一下剛才落下的MethodBeforeAdvice。關(guān)于這個(gè)類(lèi)我并不詳細介紹,因為這涉及到Spring中的另外一個(gè)概念“連接點(diǎn)(Jointpoint)”,我詳細介紹一個(gè)before這個(gè)方法。這個(gè)方法有三個(gè)參數arg0表示目標對象在哪個(gè)點(diǎn)被切入了,既然是MethodBeforeAdvice,那當然是在Method之前被切入了。那么arg0就是表示的那個(gè)Method。第二個(gè)參數arg1是Method的參數,所以類(lèi)型是Object[]。第三個(gè)參數就是目標對象了,在Greeting例子中arg2的類(lèi)型實(shí)際上是Speaker。
    在Greeting例子中,我們并沒(méi)有指定目標對象的哪些方法要被切入,而是默認切入所有方法調用(雖然Speaker只有一個(gè)方法)。通過(guò)自定義Pointcut,可以控制切入點(diǎn),我這里不再介紹了,因為這并不影響理解Spring AOP,有興趣的話(huà)去google一下就知道了。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
初學(xué)者對Spring框架的認識二JSP教程
Spring、Hibernate、Struts1整合的方式
struts2 hibernate spring配置管理(二)——DAO層(一)
Spring框架簡(jiǎn)介
架構師面試之-------------mysql和 spring aop實(shí)現
「一」1.2、Spring的AOP原理
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久