版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频javassh面试题及答案1.Struts2中拦截器(Interceptor)的执行流程是怎样的?如何自定义一个拦截器?Struts2的拦截器机制是其核心功能之一,用于在Action执行前后进行预处理和后处理。完整的执行流程为:请求到达Struts2过滤器后,框架根据配置文件(struts.xml)找到对应的Action和拦截器栈;拦截器栈中的拦截器按顺序执行preHandle(前置处理),直到最后一个拦截器调用Action的execute方法;Action执行完成后,拦截器按逆序执行postHandle(后置处理),最终返回视图。自定义拦截器需实现erceptor.Interceptor接口,重写init()(初始化)、destroy()(销毁)和intercept(ActionInvocationinvocation)方法。在intercept方法中,通过invocation.invoke()触发后续拦截器或Action的执行。例如:```javapublicclassCustomInterceptorimplementsInterceptor{@Overridepublicvoidinit(){}@Overridepublicvoiddestroy(){}@OverridepublicStringintercept(ActionInvocationinvocation)throwsException{//前置处理(如日志记录、参数校验)Stringresult=invocation.invoke();//触发后续执行//后置处理(如结果修改、资源释放)returnresult;}}```需在struts.xml中配置拦截器和拦截器栈,将自定义拦截器加入默认栈或特定Action的拦截器列表。2.简述Struts2值栈(ValueStack)的结构及OGNL表达式如何访问其中的对象?值栈是Struts2的核心数据存储结构,采用OgnlValueStack实现,包含两部分:Root(对象栈):一个ArrayList,存储当前Action及相关对象,按入栈顺序排列(后入栈的对象在栈顶)。Context(上下文):一个Map,存储请求参数、请求属性、会话属性、应用属性等(键为"request"“session”等)。OGNL(对象图导航语言)通过值栈解析表达式。访问Root中的对象时,可直接使用属性名(如),OGNL会从栈顶开始查找匹配的对象;访问Context中的对象需通过符号(如session.user)。例如,若Root中有一个User对象(name="张三"),则${name}会输出“张三”;若Context的session中存在key为“user”的对象,则${session.user.age}会获取该用户的年龄。3.Struts2中如何避免S2-057等路径遍历漏洞?S2-057漏洞源于对Action请求URL的处理逻辑缺陷,允许攻击者通过构造特殊URL(如/action/%24%7B...%7D)执行任意OGNL表达式或路径遍历。防御措施包括:升级Struts2到最新版本(如2.5.30+),修复OGNL解析器的安全补丁;禁用动态方法调用(在struts.xml中配置struts.enable.DynamicMethodInvocation=false);限制请求参数的格式,过滤包含${}、%{}等危险字符的输入;使用严格的URL映射配置,明确指定允许的Action和方法,避免通配符滥用;开启开发模式时(struts.devMode=true)需额外注意,生产环境必须关闭该模式。4.Spring的IoC容器如何实现依赖注入?@Autowired和@Resource的区别是什么?SpringIoC(控制反转)通过容器管理Bean的创建和依赖关系,依赖注入(DI)是其具体实现方式,包括构造器注入、setter注入和字段注入。容器通过读取配置(XML、注解或Java配置)解析Bean的依赖,在实例化时将依赖对象注入目标Bean。例如,通过@Autowired注解,容器会根据类型(byType)自动匹配并注入对应的Bean;若存在多个同类型Bean,需结合@Qualifier指定名称。@Autowired与@Resource的区别:来源不同:@Autowired是Spring注解,@Resource是JSR-250规范注解(属于JavaEE,Spring支持);注入方式不同:@Autowired默认按类型注入,@Resource默认按名称(name属性)注入;处理null值不同:@Autowired默认要求依赖必须存在(可通过required=false允许null),@Resource无此限制;作用目标不同:@Autowired可用于字段、方法、构造器,@Resource主要用于字段和setter方法。5.SpringAOP的底层实现原理是什么?JDK动态代理和CGLIB的适用场景?SpringAOP基于动态代理模式实现,支持两种代理方式:JDK动态代理:通过java.lang.reflect.Proxy类提供,仅能代理实现了接口的类(代理对象是接口的实现);CGLIB代理:通过ASM字节码增强技术提供目标类的子类(覆盖父类方法),可代理无接口的类(需目标类非final)。Spring默认优先使用JDK动态代理(若目标对象实现了接口),否则使用CGLIB。适用场景:接口驱动的业务层(如Service接口)推荐JDK代理,保持与接口编程的一致性;无接口的类或需要代理非public方法时,必须使用CGLIB代理;注意:目标类若为final,CGLIB无法提供子类,此时AOP失效(需避免将核心业务类声明为final)。6.如何解决Spring中的循环依赖问题?三级缓存的作用是什么?循环依赖指BeanA依赖BeanB,BeanB又依赖BeanA的情况。Spring仅能解决单例Bean的字段注入循环依赖(构造器注入无法解决),核心机制是三级缓存:一级缓存(singletonObjects):存储已初始化完成的单例Bean(成品);二级缓存(earlySingletonObjects):存储已实例化但未完成属性注入的Bean(半成品,用于解决循环依赖);三级缓存(singletonFactories):存储ObjectFactory(工厂对象),用于提供早期Bean引用(解决AOP代理问题)。流程示例:创建A时,实例化A(未注入属性),将A的ObjectFactory存入三级缓存;A需要注入B,触发B的创建;B实例化后存入三级缓存,B需要注入A,从三级缓存获取A的ObjectFactory提供早期A(可能是代理对象),将早期A存入二级缓存;B完成属性注入后存入一级缓存;A从二级缓存获取早期B,完成属性注入后存入一级缓存。三级缓存的关键作用是在Bean未完全初始化时,通过工厂对象提供可能的代理对象(如AOP增强后的对象),避免原始对象与代理对象不一致的问题。7.Spring事务的传播行为有哪些?@Transactional注解中rollbackFor和noRollbackFor的作用?Spring定义了7种事务传播行为(通过Propagation枚举类):REQUIRED(默认):当前有事务则加入,无则新建;SUPPORTS:当前有事务则加入,无则以非事务执行;MANDATORY:当前必须有事务,无则抛异常;REQUIRES_NEW:新建事务,当前事务挂起;NOT_SUPPORTED:以非事务执行,当前事务挂起;NEVER:当前必须无事务,有则抛异常;NESTED:在当前事务中嵌套执行(通过保存点实现)。@Transactional的rollbackFor指定需要回滚的异常类(默认仅回滚RuntimeException和Error),noRollbackFor指定不回滚的异常类。例如,@Transactional(rollbackFor=Exception.class)表示所有Exception及其子类都会触发回滚;@Transactional(noRollbackFor=IOException.class)表示IOException不触发回滚。8.Hibernate的Session生命周期是怎样的?如何管理Session的正确关闭?Hibernate的Session是轻量级对象,对应数据库的一次会话,生命周期与数据库连接绑定。典型生命周期阶段:创建:通过SessionFactory.openSession()或getCurrentSession()获取(getCurrentSession()与当前线程绑定,由配置的CurrentSessionContext管理);使用:执行CRUD操作(如save()、get()、update()),内部通过JDBC与数据库交互;关闭:调用session.close()释放数据库连接(若使用连接池,实际是归还连接)。正确管理Session关闭需注意:使用ThreadLocal结合AOP(如Spring的OpenSessionInView)确保Session与线程绑定,避免手动关闭;在独立应用中,通过try-with-resources(Hibernate5.2+支持Session实现AutoCloseable)自动关闭:```javatry(Sessionsession=sessionFactory.openSession()){//执行操作}//自动调用session.close()```避免在事务未提交时提前关闭Session(可能导致数据未持久化);使用getCurrentSession()时,事务提交或回滚后会自动关闭Session(由配置决定)。9.Hibernate一级缓存和二级缓存的区别是什么?如何配置二级缓存?一级缓存(Session级缓存)是Hibernate默认启用的内置缓存,生命周期与Session绑定,存储当前Session中加载过的实体对象。作用:避免同一Session内重复查询数据库,提高性能(仅对当前Session有效)。二级缓存(SessionFactory级缓存)是可选的进程级或集群级缓存,生命周期与SessionFactory绑定,可被多个Session共享。需显式配置,支持EHCache、Infinispan等缓存提供商。作用:减少跨Session的重复查询,适用于读多写少的场景。配置二级缓存步骤(以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文件,定义缓存策略(如最大元素数、过期时间)。10.Hibernate如何解决N+1查询问题?常见优化手段有哪些?N+1问题指加载主对象(如Order)时,同时加载其关联对象(如OrderItem),导致1次主查询+N次关联查询(N为主对象数量)。例如:```javaList<Order>orders=session.createQuery("fromOrder",Order.class).list();for(Orderorder:orders){order.getItems().size();//触发N次查询OrderItem}```优化手段:预加载(FetchType.EAGER):在映射关系中设置fetch=FetchType.EAGER,Hibernate会通过JOIN查询一次性加载主对象和关联对象(可能导致数据冗余);批量加载(BatchFetching):通过配置hibernate.default_batch_fetch_size设置批量加载数量,例如设置为5,则加载5个主对象后,一次性查询这5个对象的关联对象;延迟加载(FetchType.LAZY)+合并查询:使用HQL的FETCHJOIN显式指定关联加载,例如:```javasession.createQuery("fromOrderojoinfetcho.items",Order.class).list();```该语句提供一条LEFTJOIN查询,同时加载Order和OrderItem;启用二级缓存:对关联对象启用二级缓存,减少重复查询数据库的次数;使用统计查询(如COUNT、SUM)替代逐条查询,减少对关联对象的访问。11.Hibernate的HQL和SQL有什么区别?如何编写动态HQL?HQL(Hibernate查询语言)是面向对象的查询语言,操作实体类和属性;SQL是面向关系数据库的查询语言,操作表和字段。主要区别:语法对象:HQL使用类名、属性名(如fromUserwherename=?),SQL使用表名、列名(如selectfromt_userwhereusername=?);支持特性:HQL支持继承、多态、关联对象导航(如user.orders),SQL需手动JOIN;方言处理:HQL由Hibernate自动转换为对应数据库的SQL(依赖方言配置),SQL需手动适配不同数据库。编写动态HQL可通过String拼接或使用Query接口的条件方法(如CriteriaAPI,Hibernate5后推荐使用JPACriteriaAPI)。例如,使用String拼接实现动态条件查询:```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注入(使用参数绑定:name,而非字符串拼接值)。12.Hibernate的事务管理与Spring事务管理如何整合?Hibernate自身提供了Transaction接口管理事务(session.beginTransaction()),但与Spring整合时,推荐使用Spring的声明式事务管理(@Transactional)。整合步骤:1.配置Hibernate的SessionFactory(如LocalSessionFactoryBean),并注入数据源;2.配置Spring的PlatformTransactionManager(如HibernateTransactionManager),并注入SessionFactory;3.在需要事务的方法或类上添加@Transactional注解,Spring通过AOP拦截方法调用,管理事务的开启、提交、回滚。关键配置示例(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与当前线程绑定(通过TransactionSynchronizationManager),确保事务内的多次Session操作使用同一连接。13.Struts2与Spring整合的核心配置步骤是什么?如何实现Action的Spring管理?Struts2与Spring整合的目标是让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创建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();//业务逻辑returnSUCCESS;}}```整合后,Action的生命周期由Spring管理,可方便注入Service、DAO等依赖,避免手动管理对象创建。14.Hibernate6.x相比5.x有哪些重要改进?对项目迁移有何影响?Hibernate6.x(如6.2+)进行了大量重构和优化,主要改进包括:统一类型系统(UnifiedTypeSystem):合并Hibernate类型和JPA类型,简化类型映射(如不再区分Hibernate的IntegerType和JPA的Integer);增强的JPQL/HQL解析器:支持更严格的语法检查,兼容更多JPA3.1特性(如集合操作符、窗口函数);性能优化:改进查询执行计划缓存,减少反射使用,提升启动速度;移除过时特性:如CriteriaAPI旧版(org.hibernate.Criteria)、JDK8之前的日期类型支持(需使用java.time);多数据库方言合并:优化方言结构,减少重复代码(如MySQL5.7和8.0方言合并)。迁移影响:需升级Hibernate依赖(排除旧版本),并检查类型映射(如原Hibernate特有的类型需替换为JPA标准类型);旧版CriteriaAPI(org.hibernate.Criteria)需迁移至JPACriteriaAPI(javax.persistence.criteria);日期时间字段需使用java.time包(如LocalDateTime),不再支持java.util.Date(除非通过@Temporal注解兼容);部分配置参数名称变更(如hibernate.dialect改为hiber
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 羽毛球卫生球馆制度
- 健身房卫生管理制度大全
- 浴池工卫生管理制度
- 陶瓷厂环境卫生管理制度
- 日间照料卫生室管理制度
- 危化品环境卫生管理制度
- 环卫处爱国卫生管理制度
- 省卫生监督管理制度
- 卫生院违诺责任追究制度
- 居民区安全卫生管理制度
- 银行消保投诉分析培训
- 2020春人教版部编本三年级下册语文全册课文原文
- 《微生物与杀菌原理》课件
- 医疗机构药事管理规定版
- 北京市历年中考语文现代文之议论文阅读30篇(含答案)(2003-2023)
- 档案学概论-冯惠玲-笔记
- 全国民用建筑工程设计技术措施-结构
- (正式版)YST 1693-2024 铜冶炼企业节能诊断技术规范
- 1999年劳动合同范本【不同附录版】
- 全国优质课一等奖职业学校教师信息化大赛《语文》(基础模块)《我愿意是急流》说课课件
- 初三寒假家长会ppt课件全面版
评论
0/150
提交评论