Java面试题

框架篇

一:Struts1运行

通过前端总控制器ActionServlet加载config.xml解析,在jsp页面发送请求,被ActionServlet接收,将请求参数放到对应的ActionForm中,根据config.xml映射关系找到Action方法,执行相应的业务逻辑,根据actionmapping的findforward方法返回一个actionForward,在config.xml找到对应的forward标签找到对应路径的jsp页面

二、Struts2的运行原理

1、tomcat 启动时加载 web.xml 、核心控制器 FilterDispatcher 会加载并解析 struts.xml
2、客户端会发送一个请求到 action 、FilterDispatcher 会根据后缀名进行拦截
3、FilterDispatcher根据 struts.xml 配置文件信息 找到 某个action 对应的某个类里的指定方法
4、执行相关的业务逻辑最后返回 一个String
5、 里配置 name的属性值与返回的String 进行匹配,跳转到指定的jsp 页面

三、Spring MVC运行原理

从一个HTTP请求开始:
1.Tomcat在启动时加载解析web.xml,找到spring mvc的前端总控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置文件信息。
2.DispatcherServlet接收到客户端请求,找到对应HandlerMapping,根据映射规则,找到对应的处理器(Handler)。
3.调用相应处理器中的处理方法,处理该请求后,会返回一个ModelAndView。
4.DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将要显示的数据传给对应的视图,最后显示给用户。

四、Struts1.x与Struts2.x的区别

Struts 2以WebWork为核心,
采用拦截器的机制来处理用户的请求,struts1严重依赖于servletAPI,
属于侵入性框架,struts2不严重依赖于servletAPI,属于非侵入型框架。
线程模型方面:
Struts1的Action是单实例的,
一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),
没有线程安全方面的问题
封装请求参数:
Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
struts1的前端总控制器(核心总控制器)为ActionServlet,
struts2的前端总控制器(核心总控制器)为FilterDispather

五、Spring MVC、struts1和struts2区别

1.spring mvc 单例 非线程安全
struts1单例 非线程安全
struts2线程安全对每个请求都产生一个实例
2.spring mvc的入口是servlet,而struts2是filter
spring 的前端总控制器为 DispatcherServlet
struts2 的前端总控制器为 FilterDispatcher
struts1 的前端总控制器为 actionServlet
3. 参数传递:struts是在接受参数的时候,
可以用属性来接受参数,这就说明参数是让多个方法共享的。
springmvc 用方法来接受参数
4.spring mvc是基于方法的设计,而sturts是基于类

六、Struts2中result中的type类型

1.dispatcher:它是默认的,用来转向页面,通常处理JSP
    2.redirect:将用户重定向到一个已配置好的URL
    3.redirectAction:将用户重定向到一个已定义好的action
    4.chain:将action和另外一个action链接起来
    5.freemarker:呈现Freemarker模板
    6.httpheader:返回一个已配置好的HTTP头信息响应
    7.stream:向浏览器发送InputSream对象对下载的内容和图片非常有用
    8.velocity:呈现Velocity模板
    9.xslt :该XML可以通过XSL模板进行转换
    10.plaintext:显示原始文件内容,例如文件源代码

七、Struts2标签

首先需要引用 <%@taglib prefix=“s” uri="/struts-tags"%>
1.<s:if></s:if> 判断标签 后面可跟 <s:else>
2.<s:iterator> </s:iterator> 迭代标签
3.<s:include></s:include> 引入标签 可以把一个JSP页面或者servlet引入一 个页面中
4.<s:property></s:property> 输出标签
5.<s:set></s:set> 标签赋予变量一个特定范围内的值
6.<s:form></s:form> 表单标签
7.<s:testarea></s:textarea> 文本域标签
8.<s:select></s:select> 下拉标签
9.<s:url></s:url> 声明一个url的路径
最常用的是:
判断<s:if></s:if>
循环<s:iterator></s:terator>
输出<s:property></s:property>

八、SSI整合

1、Action继承于Actionsupport
2、引入struts-spring-plugin.jar包,从而完成struts和spring的整合
3、在struts2的action中注入service,保证service的名字和配置文件中的一
致, 并生成get,set方法
4、Dao层继承于SqlMapClientDaoSupport
5、在dao层的配置文件中注入sqlMapClient

九:SSH整合

1、action继承ActionSupport
2、引入struts-spring-plugin.jar包,完成Struts和spring整合
3、Struts2的action中注入service,保证service的名字和配置文件名一致生成get/set方法
4、Dao层继承hibernateDaosupport
5、在dao层的配置文件中注入sessionFactory
Hibernate两大配置文件:
.hbm.xml:主键生成策略,映射关系、一对多、一对一关系
Hibernate.cfg.xml:数据库连接信息,包含
.hbm.xml内容,映射文件也可以配事务

十:Spring MVC整合

1、在web.xml配置核心控制器DispatcherServlet对指定后缀请求进行拦截
2、controller层加@controller注解,表示该类是MVC控制层
3、创建service接口,接口加注解@component或@service,这是业务处理层
4、在controller层声明service变量,给变量加上@Autowired注解通过自动绑定机制将service注入到controller (注:@Autowired默认是ByType,如果想根据属性名注入,那么就再加上注解 @Resource(name=“属性名”))
5.在Controller层的方法上加上注解 @RequestMapping(“requestAddress”) 表明该方法的请求地址
6.Dao层要加上注解 @Repository 表明这是数据库持久层
7.同样将dao实例注入到service层中。
8.配置视图解析器 “InternalResourceViewResolver”,对处理后的跳转进行统一配置。

十一、Hibernate 中get 和 load的区别

加载方式:
    load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才 发出sql语句);
    get为立即加载(执行时,会立即向数据库发出sql语句)
返回结果:
    load检索不到记录时,会抛ObjectNotFoundException异常
    get检索不到记录时,会返回null

十二:hibernate、lbatis、jdbc三者区别

hibernate属于全自动,开发效率高,执行效率较低
lbatis半自动居中、居中
jdbc手动较低、较高
因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低

十三:hibernate运行原理

configuration接口获取hibernate配置信息(hibernate.xml),一个configeration实例代表hibernate所有sql映射的集合,创建sessionFactory实例,把configeration对象的信息拷贝到sessionFactory的缓存中,通过调用sessionFactory创建session对象,通过session接口操纵数据库的访问

十四:Hibernate五大核心(类/接口)简述

1 .Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。(加载 hibernate.cfg.xml)并创建一个SessionFactory对象。
2 .SessionFactory接口
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建 Session对象。SessionFactory是线程安全的。
3 .Session接口
Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection
4 .Query与Criteria接口
总之Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语句或SQL 语句两种表达方式。
5 .Transaction接口
Transaction(事务)接口是一个可选的API。负责操作相关的事务。

十五、Hibernate与JDBC的区别

1、hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库.
2、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合
3、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
4、如果正确的使用JDBC技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术.
5、JDBC使用的是SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行。

十六、Hibernate中的两大配置文件

.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。
Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含
.hbm.xml内容,映射 文件,也可以配事务。

十七、Hibernate事务处理

开启事务 session.beginTransaction();
执行相关的操作,如果成功则session.getTransaction().commit();
执行操作失败则 session.getTransaction.rollback();

十八:Hibernate的三种状态以及状态的转换

Transient临时:new一个初始化对象后,没有在数据库保存数据处于临时状态;
Persistent持久化:执行save()方法,调用session.close()方法之前,内存中的对象与数据库有对应关系处于持久化状态;
Detached游离:执行session.close()之后处于游离状态;
状态转换:
处于托管状态下调用update()方法,转换为持久化状态;
在持久化状态下执行delete()方法,转换为临时状态;
在未初始化对象之前调用get、load、find、iterate之后直接进入持久化状态

十九:分页步骤

1、前台封装一个显示分页组件
2、查询总条数
3、后台封装分页工具类,计算开始位置,结束位置,总页数
4、后台写支持分页的sql语句
5、前台包含分页组件,实现分页效果
注意:查询总条数的where和查询列表信息的where条件保持一致

二十:Hibernate缓存概述

hibernate分为:
一级缓存(session级别缓存):事务级别缓存
二级缓存(sessionFactory缓存):应用级缓存
三级缓存:查询缓存
一级缓存的生命周期和session的生命周期保持一致,hibernate默认就启用了一级缓存,不能将其关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。
其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。
二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存插件如ehcache,oscache等。二级缓存也只能缓存对象。
三级缓存也叫查询缓存,查询缓存是针对普通属性结果集的缓存,
对实体对象的结果集只缓存id。对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存

二十一:SSH概述

ssh是web开发常见的一种框架
s-struts、s-spring、h-hibernate
Struts在框架中充当控制器实现MVC,处理用户请求,跳转页面,关注业务逻辑实现
spring在ssh充当粘合剂,Struts-spring-hibernate,进行事物控制
hibernate充当数据库持久层,数据交互,提高开发效率,通过反射机制,有灵活的映射性,一对一,一对多,多对多
在进行ssh整合的时候,我们应该注意:

  1. Action继承于ActionSupport
    引入struts-spring-plugin.jar包,从而完成struts和spring的整合
    在struts2的action中注入service,保证service的名字和配置文件中的一致,并生成get,set方法
    Dao层继承于hibernateDaoSupport
    在dao层的配置文件中注入sessionFactory

二十二:防止表单重复提交

1、用redirect解决重复提交问题,点击一次后按钮失效
2、通过loading自定义重复提交过滤器
3、解决Struts2重复提交可以结合s:tocken标签来解决重复提交
前端jsp页面加入s:token标签访问该页面生成隐藏域,包含一个随机生成的字符串,并存在session中。
在Struts2配置文件中加入token拦截器,正常访问时从session中取出该字符串,和页面隐藏域中提交的字符串做对比,一致正常执行并删除session中存储的字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱筱龙

你的支持是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值