您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 尚硅谷_JavaEE 面试
除了SSH以外还要会什么?提要•Struts2面试问题•Hibernate面试问题•Spring&SpringMVC面试问题•SpringSecurity&Shiro面试问题•JPA&SpringData面试问题•项目面试问题简述Struts2的工作流程•①.请求发送给StrutsPrepareAndExecuteFilter•②.StrutsPrepareAndExecuteFilter判定该请求是否是一个Struts2请求•③.若该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy•④.ActionProxy创建一个ActionInvocation的实例,并进行初始化•⑤.ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。•⑥.Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。调用结果的execute方法,渲染结果。•⑦.执行各个拦截器invocation.invoke()之后的代码•⑧.把结果发送到客户端StrutsPrepareAndExecuteFilterHttpServletRequestActionMapperActionProxyActionInvocationConfigurationManagerstruts.xmlInterceptor1Interceptor2Interceptor3ActionResultInterceptor3Interceptor2Interceptor1HttpServletResponseTemplateJSP、FreeMarker…TagSubsystemStruts2拦截器和过滤器的区别:•①、过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。•②、Struts2拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。•③、拦截器可以访问Action上下文(ActionContext)、值栈里的对象(ValueStack),而过滤器不能.•④、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。为什么要使用Struts2&Struts2的优点:•①.基于MVC架构,框架结构清晰。•②.使用OGNL:OGNL可以快捷的访问值栈中的数据、调用值栈中对象的方法•③.拦截器:Struts2的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的•④.多种表现层技术.如:JSP、FreeMarker、Velocity等Struts2如何访问HttpServletRequest、HttpSession、ServletContext三个域对象?•①.与ServletAPI解耦的访问方式•通过ActionContext访问域对象对应的Map对象•通过实现Aware接口使Struts2注入对应的Map对象•②.与ServletAPI耦合的访问方式•通过ServletActionContext直接获取ServletAPI对象•通过实现ServletXxxAware接口的方式使Struts2注入对应的对象Struts2中的默认包struts-default有什么作用?•①.struts-default包是struts2内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。•②.struts-default包是在struts-default.xml中定义,struts-default.xml也是Struts2默认配置文件。Struts2每次都会自动加载struts-default.xml文件。•③.通常每个包都应该继承struts-default包。说出struts2中至少5个的默认拦截器•exception;fileUpload;i18n;modelDriven;params;prepare;token;tokenSession;validation等谈谈ValueStack•①.ValueStack贯穿整个Action的生命周期,保存在request域中,所以ValueStack和request的生命周期一样.当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,Action.然后把Action存放进ValueStack,所以Action的实例变量可以被OGNL访问。请求来的时候,Action、ValueStack的生命开始;请求结束,Action、ValueStack的生命结束•②.值栈是多实例的,因为Action是多例的(和Servlet不一样,Servelt是单例的),而每个Action都有一个对应的值栈,Action对象默认保存在栈顶;•③.ValueStack本质上就是一个ArrayList(查看源代码得到);•④.使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;•⑤.Struts2重写了request的getAttribute方法,所以可以使用EL直接访问值栈中的内容ActionContext、ServletContext、pageContext的区别?•①.ActionContextStruts2的API:是当前的Action的上下文环境•②.ServletContext和PageContext是Servlet的APIStruts2有哪几种结果类型?•参看struts-default.xml中的相关配置:dispatcher、chain、redirect等.拦截器的生命周期与工作过程?•每个拦截器都是需要实现Interceptor接口•init():在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次.可以在该方法中对相关资源进行必要的初始化;•intercept(ActionInvocationinvocation):每拦截一个动作请求,该方法就会被调用一次;•destroy:该方法将在拦截器被销毁之前被调用,它在拦截器的生命周期内也只被调用一次;如何在Struts2中使用Ajax功能?•①.JSONplugin•②.DOJOplugin•③.DWRplugin•④.使用Stream结果类型.在Hibernate中Java对象的状态有哪些?•站在持久化的角度,Hibernate把对象分为4种状态:持久化状态,临时状态,游离状态,删除状态.Session的特定方法能使对象从一个状态转换到另一个状态.对象的状态转换图临时状态持久化状态游离状态删除状态new语句get()Load()Query.list()Query.uniqueResult()Query.iterator()Query.scoll()save()saveOrUpdate()persist()merge()evict()close()clear()update()saveOrUpdate()merge()delete()delete()垃圾回收垃圾回收垃圾回收1是否在Session缓存中2在数据表中是否有对应的记录Session的清理和清空有什么区别?•清理缓存调用的是session.flush()方法.而清空调用的是session.clear()方法.•Session清理缓存是指按照缓存中对象的状态的变化来同步更新数据库,但不清空缓存;清空是把Session的缓存置空,但不同步更新数据库;Session缓存数据库News对象news记录flush()News对象Session缓存Session缓存clear()reflesh()load()和get()的区别•①:如果数据库中,没有OID指定的对象。通过get方法加载,则返回的是一个null;通过load加载,则返回一个代理对象,如果后面代码如果调用对象的某个属性会抛出异常:org.hibernate.ObjectNotFoundException;•②:load支持延迟加载,get不支持延迟加载。hibernate优缺点•①.优点:•对JDBC访问数据库的代码做了封装,简化了数据访问层繁琐的重复性代码•映射的灵活性,它支持各种关系数据库,从一对一到多对多的各种复杂关系.•非侵入性、移植性会好•缓存机制:提供一级缓存和二级缓存•②.缺点:•无法对SQL进行优化•框架中使用ORM原则,导致配置过于复杂•执行效率和原生的JDBC相比偏差:特别是在批量数据处理的时候•不支持批量修改、删除描述使用Hibernate进行大批量更新的经验.•直接通过JDBCAPI执行相关的SQl语句或调用相关的存储过程是最佳的方式Hibernate的OpenSessionView问题•①.用于解决懒加载异常,主要功能就是把HibernateSession和一个请求的线程绑定在一起,直到页面完整输出,这样就可以保证页面读取数据的时候Session一直是开启的状态,如果去获取延迟加载对象也不会报错。•②.问题:如果在业务处理阶段大批量处理数据,有可能导致一级缓存里的对象占用内存过多导致内存溢出,另外一个是连接问题:Session和数据库Connection是绑定在一起的,如果业务处理缓慢也会导致数据库连接得不到及时的释放,造成连接池连接不够.所以在并发量较大的项目中不建议使用此种方式,可以考虑使用迫切左外连接(LEFTOUTERJOINFETCH)或手工对关联的对象进行初始化.•③.配置Filter的时候要放在Struts2过滤器的前面,因为它要页面完全显示完后再退出.Hibernate中getCurrentSession()和openSession()的区别?•①.getCurrentSession()它会先查看当前线程中是否绑定了Session,如果有则直接返回,如果没有再创建.而openSession()则是直接new一个新的Session并返回。•②.使用ThreadLocal来实现线程Session的隔离。•③.getCurrentSession()在事务提交的时候会自动关闭Session,而openSession()需要手动关闭.如何调用原生jdbcAPI?•调用Session的doWork()方法.说说Hibernate的缓存•Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存:•1).Hibernate一级缓存又称为“Session的缓存”,它是内置的,不能被卸载。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。•2).Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。•当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存删除、更新、增加数据的时候,同时更新缓存。开发中主要使用Spring的什么技术?•①.
本文标题:尚硅谷_JavaEE 面试
链接地址:https://www.777doc.com/doc-5734137 .html