版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
2025年高頻javassh面試題及答案1.Struts2中攔截器(Interceptor)的執(zhí)行流程是怎樣的?如何自定義一個攔截器?Struts2的攔截器機制是其核心功能之一,用于在Action執(zhí)行前后進行預(yù)處理和后處理。完整的執(zhí)行流程為:請求到達Struts2過濾器后,框架根據(jù)配置文件(struts.xml)找到對應(yīng)的Action和攔截器棧;攔截器棧中的攔截器按順序執(zhí)行preHandle(前置處理),直到最后一個攔截器調(diào)用Action的execute方法;Action執(zhí)行完成后,攔截器按逆序執(zhí)行postHandle(后置處理),最終返回視圖。自定義攔截器需實現(xiàn)erceptor.Interceptor接口,重寫init()(初始化)、destroy()(銷毀)和intercept(ActionInvocationinvocation)方法。在intercept方法中,通過invocation.invoke()觸發(fā)后續(xù)攔截器或Action的執(zhí)行。例如:```javapublicclassCustomInterceptorimplementsInterceptor{@Overridepublicvoidinit(){}@Overridepublicvoiddestroy(){}@OverridepublicStringintercept(ActionInvocationinvocation)throwsException{//前置處理(如日志記錄、參數(shù)校驗)Stringresult=invocation.invoke();//觸發(fā)后續(xù)執(zhí)行//后置處理(如結(jié)果修改、資源釋放)returnresult;}}```需在struts.xml中配置攔截器和攔截器棧,將自定義攔截器加入默認?;蛱囟ˋction的攔截器列表。2.簡述Struts2值棧(ValueStack)的結(jié)構(gòu)及OGNL表達式如何訪問其中的對象?值棧是Struts2的核心數(shù)據(jù)存儲結(jié)構(gòu),采用OgnlValueStack實現(xiàn),包含兩部分:Root(對象棧):一個ArrayList,存儲當(dāng)前Action及相關(guān)對象,按入棧順序排列(后入棧的對象在棧頂)。Context(上下文):一個Map,存儲請求參數(shù)、請求屬性、會話屬性、應(yīng)用屬性等(鍵為"request"“session”等)。OGNL(對象圖導(dǎo)航語言)通過值棧解析表達式。訪問Root中的對象時,可直接使用屬性名(如),OGNL會從棧頂開始查找匹配的對象;訪問Context中的對象需通過符號(如session.user)。例如,若Root中有一個User對象(name="張三"),則${name}會輸出“張三”;若Context的session中存在key為“user”的對象,則${session.user.age}會獲取該用戶的年齡。3.Struts2中如何避免S2-057等路徑遍歷漏洞?S2-057漏洞源于對Action請求URL的處理邏輯缺陷,允許攻擊者通過構(gòu)造特殊URL(如/action/%24%7B...%7D)執(zhí)行任意OGNL表達式或路徑遍歷。防御措施包括:升級Struts2到最新版本(如2.5.30+),修復(fù)OGNL解析器的安全補?。唤脛討B(tài)方法調(diào)用(在struts.xml中配置struts.enable.DynamicMethodInvocation=false);限制請求參數(shù)的格式,過濾包含${}、%{}等危險字符的輸入;使用嚴格的URL映射配置,明確指定允許的Action和方法,避免通配符濫用;開啟開發(fā)模式時(struts.devMode=true)需額外注意,生產(chǎn)環(huán)境必須關(guān)閉該模式。4.Spring的IoC容器如何實現(xiàn)依賴注入?@Autowired和@Resource的區(qū)別是什么?SpringIoC(控制反轉(zhuǎn))通過容器管理Bean的創(chuàng)建和依賴關(guān)系,依賴注入(DI)是其具體實現(xiàn)方式,包括構(gòu)造器注入、setter注入和字段注入。容器通過讀取配置(XML、注解或Java配置)解析Bean的依賴,在實例化時將依賴對象注入目標(biāo)Bean。例如,通過@Autowired注解,容器會根據(jù)類型(byType)自動匹配并注入對應(yīng)的Bean;若存在多個同類型Bean,需結(jié)合@Qualifier指定名稱。@Autowired與@Resource的區(qū)別:來源不同:@Autowired是Spring注解,@Resource是JSR-250規(guī)范注解(屬于JavaEE,Spring支持);注入方式不同:@Autowired默認按類型注入,@Resource默認按名稱(name屬性)注入;處理null值不同:@Autowired默認要求依賴必須存在(可通過required=false允許null),@Resource無此限制;作用目標(biāo)不同:@Autowired可用于字段、方法、構(gòu)造器,@Resource主要用于字段和setter方法。5.SpringAOP的底層實現(xiàn)原理是什么?JDK動態(tài)代理和CGLIB的適用場景?SpringAOP基于動態(tài)代理模式實現(xiàn),支持兩種代理方式:JDK動態(tài)代理:通過java.lang.reflect.Proxy類提供,僅能代理實現(xiàn)了接口的類(代理對象是接口的實現(xiàn));CGLIB代理:通過ASM字節(jié)碼增強技術(shù)提供目標(biāo)類的子類(覆蓋父類方法),可代理無接口的類(需目標(biāo)類非final)。Spring默認優(yōu)先使用JDK動態(tài)代理(若目標(biāo)對象實現(xiàn)了接口),否則使用CGLIB。適用場景:接口驅(qū)動的業(yè)務(wù)層(如Service接口)推薦JDK代理,保持與接口編程的一致性;無接口的類或需要代理非public方法時,必須使用CGLIB代理;注意:目標(biāo)類若為final,CGLIB無法提供子類,此時AOP失效(需避免將核心業(yè)務(wù)類聲明為final)。6.如何解決Spring中的循環(huán)依賴問題?三級緩存的作用是什么?循環(huán)依賴指BeanA依賴BeanB,BeanB又依賴BeanA的情況。Spring僅能解決單例Bean的字段注入循環(huán)依賴(構(gòu)造器注入無法解決),核心機制是三級緩存:一級緩存(singletonObjects):存儲已初始化完成的單例Bean(成品);二級緩存(earlySingletonObjects):存儲已實例化但未完成屬性注入的Bean(半成品,用于解決循環(huán)依賴);三級緩存(singletonFactories):存儲ObjectFactory(工廠對象),用于提供早期Bean引用(解決AOP代理問題)。流程示例:創(chuàng)建A時,實例化A(未注入屬性),將A的ObjectFactory存入三級緩存;A需要注入B,觸發(fā)B的創(chuàng)建;B實例化后存入三級緩存,B需要注入A,從三級緩存獲取A的ObjectFactory提供早期A(可能是代理對象),將早期A存入二級緩存;B完成屬性注入后存入一級緩存;A從二級緩存獲取早期B,完成屬性注入后存入一級緩存。三級緩存的關(guān)鍵作用是在Bean未完全初始化時,通過工廠對象提供可能的代理對象(如AOP增強后的對象),避免原始對象與代理對象不一致的問題。7.Spring事務(wù)的傳播行為有哪些?@Transactional注解中rollbackFor和noRollbackFor的作用?Spring定義了7種事務(wù)傳播行為(通過Propagation枚舉類):REQUIRED(默認):當(dāng)前有事務(wù)則加入,無則新建;SUPPORTS:當(dāng)前有事務(wù)則加入,無則以非事務(wù)執(zhí)行;MANDATORY:當(dāng)前必須有事務(wù),無則拋異常;REQUIRES_NEW:新建事務(wù),當(dāng)前事務(wù)掛起;NOT_SUPPORTED:以非事務(wù)執(zhí)行,當(dāng)前事務(wù)掛起;NEVER:當(dāng)前必須無事務(wù),有則拋異常;NESTED:在當(dāng)前事務(wù)中嵌套執(zhí)行(通過保存點實現(xiàn))。@Transactional的rollbackFor指定需要回滾的異常類(默認僅回滾RuntimeException和Error),noRollbackFor指定不回滾的異常類。例如,@Transactional(rollbackFor=Exception.class)表示所有Exception及其子類都會觸發(fā)回滾;@Transactional(noRollbackFor=IOException.class)表示IOException不觸發(fā)回滾。8.Hibernate的Session生命周期是怎樣的?如何管理Session的正確關(guān)閉?Hibernate的Session是輕量級對象,對應(yīng)數(shù)據(jù)庫的一次會話,生命周期與數(shù)據(jù)庫連接綁定。典型生命周期階段:創(chuàng)建:通過SessionFactory.openSession()或getCurrentSession()獲取(getCurrentSession()與當(dāng)前線程綁定,由配置的CurrentSessionContext管理);使用:執(zhí)行CRUD操作(如save()、get()、update()),內(nèi)部通過JDBC與數(shù)據(jù)庫交互;關(guān)閉:調(diào)用session.close()釋放數(shù)據(jù)庫連接(若使用連接池,實際是歸還連接)。正確管理Session關(guān)閉需注意:使用ThreadLocal結(jié)合AOP(如Spring的OpenSessionInView)確保Session與線程綁定,避免手動關(guān)閉;在獨立應(yīng)用中,通過try-with-resources(Hibernate5.2+支持Session實現(xiàn)AutoCloseable)自動關(guān)閉:```javatry(Sessionsession=sessionFactory.openSession()){//執(zhí)行操作}//自動調(diào)用session.close()```避免在事務(wù)未提交時提前關(guān)閉Session(可能導(dǎo)致數(shù)據(jù)未持久化);使用getCurrentSession()時,事務(wù)提交或回滾后會自動關(guān)閉Session(由配置決定)。9.Hibernate一級緩存和二級緩存的區(qū)別是什么?如何配置二級緩存?一級緩存(Session級緩存)是Hibernate默認啟用的內(nèi)置緩存,生命周期與Session綁定,存儲當(dāng)前Session中加載過的實體對象。作用:避免同一Session內(nèi)重復(fù)查詢數(shù)據(jù)庫,提高性能(僅對當(dāng)前Session有效)。二級緩存(SessionFactory級緩存)是可選的進程級或集群級緩存,生命周期與SessionFactory綁定,可被多個Session共享。需顯式配置,支持EHCache、Infinispan等緩存提供商。作用:減少跨Session的重復(fù)查詢,適用于讀多寫少的場景。配置二級緩存步驟(以EHCache為例):1.添加EHCache依賴(如hibernate-ehcache);2.在hibernate.cfg.xml中啟用二級緩存:```xml<propertyname="hibernate.cache.use_second_level_cache">true</property><propertyname="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>```3.為需要緩存的實體類添加@Cache注解(JPA方式)或在映射文件中配置<cacheusage="read-write"/>;4.配置EHCache的ehcache.xml文件,定義緩存策略(如最大元素數(shù)、過期時間)。10.Hibernate如何解決N+1查詢問題?常見優(yōu)化手段有哪些?N+1問題指加載主對象(如Order)時,同時加載其關(guān)聯(lián)對象(如OrderItem),導(dǎo)致1次主查詢+N次關(guān)聯(lián)查詢(N為主對象數(shù)量)。例如:```javaList<Order>orders=session.createQuery("fromOrder",Order.class).list();for(Orderorder:orders){order.getItems().size();//觸發(fā)N次查詢OrderItem}```優(yōu)化手段:預(yù)加載(FetchType.EAGER):在映射關(guān)系中設(shè)置fetch=FetchType.EAGER,Hibernate會通過JOIN查詢一次性加載主對象和關(guān)聯(lián)對象(可能導(dǎo)致數(shù)據(jù)冗余);批量加載(BatchFetching):通過配置hibernate.default_batch_fetch_size設(shè)置批量加載數(shù)量,例如設(shè)置為5,則加載5個主對象后,一次性查詢這5個對象的關(guān)聯(lián)對象;延遲加載(FetchType.LAZY)+合并查詢:使用HQL的FETCHJOIN顯式指定關(guān)聯(lián)加載,例如:```javasession.createQuery("fromOrderojoinfetcho.items",Order.class).list();```該語句提供一條LEFTJOIN查詢,同時加載Order和OrderItem;啟用二級緩存:對關(guān)聯(lián)對象啟用二級緩存,減少重復(fù)查詢數(shù)據(jù)庫的次數(shù);使用統(tǒng)計查詢(如COUNT、SUM)替代逐條查詢,減少對關(guān)聯(lián)對象的訪問。11.Hibernate的HQL和SQL有什么區(qū)別?如何編寫動態(tài)HQL?HQL(Hibernate查詢語言)是面向?qū)ο蟮牟樵冋Z言,操作實體類和屬性;SQL是面向關(guān)系數(shù)據(jù)庫的查詢語言,操作表和字段。主要區(qū)別:語法對象:HQL使用類名、屬性名(如fromUserwherename=?),SQL使用表名、列名(如selectfromt_userwhereusername=?);支持特性:HQL支持繼承、多態(tài)、關(guān)聯(lián)對象導(dǎo)航(如user.orders),SQL需手動JOIN;方言處理:HQL由Hibernate自動轉(zhuǎn)換為對應(yīng)數(shù)據(jù)庫的SQL(依賴方言配置),SQL需手動適配不同數(shù)據(jù)庫。編寫動態(tài)HQL可通過String拼接或使用Query接口的條件方法(如CriteriaAPI,Hibernate5后推薦使用JPACriteriaAPI)。例如,使用String拼接實現(xiàn)動態(tài)條件查詢:```javaStringhql="fromUserwhere1=1";if(name!=null){hql+="andname=:name";}if(age!=null){hql+="andage>:age";}Query<User>query=session.createQuery(hql,User.class);if(name!=null){query.setParameter("name",name);}if(age!=null){query.setParameter("age",age);}List<User>users=query.list();```注意:需防范SQL注入(使用參數(shù)綁定:name,而非字符串拼接值)。12.Hibernate的事務(wù)管理與Spring事務(wù)管理如何整合?Hibernate自身提供了Transaction接口管理事務(wù)(session.beginTransaction()),但與Spring整合時,推薦使用Spring的聲明式事務(wù)管理(@Transactional)。整合步驟:1.配置Hibernate的SessionFactory(如LocalSessionFactoryBean),并注入數(shù)據(jù)源;2.配置Spring的PlatformTransactionManager(如HibernateTransactionManager),并注入SessionFactory;3.在需要事務(wù)的方法或類上添加@Transactional注解,Spring通過AOP攔截方法調(diào)用,管理事務(wù)的開啟、提交、回滾。關(guān)鍵配置示例(SpringBoot):```java@ConfigurationpublicclassHibernateConfig{@BeanpublicLocalSessionFactoryBeansessionFactory(DataSourcedataSource){LocalSessionFactoryBeanfactory=newLocalSessionFactoryBean();factory.setDataSource(dataSource);factory.setPackagesToScan("com.example.entity");PropertieshibernateProps=newProperties();hibernateProps.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL8Dialect");hibernateProps.setProperty("hibernate.hbm2ddl.auto","update");factory.setHibernateProperties(hibernateProps);returnfactory;}@BeanpublicPlatformTransactionManagertransactionManager(SessionFactorysessionFactory){returnnewHibernateTransactionManager(sessionFactory);}}```整合后,Spring會自動將Hibernate的Session與當(dāng)前線程綁定(通過TransactionSynchronizationManager),確保事務(wù)內(nèi)的多次Session操作使用同一連接。13.Struts2與Spring整合的核心配置步驟是什么?如何實現(xiàn)Action的Spring管理?Struts2與Spring整合的目標(biāo)是讓Struts2的Action由SpringIoC容器管理,便于依賴注入。核心配置步驟:1.添加struts2-spring-plugin依賴(自動整合Spring的WebApplicationContext);2.在web.xml中配置Spring的ContextLoaderListener,加載Spring配置:```xml<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>```3.在struts.xml中配置Struts2使用Spring創(chuàng)建Action實例,通過constant指定對象工廠:```xml<constantname="struts.objectFactory"value="spring"/>```4.Action類通過@Service、@Component等注解聲明為SpringBean(或在Spring配置文件中定義),Struts2會從Spring容器中獲取Action實例。示例Action類:```java@Service("userAction")publicclassUserActionextendsActionSupport{@AutowiredprivateUserServiceuserService;//由Spring注入ServicepublicStringexecute(){List<User>users=userService.getAllUsers();//業(yè)務(wù)邏輯returnSUCCESS;}}```整合后,Action的生命周期由Spring管理,可方便注入Service、DAO等依賴,避免手動管理對象創(chuàng)建。14.Hibernate6.x相比5.x有哪些重要改進?對項目遷移有何影響?Hibernate6.x(如6.2+)進行了大量重構(gòu)和優(yōu)化,主要改進包括:統(tǒng)一類型系統(tǒng)(UnifiedTypeSystem):合并Hibernate類型和JPA類型,簡化類型映射(如不再區(qū)分Hibernate的IntegerType和JPA的Integer);增強的JPQL/HQL解析器:支持更嚴格的語法檢查,兼容更多JPA3.1特性(如集合操作符、窗口函數(shù));性能優(yōu)化:改進查詢執(zhí)行計劃緩存,減少反射使用,提升啟動速度;移除過時特性:如CriteriaAPI舊版(org.hibernate.Criteria)、JDK8之前的日期類型支持(需使用java.time);多數(shù)據(jù)庫方言合并:優(yōu)化方言結(jié)構(gòu),減少重復(fù)代碼(如MySQL5.7和8.0方言合并)。遷移影響:需升級Hibernate依賴(排除舊版本),并檢查類型映射(如原Hibernate特有的類型需替換為JPA標(biāo)準(zhǔn)類型);舊版CriteriaAPI(org.hibernate.Criteria)需遷移至JPACriteriaAPI(javax.persistence.criteria);日期時間字段需使用java.time包(如LocalDateTime),不再支持java.util.Date(除非通過@Temporal注解兼容);部分配置參數(shù)名稱變更(如hibernate.dialect改為hiber
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 羽毛球衛(wèi)生球館制度
- 健身房衛(wèi)生管理制度大全
- 浴池工衛(wèi)生管理制度
- 陶瓷廠環(huán)境衛(wèi)生管理制度
- 日間照料衛(wèi)生室管理制度
- ?;翻h(huán)境衛(wèi)生管理制度
- 環(huán)衛(wèi)處愛國衛(wèi)生管理制度
- 省衛(wèi)生監(jiān)督管理制度
- 衛(wèi)生院違諾責(zé)任追究制度
- 居民區(qū)安全衛(wèi)生管理制度
- 銀行消保投訴分析培訓(xùn)
- 2020春人教版部編本三年級下冊語文全冊課文原文
- 《微生物與殺菌原理》課件
- 醫(yī)療機構(gòu)藥事管理規(guī)定版
- 北京市歷年中考語文現(xiàn)代文之議論文閱讀30篇(含答案)(2003-2023)
- 檔案學(xué)概論-馮惠玲-筆記
- 全國民用建筑工程設(shè)計技術(shù)措施-結(jié)構(gòu)
- (正式版)YST 1693-2024 銅冶煉企業(yè)節(jié)能診斷技術(shù)規(guī)范
- 1999年勞動合同范本【不同附錄版】
- 全國優(yōu)質(zhì)課一等獎職業(yè)學(xué)校教師信息化大賽《語文》(基礎(chǔ)模塊)《我愿意是急流》說課課件
- 初三寒假家長會ppt課件全面版
評論
0/150
提交評論