標籤:運算式 映射 開發 https app jar包 技術 jdbc訪問資料庫 載入
Struts2
答:核心控制層(FilterDispatcher),業務控制層(Action)和使用者實現企業商務邏輯組件。
(1)用戶端初始化一個指向Servlet容器的請求;(2)這個請求經過一系列過濾去(Filter);(3)接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否需要調用某個Action;(4)如果要調用某個Action,FilterDispatcher就把請求的處理交給ActionProxy;(5)ActionProxy通過Configuration Manager詢問架構的設定檔,找到需要調用的Action類;(6)ActionProxy建立一個ActionInvocation的執行個體;(7)ActionInvocation執行個體使用命名模式來調用,在調用Action的前後涉及到了攔截器(intercepter)的調用;(8)一點Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果;(9)相應的返回是通過我們在web.xml中配置的過濾器;(10)如果ActionContextCleanUp是當前使用,則FilterDispatcher不會清理sreadlocalActionContext,否則,則會清理sreadlocal;
答:(1)攔截器是基於java反射機制的,而過濾器是基於回呼函數的;(2)攔截器不依賴servlet容器,過濾器依賴servlet容器;(3)攔截器只能對Action請求起作用,而過濾器可以幾乎對所有的請求起作用。(4)攔截器可以訪問Action上下文,值棧中的對象,而過濾器不能;(5)在Action的生命週期中,攔截器可以多次訪問,而過濾器只能在容器初始化時被調用一次;
答:(1)Action類:struts1要求Action繼承一個抽象基類,Struts1的一個普遍問題是使用抽象類別編程而不是介面;Struts2可以實現Action介面,也可以實現其他介面,使可選和制定服務成為可能,它提供了一個ActionSupport基類去實現常用的介面,Action介面不是必須的,任何被execute修飾的POJO對象都可以Action對象。(2)線程模式:Struts1線程是單例模式並是安全執行緒的,因為僅有一個Action來處理當前的請求。Struts2為每個請求產生一個執行個體,因此沒有安全執行緒問題。(3)Servlet依賴:Struts1依賴Servlet API,因為當一個Action被調用時,HttpServletRequset和HttpServletResponse被傳遞給execute方法,Struts2不依賴容器,運行Action脫離容器單獨被測試。
答:Struts核心控制器是StrutsPrepareAndExcuteFileter。作用:負責攔截由<url-pattern>/*</url-pattern>指定的所有使用者請求,當使用者的請求到達時,該Filter就會過濾掉使用者的請求。預設情況下,如果使用者請求的路徑不帶尾碼名或者是以".action"結尾,這時這個請求會被轉入Struts2架構處理,否則,Struts2架構將略過這個請求的處理。
- Struts2架構是如何管理Action的?這樣管理方式有什麼好處?
答:Struts2架構中使用包來管理Action,包的作用和java中類包作用基本類似,主要用於管理一組業務功能相關的Action。
- struts2中的預設包struts-default有什麼作用?
答:(1)struts-default是由struts內建的,它定義了struts2中的眾多攔截器和Result類型,而Struts2中很多核心的內容都是通過這些內建的攔截器實現。(2)struts-default是在struts-default.xml中定義,struts-default.xml也是struts2的預設檔案,struts2每次都會自動載入struts-default.xml檔案。(3)通常每個包都應該繼承struts-default包。
答:(1)validate()會效驗Action中說有與execute方法簽名相同的方法;(2)要效驗指定的方法要通過重寫validateXxx()方法實現,validateXxx()只會效驗方法名為Xxx()的方法。(3)當某個資料效驗失敗,調用addFieldError()方法往系統的fieldErrors添加效驗失敗資訊。(4)在視圖中可以通過<s:fielderror/>顯示錯誤資訊。(5)先執行validateXxx()->validate()->如果出錯,會轉寄<result name="input">所指定的頁面,如果不出錯,那麼直接執行Action::execute()方法。
答:(1)ValueStack貫穿整個Action的生命週期,儲存在request域中,所有ValueStack的生命週期與request的生命週期一樣,當struts2接受一個請求時,會迅速建立ActionContext,ValueStack,action。然後把action存放到ValueStack中,所有action執行個體對象可以被OGNL訪問。請求來的時候,action,ValueStack的生命開始,請求結束,action,ValueStack的生命結束。(2)action是多例的,和Servlet不一樣,Servlet是單例的;(3)每個action都有一個對應的值棧,值棧存放的資料類型是該aciton的執行個體,以及該action的執行個體變數,action對象預設儲存在棧頂;(4)ValueStack本質就是一個ArrayList;(5)使用OGNL訪問值棧的內容時,不需要加#號,而訪問request,session,application,attr時,需要加#號;(6)在Struts中,OGNL運算式需要配合struts標籤來使用,例如<s:property value="name"/>。(7)在struts2的設定檔中引用OGNL運算式,引用值棧中的值,此時使用“$”,而不是“#”或者“%”;
- ActionContext,ServletContext,pageContext的區別?
答:(1)ActionContext是當前Action的上下文環境,通過ActionContext可以擷取到request,session,ServeltContext等於Action有關的對象的引用。(2)ServeltContext是域對象,一個web應用中只能有一個ServletContext,生命週期伴隨web應用。(3)pageContext是jsp的一個重要內建對象,可以通過pageContext可以擷取到其他域對象的應用,同時它是一個域對象,作用範圍只針對當前頁面,當前頁面結束,pageContext銷毀,生命週期是JSP四個對象中最小的。
Spirng
答:spring核心容器-IOC容器;spring AOP;spring MVC;spring DAO;spring ORM;spring WEB;spring 上下文(context)
答:(1)輕量級架構;(2)非入侵性的;(3)可以整合其他架構,比如struts,Hibernate等;(4)可以提供交易管理;
答:(1)Spring MVC將所有的請求都交給DispatcherServlet,它會委託應用系統的其他模組負責對請求進行真正的處理工作。(2)DispatcherServlet請求一個或者多個HalderMapper,找到處理請求的Controller。(3)Controller進行商務邏輯處理後,會返回一個ModelAndView。(4)Dispatcher查詢一個或者多個ViewResolver(視圖解析器),找到ModelAndView對象指定的視圖對象。(5)視圖對象將結果返回給用戶端。
答:Spring同時支援編程式事務策略和聲明式事務策略,大部分都採用聲明式事務策略。聲明式事務策略有4種:(1)使用TransactionProxyFactoryBean為Bean產生事務代理的配置。(2)採用Bean繼承的事務代理配置方式。(3)採用BeanNameAutoProxyCreator,根據Bean Name自動產生事務代理的方式。這是利用Spring的AOP架構配置事務代理的方式,需要對Spring的AOP有一定的理解。(4)採用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP架構配置事務代理的方式,效果非常不錯,但是可讀性不如前面的三個。
答:(1)struts(表現層)+Spring(業務層)+Hibernate(持久層)。(2)Struts:是一個表現層架構,主要用於頁面顯示,接受請求和分發請求;在MVC架構中,Struts屬於VC層次,負責介面表現,負責MVC關係的分發;view沿用JSP,HTTP等。(3)Spring:是一個業務層架構,是一個整合的架構,能夠很好地粘合表現層和持久層。(4)Hibernate:是一個持久性架構,負責與關聯式資料庫的操作。
答:DriverManagerDataSource資料來源來設定資料庫驅動。
- 在Spring架構中applicationContext.xml檔案能不能改成其他檔案名稱?
答:ContextLoaderListener是一個ServletContextListener,在啟動Tomcat伺服器時,它會讀取WEB-INF下的applicationContext.xml檔案,初始化Spring配置。如果想要修改applicationContext.xml檔案的檔案名稱或者檔案的儲存位置,可以通過在WEB.xml檔案中定義一個<context-param>元素來解決這個問題。
答:
- Spring裡如何定義Hibernate Mapping?
答:添加hibernate mapping檔案到WEB-INF目錄下applicationContext.xml檔案中。
- 解釋一下Dependency Injection(DI,依賴注入)和Inversion of Control(IOC,控制反轉)?
答:依賴注入DI是一種設計模式,通常也稱作控制反轉,儘管在技術上講,依賴注入是一個IOC的特殊實現,依賴注入是指一個對象應用另一個對象來提供一種特殊的能力。例如,把一個資料庫連接以參數的形式傳到一個對象的建構函式裡面而不是在那個對象內部自動建立一個串連。依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是他們描述的角度不同,依賴注入是從應用程式的角度描述,應用程式依賴容器建立並注入它所需要的外部資源;而控制反轉是從容器的角度在描述,容器控制應用程式,由容器反向嚮應用程式注入應用程式所需要的外部資源。
- Spring中BeanFactory與ApplicationContext的作用有哪些?
答:(1)BeanFactory負責讀取Bean配置文檔,管理Bean的載入和執行個體化,維護Bean之間的依賴關係,負責Bean的生命週期。(2)ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的架構功能:a、國際化支援。b、訪問資源:Resource rs=ctx.getResource("classpath:config.properties")。c、事件傳遞:通過實現ApplictionContextAware介面。(3)常用的擷取ApplicationContext的方法:FileSystemXmlApplicationContext:從檔案系統或者URL指定的XML設定檔建立,參數為設定檔名或者檔案名稱數組。ClassPathXmlApplicationContext:從classpath的xml設定檔建立,可以從jar包中讀取配合檔案。WebApplicationContextUtils:從web應用的根目錄讀取設定檔,需要現在web.xml中配置,可以配置監聽器或者Servlet來實現。
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class></listener><servlet> <servlet-name>context</servlet-name> <servelt-class> org.springframework.web.context.ContextLoaderServlet </servelt-class> <load-on-startup>1</load-on-startup></servlet>
答:在ApplicationContext.xml中配置一個Bean:
<bean id="messageSource" class=" org.spirngframework.context.support.ResourceMessageSource "><property name="basename"> <value>message</value></property></bean>
在src目錄下建立多個properties檔案,其命名格式message_語言_國家。在頁面中顯示資訊時,通過applicationContext.getMessage("鍵名","參數","地區")取出相關資訊。
答:BeanFactory:產生一個新的執行個體,可以實現單例模式;BeanWrapper:提供統一的get以及set方法;ApplicationContext:提供Spring架構的實現,包括BeanFactory的所有功能;
答:面向切面編程(AOP)提供了另一種角度來思考程式結構,通過這種方式彌補了物件導向的不足。除了類以外,AOP提供了切面例如橫切多個模型和對象的交易管理。Spirng的一個關鍵的組件就是AOP架構,可以自由的選擇是否使用AOP,提供聲明式企業服務,特別是為了替代EJB聲明式服務,最重要的服務是聲明式交易管理,這個服務是建立在Spring的抽象交易管理之上。允許使用者可以自訂切面,用AOP來完善OOP的使用,可以把Spring AOP看做是對Spring的一種增強。
答:(1)Spring能有效地組織中介層對象,無論你是否選擇使用EJB,如果使用了struts,spring關注了遺留問題。(2)Spring能消除在許多工程上對Singleton的過多使用。(3)Spring能消除使用各種格式的屬性定製檔案的需要,在整個工程中,可通過一種一致的方法進行配置。(4)能通過介面而不是類促進好的編程習慣,減少編程代價幾乎為零。(5)Spring被設計為讓使用它建立的應用儘可能少的依賴於它的APIs。在spring應用中的大多數業務對象沒有依賴於spring。(6)使用Spring架構易於單元測試。(7)Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇,能選擇用POJOs或local EJBs來實現業務介面,卻不影響調試代碼。(8)Spring能解決許多問題而不使用EJB,例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果僅僅是與單個資料打交道,甚至不需要JTA實現。(9)Spring為資料存放區提供了統一的架構,不論是使用JDBC或者O/R Mapping產品。
答:Spring是一個輕量級的控制反轉(IOC)和面向切面(AOP)的容器架構。(1)輕量:從大小與開銷兩方面而言Spring都是輕量的。完整的Spring架構可以在大小為1M多的jar檔案中發布,並且Spring的處理開銷可以微不足道,此外,Spring是非侵入式的:典型的,Spring應用中的對象不依賴Spring的特定類。(2)控制反轉:Spring通過控制反轉來促進松耦合。當應用了IOC時,一個對象的其他依賴對象會通過被動的方式傳遞進來,而不是這個對象自己建立或者尋找依賴對象,可以認為IOC與JNDI相反,不是對象從容器中尋找依賴,而是容器在對象初始化時就不等對象請求就主動將依賴傳遞給它。(3)面向切面:Spring提供了面向切面編程的豐富支援,允許通過分離應用的商務邏輯和系統級服務進行內聚性的開發。應用對象只要實現他們應該做的-完成商務邏輯-僅此而已。它們並不負責其他的系統級關注點,例如日誌或者事務支援。(4)容器:Spring包含並管理應用對象的配置和生命週期,在這個意義上來說他是一種容器,可以配置每個Bean如何被建立-基於一個可配置原型(property),bean可以建立一個單獨的執行個體或者每次需要時產生一個新的執行個體,以及他們如何相互關聯,然而,Spring不應該被混同於傳統的EJB容器,它們經常是龐大的笨拙的,難以使用。(5)架構:Spring可以將簡單的組件組合,配置成為複雜的應用。在Spring中應用對象被聲明式組合,典型的是在一個XML檔案中,Spring提供了很多基礎功能(交易管理、持久化框架組成等等),將應用邏輯的發開發留給開發人員。
答:(1)切面(aspect):一個關注點的模組化,這個關注點可能橫切多個對象。交易管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,切面可以使用通用類或者在普通類中以@Aspect註解來實現。(2)連接點(Joinpoint):在程式執行中某個特定的點,比如某個方法調用的時候或處理異常的時候。在spring AOP中,一個連接點就代表了一個方法的執行,通過聲明一個org.aspectj.lang.JointPoint類型的參數可以使通知(Advice)的主體部分獲得連接點資訊。(3)通知(Advice)在切面的某個特定的連接點上執行的動作,通知有各種類型,其中包括“around”,“before”,“after”等通知,許多AOP模型,包括spring,都是通過攔截器來做通知模型,並維護一個以連接點為中心的攔截器鏈。(4)切入點(Pointcut):匹配連接點的斷言,通知和一個切入點的運算式關聯,並在滿足這個切入點的連接點上運行。切入點運算式如何和連接點匹配是AOP的核心:Spring預設使用AspectJ切入點文法。(5)引入(Introduction):也被稱作內部型別宣告。聲明額外的方法或者某個類型的欄位,Spring運行引入新的介面到任何被代理的對象,例如,可以使用一個bean實現IsModified介面,以便簡化緩衝機制。(6)目標對象(Target Object):被一個或者多個切面所通知的對象。也叫做被通知對象,既然Spring AOP是通過運行時代理實現的,這個對象永遠是被代理的對象。(7)AOP代理:AOP架構建立的對象,用來實現切面契約。在Spring中,AOP代理可以是JDK動態代理或者GCLIB代理。(8)織入(Weaving):把切面串連到其他的應用程式類型或者對象上,並建立一個通知的對象。這些可以在編譯時間,類載入時和運行時完成。Spring和其他純java AOP架構一樣,在運行時完成織入。
答:(1)立即檢索:優點:對應用程式完全透明,不管對象處於持久狀態還是游離狀態,應用程式都可以方便的從一個對象導航到與他關聯的另一個對象。缺點:select語句太多,可能載入應用程式不需要訪問的對象白白浪費許多記憶體空間。(2)延遲檢索:優點:由應用程式決定需要載入哪些對象,可避免執行多個select語句,以及避免載入應用程式不需要訪問的對象,因此提高檢索效能,並且能節約記憶體空間。缺點:應用程式要訪問游離狀態代理類的執行個體,必須保證它在持久化狀態時已經被初始化了。(3)迫切左外串連檢索:優點:對應用程式完全透明,不管對象處於持久狀態還是游離狀態,應用程式都可以方便的從一個對象導航到與他關聯的另一個對象,使用了外連結,select語句減少。缺點:可能載入應用程式不需要訪問的對象,白白浪費許多記憶體,複雜的資料表串連也會影響檢索效能。
- hibernate裡面的sorted collection和ordered collection有什麼區別?
答:sorted collection是在記憶體中通過java比較子進行排序的;ordered conllection是在資料庫中通過ordered by進行排序的。
答:原理:讀取並解析設定檔;讀取並解析映射資訊,建立SessionFactory;開啟Session;建立事務Transation;持久化操作;提交事務;關閉Session;關閉SessionFactory;為什麼:(1)對JDBC訪問資料庫的代碼做了封裝,大大簡化了資料訪問層繁瑣的重複性代碼;(2)Hibernate是一個基於JDBC的主流持久化架構,是一個優秀的ORM實現,很大程度的簡化了DAO的編碼工作;(3)Hibernate使用java反射機制,而不是位元組碼增強程式來實現透明性;(4)支援各種資料庫關係,從一對一到多對多的各種複雜關係;
答:(1)使用雙向一對多關聯,不使用單項一對多;(2)靈活使用單向一對多關聯;(3)不用一對一,用多對一取代;(4)設定物件緩衝,不使用集合緩衝;(5)一對多集合使用Bag,多對多集合使用Set;(6)繼承類使用顯示多態;(7)表欄位好少,表關聯不要怕多,有二級緩衝;
答:hql,條件查詢(QBC),原生sql;
- 說說Hibernate中update()和saveOrUpdate()方法的區別?
答:saveOrUpdate方法可以實現update方法的功能,但是多些步驟,具體如下:如果對象在該session中已經被持久化,不進行操作;對象的標識符屬性在資料庫中不存在或者是個暫時的值,調用save()方法儲存它;如果session中的對象有相同的標識符則拋出異常;以上皆不符合調用update方法。
答;如果未發現合格記錄,get方法返回null,而load方法會拋出一個異常ObjectNotFoundException;load方法可以返回實體的代理類執行個體,而get方法永遠直接返回實體類;load方法可以充分利用內部緩衝和二級緩衝中的現有資料,而get方法則僅僅在內部緩衝中進行資料尋找,如果沒有探索資料,將越過二級緩衝,直接調用sql完成資料讀取。
- 游離對象(Detached Object)有什麼好處?
答:游離對象可以傳遞到任何層直到表現層而不是用任何DTO,然後你還可以把游離對象重新賦給另一個session。
JAVA中架構總結