java 三大框架面試題

?

1.Hibernate工作原理及為什么要用?

原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創建SessionFactory3.打開Session 4.創建事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory

為什么要用: 1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。 2. Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。 4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

2.Hibernate是如何延遲加載?

1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)

2. Hibernate3 提供了屬性的延遲加載功能當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。?

?

?

3.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)

類與類之間的關系主要體現在表與表之間的關系進行操作,它們都是對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many

?

?

4.Struts1流程:

1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被ActionServlet接收。3、根據struts-config.xml配置, ActionServlet先將請求中的參數填充到ActionForm中,然后ActionServlet再將請求發送到Action 進行處理。4、是否驗證,需要驗證則調用ActionForm的validate方法,驗證失敗則跳轉到input,成功則繼續。5、Action從ActionForm獲得數據,調用javabean 中的業務方法處理數據。6、Action返回ActionForward對象,跳轉到相應JSP頁面或Action。7、返回HTTP響應到客戶端瀏覽器。

?

MVC設計模式:modal:“模型” 也稱業務邏輯,是正真完成任務的代碼,相當與JavaBeanview:視圖,其實就是顯示界面,相當于JSPcontroller:控制器,他控制模型和視圖的交互過程,相當于servletstruts1是基于MVC設計模式hibernate是基于ORM對象關系映射

?

5.struts是什么?

struts1是基于JSP和servlet的一個開源的Web應用框架,使用的是MVC的設計模式struts2是基于webwork技術的框架,是sun和webwork公司聯手開發的一個功能非常齊全的框架,struts2和struts1沒有任何關系,是一個全新的框架

?

6.spring是什么?

spring是一個集成了許多第三方框架的大雜燴,其核心技術是IOC(控制反轉,也稱依賴注入)和AOP(面向切面編程)

?

7.hibernate是什么?

hibernate是基于ORM對象關系映射(完成對象數據到關系數據映射的機制)實現的,做數據持久化的工具

?

8.JSF是什么?

JavaServer Face是基于組件的web開發框架,跟sturts差不多的框架

?

9.數據庫里面的索引和約束是什么?

索引是為了提高數據的檢索速度,索引是建立在數據表上,根據一個或多個字段建立的約束是為了保持數據的完整性,約束有非空約束,主鍵約束,外鍵約束等等。

?

10.spring是什么

這個問題,往往可以通過我們為什么要使用spring這個問題來切入:AOP 讓開發人員可以創建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用 AOP 后,公共服務 (比 如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。 IOC 允許創建一個可以構造對象的應用環境,然后向這些對象傳遞它們的協作對象。正如單詞 倒置所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。 Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然后可以很容易地在需要時替換具有類似接口的協作對象。

?

11.用自己的話簡要闡述struts2的執行流程。

Struts 2框架本身大致可以分為3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是需要用戶來自己實現的。用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。

?

Struts 2的工作流程相對于Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。基本簡要流程如下:1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被FilterDispatcher接收。3、根據struts.xml配置,找到需要調用的Action類和方法,并通過IoC方式,將值注入給Aciton。4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,并跳轉到相應頁面。6、返回HTTP響應到客戶端瀏覽器。

1 Action是不是線程安全的?如果不是有什么方式可以保證Action的線程安全?如果是,說明原因

不是

聲明局部變量,或者擴展RequestProcessor,讓每次都創建一個Action,或者在spring中用scope="prototype"來管理

?

2.MVC,分析一下struts是如何實現MVC的

m:JavaBean 或結合 EJB 組件或者pojo構成

c:Action 來實現

v:一組 JSP 文件及其標簽構成。

?

3.struts中的幾個關鍵對象的作用(說說幾個關鍵對象的作用)

Action:控制器類,ActionForm:表單對象,DynaValidatorForm:動態form,ActonMapping:配置文件中action節點的信息......

?

4.說說AOP和IOC的概念以及在spring中是如何應用的

AOP:面向方面編程,ioc:依賴注入;聲明式事務和編程式事務積極一些通用部分

?

5.Hibernate有哪幾種查詢數據的方式

hql查詢,sql查詢,條件查詢

?

6.load()和get()的區別

hibernate對于load方法認為該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,load默認支持延遲加載,在用到對象中的其他屬性數 據時才查詢數據庫,但是萬一數據庫中不存在該記錄,只能拋異常ObjectNotFoundEcception;所說的load方法拋異常是指在使用該對 象的數據時,數據庫中不存在該數據時拋異常,而不是在創建這個對象時。由于session中的緩存對于hibernate來說是個相當廉價的資源,所以在 load時會先查一下session緩存看看該id對應的對象是否存在,不存在則創建代理(load時候之查詢一級緩存,不存在則創建代理)。get() 現在一級緩存找,沒有就去二級緩存找,沒有就去數據庫找,沒有就返回null ;而對于get方法,hibernate一定要獲取到真實的數據,否則返回null。

?

7.談談hibernate的延遲加載和openSessionInView

延遲加載要在session范圍內,用到的時候再加載;opensessioninview是在web層寫了一個

filter來打開和關閉session,這樣就表示在一次request過程中session一直開著,保證了延遲

加載在session中的這個前提。

?

8.spring的事務有幾種方式?談談spring事務的隔離級別和傳播行為。

聲明事務和編程事務

隔離級別:

- DEFAULT使用數據庫默認的隔離級別

- READ_UNCOMMITTED會出現臟讀,不可重復讀和幻影讀問題

- READ_COMMITTED會出現重復讀和幻影讀

- REPEATABLE_READ會出現幻影讀

- SERIALIZABLE最安全,但是代價最大,性能影響極其嚴重

和傳播行:

- REQUIRED存在事務就融入該事務,不存在就創建事務

- SUPPORTS存在事務就融入事務,不存在則不創建事務

- MANDATORY存在事務則融入該事務,不存在,拋異常

- REQUIRES_NEW總是創建新事務

- NOT_SUPPORTED存在事務則掛起,一直執行非事務操作

- NEVER總是執行非事務,如果當前存在事務則拋異常

- NESTED嵌入式事務

?

9.Hibernate中的update()和saveOrUpdate()的區別.

摘自hibernate說明文檔:

saveOrUpdate()做下面的事:

如果對象已經在本session中持久化了,不做任何事

如果另一個與本session關聯的對象擁有相同的持久化標識(identifier),拋出一個異常

如果對象沒有持久化標識(identifier)屬性,對其調用save()

如果對象的持久標識(identifier)表明其是一個新實例化的對象,對其調用save()

如果對象是附帶版本信息的(通過<version>或 <timestamp>)并且版本屬性的值表明其是一個新實例化的對象,save()它。否則update() 這個對象

10.Spring對多種ORM框架提供了很好的支持,簡單描述在Spring中使用Hibernate的方法,并結合事務管理。

getHiberanteTemplate里面提供了save,update,delete,find等方法。

簡單說一個:如果配置了聲明式事務,當執行getHibernateTemplate的各種方法的時候,事務會

自動被加載

如果沒有配置事務,那么以上操作不會真正的被同步到數據庫,除非配置了hibernate的

autocommit=true

8.spring的事務有幾種方式?談談spring事務的隔離級別和傳播行為。

spring事務分兩種形式,聲明式事務和編程式事務,spring提供了一個事務的接口

PaltformTractionManager接口,針對不同的事務,spring進行了不同的實現,對hibernate事務

的實現HIbernateTractionManager,對JDBC的JdbcTractionManager,

DataSourceTractionManager以及JdoTractionManager。接口platformTractionManager提供了三

個方法,獲取事務,提交和回滾的方法。

******************************************************************************

分享面試題二】Spring,hibernate,struts的面試筆試題(含答案)

(聲明:這里不是為其他商業利益,是為學習討論使用)

【鄭重聲明】:單純接分將被刪帖,希望大家有自己的感觸

Hibernate工作原理及為什么要用?

原理:

1.讀取并解析配置文件

2.讀取并解析映射信息,創建SessionFactory

3.打開Sesssion

4.創建事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

為什么要用:

1.???對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

2.???Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

3.???hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。

4.???hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

2. Hibernate是如何延遲加載?

1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)

2. Hibernate3 提供了屬性的延遲加載功能

當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。

3.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)

類與類之間的關系主要體現在表與表之間的關系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、

4. 說下Hibernate的緩存機制

1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存

2. 二級緩存:

a) 應用及緩存

b) 分布式緩存

條件:數據不會被第三方修改、數據大小在可接受范圍、數據更新頻率低、同一數據被系統頻繁使用、非????????????? 關鍵數據

c) 第三方緩存的實現

5. Hibernate的查詢方式

Sql、Criteria,object comptosition

Hql:

1、 屬性查詢

2、 參數查詢、命名參數查詢

3、 關聯查詢

4、 分頁查詢

5、 統計函數

6. 如何優化Hibernate?

1.使用雙向一對多關聯,不使用單向一對多

2.靈活使用單向一對多關聯

3.不用一對一,用多對一取代

4.配置對象緩存,不使用集合緩存

5.一對多集合使用Bag,多對多集合使用Set

6. 繼承類使用顯式多態

7. 表字段要少,表關聯不要怕多,有二級緩存撐腰

?

7. Struts工作機制?為什么要使用Struts?

工作機制:

Struts的工作流程:

在web應用啟動時就會加載初始化ActionServlet,ActionServlet從

struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象

當ActionServlet接收到一個客戶請求時,將執行如下流程.

???-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;

???-(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;

???-(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;

???-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;

???-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應 的??????????????????? Action實例不存在,就先創建這個實例,然后調用Action的execute()方法;

???-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給 ActionForward對象指向的JSP組件;

???-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;

為什么要用:

JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。

基于Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件

8. Struts的validate框架是如何驗證的?

在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。

9. 說下Struts的設計模式

MVC模式: web應用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,并被填入表單相應的數 據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的 Validate()驗證后選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然后調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對 象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動 態的網頁,返回給客戶。

10. spring工作機制及為什么要用?

1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。

2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理后,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

6.視圖對象負責渲染返回給客戶端。

為什么用:

{AOP 讓開發人員可以創建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用 AOP 后,公共服務 (比 如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。

???IOC 允許創建一個可以構造對象的應用環境,然后向這些對象傳遞它們的協作對象。正如單詞 倒置所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。

Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然后可以很容易地在需要時替換具有類似接口的協作對象。}

Struts,Spring,Hibernate優缺點

Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟件,這是它的一大優點。使開發者能更深入的了解其內部實現機制。 Struts開放源碼框架的創建是為了使開發者在構建基于Java Servlet和JavaServerPages(JSP)技術的Web應用時更加容易。Struts框架為開放者提供了一個統一的標準框架,通過使用Struts作為基礎,開發者能夠更專注 于應用程序的商業邏輯。Struts框架本身是使用Java Servlet和JavaServer Pages技術的一種Model-View-Controller(MVC)實現.

具體來講,

Struts的優點有:

1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.

2. 有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。

3. 頁面導航.頁面導航將是今后的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。

4. 提供Exception處理機制 .

5. 數據庫鏈接池管理

6. 支持I18N

缺點:

一、轉到展示層時,需要配置forward,每一次轉到展示層,相信大多數都是直接轉到jsp,而涉及到轉向, 需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個項目,而tomcate這樣的服務器,還必須重新啟動服務器,如果業務變更復雜頻繁的系統,這樣的操作簡單不可想象。現在就是這樣,幾十上百個人同時在線使用我們的系統,大家可以想象一下,我的煩惱有多大。

二、 Struts 的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。

三、 測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase可以實現它的單元測試。

四、 類型的轉換. Struts的FormBean把所有的數據都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。

五、 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。

六、前端表達式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。

七、 對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。

八、 對Action 執行前和后的處理. Struts處理Action的時候是基于class的hierarchies,很難在action處理前和后進行操作。

九、 對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能 對應一個事件,struts這種事件方式稱為applicationevent,application event和component event相比是一種粗粒度的事件。

?

Struts重要的表單對象ActionForm是一種對象,它代表了一種應用,這個對象中至少包含幾個字段, 這些字段是Jsp頁面表單中的input字段,因為一個表單對應一個事件,所以,當我們需要將事件粒度細化到表單中這些字段時,也就是說,一個字段對應一個事件時,單純使用Struts就不太可能,當然通過結合JavaScript也是可以轉彎實現的。

2.Hibernate

Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。

Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序實用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。

大多數開發機構經常采取創建各自獨立的數據持久層。一旦底層的數據結構發生改變,那么修改應用的其余部分使之適應這種改變的代價將是十分巨大的。 Hibernate適時的填補了這一空白,它為Java應用提供了一個易用的、高效率的對象關系映射框架。hibernate是個輕量級的持久性框架,功 能卻非常豐富。

優點:

a.Hibernate 使用 Java 反射機制而不是字節碼增強程序來實現透明性。

b.Hibernate 的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。

c.它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

缺點:

它限制您所使用的對象模型。(例如,一個持久性類不能映射到多個表)其獨有的界面和可憐的市場份額也讓人不安,盡管如此,Hibernate 還是以其強大的發展動力減輕了這些風險。其他的開源持久性框架也有一些,不過都沒有 Hibernate 這樣有市場沖擊力。

上面回貼情緒有點激動,希望諒解,我不是因為有人批評Hibernate而感到不快,而是因為帖子里面的觀點實在讓我覺得荒謬。不管覺得 Hibernate好也吧,不好也吧,我唯一覺得遺憾的是,在中文論壇里面找不到一個對Hibernate的真正高水平的評價。在TSS上有一個關于 Hibernate的hot thread,跟了幾百貼,其中包括Hibernate作者Gavin和LiDO JDO的CTO,對于JDO和Hibernate有過一些激烈的爭論,我曾經耐心的看了一遍,仍然沒有發現針對Hibernate真正有力的攻擊,那些所 謂的攻擊無非針對Hibernate沒有一個GUI的配置工具,沒有商業公司支持,沒有標準化等等這些站不住腳的理由。

補充幾點我的意見:

一、Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架,和App Server,和EJB沒有什么必然的聯系。Hibernate可以用在任何JDBC可以使用的場合,例如Java應用程序的數據庫訪問代碼,DAO接口的實現類,甚至可以是BMP里面的訪問數據庫的代碼。從這個意義上來說,Hibernate和EB不是一個范疇的東西,也不存在非此即彼的關系。

二、Hibernate是一個和JDBC密切關聯的框架,所以Hibernate的兼容性和JDBC驅動,和數據庫都有一定的關系,但是和使用它的Java程序,和App Server沒有任何關系,也不存在兼容性問題。

三、Hibernate不能用來直接和Entity Bean做對比,只有放在整個J2EE項目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC的替代者出現的,而不是Entity Bean的替代者出現的,讓我再列一次我已經列n次的框架結構:

傳統的架構:

1) Session Bean <-> Entity Bean<-> DB

為了解決性能障礙的替代架構:

2) Session Bean <-> DAO <->JDBC <-> DB

使用Hibernate來提高上面架構的開發效率的架構:

3) Session Bean <-> DAO <->Hibernate <-> DB

就上面3個架構來分析:

1、內存消耗:采用JDBC的架構2無疑是最省內存的,Hibernate的架構3次之,EB的架構1最差。

2、運行效率:如果JDBC的代碼寫的非常優化,那么JDBC架構運行效率最高,但是實際項目中,這一點幾乎做不到,這需要程序員非常精通JDBC,運用 Batch語句,調整PreapredStatement的Batch Size和Fetch Size等參數,以及在必要的情況下采用結果集cache等等。而一般情況下程序員是做不到這一點的。因此Hibernate架構表現出最快的運行效率。 EB的架構效率會差的很遠。

3、開發效率:在有JBuilder的支持下以及簡單的項目,EB架構開發效率最高,JDBC次之,Hibernate最差。但是在大的項目,特別是持久層關系映射很復雜的情況下,Hibernate效率高的驚人,JDBC次之,而EB架構很可能會失敗。

4、分布式,安全檢查,集群,負載均衡的支持

由于有SB做為Facade,3個架構沒有區別。

四、EB和Hibernate學習難度在哪里?

EB的難度在哪里?不在復雜的XML配置文件上,而在于EB運用稍微不慎,就有嚴重的性能障礙。所以難在你需要學習很多EJB設計模式來避開性能問題,需 要學習App Server和EB的配置來優化EB的運行效率。做EB的開發工作,程序員的大部分精力都被放到了EB的性能問題上了,反而沒有更多的精力關注本身就主要 投入精力去考慮的對象持久層的設計上來。

Hibernate難在哪里?不在Hibernate本身的復雜,實際上Hibernate非常的簡單,難在Hibernate太靈活了。

當你用EB來實現持久層的時候,你會發現EB實在是太笨拙了,笨拙到你根本沒有什么可以選擇的余地,所以你根本就不用花費精力去設計方案,去平衡方案的好壞,去費腦筋考慮選擇哪個方案,因為只有唯一的方案擺在你面前,你只能這么做,沒得選擇。

Hibernate相反,它太靈活了,相同的問題,你至少可以設計出十幾種方案來解決,所以特別的犯難,究竟用這個,還是用那個呢?這些方案之間到底有什么區別呢?他們的運行原理有什么不同?運行效率哪個比較好?光是主鍵生成,就有七八種方案供你選擇,你為難不為難?集合屬性可以用Set,可以用 List,還可以用Bag,到底哪個效率高,你為難不為難?查詢可以用iterator,可以用list,哪個好,有什么區別?你為難不為難?復合主鍵你 可以直接在hbm里面配置,也可以自定義CustomerType,哪種比較好些?你為難不為難?對于一個表,你可以選擇單一映射一個對象,也可以映射成父子對象,還可以映射成兩個1:1的對象,在什么情況下用哪種方案比較好,你為難不為難?

這個列表可以一直開列下去,直到你不想再看下去為止。當你面前擺著無數的眼花繚亂的方案的時候,你會覺得幸福呢?還是悲哀呢?如果你是一個負責的程序員,那么你一定會仔細研究每種方案的區別,每種方案的效率,每種方案的適用場合,你會覺得你已經陷入進去拔不出來了。如果是用EB,你第一秒種就已經做出了決 定,根本沒得選擇,比如說集合屬性,你只能用Collection,如果是Hibernate,你會在Bag,List和Set之間來回猶豫不決,甚至搞 不清楚的話,程序都沒有辦法寫。

3. Spring

它是一個開源的項目,而且目前非常活躍;它基于IoC(Inversion of Control,反向控制)和AOP的構架多層j2ee系統的框架,但它不強迫你必須在每一層中必須使用Spring,因為它模塊化的很好,允許你根據自己的需要選擇使用它的某一個模塊;它實現了很優雅的MVC,對不同的數據訪問技術提供了統一的接口,采用IoC使得可以很容易的實現bean的裝配,提供了簡潔的AOP并據此實現Transcation Managment,等等

優點:

a. Spring能有效地組織你的中間層對象,不管你是否選擇使用了EJB。如果你僅僅使用了Struts或其他為J2EE的 API特制的framework,Spring致力于解決剩下的問題。

b. Spring能消除在許多工程中常見的對Singleton的過多使用。根據我的經驗,這是一個很大的問題,它降低了系統的可測試性和面向對象的程度。

c. 通過一種在不同應用程序和項目間一致的方法來處理配置文件,Spring能消除各種各樣自定義格式的屬性文件的需要。曾經對某個類要尋找的是哪個魔法般的 屬性項或系統屬性感到不解,為此不得不去讀Javadoc甚至源編碼?有了Spring,你僅僅需要看看類的JavaBean屬性。Inversion ofControl的使用(在下面討論)幫助完成了這種簡化。

d.通過把對接口編程而不是對類編程的代價幾乎減少到沒有,Spring能夠促進養成好的編程習慣。

e. Spring被設計為讓使用它創建的應用盡可能少的依賴于他的APIs。在Spring應用中的大多數業務對象沒有依賴于Spring。

f. 使用Spring構建的應用程序易于單元測試。

g.Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。

h. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適用于許多web應用。例如,Spring能使用AOP提供聲明性事務管理而不通過EJB容器,如果你僅僅需要與單個數據庫打交道,甚至不需要一個JTA實現。

i. Spring為數據存取提供了一個一致的框架,不論是使用的是JDBC還是O/R mapping產品(如Hibernate)。

Spring確實使你能通過最簡單可行的解決辦法來解決你的問題。而這是有有很大價值的。

缺點:

使用人數不多、jsp中要寫很多代碼、控制器過于靈活,缺少一個公用控制器。

?

6.?Java Web部分

1、Tomcat的優化經驗

答:去掉對web.xml的監視,把jsp提前編輯成Servlet。

有富余物理內存的情況,加大tomcat使用的jvm的內存

?

?

1、HTTP請求的GET與POST方式的區別

(1)get是從服務器上獲取數據,post是向服務器傳送數據。

在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放置在HTML HEADER內提交。

(2)對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request.Form獲取提交的數據。

(3) GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。

(4)安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那么使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那么還是使用 post為好。

62、解釋一下什么是servlet;

答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

1、說一說Servlet的生命周期?

答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。

?

Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。

web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。

?

4、Servlet的基本架構

public class ServletName extendsHttpServlet {

public void doPost(HttpServletRequestrequest, HttpServletResponse response) throws

ServletException, IOException {

}

public void doGet(HttpServletRequestrequest, HttpServletResponse response) throws

ServletException, IOException {

}

}

3、SERVLET API中forward() 與redirect()的區別?

答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;后者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用

sendRedirect()方法。

?

60、什么情況下調用doGet()和doPost()?

Jsp頁面中的FORM標簽里的method屬性為get時調用doGet(),為post時調用doPost()。

?

66、Request對象的主要方法:

setAttribute(String name,Object):設置名字為name的request的參數值

getAttribute(String name):返回由name指定的屬性值

getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例

getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組

getCharacterEncoding():返回請求中的字符編碼方式

getContentLength():返回請求的Body的長度

getHeader(String name):獲得HTTP協議定義的文件頭信息

getHeaders(String name):返回指定名字的request Header的所有值,結果是一個枚舉的實例

getHeaderNames():返回所以request Header的名字,結果是一個枚舉的實例

getInputStream():返回請求的輸入流,用于獲得請求中的數據

getMethod():獲得客戶端向服務器端傳送數據的方法

getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數值

getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例

getParametervalues(String name):獲得有name指定的參數的所有值

getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱

getQueryString():獲得查詢字符串

getRequestURI():獲取發出請求字符串的客戶端地址

getRemoteAddr():獲取客戶端的IP地址

getRemoteHost():獲取客戶端的名字

getSession([Boolean create]):返回和請求相關Session

getServerName():獲取服務器的名字

getServletPath():獲取客戶端所請求的腳本文件的路徑

getServerPort():獲取服務器的端口號

removeAttribute(String name):刪除請求中的一個屬性

?

?

?

19、forward 和redirect的區別

forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。

??redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,所以session,request參數都可以獲取。

4、request.getAttribute() 和 request.getParameter() 有何區別?

1.getAttribute是取得jsp中 用setAttribute設定的attribute

2.parameter得到的是string;attribute得到的是object

3.request.getParameter ()方法傳遞的數據,會從Web客戶端傳到Web服務器端,代表HTTP請求數據;request.setAttribute()和 getAttribute()方法傳遞的數據只會存在于Web容器內部,在具有轉發關系的Web組件之間共享。即request.getAttribute()方法返回request范圍內存在的對象,而request.getParameter()方法是獲取 http提交過來的數據。

?

?

1. jsp有哪些內置對象?作用分別是什么? 分別有什么方法?

答:JSP共有以下9個內置的對象:

request 用戶端請求,此請求會包含來自GET/POST請求的參數

response 網頁傳回用戶端的回應

pageContext 網頁的屬性是在這里管理

session 與請求有關的會話期

application servlet 正在執行的內容

out 用來傳送回應的輸出

config servlet的構架部件

page JSP網頁本身

exception 針對錯誤網頁,未捕捉的例外

?

request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header, 和session數據的有用的方法。

??response表示HttpServletResponse對象,并提供了幾個用于設置送回瀏覽器的響應的方法(如cookies,頭信息等)

??out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結果。

??pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關的對象的API,并且包裝了通用的servlet相關功能的方法。

??session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息

??applicaton 表示一個javax.servle.ServletContext對象。這有助于查找有關servlet引擎和servlet環境的信息

??config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數。

??page表示從該頁面產生的一個servlet實例

?

2. jsp有哪些動作?作用分別是什么?

(這個問題似乎不重要,不明白為何有此題)

答:JSP共有以下6種基本動作

jsp:include:在頁面被請求的時候引入一個文件。

jsp:useBean:尋找或者實例化一個JavaBean。

jsp:setProperty:設置JavaBean的屬性。

jsp:getProperty:輸出某個JavaBean的屬性。

jsp:forward:把請求轉到一個新的頁面。

jsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記

59、JSP的常用指令

isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)

?

3. JSP中動態INCLUDE與靜態INCLUDE的區別?

答:動態INCLUDE用jsp:include動作實現

<jsp:include page=included.jspflush=true />它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數 靜態INCLUDE用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面<%@ include file=included.htm %>

?

4、兩種跳轉方式分別是什么?有什么區別?

(下面的回答嚴重錯誤,應該是想問forward和sendRedirect 的區別,畢竟出題的人不是專業搞文字藝術的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術面也可能存在一些問題,不一定真正將他的意思表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什么,不要一味想著是在答題)

答:有兩種,分別為:

<jsp:include page=included.jspflush=true>

<jsp:forward page= nextpage.jsp/>

前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完后還會回來,相當于函數調用。并且可以帶參數.后者完全轉向新頁面,不會再回來。相當于go to語句。

?

63、頁面間對象傳遞的方法

request,session,application,cookie等

64、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什么?

JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。

?

1、MVC的各個部分都有那些技術來實現?如何實現?

答:MVC是Model-View-Controller的簡寫。Model 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現), View 是應用的表示面(由JSP頁面產生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。

?

68、我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?

?Public String translate (String str) {

??String tempStr = "";

??try {

????tempStr = new String(str.getBytes("ISO-8859-1"),"GBK");

????tempStr = tempStr.trim();

?? }

??catch (Exception e) {

????System.err.println(e.getMessage());

?? }

??return tempStr;

?}

1.現在輸入n個數字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結果為,提供reset

7. 實際項目開發

1、在eclipse中調試時,怎樣查看一個變量的值?

在要查看的變量前先設置斷點,然后選中變量,右鍵選debugas-->Java Application,打開debug透視圖,這時在Variables窗口中可以看到變量當前的值。

如果是局部變量,也可以在局部變量窗口中查看。

要知道一個方法被調用的方法調用鏈,可以在方法棧中查看。

?

2、你們公司使用的代碼配置管理工具是什么?

除了說以前使用cvs,現在新項目使用svn了,還簡要說一下使用的過程,如果有可能,還說說倉庫的概念和如何使用鎖之類的細節。

?

3、你們的項目總金額多少,多少人開發,總共花了多少個月?

像巴巴運動網這種規模的項目,可以說是4、5個人、開發了4、5個月,費用則是4、50萬。按每人每月兩萬收入去計算,就差不多了。

?

7. 數據庫部分

1、用兩種方式根據部門號從高到低,工資從低到高列出每個員工的信息。

employee:

???? eid,ename,salary,deptid;

?select * from employee order by deptiddesc,salary

?

?

2、列出各個部門中工資高于本部門的平均工資的員工數和部門號,并按部門號排序

創建表:

??????MySQL> create table employee921(id int primary keyauto_increment,name varchar(5

0),salary bigint,deptid int);

?

插入實驗數據:

mysql> insert into employee921values(null,'zs',1000,1),(null,'ls',1100,1),(null

,'ww',1100,1),(null,'zl',900,1),(null,'zl',1000,2), (null,'zl',900,2) ,(null,'z

l',1000,2) , (null,'zl',1100,2);

?

編寫sql語句:

?

()select avg(salary)from employee921 group by deptid;

()mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep

tid tid from? employee921 where salary > (selectavg(salary) from employee921 where?deptid = tid);

?? 效率低的一個語句,僅供學習參考使用(在group by之后不能使用where,只能使用having,在group by之前可以使用where,即表示對過濾后的結果分組):

mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep

tid tid from? employee921 where salary > (selectavg(salary) from employee921 group by deptid having deptid = tid);

()select count(*) ,tid

???????? from(

?????????????????? selectemployee921.id,employee921.name,employee921.salary,employee921.deptid tid

?????????????????? from? ???? employee921

?????????????????? wheresalary >

???????? ???????????????? (selectavg(salary) from employee921 where?deptid = tid)

???????? )as t

???????? groupby tid ;

?

另外一種方式:關聯查詢

select a.ename,a.salary,a.deptid

?fromemp a,

???(select deptd,avg(salary) avgsal from emp group by deptid ) b

?where a.deptid=b.deptid anda.salary>b.avgsal;

1、存儲過程與觸發器必須講,經常被面試到?

create procedure insert_Student (_namevarchar(50),_age int ,out _id int)

begin

???????? insertinto student value(null,_name,_age);

???????? selectmax(stuId) into _id from student;

end;

?

call insert_Student('wfz',23,@id);

select @id;

?

mysql> create trigger update_StudentBEFORE update on student FOR EACH ROW

-> select * from student;

觸發器不允許返回結果

?

create trigger update_Student BEFORE updateon student FOR EACH ROW?

insert into?student value(null,'zxx',28);

mysql的觸發器目前不能對當前表進行操作

?

create trigger update_Student BEFORE updateon student FOR EACH ROW?

delete from articles? where id=8;

這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的所有帖子

這里要注意使用OLD.id

?

觸發器用處還是很多的,比如校內網、開心網、Facebook,你發一個日志,自動通知好友,其實就是在增加日志時做一個后觸發,再向通知表中寫入條目。因為觸發器效率高。而UCH沒有用觸發器,效率和數據處理能力都很低。

存儲過程的實驗步驟:

mysql> delimiter |

mysql> create procedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out

?pIdint)

???-> begin

???-> insert into article1 value(null,pTitle,pBid);

???-> select max(id) into pId from article1;

???-> end;

???-> |

Query OK, 0 rows affected (0.05 sec)

?

mysql> call insertArticle_Procedure('傳智播客',1,@pid);

???-> |

Query OK, 0 rows affected (0.00 sec)

?

mysql> delimiter ;

mysql> select @pid;

+------+

| @pid |

+------+

| 3???|

+------+

1 row in set (0.00 sec)

?

mysql> select * from article1;

+----+--------------+------+

| id | title??????? | bid?|

+----+--------------+------+

| 1?| test???????? | 1??? |

| 2?| chuanzhiboke | 1??? |

| 3?| 傳智播客???? | 1???|

+----+--------------+------+

3 rows in set (0.00 sec)

?

觸發器的實驗步驟:

create table board1(id int primary keyauto_increment,name varchar(50),ar

ticleCount int);

?

create table article1(id int primary keyauto_increment,title varchar(50)

,bid int references board1(id));

?

delimiter |

?

create trigger insertArticle_Trigger afterinsert on article1 for each ro

w begin

???-> update board1 set articleCount=articleCount+1 where id= NEW.bid;

???-> end;

???-> |

?

delimiter ;

?

insert into board1 value (null,'test',0);

?

insert into article1 value(null,'test',1);

還有,每插入一個帖子,都希望將版面表中的最后發帖時間,帖子總數字段進行同步更新,用觸發器做效率就很高。下次課設計這樣一個案例,寫觸發器時,對于最后發帖時間可能需要用declare方式聲明一個變量,或者是用NEW.posttime來生成。

?

1、數據庫三范式是什么?

第一范式(1NF):字段具有原子性,不可再分。所有關系型數據庫系統都滿足第一范式)

???????? 數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須作為一個整體,無法區分哪部分是姓,哪部分是名,如果要區分出姓和名,必須設計成兩個獨立的字段。

?

? 第二范式(2NF):

第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。

要求數據庫表中的每個實例或行必須可以被惟一地區分。通常需要為表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵。

?

第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字。

?

?第三范式的要求如下:

滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。

所以第三范式具有如下特征:

????????1,每一列只有一個值

????????2,每一行都能區分。

????????3,每一個表都不包含其他表已經包含的非主關鍵字信息。

例如,帖子表中只能出現發帖人的id,而不能出現發帖人的id,還同時出現發帖人姓名,否則,只要出現同一發帖人id的所有記錄,它們中的姓名部分都必須嚴格保持一致,這就是數據冗余。

?

1、說出一些數據庫優化方面的經驗?

用PreparedStatement 一般來說比Statement性能高:一個sql 發給服務器去執行,涉及步驟:語法檢查、語義分析,編譯,緩存

“inert into uservalues(1,1,1)”-?二進制

“inert into uservalues(2,2,2)”-?二進制

“inert into uservalues(?,?,?)”-?二進制

?

?

?

有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性,那在設計數據庫時就去掉外鍵。(比喻:就好比免檢產品,就是為了提高效率,充分相信產品的制造商)

(對于hibernate來說,就應該有一個變化:empleyee->Deptment對象,現在設計時就成了employee?deptid)

?

看mysql幫助文檔子查詢章節的最后部分,例如,根據掃描的原理,下面的子查詢語句要比第二條關聯查詢的效率高:

1.?select e.name,e.salary where e.managerid=(select id from employee wherename='zxx');

?

2.??select e.name,e.salary,m.name,m.salary from employees e,employees mwhere

?e.managerid = m.id and m.name='zxx';

?

表中允許適當冗余,譬如,主題帖的回復數量和最后回復時間等

將姓名和密碼單獨從用戶表中獨立出來。這可以是非常好的一對一的案例喲!

?

sql語句全部大寫,特別是列名和表名都大寫。特別是sql命令的緩存功能,更加需要統一大小寫,sql語句?發給oracle服務器?語法檢查和編譯成為內部指令?緩存和執行指令。根據緩存的特點,不要拼湊條件,而是用?和PreparedStatment

?

還有索引對查詢性能的改進也是值得關注的。

?

備注:下面是關于性能的討論舉例

?

4航班 3個城市

?

m*n

?

select * from flight,city whereflight.startcityid=city.cityid and city.name='beijing';

?

m + n

?

?

select * from flight where startcityid =(select cityid from city where cityname='beijing');

?

selectflight.id,'beijing',flight.flightTime from flight where startcityid = (selectcityid from city where cityname='beijing')

2、union和union all有什么不同?

假設我們有一個表Student,包括以下字段與數據:

drop table student;

create table student

(

id int primary key,

name nvarchar2(50) not null,

score number not null

);

insert into student values(1,'Aaron',78);

insert into student values(2,'Bill',76);

insert into student values(3,'Cindy',89);

insert into student values(4,'Damon',90);

insert into student values(5,'Ella',73);

insert into student values(6,'Frado',61);

insert into student values(7,'Gill',99);

insert into student values(8,'Hellen',56);

insert into student values(9,'Ivan',93);

insert into student values(10,'Jay',90);

commit;

Union和Union All的區別。

select *

from student

where id < 4

union

select *

from student

where id > 2 and id < 6

結果將是

1???Aaron??? 78

2???Bill??? 76

3???Cindy??? 89

4???Damon??? 90

5???Ella??? 73

如果換成Union All連接兩個結果集,則返回結果是:

1???Aaron??? 78

2???Bill??? 76

3???Cindy??? 89

3???Cindy??? 89

4???Damon??? 90

5???Ella??? 73

可以看到,Union和Union All的區別之一在于對重復結果的處理。

?

  UNION在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。實際大部分應用中是不會產生重復的記錄,最常見的是過程表與歷史表UNION。如:

select * from gc_dfys

union

select * from ls_jg_dfys

  這個SQL在運行時先取出兩個表的結果,再用排序空間進行排序刪除重復的記錄,最后返回結果集,如果表數據量大的話可能會導致用磁盤進行排序。

 而UNION ALL只是簡單的將兩個結果合并后就返回。這樣,如果返回的兩個結果集中有重復的數據,那么返回的結果集就會包含重復的數據了。

 從效率上說,UNION ALL 要比UNION快很多,所以,如果可以確認合并的兩個結果集中不包含重復的數據的話,那么就使用UNION ALL,

3.分頁語句

取出sql表中第31到40的記錄(以自動增長ID為主鍵)

sql server方案1:

???????? selecttop 10 * from t where id not in (select top 30 id from t order by id ) orde byid

sql server方案2:

???????? selecttop 10 * from t where id in (select top 40 id from t order by id) order by iddesc

?

mysql方案:select * from t order by id limit 30,10

?

oracle方案:select * from (select rownum r,* from t where r<=40) wherer>30

?

--------------------待整理進去的內容-------------------------------------

pageSize=20;

pageNo = 5;

?

1.分頁技術1(直接利用sql語句進行分頁,效率最高和最推薦的)

?

mysql:sql = "select * from articleslimit " + (pageNo-1)*pageSize + "," + pageSize;

oracle: sql = "select * from " +

?????????????????????????????????????????????????????????????????????????? "(selectrownum r,* from " +

??????????????????????????????????????????????????????????????????????????????????? "(select* from articles order by postime desc)" +

?????????????????????????????????????????????????????????????????????????? "whererownum<= " + pageNo*pageSize +") tmp " +

???????????????????????????????????????????????????????????????? "wherer>" + (pageNo-1)*pageSize;

注釋:第7行保證rownum的順序是確定的,因為oracle的索引會造成rownum返回不同的值

簡洋提示:沒有order by時,rownum按順序輸出,一旦有了order by,rownum不按順序輸出了,這說明rownum是排序前的編號。如果對order by從句中的字段建立了索引,那么,rownum也是按順序輸出的,因為這時候生成原始的查詢結果集時會參照索引表的順序來構建。

?

sqlserver:sql = "select top 10 * fromid not id(select top " + (pageNo-1)*pageSize + "id fromarticles)"

?

DataSource ds = newInitialContext().lookup(jndiurl);

Connection cn = ds.getConnection();

//"select * from user whereid=?"? --->binary directive

PreparedStatement pstmt =cn.prepareSatement(sql);

ResultSet rs = pstmt.executeQuery()

while(rs.next())

{

???????? out.println(rs.getString(1));

}

?

2.不可滾動的游標

pageSize=20;

pageNo = 5;

cn = null

stmt = null;

rs = null;

try

{

sqlserver:sql = "select? * from articles";

?

DataSource ds = newInitialContext().lookup(jndiurl);

Connection cn = ds.getConnection();

//"select * from user whereid=?"? --->binary directive

PreparedStatement pstmt =cn.prepareSatement(sql);

ResultSet rs = pstmt.executeQuery()

for(int j=0;j<(pageNo-1)*pageSize;j++)

{

???????? rs.next();

}

?

int i=0;

?

while(rs.next() && i<10)

{

???????? i++;

???????? out.println(rs.getString(1));

}

}

cacth(){}

finnaly

{

???????? if(rs!=null)try{rs.close();}catch(Exceptione){}

???????? if(stm.........

???????? if(cn............

}

?

3.可滾動的游標

pageSize=20;

pageNo = 5;

cn = null

stmt = null;

rs = null;

try

{

sqlserver:sql = "select? * from articles";

?

DataSource ds = newInitialContext().lookup(jndiurl);

Connection cn = ds.getConnection();

//"select * from user whereid=?"? --->binary directive

PreparedStatement pstmt =cn.prepareSatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,...);

//根據上面這行代碼的異常SQLFeatureNotSupportedException,就可判斷驅動是否支持可滾動游標

?

ResultSet rs = pstmt.executeQuery()

rs.absolute((pageNo-1)*pageSize)

int i=0;

while(rs.next() && i<10)

{

???????? i++;

???????? out.println(rs.getString(1));

}

}

cacth(){}

finnaly

{

???????? if(rs!=null)try{rs.close();}catch(Exceptione){}

???????? if(stm.........

???????? if(cn............

}

3.用一條SQL語句 查詢出每門課都大于80分的學生姓名?

name??kecheng?? fenshu

張三???? 語文?????? 81

張三???? 數學?????? 75

李四?? ??語文?????? 76

李四???? 數學?????? 90

王五???? 語文?????? 81

王五???? 數學?????? 100

王五???? 英語?????? 90

?

準備數據的sql代碼:

create table score(id int primary keyauto_increment,name varchar(20),subject varchar(20),score int);

insert into score values

(null,'張三','語文',81),

(null,'張三','數學',75),

(null,'李四','語文',76),

(null,'李四','數學',90),

(null,'王五','語文',81),

(null,'王五','數學',100),

(null,'王五 ','英語',90);

?

提示:當百思不得其解時,請理想思維,把小變成大做,把大變成小做,

?

答案:

A: select distinct name from score? where?name not in (select distinct name from score where score<=80)

?

B:select distince name t1 from score where80< all (select score from score where name=t1);

?

4.所有部門之間的比賽組合

一個叫department的表,里面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,現在四個球對進行比賽,用一條sql語句顯示所有可能的比賽組合.

?

答:select a.name, b.name

from team a, team b

where a.name < b.name

?

4.每個月份的發生額都比101科目多的科目

請用SQL語句實現:從TestDB數據表中查詢出所有月份的發生額都比101科目相應月份的發生額高的科目。請注意:TestDB中有很多科目,都有1-12月份的發生額。

AccID:科目代碼,Occmonth:發生額月份,DebitOccur:發生額。

數據庫名:JcyAudit,數據集:Select * from TestDB

準備數據的sql代碼:

drop table if exists TestDB;

create table TestDB(id int primary keyauto_increment,AccID varchar(20), Occmonth date, DebitOccur bigint);

insert into TestDB values

(null,'101','1988-1-1',100),

(null,'101','1988-2-1',110),

(null,'101','1988-3-1',120),

(null,'101','1988-4-1',100),

(null,'101','1988-5-1',100),

(null,'101','1988-6-1',100),

(null,'101','1988-7-1',100),

(null,'101','1988-8-1',100);

--復制上面的數據,故意把第一個月份的發生額數字改小一點

insert into TestDB values

(null,'102','1988-1-1',90),

(null,'102','1988-2-1',110),

(null,'102','1988-3-1',120),

(null,'102','1988-4-1',100),

(null,'102','1988-5-1',100),

(null,'102','1988-6-1',100),

(null,'102','1988-7-1',100),

(null,'102','1988-8-1',100);

--復制最上面的數據,故意把所有發生額數字改大一點

insert into TestDB values

(null,'103','1988-1-1',150),

(null,'103','1988-2-1',160),

(null,'103','1988-3-1',180),

(null,'103','1988-4-1',120),

(null,'103','1988-5-1',120),

(null,'103','1988-6-1',120),

(null,'103','1988-7-1',120),

(null,'103','1988-8-1',120);

--復制最上面的數據,故意把所有發生額數字改大一點

insert into TestDB values

(null,'104','1988-1-1',130),

(null,'104','1988-2-1',130),

(null,'104','1988-3-1',140),

(null,'104','1988-4-1',150),

(null,'104','1988-5-1',160),

(null,'104','1988-6-1',170),

(null,'104','1988-7-1',180),

(null,'104','1988-8-1',140);

--復制最上面的數據,故意把第二個月份的發生額數字改小一點

insert into TestDB values

(null,'105','1988-1-1',100),

(null,'105','1988-2-1',80),

(null,'105','1988-3-1',120),

(null,'105','1988-4-1',100),

(null,'105','1988-5-1',100),

(null,'105','1988-6-1',100),

(null,'105','1988-7-1',100),

(null,'105','1988-8-1',100);

答案:

select distinct AccID from TestDB

where AccID not in

???????? (selectTestDB.AccIDfrom TestDB,

?????????????????? ?(select * from TestDB where AccID='101') asdb101

???????? whereTestDB.Occmonth=db101.Occmonth and TestDB.DebitOccur<=db101.DebitOccur

???????? );

?

4.統計每年每月的信息

year?month amount

1991??1???? 1.1

1991??2???? 1.2

1991??3???? 1.3

1991??4???? 1.4

1992??1???? 2.1

1992??2???? 2.2

1992??3???? 2.3

1992??4?? ??2.4

查成這樣一個結果

year m1?m2? m3? m4

1991 1.1 1.2 1.3 1.4

1992 2.1 2.2 2.3 2.4

?

提示:這個與工資條非常類似,與學生的科目成績也很相似。

?

準備sql語句:

drop table if exists sales;

create table sales(id int auto_incrementprimary key,year varchar(10), month varchar(10), amount float(2,1));

insert into sales values

(null,'1991','1',1.1),

(null,'1991','2',1.2),

(null,'1991','3',1.3),

(null,'1991','4',1.4),

(null,'1992','1',2.1),

(null,'1992','2',2.2),

(null,'1992','3',2.3),

(null,'1992','4',2.4);

?

答案一、

select sales.year ,

(select t.amount from sales t wheret.month='1' and t.year= sales.year) '1',

(select t.amount from sales t wheret.month='1' and t.year= sales.year) '2',

(select t.amount from sales t wheret.month='1' and t.year= sales.year) '3',

(select t.amount from sales t wheret.month='1' and t.year= sales.year) as '4'

from sales?group by year;

?

5.顯示文章標題,發帖人、最后回復時間

表:id,title,postuser,postdate,parentid

準備sql語句:

drop table if exists articles;

create table articles(id int auto_incrementprimary key,title varchar(50), postuser varchar(10), postdate datetime,parentidint references articles(id));

insert into articles values

(null,'第一條','張三','1998-10-1012:32:32',null),

(null,'第二條','張三','1998-10-1012:34:32',null),

(null,'第一條回復1','李四','1998-10-1012:35:32',1),

(null,'第二條回復1','李四','1998-10-1012:36:32',2),

(null,'第一條回復2','王五','1998-10-1012:37:32',1),

(null,'第一條回復3','李四','1998-10-1012:38:32',1),

(null,'第二條回復2','李四','1998-10-1012:39:32',2),

(null,'第一條回復4','王五','1998-10-1012:39:40',1);

?

答案:

select a.title,a.postuser,

???????? (selectmax(postdate) from articles where parentid=a.id) reply

from articles a where a.parentid is null;

?

注釋:子查詢可以用在選擇列中,也可用于where的比較條件中,還可以用于from從句中。

3.刪除除了id號不同,其他都相同的學生冗余信息

2.學生表 如下:

id號?? 學號?? 姓名課程編號 課程名稱 分數

1???????2005001? 張三? 0001????? 數學??? 69

2???????2005002? 李四? 0001????? 數學??? 89

3???????2005001? 張三? 0001????? 數學??? 69

A: delete from tablename where id號 not in(select min(id號) fromtablename group by 學號,姓名,課程編號,課程名稱,分數)

實驗:

create table student2(id int auto_incrementprimary key,code varchar(20),name varchar(20));

insert into student2values(null,'2005001','張三'),(null,'2005002','李四'),(null,'2005001','張三');

?

//如下語句,mysql報告錯誤,可能刪除依賴后面統計語句,而刪除又導致統計語句結果不一致。

?

delete from student2 where id not in(selectmin(id) from student2 group by name);

//但是,如下語句沒有問題:

select *?from student2 where id not in(select min(id) from student2 group by name);

//于是,我想先把分組的結果做成虛表,然后從虛表中選出結果,最后再將結果作為刪除的條件數據。

delete from student2 where id not in(selectmid from (select min(id) mid

from student2 group by name) as t);

或者:

delete from student2 where id not in(selectmin(id) from (select * from s

tudent2) as t group by t.name);

4.航空網的幾個航班查詢題:

表結構如下:

flight{flightID,StartCityID,endCityID,StartTime}

city{cityID, CityName)

實驗環境:

create table city(cityID int auto_incrementprimary key,cityName varchar(20));

create table flight (flightID intauto_increment primary key,

???????? StartCityIDint references city(cityID),

???????? endCityID? int references city(cityID),

???????? StartTimetimestamp);

//航班本來應該沒有日期部分才好,但是下面的題目當中涉及到了日期

insert into city values(null,'北京'),(null,'上海'),(null,'廣州');

insert into flight values

???????? (null,1,2,'9:37:23'),(null,1,3,'9:37:23'),(null,1,2,'10:37:23'),(null,2,3,'10:37:23');

?

?

1、查詢起飛城市是北京的所有航班,按到達城市的名字排序

?

?

參與運算的列是我起碼能夠顯示出來的那些列,但最終我不一定把它們顯示出來。各個表組合出來的中間結果字段中必須包含所有運算的字段。

?

?select? * from flight f,city c

???????? wheref.endcityid = c.cityid and startcityid =

???????? (selectc1.cityid from city c1 where c1.cityname = "北京")

???????? orderby c.cityname asc;

?

mysql> select flight.flightid,'北京' startcity, e.cityname from flight,city e wh

ere flight.endcityid=e.cityid andflight.startcityid=(select cityid from city wh

ere cityname='北京');

?

mysql> selectflight.flightid,s.cityname,e.cityname from flight,city s,city e wh

ere flight.startcityid=s.cityid ands.cityname='北京' andflight.endCityId=e.cit

yID order by e.cityName desc;

?

?

2、查詢北京到上海的所有航班紀錄(起飛城市,到達城市,起飛時間,航班號)

select c1.CityName,c2.CityName,f.StartTime,f.flightID

from city c1,city c2,flight f

where f.StartCityID=c1.cityID

and f.endCityID=c2.cityID

and c1.cityName='北京'

and c2.cityName='上海'

3、查詢具體某一天(2005-5-8)的北京到上海的的航班次數

select count(*) from

(select c1.CityName,c2.CityName,f.StartTime,f.flightID

from city c1,city c2,flight f

where f.StartCityID=c1.cityID

and f.endCityID=c2.cityID

and c1.cityName='北京'

and c2.cityName='上海'

and 查幫助獲得的某個日期處理函數(startTime) like '2005-5-8%'

?

mysql中提取日期部分進行比較的示例代碼如下:

select * from flight where date_format(starttime,'%Y-%m-%d')='1998-01-02'

5.查出比經理薪水還高的員工信息:

Drop table if not exists employees;

create table employees(id int primary keyauto_increment,name varchar(50)

,salary int,managerid int referencesemployees(id));

insert into employees values (null,'lhm',10000,null), (null,' zxx',15000,1

),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);

?

Wzg大于flx,lhm大于zxx

?

解題思路:

???? 根據sql語句的查詢特點,是逐行進行運算,不可能兩行同時參與運算。

涉及了員工薪水和經理薪水,所有,一行記錄要同時包含兩個薪水,所有想到要把這個表自關聯組合一下。

???? 首先要組合出一個包含有各個員工及該員工的經理信息的長記錄,譬如,左半部分是員工,右半部分是經理。而迪卡爾積會組合出很多垃圾信息,先去除這些垃圾信息。

?

select e.* from employees e,employees mwhere e.managerid=m.id and e.sala

ry>m.salary;

6、求出小于45歲的各個老師所帶的大于12歲的學生人數

數據庫中有3個表 teacher 表,student表,tea_stu關系表。

teacher 表 teaID name age

student 表 stuID name age

teacher_student表 teaID stuID

要求用一條sql查詢出這樣的結果

1.顯示的字段要有老師name, age 每個老師所帶的學生人數

2 只列出老師age為40以下,學生age為12以上的記錄

預備知識:

?????1.sql語句是對每一條記錄依次處理,條件為真則執行動作(select,insert,delete,update)

??????2.只要是迪卡爾積,就會產生“垃圾”信息,所以,只要迪卡爾積了,我們首先就要想到清除“垃圾”信息

實驗準備:

???????? droptable if exists tea_stu;

???????? droptable if exists teacher;

???????? droptable if exists student;

?????create table teacher(teaID int primary key,name varchar(50),age int);

?????create table student(stuID int primary key,name varchar(50),age int);

?????create table tea_stu(teaID int references teacher(teaID),stuID intreferences student(stuID));

insert into teacher values(1,'zxx',45),(2,'lhm',25) , (3,'wzg',26) , (4,'tg',27);

insert into student values(1,'wy',11),(2,'dh',25) , (3,'ysq',26) , (4,'mxc',27);

insert into tea_stu values(1,1), (1,2),(1,3);

insert into tea_stu values(2,2), (2,3),(2,4);

?insert into tea_stu values(3,3), (3,4), (3,1);

insert into tea_stu values(4,4), (4,1),(4,2) , (4,3);

?

結果:2?3,3?2,4?3

?

解題思路:(真實面試答題時,也要寫出每個分析步驟,如果紙張不夠,就找別人要)

1要會統計分組信息,統計信息放在中間表中:

select teaid,count(*) from tea_stu group byteaid;

?

2接著其實應該是篩除掉小于12歲的學生,然后再進行統計,中間表必須與student關聯才能得到12歲以下學生和把該學生記錄從中間表中剔除,代碼是:

select tea_stu.teaid,count(*) total fromstudent,tea_stu

where student.stuid=tea_stu.stuid andstudent.age>12 group by tea_stu.teaid

?

3.接著把上面的結果做成虛表與teacher進行關聯,并篩除大于45的老師

select teacher.teaid,teacher.name,totalfrom teacher ,(select tea_stu.tea

id,count(*) total from student,tea_stuwhere student.stuid=tea_stu.stuid and stu

dent.age>12 group by tea_stu.teaid) astea_stu2 where teacher.teaid=tea_stu2.tea

id and teacher.age<45;

?

?

7.求出發帖最多的人:

select authorid,count(*) total fromarticles

group by authorid

having total=

(select max(total2) from (select count(*)total2 from articles group by authorid) as t);

?

select t.authorid,max(t.total) from

(selectauthorid,count(*) total from articles )as t

這條語句不行,因為max只有一列,不能與其他列混淆。

?

select authorid,count(*) total fromarticles

group by authorid having total=max(total)也不行。

?

10、一個用戶表中有一個積分字段,假如數據庫中有100多萬個用戶,若要在每年第一天凌晨將積分清零,你將考慮什么,你將想什么辦法解決?

alter table drop column score;

alter table add colunm score int;

可能會很快,但是需要試驗,試驗不能拿真實的環境來操刀,并且要注意,

這樣的操作時無法回滾的,在我的印象中,只有inertupdate delete等DML語句才能回滾,

對于create table,droptable ,alter table等DDL語句是不能回滾。

?

?

解決方案一,update user setscore=0;

解決方案二,假設上面的代碼要執行好長時間,超出我們的容忍范圍,那我就alter table user drop column score;alter table user add column scoreint。

?

下面代碼實現每年的那個凌晨時刻進行清零。

Runnable runnable =

???????? newRunnable(){

?????????????????? publicvoid run(){

??????????????????????????? clearDb();

??????????????????????????? schedule(this,newDate(new Date().getYear()+1,0,0));

??????????????????????????? }????????????????

??????????????????????????? };

?

schedule(runnable,

???????? newDate(new Date().getYear()+1,0,1));

?

10、一個用戶具有多個角色,請查詢出該表中具有該用戶的所有角色的其他用戶。

select count(*) as num,tb.id

from

?tb,

?(select role from tb where id=xxx) as t1

where

?tb.role = t1.role and tb.id != t1.id

group by tb.id

having

???????? num= select count(role) from tb where id=xxx;

8. xxx公司的sql面試

Table EMPLOYEES Structure:

EMPLOYEE_ID????? NUMBER??????? Primary Key,

FIRST_NAME?????? VARCHAR2(25),

LAST_NAME?????? VARCHAR2(25),

Salary number(8,2),

HiredDate DATE,

Departmentid number(2)

Table Departments Structure:

Departmentid number(2)??????? Primary Key,

DepartmentName? VARCHAR2(25).

?

?(2)基于上述EMPLOYEES表寫出查詢:寫出雇用日期在今年的,或者工資在[1000,2000]之間的,或者員工姓名(last_name)以’Obama’打頭的所有員工,列出這些員工的全部個人信息。(4分)

select * from employees

where Year(hiredDate) = Year(date())

???????? or(salary between 1000 and 200)

???????? orleft(last_name,3)='abc';

?

(3) 基于上述EMPLOYEES表寫出查詢:查出部門平均工資大于1800元的部門的所有員工,列出這些員工的全部個人信息。(4分)

mysql> select id,name,salary,deptid didfrom employee1 where (select avg(salary)

?fromemployee1 where deptid = did) > 1800;

?

(4) 基于上述EMPLOYEES表寫出查詢:查出個人工資高于其所在部門平均工資的員工,列出這些員工的全部個人信息及該員工工資高出部門平均工資百分比。(5分)

selectemployee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary

from employee1,

???????? (selectdeptid,avg(salary) avgSalary from employee1 group by deptid) as t

where employee1.deptid = t.deptid andemployee1.salary>t.avgSalary;

?

1、注冊Jdbc驅動程序的三種方式

?

1、用JDBC如何調用存儲過程

代碼如下:

package com.huawei.interview.lym;

?

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Types;

?

public class JdbcTest {

?

???????? /**

???????? ?* @param args

???????? ?*/

???????? publicstatic void main(String[] args) {

?????????????????? //TODO Auto-generated method stub

?????????????????? Connectioncn = null;

?????????????????? CallableStatementcstmt = null;??????????????

?????????????????? try{

??????????????????????????? //這里最好不要這么干,因為驅動名寫死在程序中了

??????????????????????????? Class.forName("com.mysql.jdbc.Driver");

??????????????????????????? //實際項目中,這里應用DataSource數據,如果用框架,

??????????????????????????? //這個數據源不需要我們編碼創建,我們只需Datasource ds = context.lookup()

??????????????????????????? //cn= ds.getConnection();????????????????????????

??????????????????????????? cn=DriverManager.getConnection("jdbc:mysql:///test","root","root");

??????????????????????????? cstmt= cn.prepareCall("{call insert_Student(?,?,?)}");

??????????????????????????? cstmt.registerOutParameter(3,Types.INTEGER);

??????????????????????????? cstmt.setString(1,"wangwu");

??????????????????????????? cstmt.setInt(2,25);

??????????????????????????? cstmt.execute();

??????????????????????????? //get第幾個,不同的數據庫不一樣,建議不寫

??????????????????????????? System.out.println(cstmt.getString(3));

?????????????????? }catch (Exception e) {

??????????????????????????? //TODO Auto-generated catch block

??????????????????????????? e.printStackTrace();

?????????????????? }

?????????????????? finally

?????????????????? {

?

??????????????????????????? /*try{cstmt.close();}catch(Exceptione){}

??????????????????????????? try{cn.close();}catch(Exceptione){}*/

??????????????????????????? try{

???????????????????????????????????? if(cstmt!= null)

?????????????????????????????????????????????? cstmt.close();

???????????????????????????????????? if(cn!= null)?????????????????????????????????

?????????????????????????????????????????????? cn.close();

??????????????????????????? }catch (SQLException e) {

???????????????????????????????????? //TODO Auto-generated catch block

???????????????????????????????????? e.printStackTrace();

??????????????????????????? }

?????????????????? }

???????? }

1、JDBC中的PreparedStatement相比Statement的好處

答:一個sql命令發給服務器去執行的步驟為:語法檢查,語義分析,編譯成內部指令,緩存指令,執行指令等過程。

select * from student where id =3----緩存--?xxxxx二進制命令

select * from student where id =3----直接取-?xxxxx二進制命令

select * from student where id =4--- -?會怎么干?

如果當初是select * fromstudent where id =?--- -?又會怎么干?

?上面說的是性能提高

可以防止sql注入。

1. 寫一個用jdbc連接并訪問oracle數據的程序代碼

2、Class.forName的作用?為什么要用?

答:按參數中指定的字符串形式的類名去搜索并加載相應的類,如果該類字節碼已經被加載過,則返回代表該字節碼的Class實例對象,否則,按類加載器的委托機制去搜索和加載該類,如果所有的類加載器都無法加載到該類,則拋出ClassNotFoundException。加載完這個Class字節碼后,接著就可以使用Class字節碼的newInstance方法去創建該類的實例對象了。

有時候,我們程序中所有使用的具體類名在設計時(即開發時)無法確定,只有程序運行時才能確定,這時候就需要使用Class.forName去動態加載該類,這個類名通常是在配置文件中配置的,例如,spring的ioc中每次依賴注入的具體類就是這樣配置的,jdbc的驅動類名通常也是通過配置文件來配置的,以便在產品交付使用后不用修改源程序就可以更換驅動類名。

3、大數據量下的分頁解決方法。

答:最好的辦法是利用sql語句進行分頁,這樣每次查詢出的結果集中就只包含某頁的數據內容。再sql語句無法實現分頁的情況下,可以考慮對大的結果集通過游標定位方式來獲取某頁的數據。

sql語句分頁,不同的數據庫下的分頁方案各不一樣,下面是主流的三種數據庫的分頁sql:

sql server:

???????? Stringsql =

???????? "selecttop " + pageSize + " * from students where id not in" +

?

?"(select top " + pageSize *(pageNumber-1) + " id from students order by id)" +

?

?"order by id";

?

mysql:

?

???????? Stringsql =

???????? "select* from students order by id limit " + pageSize*(pageNumber-1) +"," + pageSize;

????????

oracle:

?

???????? Stringsql =

???????? ?"select * from " +?

???????? ?(select *,rownum rid from (select * fromstudents order by postime desc) where rid<=" + pagesize*pagenumber +") as t" +

???????? ?"where t>" +pageSize*(pageNumber-1);

4、用 JDBC 查詢學生成績單, 把主要代碼寫出來(考試概率極大).

Connection cn = null;

PreparedStatement pstmt =null;

Resultset rs = null;

try

{

???????? Class.forname(driveClassName);

???????? cn=?DriverManager.getConnection(url,username,password);

???????? pstmt= cn.prepareStatement(“select? score.*from score ,student “ +

?????????????????? “wherescore.stuId = student.id and student.name = ?”);

???????? pstmt.setString(1,studentName);

???????? Resultsetrs = pstmt.executeQuery();

???????? while(rs.next())

???????? {

?????????????????? system.out.println(rs.getInt(“subject”)? +?“??? ” + rs.getFloat(“score”) );

???????? }

}catch(Exception e){e.printStackTrace();}

finally

{

???????? if(rs!= null) try{ rs.close() }catch(exception e){}

???????? if(pstmt!= null) try{pstmt.close()}catch(exception e){}

???????? if(cn!= null) try{ cn.close() }catch(exception e){}

}

?

?

5、這段代碼有什么不足之處?

try {

Connection conn = ...;

Statement stmt = ...;

ResultSet rs =stmt.executeQuery("select * from table1");

while(rs.next()) {

}

} catch(Exception ex) {

}

答:沒有finally語句來關閉各個對象,另外,使用finally之后,要把變量的定義放在try語句塊的外面,以便在try語句塊之外的finally塊中仍可以訪問這些變量。

?

36、說出數據連接池的工作機制是什么?

J2EE服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量有配置參數決定。當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。

實現方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正關連接,而是把它代理的Connection對象還回到連接池中。

?

4、為什么要用 ORM?? 和 JDBC 有何不一樣?

orm是一種思想,就是把object轉變成數據庫中的記錄,或者把數據庫中的記錄轉變成objecdt,我們可以用jdbc來實現這種思想,其實,如果我們的項目是嚴格按照oop方式編寫的話,我們的jdbc程序不管是有意還是無意,就已經在實現orm的工作了。

現在有許多orm工具,它們底層調用jdbc來實現了orm工作,我們直接使用這些工具,就省去了直接使用jdbc的繁瑣細節,提高了開發效率,現在用的較多的orm工具是hibernate。也聽說一些其他orm工具,如toplink,ojb等。

8. XML部分

1、xml有哪些解析技術?區別是什么?

答:有DOM,SAX,STAX等

DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構占用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問SAX:不現于DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問

STAX:Streaming API for XML (StAX)

講解這些區別是不需要特別去比較,就像說傳智播客與其他培訓機構的區別時,我們只需說清楚傳智播客有什么特點和優點就行了,這就已經間接回答了彼此的區別。

?

2、你在項目中用到了xml技術的哪些方面?如何實現的?

答:用到了數據存貯,信息配置兩方面。在做數據交換平臺時,將不能數據源的數據組裝成XML文件,然后將XML文件壓縮打包加密后通過網絡傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數都存貯在XML文件中。

3、用jdom解析xml文件時如何解決中文問題?如何解析?

答:看如下代碼,用編碼方式加以解決

package test;

import java.io.*;

public class DOMTest

{

private String inFile ="c:\\people.xml"

private String outFile ="c:\\people.xml"

public static void main(String args[])

{

new DOMTest();

}

public DOMTest()

{

try

{

javax.xml.parsers.DocumentBuilder builder =

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();

org.w3c.dom.Document doc =builder.newDocument();

org.w3c.dom.Element root = doc.createElement("老師");

org.w3c.dom.Element wang =doc.createElement("王");

org.w3c.dom.Element liu =doc.createElement("劉");

wang.appendChild(doc.createTextNode("我是王老師"));

root.appendChild(wang);

doc.appendChild(root);

javax.xml.transform.Transformer transformer=

javax.xml.transform.TransformerFactory.newInstance().newTransformer();

transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"gb2312");

transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,"yes");

transformer.transform(newjavax.xml.transform.dom.DOMSource(doc),

new

javax.xml.transform.stream.StreamResult(outFile));

}

catch (Exception e)

{

System.out.println (e.getMessage());

}

}

}

4、編程用JAVA解析XML的方式.

答:用SAX方式解析XML,XML文件如下:

<?xml version=1.0 encoding=gb2312?>

<person>

<name>王小明</name>

<college>信息學院</college>

<telephone>6258113</telephone>

<notes>男,1955年生,博士,95年調入海南大學</notes>

</person>

事件回調類SAXHandler.java

import java.io.*;

import java.util.Hashtable;

import org.xml.sax.*;

public class SAXHandler extends HandlerBase

{

private Hashtable table = new Hashtable();

private String currentElement = null;

private String currentValue = null;

public void setTable(Hashtable table)

{

this.table = table;

}

public Hashtable getTable()

{

return table;

}

public void startElement(String tag,AttributeList attrs)

throws SAXException

{

currentElement = tag;

}

public void characters(char[] ch, intstart, int length)

throws SAXException

{

currentValue = new String(ch, start,length);

}

public void endElement(String name) throwsSAXException

{

if (currentElement.equals(name))

table.put(currentElement, currentValue);

}

?

}

JSP內容顯示源碼,SaxXml.jsp:

<HTML>

<HEAD>

<TITLE>剖析XML文件people.xml</TITLE>

</HEAD>

<BODY>

<%@ page errorPage=ErrPage.jsp

contentType=text/html;charset=GB2312 %>

<%@ page import=java.io.* %>

<%@ page import=java.util.Hashtable%>

<%@ page import=org.w3c.dom.* %>

<%@ page import=org.xml.sax.* %>

<%@ pageimport=javax.xml.parsers.SAXParserFactory %>

<%@ page import=javax.xml.parsers.SAXParser%>

<%@ page import=SAXHandler %>

<%

File file = new File(c:\people.xml);

FileReader reader = new FileReader(file);

Parser parser;

SAXParserFactory spf =SAXParserFactory.newInstance();

SAXParser sp = spf.newSAXParser();

SAXHandler handler = new SAXHandler();

sp.parse(new InputSource(reader), handler);

Hashtable hashTable = handler.getTable();

out.println(<TABLEBORDER=2><CAPTION>教師信息表</CAPTION>);

out.println(<TR><TD>姓名</TD> + <TD> +

(String)hashTable.get(new String(name)) +</TD></TR>);

out.println(<TR><TD>學院</TD> + <TD> +

(String)hashTable.get(newString(college))+</TD></TR>);

out.println(<TR><TD>電話</TD> + <TD> +

(String)hashTable.get(newString(telephone)) + </TD></TR>);

out.println(<TR><TD>備注</TD> + <TD> +

(String)hashTable.get(new String(notes)) +</TD></TR>);

out.println(</TABLE>);

%>

</BODY>

</HTML>

70、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方式?

a: 兩種形式 dtd? schema,b: 本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的),c:有DOM,SAX,STAX等

??DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構占用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問

SAX:不現于DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問

??STAX:Streaming API for XML (StAX)

?

9. 流行的框架與新技術

?

1、談談你對Struts的理解。

答:

1. struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的servlet,這個Servlet名為ActionServlet,或是ActionServlet的子類。我們可以在web.xml文件中將符合某種特征的所有請求交給這個Servlet處理,這個Servlet再參照一個配置文件(通常為/WEB-INF/struts-config.xml)將各個請求分別分配給不同的action去處理。

一個擴展知識點:struts的配置文件可以有多個,可以按模塊配置各自的配置文件,這樣可以防止配置文件的過度膨脹;

2. ActionServlet把請求交給action去處理之前,會將請求參數封裝成一個formbean對象(就是一個java類,這個類中的每個屬性對應一個請求參數),封裝成一個什么樣的formbean對象呢?看配置文件。

3.要說明的是, ActionServlet把formbean對象傳遞給action的execute方法之前,可能會調用formbean的validate方法進行校驗,只有校驗通過后才將這個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面,這個錯誤頁面由input屬性指定,(看配置文件)作者為什么將這里命名為input屬性,而不是error屬性,我們后面結合實際的運行效果進行分析。

4.action執行完后要返回顯示的結果視圖,這個結果視圖是用一個ActionForward對象來表示的,actionforward對象通過struts-config.xml配置文件中的配置關聯到某個jsp頁面,因為程序中使用的是在struts-config.xml配置文件為jsp頁面設置的邏輯名,這樣可以實現action程序代碼與返回的jsp頁面名稱的解耦。

?

你對struts可能還有自己的應用方面的經驗,那也要一并說出來。

2、談談你對Hibernate的理解。

答:

1. 面向對象設計的軟件內部運行過程可以理解成就是在不斷創建各種新對象、建立對象之間的關系,調用對象的方法來改變各個對象的狀態和對象消亡的過程,不管程序運行的過程和操作怎么樣,本質上都是要得到一個結果,程序上一個時刻和下一個時刻的運行結果的差異就表現在內存中的對象狀態發生了變化。

2.為了在關機和內存空間不夠的狀況下,保持程序的運行狀態,需要將內存中的對象狀態保存到持久化設備和從持久化設備中恢復出對象的狀態,通常都是保存到關系數據庫來保存大量對象信息。從Java程序的運行功能上來講,保存對象狀態的功能相比系統運行的其他功能來說,應該是一個很不起眼的附屬功能,java采用jdbc來實現這個功能,這個不起眼的功能卻要編寫大量的代碼,而做的事情僅僅是保存對象和恢復對象,并且那些大量的jdbc代碼并沒有什么技術含量,基本上是采用一套例行公事的標準代碼模板來編寫,是一種苦活和重復性的工作。

3.通過數據庫保存java程序運行時產生的對象和恢復對象,其實就是實現了java對象與關系數據庫記錄的映射關系,稱為ORM(即Object RelationMapping),人們可以通過封裝JDBC代碼來實現了這種功能,封裝出來的產品稱之為ORM框架,Hibernate就是其中的一種流行ORM框架。使用Hibernate框架,不用寫JDBC代碼,僅僅是調用一個save方法,就可以將對象保存到關系數據庫中,僅僅是調用一個get方法,就可以從數據庫中加載出一個對象。

4.使用Hibernate的基本流程是:配置Configuration對象、產生SessionFactory、創建session對象,啟動事務,完成CRUD操作,提交事務,關閉session。

5.使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數據庫連接信息和方言等,還要為每個實體配置相應的hbm.xml文件,hibernate.cfg.xml文件中需要登記每個hbm.xml文件。

6.在應用Hibernate時,重點要了解Session的緩存原理,級聯,延遲加載和hql查詢。

3、AOP的作用。

3、你對Spring的理解。

1.Spring實現了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個類名為BeanFactory(實際上是一個接口),在程序中通常BeanFactory的子類ApplicationContext。Spring相當于一個大的工廠類,在其配置文件中通過<bean>元素配置用于創建實例對象的類名和實例對象的屬性。

2. Spring提供了對IOC良好支持,IOC是一種編程思想,是一種架構藝術,利用這種思想可以很好地實現模塊之間的解耦。IOC也稱為DI(Depency Injection),什么叫依賴注入呢?

譬如,Class Programmer

{

???????? Computercomputer = null;

???????? publicvoid code()

???????? {

?????????????????? //Computercomputer = new IBMComputer();

?????????????????? //Computercomputer = beanfacotry.getComputer();

?????????????????? computer.write();

???????? }

???????? publicvoid setComputer(Computer computer)

???????? {

?????????????????? this.computer= computer;

???????? }

}

另外兩種方式都由依賴,第一個直接依賴于目標類,第二個把依賴轉移到工廠上,第三個徹底與目標和工廠解耦了。在spring的配置文件中配置片段如下:

<bean id=”computer”class=”cn.itcast.interview.Computer”>

</bean>

?

<bean id=”programmer”class=”cn.itcast.interview.Programmer”>

???????? <propertyname=”computer”?ref=”computer”></property>

</bean>

3. Spring提供了對AOP技術的良好封裝, AOP稱為面向切面編程,就是系統中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統功能的代碼,例如,加入日志,加入權限判斷,加入異常處理,這種應用稱為AOP。實現AOP功能采用的是代理技術,客戶端程序不再調用目標,而調用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現相同的方法聲明,一是實現相同的接口,二是作為目標的子類在,JDK中采用Proxy類產生動態代理的方式為某個接口生成實現類,如果要為某個類生成子類,則可以用CGLI B。在生成的代理類的方法中加入系統功能和調用目標類的相應方法,系統功能的代理以Advice對象進行提供,顯然要創建出代理對象,至少需要目標類和Advice類。spring提供了這種支持,只需要在spring配置文件中配置這兩個元素即可實現代理和aop功能,例如,

<bean id=”proxy”type=”org.spring.framework.aop.ProxyBeanFactory”>

???????? <propertyname=”target” ref=””></property>

???????? <propertyname=”advisor” ref=””></property>

?

</bean>

?

11、談談Struts中的Action servlet。

?

12、Struts優缺點

優點:

?1. 實現MVC模式,結構清晰,使開發者只關注業務邏輯的實現.

2.有豐富的tag可以用 ,Struts的標記庫(Taglib),如能靈活動用,則能大大提高開發效率

3. 頁面導航

???????? 使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。

4. 提供Exception處理機制 .

5. 數據庫鏈接池管理

6. 支持I18N

缺點

一、???????? 轉到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十次struts,而且還不包括有時候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整個項目,而tomcate這樣的服務器,還必須重新啟動服務器

二、???????? 二、 Struts 的Action必需是thread-safe方式,它僅僅允許一個實例去處理所有的請求。所以action用到的所有的資源都必需統一同步,這個就引起了線程安全的問題。

三、???????? 測試不方便. Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實現。不過有一個Junit的擴展工具Struts TestCase可以實現它的單元測試。

四、???????? 類型的轉換. Struts的FormBean把所有的數據都作為String類型,它可以使用工具Commons-Beanutils進行類型轉化。但它的轉化都是在Class級別,而且轉化的類型是不可配置的。類型轉化時的錯誤信息返回給用戶也是非常困難的。

五、???????? 對Servlet的依賴性過強. Struts處理Action時必需要依賴ServletRequest 和ServletResponse,所有它擺脫不了Servlet容器。

六、???????? 前端表達式語言方面.Struts集成了JSTL,所以它主要使用JSTL的表達式語言來獲取數據。可是JSTL的表達式語言在Collection和索引屬性方面處理顯得很弱。

七、???????? 對Action執行的控制困難. Struts創建一個Action,如果想控制它的執行順序將會非常困難。甚至你要重新去寫Servlet來實現你的這個功能需求。

八、???????? 對Action 執行前和后的處理. Struts處理Action的時候是基于class的hierarchies,很難在action處理前和后進行操作。

九、???????? 對事件支持不夠. 在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能 對應一個事件,struts這種事件方式稱為applicationevent,application event和component event相比是一種粗粒度的事件

?

?

119、STRUTS的應用(如STRUTS架構)

Struts是采用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。采用Struts能開發出基于MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能: 一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。 二.JSP自由tag庫,并且在controller servlet中提供關聯支持,幫助開發員創建交互式表單應用。 三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。

?

110、說說struts1與struts2的區別。

1.都是MVC的WEB框架,

2 struts1的老牌框架,應用很廣泛,有很好的群眾基礎,使用它開發風險很小,成本更低!struts2雖然基于這個框架,但是應用群眾并多,相對不成熟,未知的風險和變化很多,開發人員相對不好招,使用它開發項目的風險系數更大,用人成本更高!

3.struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2得到了解決。

4.struts1的前端控制器是一個Servlet,名稱為ActionServlet,struts2的前端控制器是一個filter,在struts2.0中叫FilterDispatcher,在struts2.1中叫StrutsPrepareAndExecuteFilter。

5.struts1的action需要繼承Action類,struts2的action可以不繼承任何類;struts1對同一個路徑的所有請求共享一個Action實例,struts2對同一個路徑的每個請求分別使用一個獨立Action實例對象,所有對于struts2的Action不用考慮線程安全問題。

6.在struts1中使用formbean封裝請求參數,在struts2中直接使用action的屬性來封裝請求參數。

7.struts1中的多個業務方法放在一個Action中時(即繼承DispatchAction時),要么都校驗,要么都不校驗;對于struts2,可以指定只對某個方法進行校驗,當一個Action繼承了ActionSupport且在這個類中只編寫了validateXxx()方法,那么則只對Xxx()方法進行校驗。

?

(一個請求來了的執行流程進行分析,struts2是自動支持分模塊開發,并可以不同模塊設置不同的url前綴,這是通過package的namespace來實現的;struts2是支持多種類型的視圖;struts2的視圖地址可以是動態的,即視圖的名稱是支持變量方式的,舉例,論壇發帖失敗后回來還要傳遞boardid。視圖內容顯示方面:它的標簽用ognl,要el強大很多,在國際化方面支持分模塊管理,兩個模塊用到同樣的key,對應不同的消息;)

?

??????????????????

與Struts1不同,Struts2對用戶的每一次請求都會創建一個Action,所以Struts2中的Action是線程安全的。

?

給我印象最深刻的是:struts配置文件中的redirect視圖的url不能接受參數,而struts2配置文件中的redirect視圖可以接受參數。

?

?

110、hibernate中的update()和saveOrUpdate()的區別,session的load()和get()的區別。

110、簡述 Hibernate 和 JDBC 的優缺點? 如何書寫一個 one to many 配置文件.

7、iBatis與Hibernate有什么不同?

相同點:屏蔽jdbc api的底層訪問細節,使用我們不用與jdbc api打交道,就可以訪問數據。

jdbc api編程流程固定,還將sql語句與java代碼混雜在了一起,經常需要拼湊sql語句,細節很繁瑣。

ibatis的好處:屏蔽jdbc api的底層訪問細節;將sql語句與java代碼進行分離;提供了將結果集自動封裝稱為實體對象和對象的集合的功能,queryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳遞給sql語句的參數。

?

Hibernate是一個全自動的orm映射工具,它可以自動生成sql語句,ibatis需要我們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大很多。因為hibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定的高效率的sql。對于一些不太復雜的sql查詢,hibernate可以很好幫我們完成,但是,對于特別復雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯的選擇,因為ibatis還是由我們自己寫sql語句。

?

?

7、寫Hibernate的一對多和多對一雙向關聯的orm配置?

9、hibernate的inverse屬性的作用?

解決方案一,按照Object[]數據取出數據,然后自己組bean

解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2

field2) ,然后在hql里面就可以直接生成這個bean了。

?

10、在DAO中如何體現DAO設計模式?

解決方案一,按照Object[]數據取出數據,然后自己組bean

解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2

field2) ,然后在hql里面就可以直接生成這個bean了。

?

10、spring+Hibernate中委托方案怎么配置?

解決方案一,按照Object[]數據取出數據,然后自己組bean

解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2

field2) ,然后在hql里面就可以直接生成這個bean了。

?

10、spring+Hibernate中委托方案怎么配置?

解決方案一,按照Object[]數據取出數據,然后自己組bean

解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2

field2) ,然后在hql里面就可以直接生成這個bean了。

?

8. hibernate進行多表查詢每個表中各取幾個字段,也就是說查詢出來的結果集沒有一個實體類與之對應如何解決;

?

解決方案一,按照Object[]數據取出數據,然后自己組bean

解決方案二,對每個表的bean寫構造函數,比如表一要查出field1,field2兩個字段,那么有一個構造函數就是Bean(type1filed1,type2

field2) ,然后在hql里面就可以直接生成這個bean了。

8.介紹一下Hibernate的二級緩存

按照以下思路來回答:(1)首先說清楚什么是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,為什么還要有二級緩存,(3)最后再說如何配置Hibernate的二級緩存。

(1)緩存就是把以前從數據庫中查詢出來和使用過的對象保存在內存中(一個數據結構中),這個數據結構通常是或類似Hashmap,當以后要使用某個對象時,先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數據庫,并將查詢出來的對象保存在緩存中,以便下次使用。下面是緩存的偽代碼:

引出hibernate的第二級緩存,用下面的偽代碼分析了Cache的實現原理

Dao

{

???????? hashmapmap = new map();

???????? UsergetUser(integer id)

???????? {

?????????????????? Useruser = map.get(id)

?????????????????? if(user== null)

?????????????????? {

??????????????????????????? user= session.get(id);

??????????????????????????? map.put(id,user);

?????????????????? }

?????????????????? returnuser;

???????? }

}

?

Dao

{

???????? Cachecache = null

???????? setCache(Cachecache)

???????? {

?????????????????? this.cache= cache

???????? }

????????

???????? UsergetUser(int id)

???????? {

?????????????????? if(cache!=null)

?????????????????? {

??????????????????????????? Useruser = cache.get(id);

??????????????????????????? if(user==null)

??????????????????????????? {

???????????????????????????????????? user= session.get(id);

???????????????????????????????????? cache.put(id,user);

??????????????????????????? }

??????????????????????????? returnuser;

?????????????????? }

??????????????????

?????????????????? returnsession.get(id);

???????? }

}

(2)Hibernate的Session就是一種緩存,我們通常將之稱為Hibernate的一級緩存,當想使用session從數據庫中查詢出一個對象時,Session也是先從自己內部查看是否存在這個對象,存在則直接返回,不存在才去訪問數據庫,并將查詢的結果保存在自己內部。由于Session代表一次會話過程,一個Session與一個數據庫連接相關連,所以Session最好不要長時間保持打開,通常僅用于一個事務當中,在事務結束時就應關閉。并且Session是線程不安全的,被多個線程共享時容易出現問題。通常只有那種全局意義上的緩存才是真正的緩存應用,才有較大的緩存價值,因此,Hibernate的Session這一級緩存的緩存作用并不明顯,應用價值不大。Hibernate的二級緩存就是要為Hibernate配置一種全局緩存,讓多個線程和多個事務都可以共享這個緩存。我們希望的是一個人使用過,其他人也可以使用,session沒有這種效果。

(3)二級緩存是獨立于Hibernate的軟件部件,屬于第三方的產品,多個廠商和組織都提供有緩存產品,例如,EHCache和OSCache等等。在Hibernate中使用二級緩存,首先就要在hibernate.cfg.xml配置文件中配置使用哪個廠家的緩存產品,接著需要配置該緩存產品自己的配置文件,最后要配置Hibernate中的哪些實體對象要納入到二級緩存的管理中。明白了二級緩存原理和有了這個思路后,很容易配置起Hibernate的二級緩存。擴展知識:一個SessionFactory可以關聯一個二級緩存,也即一個二級緩存只能負責緩存一個數據庫中的數據,當使用Hibernate 的二級緩存后,注意不要有其他的應用或SessionFactory來更改當前數據庫中的數據,這樣緩存的數據就會與數據庫中的實際數據不一致。

?

111、Spring 的依賴注入是什么意思? 給一個 Bean 的 message 屬性, 字符串類型, 注入值為 "Hello" 的 XML 配置文件該怎么寫?

?

120、Jdo是什么?

JDO是Java對象持久化的新的規范,為java dataobject的簡稱,也是一個用于存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲,因此對開發人員來說,存儲數據對象完全不需要額外的代碼(如JDBC API的使用)。這些繁瑣的例行工作已經轉移到JDO產品提供商身上,使開發人員解脫出來,從而集中時間和精力在業務邏輯上。另外,JDO很靈活,因為它可以在任何數據底層上運行。JDBC只是面向關系數據庫(RDBMS)JDO更通用,提供到任何數據底層的存儲功能,比如關系數據庫、文件、XML以及對象數據庫(ODBMS)等等,使得應用可移植性更強。

?

什么是spring的IOC? AOP

STRUTS的工作流程!

spring 與EJB的區別!!

Hibernate工作原理及為什么要用?

原理:

1.讀取并解析配置文件

2.讀取并解析映射信息,創建SessionFactory

3.打開Sesssion

4.創建事務Transation

5.持久化操作

6.提交事務

7.關閉Session

8.關閉SesstionFactory

?

為什么要用:

1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。

?

2. Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作

?

3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。

?

4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。

?

2. Hibernate是如何延遲加載?

1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)

?

2. Hibernate3 提供了屬性的延遲加載功能

?

當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。

?

3.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)

?

類與類之間的關系主要體現在表與表之間的關系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、

?

4. 說下Hibernate的緩存機制

?

1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存

?

2. 二級緩存:

a) 應用及緩存

b) 分布式緩存

條件:數據不會被第三方修改、數據大小在可接受范圍、數據更新頻率低、同一數據被系統頻繁使用、非關鍵數據

c) 第三方緩存的實現

?

5. Hibernate的查詢方式

Sql、Criteria,object comptosition

Hql:

1、 屬性查詢

2、 參數查詢、命名參數查詢

3、 關聯查詢

4、 分頁查詢

5、 統計函數

?

6. 如何優化Hibernate?

1.使用雙向一對多關聯,不使用單向一對多

2.靈活使用單向一對多關聯

3.不用一對一,用多對一取代

4.配置對象緩存,不使用集合緩存

5.一對多集合使用Bag,多對多集合使用Set

6. 繼承類使用顯式多態

7. 表字段要少,表關聯不要怕多,有二級緩存撐腰

?

?

7. Struts工作機制?為什么要使用Struts?

工作機制:

Struts的工作流程:

在web應用啟動時就會加載初始化ActionServlet,ActionServlet從

struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象

當ActionServlet接收到一個客戶請求時,將執行如下流程.

-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;

-(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;

-(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;

-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;

-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的 Action實例不存在,就先創建這個實例,然后調用Action的execute()方法;

-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給ActionForward對象指向的JSP組件;

-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;

?

為什么要用:

JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。

?

基于Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件

?

8. Struts的validate框架是如何驗證的?

在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。

?

9. 說下Struts的設計模式

MVC 模式: web應用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,并被填入表單相應的數 據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的 Validate()驗證后選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然后調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對 象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動 態的網頁,返回給客戶。

?

10. spring工作機制及為什么要用?

1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。

2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理后,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

6.視圖對象負責渲染返回給客戶端。

?

為什么用:

{AOP 讓開發人員可以創建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用 AOP 后,公共服務 (比如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。

IOC 允許創建一個可以構造對象的應用環境,然后向這些對象傳遞它們的協作對象。正如單詞倒置 所表明的,IOC 就像反過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。

Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然后可以很容易地在需要時替換具有類似接口的協作對象。}

?

?

?

?

Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖 1 所示。

?

組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:

?

☆ 核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要組件是BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉(IOC)模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。

?

☆ Spring 上下文:Spring 上下文是一個配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。

?

☆ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。

?

☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。

?

☆ Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。

?

☆ Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。

?

☆ Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。

?

Spring 框架的功能可以用在任何 J2EE 服務器中,大多數功能也適用于不受管理的環境。Spring的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。

?

IOC 和 AOP

?

控制反轉模式(也稱作依賴性介入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器(在 Spring 框架中是 IOC 容器)負責將這些聯系在一起。

?

在典型的 IOC 場景中,容器創建了所有對象,并設置必要的屬性將它們連接在一起,決定什么時間調用方法。下表列出了 IOC 的一個實現模式。

?

?

?

?

Spring 框架的 IOC 容器采用類型 2 和類型3 實現。

?

?

面向方面的編程

?

面向方面的編程,即 AOP,是一種編程技術,它允許程序員對橫切關注點或橫切典型的職責分界線的行為(例如日志和事務管理)進行模塊化。AOP 的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模塊中。

?

AOP 和 IOC 是補充性的技術,它們都運用模塊化方式解決企業應用程序開發中的復雜問題。在典型的面向對象開發方式中,可能要將日志記錄語句放在所有方法和 Java 類中才能實現日志功能。在 AOP 方式中,可以反過來將日志服務模塊化,并以聲明的方式將它們應用到需要日志的組件上。當然,優勢就是 Java 類不需要知道日志服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程序代碼是松散耦合的。

?

AOP 的功能完全集成到了 Spring 事務管理、日志和其他各種特性的上下文中。

?

IOC 容器

?

Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與 JavaBean 組件一起使用。這個包通常不是由用戶直接使用,而是由服務器將其用作其他多數功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設計模式的實現,允許通過名稱創建和檢索對象。BeanFactory 也可以管理對象之間的關系。

?

BeanFactory 支持兩個對象模型。

?

□ 單態 模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton 是默認的也是最常用的對象模型。對于無狀態服務對象很理想。

?

□ 原型 模型確保每次檢索都會創建單獨的對象。在每個用戶都需要自己的對象時,原型模型最適合。

?

bean 工廠的概念是 Spring 作為 IOC 容器的基礎。IOC 將處理事情的責任從應用程序代碼轉移到框架。正如我將在下一個示例中演示的那樣,Spring 框架使用 JavaBean 屬性和配置數據來指出必須設置的依賴關系。

?

BeanFactory 接口

?

因為org.springframework.beans.factory.BeanFactory 是一個簡單接口,所以可以針對各種底層存儲方法實現。最常用的 BeanFactory 定義是XmlBeanFactory,它根據 XML 文件中的定義裝入 bean,如清單 1 所示。

?

清單 1. XmlBeanFactory

?

BeanFactory factory = new XMLBeanFactory(newFileInputSteam("mybean.xml"));

?

在 XML 文件中定義的 Bean 是被消極加載的,這意味在需要 bean 之前,bean 本身不會被初始化。要從 BeanFactory 檢索 bean,只需調用 getBean() 方法,傳入將要檢索的 bean 的名稱即可,如清單 2 所示。

?

清單 2. getBean()

?

MyBean mybean = (MyBean)factory.getBean("mybean");

?

每個 bean 的定義都可以是 POJO (用類名和 JavaBean 初始化屬性定義)或 FactoryBean。FactoryBean 接口為使用 Spring 框架構建的應用程序添加了一個間接的級別。

?

IOC 示例

?

理解控制反轉最簡單的方式就是看它的實際應用。在對由三部分組成的 Spring 系列 的第 1 部分進行總結時,我使用了一個示例,演示了如何通過Spring IOC 容器注入應用程序的依賴關系(而不是將它們構建進來)。

?

我用開啟在線信用帳戶的用例作為起點。對于該實現,開啟信用帳戶要求用戶與以下服務進行交互:

?

☆ 信用級別評定服務,查詢用戶的信用歷史信息。

?

☆ 遠程信息鏈接服務,插入客戶信息,將客戶信息與信用卡和銀行信息連接起來,以進行自動借記(如果需要的話)。

?

☆ 電子郵件服務,向用戶發送有關信用卡狀態的電子郵件。

?

三個接口

?

對于這個示例,我假設服務已經存在,理想的情況是用松散耦合的方式把它們集成在一起。以下清單顯示了三個服務的應用程序接口。

?

清單 3.CreditRatingInterface

?

public interface CreditRatingInterface {

public booleangetUserCreditHistoryInformation(ICustomer iCustomer);

}

?

清單 3 所示的信用級別評定接口提供了信用歷史信息。它需要一個包含客戶信息的 Customer 對象。該接口的實現是由CreditRating 類提供的。

?

清單 4.CreditLinkingInterface

?

public interface CreditLinkingInterface {

?

public String getUrl();

public void setUrl(String url);

public void linkCreditBankAccount() throwsException ;

?

}

?

信用鏈接接口將信用歷史信息與銀行信息(如果需要的話)連接在一起,并插入用戶的信用卡信息。信用鏈接接口是一個遠程服務,它的查詢是通過 getUrl() 方法進行的。URL 由 Spring 框架的 bean 配置機制設置,我稍后會討論它。該接口的實現是由 CreditLinking 類提供的。

?

清單 5. EmailInterface

?

public interface EmailInterface {

?

public void sendEmail(ICustomer iCustomer);

public String getFromEmail();

public void setFromEmail(String fromEmail);

public String getPassword();

public void setPassword(String password) ;

public String getSmtpHost() ;

public void setSmtpHost(String smtpHost);

public String getUserId() ;

public void setUserId(String userId);

?

10. 軟件工程與設計模式

111、UML方面

標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行為圖,交互圖(順序圖,合作圖),實現圖。

112. 軟件開發的

92、j2ee常用的設計模式?說明工廠模式。

總共23種,分為三大類:創建型,結構型,行為型

我只記得其中常用的6、7種,分別是:

創建型(工廠、工廠方法、抽象工廠、單例)

結構型(包裝、適配器,組合,代理)

行為(觀察者,模版,策略)

然后再針對你熟悉的模式談談你的理解即可。??

?

Java中的23種設計模式:

Factory(工廠模式),????? Builder(建造模式),?????? Factory Method(工廠方法模式),

Prototype(原始模型模式),Singleton(單例模式),??? Facade(門面模式),

Adapter(適配器模式),??? Bridge(橋梁模式),??????? Composite(合成模式),

Decorator(裝飾模式),??? Flyweight(享元模式),???? Proxy(代理模式),

Command(命令模式),????? Interpreter(解釋器模式), Visitor(訪問者模式),

Iterator(迭代子模式),?? Mediator(調停者模式),??? Memento(備忘錄模式),

Observer(觀察者模式),?? State(狀態模式),???????? Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)

工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。

113、開發中都用到了那些設計模式?用在什么場合?

每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重復相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。

?

11. j2ee部分

117、BS與CS的聯系與區別。

C/S是Client/Server的縮寫。服務器通常采用高性能的PC、工作站或小型機,并采用大型數據庫系統,如Oracle、Sybase、InFORMix或 SQL Server。客戶端需要安裝專用的客戶端軟件。

B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如NetscapeNavigator或Internet Explorer,服務器安裝Oracle、Sybase、InFORMix或 SQL Server等數據庫。在這種結構下,用戶界面完全通過WWW瀏覽器實現,一部分事務邏輯在前端實現,但是主要事務邏輯在服務器端實現。瀏覽器通過Web Server 同數據庫進行數據交互。

C/S 與 B/S 區別:

1.硬件環境不同:

  C/S 一般建立在專用的網絡上, 小范圍里的網絡環境, 局域網之間再通過專門服務器提供連接和數據交換服務.

  B/S 建立在廣域網之上的, 不必是專門的網絡硬件環境,例與電話上網, 租用設備. 信息自己管理. 有比C/S更強的適應范圍, 一般只要有操作系統和瀏覽器就行

2.對安全要求不同

  C/S 一般面向相對固定的用戶群, 對信息安全的控制能力很強. 一般高度機密的信息系統采用C/S 結構適宜. 可以通過B/S發布部分可公開信息.

  B/S 建立在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。

3.對程序架構不同

  C/S 程序可以更加注重流程, 可以對權限多層次校驗, 對系統運行速度可以較少考慮.

  B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟.

4.軟件重用不同

  C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好.

  B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就入買來的餐桌可以再利用,而不是做在墻上的石頭桌子

5.系統維護不同??

  C/S 程序由于整體性, 必須整體考察, 處理出現的問題以及系統升級. 升級難. 可能是再做一個全新的系統

  B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上自己下載安裝就可以實現升級.

6.處理問題不同

  C/S 程序可以處理用戶面固定, 并且在相同區域, 安全要求高需求, 與操作系統相關. 應該都是相同的系統

  B/S 建立在廣域網上, 面向不同的用戶群, 分散地域, 這是C/S無法作到的. 與操作系統平臺關系最小.

7.用戶接口不同

  C/S 多是建立的Window平臺上,表現方法有限,對程序員普遍要求較高

  B/S 建立在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 并且大部分難度減低,減低開發成本.

8.信息流不同

  C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低

  B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心。

2、應用服務器與WEB SERVER的區別?

應用服務器:Weblogic、Tomcat、Jboss

WEB SERVER:IIS、 Apache

32、應用服務器有那些?

BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat

?

3、J2EE是什么?

答:Je22是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業級應用模型(enterpriese application model).在這樣的一個應用系統中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業信息系統(EIS)層。

?

一個另類的回答:j2ee就是增刪改查。

67、J2EE是技術還是平臺還是框架? 什么是J2EE

??J2EE本身是一個標準,一個為企業分布式應用的開發提供的標準平臺。

??J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。

95、請對以下在J2EE中常用的名詞進行解釋(或簡單描述)

web容器:給處于其中的應用程序組件(JSP,SERVLET)提供一個環境,使JSP,SERVLET直接更容器中的環境變量接口交互,不必關注其它系統問題。主要有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口嚴格遵守J2EE規范中的WEB APPLICATION 標準。我們把遵守以上標準的WEB服務器就叫做J2EE中的WEB容器。

EJB容器:Enterprise java bean 容器。更具有行業領域特色。他提供給運行在其中的組件EJB各種管理功能。只要滿足J2EE規范的EJB放入該容器,馬上就會被容器進行高效率的管理。并且可以通過現成的接口來獲得系統級別的服務。例如郵件服務、事務管理。

JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下自己的索引,從而滿足快速查找和定位分布式應用程序的功能。

JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的通訊。包括點對點和廣播。

JTA:(Java Transaction API)JAVA事務服務。提供各種分布式事務服務。應用程序只需調用其提供的接口即可。

JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的框架。讓開發者通過各種部署和自定義實現自己的個性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet對象請求中介協議)他們主要用于通過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股票分析服務,我們可以在本地計算機上實現對其直接調用。當然這是要通過一定的規范才能在異構的系統之間進行通信。RMI是JAVA特有的。

轉載于:https://www.cnblogs.com/2714585551summer/p/5722831.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL語言基礎:SQL中的數據完整性約束用法

前言數據庫的完整性是指數據庫正確性和相容性&#xff0c;是防止合法用戶使用數據庫時向數據庫加入不符合語義的數據&#xff0c;從而保證了數據庫中的數據是正確的&#xff0c;避免非法的更新操作。1、主鍵約束1.1 完整性約束條件完整性約束條件作用的對象有關系、元組、列三種…

SpringCloud Gateway的工作方式

SpringCloud Gateway工作方式 從官網的圖來看&#xff0c;并不是特別復雜&#xff0c;首先客戶端請求都會先經過Gateway Handler Mapping&#xff0c;匹配上就通過Gateway Web Handler轉給過濾器處理&#xff0c;過濾器分為PreFilter&#xff08;前置過濾器&#xff09;、PostF…

java制定年月日第幾天_(JAVA)輸入年月日,計算日期是今年的第幾天?

這個代碼非常正確&#xff0c;還解決了2月份等天數不對的問題。你可以試試看&#xff0c;手工代碼&#xff0c;記得采納&#xff0c;非常感謝。importjava.util.Scanner;publicclasspractice{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);System.out.pr…

后端:414 Request-URI Too Large解決方案

目錄 一、get請求改為Post請求 二、調整前端請求參數的邏輯 三、服務器配置調整 3.1 Java項目 3.2 PHP項目&#xff1a; 3.3 Net項目 3.4 nginx配置文件修改內容&#xff1a; Web項目接口請求會出現414 Request-URI Too Large這個錯誤 下面給大家分享一下相關解決辦法&#xf…

面向對象和面向過程_程序員給你解釋:面向對象和面向過程的區別,到底是怎么回事?...

今天下午在一個組的項目回顧會議上&#xff0c;這個同事講了自己用DDD思想對三個模塊的重構。把之前在Service層的一些業務邏輯下沉到了領域層里&#xff0c;由之而引起的討論。部門經理&#xff1a;“其實你的業務邏輯總體并沒有少&#xff0c;只是把邊界重新劃分了一下。”一…

Android Bug分析系列:第三方平臺安裝app啟動后,home鍵回到桌面后點擊app啟動時會再次啟動入口類bug的原因剖析...

前言 前些天&#xff0c;測試MM發現了一個比較奇怪的bug。 具體表現是&#xff1a; 1、將app包通過電腦QQ傳送到手機QQ上面&#xff0c;點擊安裝&#xff0c;安裝后選擇打開app &#xff08;此間的應用邏輯應該是要觸發 【閃屏頁Activity】&#xff0c; 然后跳轉 【主頁Activit…

SQL語言基礎:SQL授權相關知識筆記?

1、數據控制數據控制是控制對用戶存取的權力&#xff0c;由DBA來決定。DBMS數據控制與功能&#xff1a;1、通過GRANT和REVOKE將授權通知系統&#xff0c;并存入數據字典。2、當用戶發起請求時&#xff0c;根據授權情況檢查是否執行操作請求。SQL標準包括 delete、insert、selec…

JVM的位置

對于JVM的位置&#xff1a; JVM是運行在操作系統之上的,它與硬件沒有直接的交互JVM是運行在操作系統之上的&#xff0c;與硬件沒有直接的交互&#xff0c;但是可以調用底層的硬件&#xff0c;用JIN &#xff08;Java本地接口調用底層硬件接口&#xff0c;了解下就好&#xff0…

word2010添加b5紙張大小_紙張幅面規格尺寸你了解嗎?

點擊藍色文字關注|十七的錨|(單位&#xff1a;mm)關于印前調整若紙張規格標記字母的前面加一個字母R(或S)時&#xff0c;是表示紙張沒有切毛邊&#xff0c;經過切邊修整后&#xff0c;將減少到標準尺寸&#xff0c;例如RA4(或SA4)表示不切邊紙張的尺寸為240mm*330mm&#xff0c…

future promise java_第四章 Future和Promise

Netty是一個異步網絡處理框架&#xff0c;在實現中大量使用了Future機制&#xff0c;并在Java自帶Future的基礎上&#xff0c;增加了Promise機制。這兩者的目的都是使異步編程更加方便使用。在閱讀源碼之前&#xff0c;我們需要對Future的機制有很清楚的認識。## 4.1 異步編程模…

在頁面最上面顯示當前登陸的狀態

首先先判斷一下session <li> <?php if(session(m_id)) : ?> 您好, <?php echo session(m_username); ?>[<a href"<?php echo U(Member/logout) ; ?>">退出</a>] <?php else : ?> 您好&#xff0c;歡迎來到京西&a…

python入門之運算符的使用的答案_python入門教程之基本算術運算符

一、算術運算符運算符-*/%**(冪)求次方//(取整除&#xff0c;向下取整)如&#xff1a;9//2 4二、比較運算符運算符!<>(不等于&#xff0c;類似&#xff01;)<>><#舉例說明&#xff1a;x 10y 20print(x > y) # Falseprint(x < y) # Trueprint(x > …

JVM體系結構

JVM體系結構 Java虛擬機主要分為五大模塊&#xff1a; 類裝載器子系統運行時數據區執行引擎本地方法接口垃圾收集模塊1、JVM一共分為五個區&#xff0c;分別為方法區、堆、Java棧、本地方法棧、程序計 2、方法區、堆為線程共享區域&#xff0c;GC會對二個區進行垃圾回收&…

找數據?這幾個數據源網站就夠用了?

來源&#xff1a;經管學苑轉自&#xff1a;經管學苑大家好&#xff0c;我是小z在這個用數據說話的時代&#xff0c;能夠打動人的往往是用數據說話的理性分析&#xff0c;無論是對于混跡職場的小年輕&#xff0c;還是需要數據進行分析和研究的同學&#xff0c;能夠找到合適的數據…

solaris11-text-安裝GUI(gnome)

http://blog.chinaunix.net/xmlrpc.php?rblog/article&uid45057&id3018467 1.下載所需的資源Text Installer CDRepository Image(a,b)http://www.oracle.com/technetwork/server-storage/solaris11/downloads/index.html2.用text CD安裝solaris11安裝那是相當的快呀&a…

java replaceall 大小寫_Java replaceAll不區分大小寫

Java 中replaceAll如何忽略大小寫呢?方式一:在正則表達式前面添加(?i)Testpublic void test_replaceAll33(){String input "I like Java,jAva is very easy and jaVa is so popular.";String replacement"cccc";System.out.println(input);System.out.p…

jdk環境變量配置_jmeter及jdk的環境變量配置

jmeter是apache公司基于java開發的一款開源壓力測試工具&#xff0c;其內部原理都是源于java的運行&#xff0c;并支持多種外部插件用于接口及性能測試&#xff0c;最主要的還是開源免費&#xff0c;在安裝jmeter前必須配置jdk環境。jdk下載地址&#xff1a;https://www.oracle…

jvm是運行在操作系統之上的,他和硬件沒有直接的交互

jvm是運行在操作系統之上的&#xff0c;他和硬件沒有直接的交互

SQL語言基礎:觸發器相關知識介紹?

1、觸發器 Trigger介紹觸發器可以實現完整性規則和保證一些復雜業務規則的實施。針對示警或滿足特定 條件下自動執行某項任務來說&#xff0c;觸發器是十分有用的機制。觸發器是由事件1驅動的特殊過程&#xff0c;一旦由某個用戶定義&#xff0c;任何用戶對該觸發器指定的數據新…

socket與socketServer通信

服務端代碼&#xff1a; public class TalkServer {public static void main(String args[]){try {//創建服務器&#xff0c;開放7777端口ServerSocket server new ServerSocket(7777);while(true){Socket socket server.accept();System.out.println("客戶端與服務端已…