Struts2
-
Struts2本質可以分為三個部分?
答:核心控制層(FilterDispatcher),業務控制層(Action)和用戶實現企業業務邏輯組件。
-
Struts2的基本流程?
(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的生命周期中,攔截器可以多次訪問,而過濾器只能在容器初始化時被調用一次;
-
struts1與struts2的比較?
答:(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脫離容器單獨被測試。
-
Struts2的核心控制器是什么?它有什么作用?
答: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包。
-
struts2如何對指定的方法進行驗證?
答:(1)validate()會效驗Action中說有與execute方法簽名相同的方法;(2)要效驗指定的方法要通過重寫validateXxx()方法實現,validateXxx()只會效驗方法名為Xxx()的方法。(3)當某個數據效驗失敗,調用addFieldError()方法往系統的fieldErrors添加效驗失敗信息。(4)在視圖中可以通過<s:fielderror/>顯示錯誤信息。(5)先執行validateXxx()->validate()->如果出錯,會轉發<result name="input">所指定的頁面,如果不出錯,那么直接執行Action::execute()方法。
-
值棧ValueStack的原理與生命周期?
答:(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框架有哪些模塊?
答:spring核心容器-IOC容器;spring AOP;spring MVC;spring DAO;spring ORM;spring WEB;spring 上下文(context)
-
Spring都有哪些特點?
答:(1)Spring不同於其他的Framework,他要提供的是一種管理你的業務對象的方法。(2)Spring有分層的體系結構,意味着你能選擇僅僅使用它的任何一個獨立部分,而其他的仍然使用你的相關實現。(3)它的設計從一開始就是要幫助你編程易於測試的代碼,Spring是使用測試驅動開發(TDD)工程的理想框架。(4)Spring不會給你的工程添加對其他的框架依賴,同時Spring又可以稱得上是一個一攬子解決方案,提供了一個典型應用所需要的大部分基礎架構。
-
為什么要使用spring框架,它有什么優點?
答:(1)輕量級框架;(2)非入侵性的;(3)可以整合其他框架,比如struts,Hibernate等;(4)可以提供事務管理;
(1)Spring能有效的組織你的中間層對象。(2)Spring能消除在許多工程中常見的對Singleton的過多使用。(3)Spring的設計會讓使用它的創建的應用盡可能少地依賴它的API,在Spring應用中的大多數業務對象沒有依賴於Spring。(4)Spring提供一些Web應用上的EJB的替代方案,比如用AOP提供聲明性事務管理。
-
Spring框架的工作機制是什么?
答:(1)Spring MVC將所有的請求都交給DispatcherServlet,它會委托應用系統的其他模塊負責對請求進行真正的處理工作。(2)DispatcherServlet請求一個或者多個HalderMapper,找到處理請求的Controller。(3)Controller進行業務邏輯處理后,會返回一個ModelAndView。(4)Dispatcher查詢一個或者多個ViewResolver(視圖解析器),找到ModelAndView對象指定的視圖對象。(5)視圖對象將結果返回給客戶端。
-
怎么使用Spring事物?
答:Spring同時支持編程式事務策略和聲明式事務策略,大部分都采用聲明式事務策略。聲明式事務策略有4種:(1)使用TransactionProxyFactoryBean為Bean生成事務代理的配置。(2)采用Bean繼承的事務代理配置方式。(3)采用BeanNameAutoProxyCreator,根據Bean Name自動生成事務代理的方式。這是利用Spring的AOP框架配置事務代理的方式,需要對Spring的AOP有一定的理解。(4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事務代理的方式,效果非常不錯,但是可讀性不如前面的三個。
-
請談談SSH整合?
答:(1)struts(表現層)+Spring(業務層)+Hibernate(持久層)。(2)Struts:是一個表現層框架,主要用於頁面顯示,接受請求和分發請求;在MVC框架中,Struts屬於VC層次,負責界面表現,負責MVC關系的分發;view沿用JSP,HTTP等。(3)Spring:是一個業務層框架,是一個整合的框架,能夠很好地粘合表現層和持久層。(4)Hibernate:是一個持久性框架,負責與關系數據庫的操作。
-
在Spring框架中如何配置數據庫驅動?
答:DriverManagerDataSource數據源來配置數據庫驅動。
-
在Spring框架中applicationContext.xml文件能不能改成其他文件名?
答:ContextLoaderListener是一個ServletContextListener,在啟動Tomcat服務器時,它會讀取WEB-INF下的applicationContext.xml文件,初始化Spring配置。如果想要修改applicationContext.xml文件的文件名或者文件的存儲位置,可以通過在WEB.xml文件中定義一個<context-param>元素來解決這個問題。
-
如何在WEB中配置Spring?
答:
-
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>
-
如何在Spring中實現國際化?
答:在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("鍵名","參數","區域")取出相關信息。
-
Spring核心類有哪些,各有什么作用?
答:BeanFactory:產生一個新的實例,可以實現單例模式;BeanWrapper:提供統一的get以及set方法;ApplicationContext:提供Spring框架的實現,包括BeanFactory的所有功能;
-
什么是AOP,AOP有什么作用?
答:面向切面編程(AOP)提供了另一種角度來思考程序結構,通過這種方式彌補了面向對象的不足。除了類以外,AOP提供了切面例如橫切多個模型和對象的事務管理。Spirng的一個關鍵的組件就是AOP框架,可以自由的選擇是否使用AOP,提供聲明式企業服務,特別是為了替代EJB聲明式服務,最重要的服務是聲明式事務管理,這個服務是建立在Spring的抽象事務管理之上。允許用戶可以自定義切面,用AOP來完善OOP的使用,可以把Spring AOP看做是對Spring的一種增強。
-
使用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?它有什么特點?
答: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提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的發開發留給開發者。
-
AOP中幾個重要的名詞解釋?
答:(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框架一樣,在運行時完成織入。
Hibernate有兩個特殊文件?
答:關於cfg.xml文件:cfg.xml文件的作用就是連接數據庫。文件內部其實就是一個由user、password、URL、driver組成的連接庫的基本信息。文件的內容如下:
1 <Hibernate-configuration> 2 <session-factory> 3 <property name="connection.username">sss</property> 4 <property name="connection.url">jdbc:oracle:thin:@193.168.0.1:1809:ris</property> 5 <property name="dialect">org.Hibernate.dialect.Oracle9Dialect</property> 6 <property name="connection.password">sss</property> 7 <property name="connection.dirver_class">oracle.jdbc.driver.OracleDirver</property> 8 <mapping resource="employee.hbm.xml"> 9 </session-factory> 10 </Hibernate-configuration>
(1)<Hibernate-configuration>包含的是程序里面的configuration實例信息。通過這個實例的方法configure,我們可以從mapping中得到對應的表的信息和類的信息。
(2)<Session-factory>這個標簽是程序中通過configure的方法BuildSessionFactory所得到的一個SessionFactory對象,這個對象可以理解為一個statement。我們對數據庫的所有操作都是通過它的一系列方法來實現。
(3)property dialect都是Hibernate的一些屬性設置,我們可以設置很多property,其中一些是必須的,一些是可選的。
關於hbm.xml文件
hbm.xml文件是對數據庫中表的映射文件,可以由這個指出那個類對應着哪個表,而且還指出那個類中的屬性對應着表中的哪個字段。文件內容如下:
<Hibernate-mapping> <class name="src.employee" table="employee">//先指定類對應的表 <id name="id" column="id"> <generator class="increment">//可是實現id自動增長 </id> <property name="name" column="name"> </class> </Hibernate-mapping>
-
比較Hibernate三種檢索策略的優缺點?
答:(1)立即檢索:優點:對應用程序完全透明,不管對象處於持久狀態還是游離狀態,應用程序都可以方便的從一個對象導航到與他關聯的另一個對象。缺點:select語句太多,可能加載應用程序不需要訪問的對象白白浪費許多內存空間。(2)延遲檢索:優點:由應用程序決定需要加載哪些對象,可避免執行多個select語句,以及避免加載應用程序不需要訪問的對象,因此提高檢索性能,並且能節約內存空間。缺點:應用程序要訪問游離狀態代理類的實例,必須保證它在持久化狀態時已經被初始化了。(3)迫切左外連接檢索:優點:對應用程序完全透明,不管對象處於持久狀態還是游離狀態,應用程序都可以方便的從一個對象導航到與他關聯的另一個對象,使用了外鏈接,select語句減少。缺點:可能加載應用程序不需要訪問的對象,白白浪費許多內存,復雜的數據表連接也會影響檢索性能。
-
hibernate里面的sorted collection和ordered collection有什么區別?
答:sorted collection是在內存中通過java比較器進行排序的;ordered conllection是在數據庫中通過ordered by進行排序的。
-
Hiberante工作原理及為什么要用?
答:原理:讀取並解析配置文件;讀取並解析映射信息,創建SessionFactory;打開Session;創建事務Transation;持久化操作;提交事務;關閉Session;關閉SessionFactory;為什么:(1)對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼;(2)Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現,很大程度的簡化了DAO的編碼工作;(3)Hibernate使用java反射機制,而不是字節碼增強程序來實現透明性;(4)支持各種數據庫關系,從一對一到多對多的各種復雜關系;
-
如何優化Hibernate?
答:(1)使用雙向一對多關聯,不使用單項一對多;(2)靈活使用單向一對多關聯;(3)不用一對一,用多對一取代;(4)配置對象緩存,不使用集合緩存;(5)一對多集合使用Bag,多對多集合使用Set;(6)繼承類使用顯示多態;(7)表字段好少,表關聯不要怕多,有二級緩存;
-
Hibernate有哪幾種查詢模式?
答:hql,條件查詢(QBC),原生sql;
-
說說Hibernate中update()和saveOrUpdate()方法的區別?
答:saveOrUpdate方法可以實現update方法的功能,但是多些步驟,具體如下:如果對象在該session中已經被持久化,不進行操作;對象的標識符屬性在數據庫中不存在或者是個暫時的值,調用save()方法保存它;如果session中的對象有相同的標識符則拋出異常;以上皆不符合調用update方法。
-
session中get()和load()的區別?
答;如果未發現符合條件的記錄,get方法返回null,而load方法會拋出一個異常ObjectNotFoundException;load方法可以返回實體的代理類實例,而get方法永遠直接返回實體類;load方法可以充分利用內部緩存和二級緩存中的現有數據,而get方法則僅僅在內部緩存中進行數據查找,如果沒有發現數據,將越過二級緩存,直接調用sql完成數據讀取。
-
游離對象(Detached Object)有什么好處?
答:游離對象可以傳遞到任何層直到表現層而不是用任何DTO,然后你還可以把游離對象重新賦給另一個session。
-
三層次(多層次)軟件架構相比二層次軟件架構有什么優勢?
答:三層次架構的瀏覽器/服務器着重於客戶機對應服務的請求,二層次架構僅局限於數據的簡單請求。三層次架構要求的初期投資比二層次的體系結構高。
-
如果讓你設計一個數據庫連接池,可能會考慮到哪些方面的問題?
答:(1)連接池需要實現javax.sql.DataSource接口,以適合於不同的場合。(2)Connection#close問題:使用者使用連接池與不使用連接池,除了從哪獲得Connection對象不一樣之外,其他JDBC的代碼是完全一樣的,並不能因為使用連接池而改變既有的JDBC代碼,如果不能改變JDBC代碼,就帶來了一個Connection close的問題,都知道這個是關閉數據庫連接,如果在連接池中這么做的話就會關閉連接,使用連接得不到重用。(3)連接被動關閉問題:為了保證連接的復用性,將連接一直保存在連接池中,有些數據庫會將已經連接很久的客戶端連接主動踢掉,如果碰到這種情況,在池中的這個連接池就會變為不可用狀態,如果被客戶端使用的話將會拋出連接被關閉的SQLException。(4)連接回收問題:假如我們的連接池最大設為50個,在某一並發的時段達到了50個,但是過后並發率就降低,對於連接池來說池中還有50個連接,實際上后面根本不需要那么多連接,這就導致資源的浪費,所以我們應該及時的將不需要使用的連接關閉。(5)網絡中斷重連問題:連接池中的連接在網絡中斷時,池中連接會全部斷開,數據庫服務端也會回收斷開的連接,但是網絡中斷后,過了一些時間又連上了,這是池中的連接依然是斷開的,如果取出來用的話,不用說就會拋出異常。一個可用的連接需要有實現自動重連功能,否則沒有可用價值。