




已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JAVA部分:1.Collection 和 Collections的區(qū)別。 3提問,沒有回答出collectionsCollections是個java.util下的類,它包含有各種有關集合操作的靜態(tài)方法。 Collection是個java.util下的接口,它是各種集合結構的父接口。 2.ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別 就ArrayList與Vector主要從二方面來說. 一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的 二.數據增長:當需要增長時,Vector 默認增長為原來一培,而ArrayList卻是原來的一半 就HashMap與HashTable主要從三方面來說。一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現 二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的 三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value 3.char型變量中能不能存貯一個中文漢字?為什么? 是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節(jié),所以放一個中文是沒問題的 4.多線程有幾種實現方法,都是什么?同步有幾種實現方法,都是什么? 答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口 同步的實現方面有兩種,分別是synchronized,wait與notify 5.談談final, finally, finalize的區(qū)別。答案:final 用于聲明屬性,方法和類,分別表示屬性不可變,注意:如果是基本類型說明變量本身不能改變,如果是引用類型,說明它不能指向其他的對象了。但對象還是可以改變的。方法不可覆蓋,類不可繼承。finally是異常處理語句結構的一部分,表示無論是否出現異??偸菆?zhí)行。finalize是Object類的一個方法,在垃圾收集器執(zhí)行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。error和exception有什么區(qū)別?Error表示系統(tǒng)級的錯誤和程序不必處理的異常,我們無法處理它。 Exception表示是可以捕捉或者需要程序進行處理的異常。abstract class和interface有什么區(qū)別?答案:一個只能繼承一個抽象類,但卻可以實現多個接口。抽象類中可以有也可以沒有抽象方法。并且可以定義和常規(guī)類一樣的變量和方法。而接口中所有的方法都是抽象的,所有的變量都是靜態(tài)不可修改的。*JAVA WEB部分:1 使用hibernate連接數據庫需要在工程中添加那些文件和類?使用他們連接數據庫的流程?為什么要使用hibernate? hibernate配置文件:Hibernate-config.xml;Entity的映射文件:XXX.hbm.xml;DAO中使用.流程:1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.打開Sesssion 4.創(chuàng)建事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory 使用原因(使用hibernate的好處): 1.對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。 2. Hibernate是一個基于JDBC的主流持久化框架,是一個優(yōu)秀的ORM實現。他很大程度的簡化DAO層的編碼工作 3.hibernate使用Java反射機制,而不是字節(jié)碼增強程序來實現透明性。 4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。 什么是hibernate的延遲加載?當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節(jié)省了服務器的內存開銷,從而提高了服務器的性能。 說下Hibernate的緩存機制 1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存 .2. 二級緩存: a) 應用及緩存 b) 分布式緩存.條件:數據不會被第三方修改、數據大小在可接受范圍、數據更新頻率低、同一數據被系統(tǒng)頻繁使用、非關鍵數據 c) 第三方緩存的實現 Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系) 類與類之間的關系主要體現在表與表之間的關系進行操作,它們都是對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many等.如何優(yōu)化Hibernate? 1.使用雙向一對多關聯,不使用單向一對多 2.靈活使用單向一對多關聯 3.不用一對一,用多對一取代 4.配置對象緩存,不使用集合緩存 5.一對多集合使用Bag,多對多集合使用Set 6. 繼承類使用顯式多態(tài) 7. 表字段要少,表關聯不要怕多,有二級緩存撐腰 servlet中forward() 與redirect()的區(qū)別?答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址 欄中不會顯示出轉向后的地址;后者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發(fā)送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。 所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其 它服務器上的資源,則必須使用sendRedirect()方法。Struts工作流程?為什么要使用Struts? Struts的工作流程:在web應用啟動時就會加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象 當ActionServlet接收到一個客戶請求時,將執(zhí)行如下流程. (1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息; (2)如果ActionForm實例不存在,就創(chuàng)建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中; (3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法; (4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功; (5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發(fā)給哪個Action,如果相應的Action實例不存在,就先創(chuàng)建這個實例,然后調用Action的execute()方法; (6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發(fā)給 ActionForward對象指向的JSP組件; (7)ActionForward對象指向JSP組件生成動態(tài)網頁,返回給客戶; 使用原因: JSP、Servlet、JavaBean技術的出現給我們構建強大的企業(yè)應用系統(tǒng)提供了可能。但用這些技術構建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個規(guī)則、一個把這些技術組織起來的規(guī)則,這就是框架,Struts便應運而生。 基于Struts開發(fā)的應用由3類組件構成:控制器組件、模型組件、視圖組件 驗證框架.11號補充.STRUTS的應用(如STRUTS架構)答:Struts是采用Java Servlet/JavaServer Pages技術,開發(fā)Web應用程序的開放源碼的framework。 采用Struts能開發(fā)出基于MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能: 一.包含一個controller servlet,能將用戶的請求發(fā)送到相應的Action對象。 二.JSP自由tag庫,并且在controller servlet中提供關聯支持,幫助開發(fā)員創(chuàng)建交互式表單應用。 三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息Struts的validate框架是如何驗證的? 在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。 Struts的設計模式(MVC) MVC模式: web應用程序啟動時就會加載并初始化ActionServlert。用戶提交表單時,一個配置好的ActionForm對象被創(chuàng)建,并被填入表單相應的數 據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的 Validate()驗證后選擇將請求發(fā)送到哪個Action,如果Action不存在,ActionServlet會先創(chuàng)建這個對象,然后調用 Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業(yè)務邏輯,返回一個ActionForward對 象,ActionServlet再把客戶請求轉發(fā)給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動 態(tài)的網頁,返回給客戶。 MVC的各個部分都有那些技術來實現?如何實現?答:MVC是ModelViewController的簡寫。Model 代表的是應用的業(yè)務邏輯(通過JavaBean,EJB組件實現), View 是應用的表示面(由JSP頁面產生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。spring工作機制及使用原因? 1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應用系統(tǒng)的其他模塊負責負責對請求進行真正的處理工作。 2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller. 3.DispatcherServlet請請求提交到目標Controller 4.Controller進行業(yè)務邏輯處理后,會返回一個ModelAndView 5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象 6.視圖對象負責渲染返回給客戶端。 使用原因: AOP讓開發(fā)人員可以創(chuàng)建非行為性的關注點,稱為橫切關注點(aspect),并將它們插入到應用程序代碼中。使用 AOP 后,公共服務 (比 如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。石建磊回答什么是IOC. IOC 允許創(chuàng)建一個可以構造對象的應用環(huán)境,然后向這些對象傳遞它們的協作對象。正如單詞倒置所表明的,IOC 就像反過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。 Spring既是一個AOP框架,也是一個IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然后可以很容易地在需要時替換具有類似接口的協作對象。 EJB中SessionBean和EntityBean的區(qū)別,StatefulBean和StatelessBean的區(qū)別.EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技術實現.SessionBean在J2EE應用程序中被用來完成一些服務器端的業(yè)務操作,例如訪問數據庫、調用其他EJB組件.EntityBean被用來代表 應用系統(tǒng)中用到的數據.對于客戶機,SessionBean是一種非持久性對象,它實現某些在服務器上運行的業(yè)務邏輯;EntityBean是一種持久性 對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業(yè)應用程序實現的實體.Session Bean 還可以再細分為 Stateful Session Bean 與 Stateless Session Bean .這兩種的 Session Bean都可以將系統(tǒng)邏輯放在 method之中執(zhí)行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態(tài),因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體.Stateless Session Bean 雖然也是邏輯組件,但是他卻不負責記錄使用者狀態(tài),也就是說當使用者呼叫 Stateless Session Bean 的時候,EJB Container 并不會找尋特定的 Stateless Session Bean 的實體來執(zhí)行這個 method.EJB與JAVA BEAN的區(qū)別? 答:Java Bean 是可復用的組件,對Java Bean并沒有嚴格的規(guī)范,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java Bean是被容器所創(chuàng)建(如Tomcat)的,所以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實現Serializable接口用于實現Bean的持久性。Java Bean實際上相當于微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。客戶通過容器來訪問真正的EJB組件。J2EE是什么? 答:Je22是Sun公司提出的多層(multi-diered),分布式(distributed),基于組件(component-base)的企業(yè)級應用模型(enterpriese application model).在這樣的一個應用系統(tǒng)中,可按照功能劃分為不同的組件,這些組件又可在不同計算機上,并且處于相應的層次(tier)中。所屬層次包括客戶層(clietn tier)組件,web層和組件,Business層和組件,企業(yè)信息系統(tǒng)(EIS)層。J2EE是技術還是平臺還是框架? 答:J2EE本身是一個標準,一個為企業(yè)分布式應用的開發(fā)提供的標準平臺。 J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。j2ee常用的設計模式?說明工廠模式。 答:Java中的23種設計模式: Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式), Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式), Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式), Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式), Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式), Observer(觀察者模式), State(狀態(tài)模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式) 工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并 且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一 個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發(fā)人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。單例模式的實現: UTF-8的介紹使用UTF-8編碼唯一的好處是,國外的用戶如果使用Windows XP英文版,瀏覽UTF-8編碼的任何網頁,無論是中文、還是日文、韓文、阿拉伯文,都可以正常顯示,UTF-8是世界通用的語言編碼,UTF-8的推廣要歸功于Google的應用,以及Blog開發(fā)者。而如果用Windows XP英文版的IE6.0瀏覽gb2312語言編碼的網頁,則會提示是否安裝語言包。因此,可能會失去很多的國外瀏覽者。 使用gb2312 編碼的好處是,因為程序產生的網頁文本使用ANSI編碼格式,會比UTF-8文本編碼節(jié)省一些體積,訪問速度會稍微快一點點,大約是30:38的比例,也就是30K的ANSI編碼,轉為UTF-8編碼是38K,當然,這個比例并不準確,是會隨Unicode字符集區(qū)域的不同而變化的。UTF-8(8 位元 Universal Character Set/Unicode Transformation Format)是針對Unicode 的一種可變長度字符編碼。它可以用來表示 Unicode 標準中的任何字符,而且其編碼中的第一個字節(jié)仍與 ASCII 相容,使得原來處理 ASCII字符的軟件無需或只作少部份修改后,便可繼續(xù)使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優(yōu)先采用的編碼。 UTF-8 編碼提供了一種簡便而向后兼容的方法, 使得那種完全圍繞 ASCII 設計的操作系統(tǒng), 比如 Unix, 也可以使用 Unicode. UTF-8. UTF_8字符集.UTF-8是UNICODE的一種變長字符編碼,由Ken Thompson于1992年創(chuàng)建。現在已經標準化為RFC 3629。UTF-8用1到6個字節(jié)編碼UNICODE字符。如果UNICODE字符由2個字節(jié)表示,則編碼成UTF-8很可能需要3個字節(jié),而如果UNICODE字符由4個字節(jié)表示,則編碼成UTF-8可能需要6個字節(jié)。用4個或6個字節(jié)去編碼一個UNICODE字符可能太多了,但很少會遇到那樣的UNICODE字符2.JSP四種會話跟蹤技術,會話作用域page代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的 Java servlet 類(可以帶有任何的 include 指令,但是沒有 include 動作)表示。這既包括servlet 又包括被編譯成 servlet 的 JSP 頁面request代表與 Web 客戶機發(fā)出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個 Web 組件(由于 forward 指令和 include 動作的關系)session代表與用于某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一個 Web 會話可以也經常會跨越多個客戶機請求application代表與整個 Web 應用程序相關的對象和屬性。這實質上是跨越整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域3.如何理解MVCMVC是ModelViewController的簡寫。Model 代表的是應用的業(yè)務邏輯 (通過JavaBean,EJB組件實現),View 是應用的表示面(由JSP頁面產生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用4.xml有哪些解析技術?區(qū)別是什么有DOM,SAX,STAX等DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成的,這種結構占用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內存,適合對XML的隨機訪問SAX:不同于DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標簽開頭與標簽結束時,它會觸發(fā)一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問STAX:Streaming API for XML (StAX) 5.Struts框架的數據驗證可分為幾種類型?表單驗證(由ActionForm Bean處理):如果用戶沒有在表單中輸入姓名,就提交表單,將生成表單驗證錯誤業(yè)務邏輯驗證(由Action處理):如果用戶在表單中輸入的姓名為“Monster”,按照本應用的業(yè)務規(guī)則,不允許向“Monster”打招呼,因此將生成業(yè)務邏輯錯誤。6.在struts配置文件中action元素包含哪些屬性和子元素?答案:path屬性:指定請求訪問Action的路徑type屬性:指定Action的完整類名name屬性:指定需要傳遞給Action的ActionForm Beanscope屬性:指定ActionForm Bean的存放范圍validate屬性:指定是否執(zhí)行表單驗證input屬性:指定當表單驗證失敗時的轉發(fā)路徑。元素還包含一個子元素,它定義了一個請求轉發(fā)路徑。7.Struts Forward與Global-Forward的區(qū)別答案:Forward是根據Action return的值找到對應的JSP頁。當多個Action共同return同一個值時,可將這個Forward元素寫在Global-Forward中8.敘述Struts ActionForm執(zhí)行步驟()檢查Action的映射,確定Action中已經配置了對ActionForm的映射()根據name屬性,查找form bean的配置信息()檢查Action的formbean的使用范圍,確定在此范圍下,是否已經有此form bean的實例。()假如當前范圍下,已經存在了此form bean的實例,而是對當前請求來說,是同一種類型的話,那么就重用。()否則,就重新構建一個form bean的實例()form bean的reset()方法備調用()調用對應的setter方法,對狀態(tài)屬性賦值()如果validatede的屬性被設置為true,那么就調用form bean的validate()方法。(9)如果validate()方法沒有返回任何錯誤,控制器將ActionForm作為參數,傳給Action實例的execute()方法并執(zhí)行9.簡單敘述Struts 里 ActionForm Bean的作用1、ActionForm Bean也是一種JavaBean,除了具有一些JavaBean的常規(guī)方法,還包含一些特殊的方法,用于驗證HTML表單數據以及將其屬性重新設置為默認值。2、Struts框架利用ActionForm Bean來進行View組件和Controller組件之間表單數據的傳遞。3、Struts框架把View組件接受到的用戶輸入的表單數據保存在ActionForm Bean中,把它傳遞給Controller組件,Controller組件可以對ActionForm Bean中的數據進行修改,JSP文件使用Struts標簽讀取修改后的ActionForm Bean的信息,重新設置HTML表單。10.簡述Struts Form Bean的表單驗證流程 1、當用戶提交了HTML表單,Struts框架自動把表單數據組裝到ActionForm Bean中。2、接下來Struts框架會調用ActionForm Bean的validate()方法進行表單驗證。3、如果validate()方法返回的ActionErrors 對象為null,或者不包含任何ActionMessage對象,就表示沒有錯誤,數據驗證通過。4、如果ActionErrors中包含ActionMessage對象,就表示發(fā)生了驗證錯誤,Struts框架會把ActionErrors對象保存到request范圍內,然后把請求轉發(fā)到恰當的視圖組件,視圖組件通過標簽把request范圍內的ActionErrors對象中包含的錯誤消息顯示出來,提示用戶修改錯誤 簡述Struts框架響應客戶請求的工作流程答案:1. 檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回用戶請求路徑無效的信息。2. 如果ActionForm實例不存在,就創(chuàng)建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中。3. 根據配置信息決定是否需要表單驗證。如果需要驗證,就調用ActionForm的validate()方法。4. 如果ActionForm的validate()方法返回null或返回一個不包含ActionMessge的ActionErrors對象,就表示表單驗證成功。5. ActionServlet根據AtionMapping實例包含的映射信息決定將請求轉發(fā)給哪個Action。如果應的Action實例不存在,就先創(chuàng)建這個實例,然后調用Action的execute()方法。6. Action的execute()方法返回一個ActionForward對象,ActionServlet再把客戶請求轉發(fā)給ActionForward對象指向的JSP組件。7. ActionForward對象指向的JSP組件生成動態(tài)頁面,返回給客戶。對于以上流程的步驟(4),如果ActionForm的validate()方法返回一個包含一個或多個ActionError的ActionErrors對象,就表示表單驗證失敗,此時ActionServlet將直接把請求轉發(fā)給包含客戶提交表單的JSP組件。在這種情況下,不會再創(chuàng)建Action對象并調用Action的execute方法。Get請求和Post請求區(qū)別APost是通過Http中的Post機制將表單中的數據提交到Action所制定的程序Get方法是通過Url請求來提交表單數據的。b.Get適用于傳輸數據量小于1K數據,執(zhí)行效率高。Post傳輸數據量較大,但也有限量你知道的servlet調試方式有哪些?1 使用打印語句,System.out.println2 使用TOMCAT日志3 返回錯誤頁面4 使用IDE集成5 直接查看HTML源代碼Struts的工作原理 在Struts中,用戶的請求一般以*.do作為請求服務名,所有的*.do請求均被指向ActionSevlet, ActionSevlet根據Struts-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,并將此 FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業(yè)務操作,如文件操作,數據庫操作等。每一個*.do均有對應的 FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。 Struts優(yōu)點與缺點 Struts是開源軟件,使開發(fā)者能更深入的了解其內部實現機制。 Struts 優(yōu)點:業(yè)界標準(很多成功案例),學習資源豐富。 Struts的優(yōu)點主要集中體現在兩個方面:Taglib和頁面導航。利用Struts提供的taglib可以大大節(jié)約開發(fā)時間。維護擴展比較方便。通過一個配置文件,即可把握整個系統(tǒng)各部分之間的聯系,這對于期的維護有著莫大的好處。 表現與邏輯分離表單驗證解決了請求數據的驗證問題,增強了系統(tǒng)健壯性。 便于團隊開發(fā)Struts缺點: a、大量的使用標簽,對于初學者難度較大。 b、ActionForms使用不便、無法進行單元測試(StrutsTestCase只能用于集成)Struts提供了幾個標簽庫?都是什么標簽庫? Struts提供了五個標簽庫,即:HTML、Bean、Logic、Template和Nested。HTML 標簽 用來創(chuàng)建能夠和Struts 框架和其他相應的HTML 標簽交互的HTML 輸入表單 Bean 標簽 在訪問JavaBeans 及其屬性,以及定義一個新的bean 時使用 Logic 標簽 管理條件產生的輸出和對象集產生的循環(huán) Template 標簽 隨著Tiles框架包的出現,此標記已開始減少使用 Nested 標簽 增強對其他的Struts 標簽的嵌套使用的能力, 參考: struts Logic標簽說明, , , bean:size延遲加載: 延遲加載機制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當在真正需要數據的時候,才真正執(zhí)行數據加載操作。在Hibernate中提供了對實體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。下面我們就分別介紹這些種類的延遲加載的細節(jié)。實體對象的延遲加載:如果想對實體對象使用延遲加載,必須要在實體的映射配置文件中進行相應的配置,如下所示: 通過將class的lazy屬性設置為true,來開啟實體的延遲加載特性。如果我們運行下面的代碼:User user=(User)session.load(User.class,”1”);(1)System.out.println(user.getName();(2)當運行到(1)處時,Hibernate并沒有發(fā)起對數據的查詢,如果我們此時通過一些調試工具(比如JBuilder2005的Debug工具),觀察此時user對象的內存快照,我們會驚奇的發(fā)現,此時返回的可能是User$EnhancerByCGLIB$bede8986類型的對象,而且其屬性為null,這是怎么回事?還記得前面我曾講過session.load()方法,會返回實體對象的代理類對象,這里所返回的對象類型就是User對象的代理類對象。在Hibernate中通過使用CGLIB,來實現動態(tài)構造一個目標對象的代理類對象,并且在代理類對象中包含目標對象的所有屬性和方法,而且所有屬性均被賦值為null。通過調試器顯示的內存快照,我們可以看出此時真正的User對象,是包含在代理對象的CGLIB$CALBACK_0.target屬性中,當代碼運行到(2)處時,此時調用user.getName()方法,這時通過CGLIB賦予的回調機制,實際上調用CGLIB$CALBACK_0.getName()方法,當調用該方法時,Hibernate會首先檢查CGLIB$CALBACK_0.target屬性是否為null,如果不為空,則調用目標對象的getName方法,如果為空,則會發(fā)起數據庫查詢,生成類似這樣的SQL語句:select * from user where id=1;來查詢數據,并構造目標對象,并且將它賦值到CGLIB$CALBACK_0.target屬性中。這樣,通過一個中間代理對象,Hibernate實現了實體的延遲加載,只有當用戶真正發(fā)起獲得實體對象屬性的動作時,才真正會發(fā)起數據庫查詢操作。所以實體的延遲加載是用通過中間代理類完成的,所以只有session.load()方法才會利用實體延遲加載,因為只有session.load()方法才會返回實體類的代理類對象。B、集合類型的延遲加載:在Hibernate的延遲加載機制中,針對集合類型的應用,意義是最為重大的,因為這有可能使性能得到大幅度的提高,為此Hibernate進行了大量的努力,其中包括對JDK Collection的獨立實現,我們在一對多關聯中,定義的用來容納關聯對象的Set集合,并不是java.util.Set類型或其子類型,而是net.sf.hibernate.collection.Set類型,通過使用自定義集合類的實現,Hibernate實現了集合類型的延遲加載。為了對集合類型使用延遲加載,我們必須如下配置我們的實體類的關于關聯的部分: . 通過將元素的lazy屬性設置為true來開啟集合類型的延遲加載特性。我們看下面的代碼:User user=(User)session.load(User.class,”1”);Collection addset=user.getAddresses(); (1)Iterator it=addset.iterator(); (2)while(it.hasNext()Address address=(Address)it.next();System.out.println(address.getAddress();當程序執(zhí)行到(1)處時,這時并不會發(fā)起對關聯數據的查詢來加載關聯數據,只有運行到(2)處時,真正的數據讀取操作才會開始,這時Hibernate會根據緩存中符合條件的數據索引,來查找符合條件的實體對象。這里我們引入了一個全新的概念數據索引,下面我們首先將講一下什么是數據索引。在Hibernate中對集合類型進行緩存時,是分兩部分進行緩存的,首先緩存集合中所有實體的id列表,然后緩存實體對象,這些實體對象的id列表,就是所謂的數據索引。當查找數據索引時,如果沒有找到對應的數據索引,這時就會一條select SQL的執(zhí)行,獲得符合條件的數據,并構造實體對象集合和數據索引,然后返回實體對象的集合,并且將實體對象和數據索引納入Hibernate的緩存之中。另一方面,如果找到對應的數據索引,則從數據索引中取出id列表,然后根據id在緩存中查找對應的實體,如果找到就從緩存中返回,如果沒有找到,在發(fā)起select SQL查詢。在這里我們看出了另外一個問題,這個問題可能會對性能產生影響,這就是集合類型的緩存策略。如果我們如下配置集合類型: . 這里我們應用了配置,如果采用這種策略來配置集合類型,Hibernate將只會對數據索引進行緩存,而不會對集合中的實體對象進行緩存。如上配置我們運行下面的代碼:User user=(User)session.load(User.class,”1”);Collection addset=user.getAddresses(); Iterator it=addset.iterator(); while(it.hasNext()Address address=(Address)it.next();System.out.println(address.getAddress();System.out.println(“Second query”);User user2=(User)session.load(User.class,”1”);Collection it2=user2.getAddresses();while(it2.hasNext()Address address2=(Address)it2.next();System.out.println(address2.getAddress();運行這段代碼,會得到類似下面的輸出:Select * from user where id=1;Select * from address where user_id=1;TianjinDalianSecond querySelect * from address where id=1;Select * from address where id=2;TianjinDalian我們看到,當第二次執(zhí)行查詢時,執(zhí)行了兩條對address表的查詢操作,為什么會這樣?這是因為當第一次加載實體后,根據集合類型緩存策略的配置,只對集合數據索引進行了緩存,而并沒有對集合中的實體對象進行緩存,所以在第二次再次加載實體時,Hibernate找到了對應實體的數據索引,但是根據數據索引,卻無法在緩存中找到對應的實體,所以Hibernate根據找到的數據索引發(fā)起了兩條select SQL的查詢操作,這里造成了對性能的浪費,怎樣才能避免這種情況呢?我們必須對集合類型中的實體也指定緩存策略,所以我們要如下對集合類型進行配置: . 此時Hibernate會對集合類型中的實體也進行緩存,如果根據這個配置再次運行上面的代碼,將會得到類似如下的輸出:Select * from user where id=1;Select * from address where user_id=1;TianjinDalianSecond queryTianjinDalian這時將不會再有根據數據索引進行查詢的SQL語句,因為此時可以直接從緩存中獲得集合類型中存放的實體對象。C、屬性延遲加載:在Hibernate3中,引入了一種新的特性屬性的延遲加載,這個機制又為獲取高性能查詢提供了有力的工具。在前面我們講大數據對象讀取時,在User對象中有一個resume字段,該字段是一個java.sql.Clob類型,包含了用戶的簡歷信息,當我們加載該對象時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務周例會分析流程
- 職工心理健康提升培訓心得體會
- 工業(yè)廠房施工進度計劃及材料保障措施
- 礦山機械維護保養(yǎng)服務方案計劃
- 語文培優(yōu)生課題研究思路及措施
- 生態(tài)修復施工措施計劃
- 教師團隊合作強化計劃
- 成人教育網上教學專題培訓心得體會
- 2025年度酒店銷售部渠道管理計劃
- 六年級線上體育技能提升計劃
- 基于項目式學習的小學勞動教育課程教學設計
- 2025屆湖北省武漢市武昌區(qū)南湖中學英語七年級第二學期期末達標檢測試題含答案
- 等離子體泡跨尺度耦合-洞察及研究
- 菱鎂礦行業(yè)研究報告
- 2025至2030年中國血氣分析儀行業(yè)市場運作模式及前景戰(zhàn)略分析報告
- 公共娛樂衛(wèi)生管理制度
- 四川省成都市嘉祥外國語學校2025屆七年級英語第二學期期末達標檢測試題含答案
- 垃圾分類處置及配套建設項目可行性研究報告
- 2024年湖南郴州汝城投資發(fā)展集團有限公司第二次招聘3人筆試參考題庫附帶答案詳解
- 《黃帝內經養(yǎng)生智慧》課件
- 2025年安徽蚌埠市臨港建設投資集團及所屬公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論