【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(二)

简介: 【前言】别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 ……   【下载】个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员。想要word完整版下载的,评论里留言留下你的邮箱! 16.请写出hibernate中主键生成策略? 答:①incr

【前言】别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 ……  

【下载】个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员想要word完整版下载的,评论里留言留下你的邮箱!

16.请写出hibernate中主键生成策略?

答:increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制。

* Hibernate中提供的一种增长机制;

* 先进行查询:select max(id) from user

* 再进行插入:获得最大值+1作为新的记录的主键;

* 问题:不能在集群环境下或者有并发访问的情况下使用;

identity:适用于short,int,long作为主键。必须使用底层带有自动增长机制的数据库。

* 底层使用的是数据库的自动增长(auto_increment).Oracle数据库没有自动增长;

sequence:适用于short,int,long作为主键.底层使用的是序列的增长方式。

* Oracle数据库底层没有自动增长,想自动增长需要使用序列;

uuid:适用于char,varchar类型的作为主键.

* 使用随机的字符串作为主键;

native:本地策略.根据底层的数据库不同,自动选择适用于该种数据库的生成策略.(short,int,long)

* 如果底层使用的MySQL数据库:相当于identity

* 如果底层使用Oracle数据库:相当于sequence

assigned:主键的生成不用Hibernate管理了.必须手动设置主键。

17.具有相同名称的一组值,struts2如何实现封装

答:①对于String类型,Struts2会采用“, ”方法进行字符串连接。

如:23ad, 43e4, 65ds.....

解决:  String ids[] = model.getId().split(", ");

//调用业务方法,实现批量删除

deptService.delete(Dept.class, ids);

②对于Integer,Float,Date类型,Struts2默认接收的是最后一个值;

如:客户端给id传了三个值,id=3id=4id=5....服务器只能接受最后一个值,就是id=5

解决:private List<Integer> ids;//生成它的gettersetter

18.阐述实体对象的三种状态以及转换关系?

答:Hibernate中对象有三种状态:

瞬时态(transient):没有持久化标识OID,没有被纳入到Session对象的管理;

持久态(persistent):有持久化标识OID,已经被纳入到Session对象的管理;

游离态(detached)有持久化标识OID,没有被纳入到Session对象的管理;

 

注意:处在持久态的对象,有自动更新数据库的能力。尤其快照机制引起的:

19.简述Hibernate中快照机制的原理?

 

20.简述Hibernate中常见的优化策略?

答:①指定合理的缓存策略;

②采用合理的Session管理机制;

③尽量使用延迟加载特性;

④设定合理的批量处理参数;

⑤如果可以,选用UUID作为主键生成器;

⑥如果可以, 选用基于version的乐观锁替代悲观锁;

⑦开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项;

⑧数据库本身的优化(合理的索引,缓存,数据分区策略等)也会对持久层的性能带来可观的提升,这些需要专业的DBA提供支持;

21.谈一谈Hibernate的一级缓存、二级缓存和查询缓存?

答:HibernateSession提供了一级缓存的功能,默认总是有效的,当应用程序保存持久化实体、修改持久化实体时,Session并不会立即把这种改变提交到数据库,而是缓存在当前的Session中,除非显示调用了Sessionflush()方法或通过close()方法关闭Session。通过一级缓存,可以减少程序与数据库的交互,从而提高数据库访问性能。

SessionFactory级别的二级缓存是全局性的,所有的Session可以共享这个二级缓存。不过二级缓存默认是关闭的,需要显示开启并指定需要使用哪种二级缓存实现类(可以使用第三方提供的实现)。一旦开启了二级缓存并设置了需要使用二级缓存的实体类,SessionFactory就会缓存访问过的该实体类的每个对象,除非缓存的数据超出了指定的缓存空间。

③一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果希望对普通属性进行缓存,可以使用查询缓存。查询缓存是将HQLSQL语句以及它们的查询结果作为键值对进行缓存,对于同样的查询可以直接从缓存中获取数据。查询缓存默认也是关闭的,需要显示开启。

22.说出Servlet的生命周期?

答:Servlet的生命周期:

servlet是单实例多线程的

②默认第一次收到请求的时候,服务器创建servlet

③与此同时调用init方法,实现初始化操作,并调用service方法;

service方法会调用与请求对应的doGetdoPost等方法完成业务操作;

⑤以后每当收到请求的时候,都创建一个新的线程,同样服务器会调用service方法来处理业务逻辑;

⑥当服务器正常关闭或者servlet被移除的时候,服务器调用destroy方法,实现销毁操作。

23.请求转发(forward)和重定向(redirect)的区别?

答:① 请求转发是1次请求;重定向是2次请求;

② 请求转发地址栏不变;重定向地址栏改变;

③ 请求转发是request的方法;重定向是response的方法;

④ 请求转发的时候可以使用request域对象;而重定向不能使用;

⑤ 请求转发的路径是内部路径;重定向的路径是绝对路径;

⑥ 若访问站外资源,需要使用重定向;

24. getpost请求的区别?

答: get请求用来从浏览器上获取资源,而post是用来向服务器提交数据;

get会将表单中的数据,按照name=value的形式,添加到action所指向的URL后面,并且两者间使用“?”连接,各个变量之间使用“&”连接;post是将表单中的数据放在HTML头部(header),传递到action所指向URL,不会出现在地址栏中;

get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件只能使用post方式;

25.JSPServlet有有什么关系?

答:Servlet是一个特殊的Java程序,它运行于服务器的JVM中,依靠服务器的支持向浏览器提供显示内容;

JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于ServletJava程序,可以简化页面内容的生成;

ServletJSP最主要的不同点在于:Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是JavaHTML可以组合成一个扩展名为.jsp的文件(有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然,这个说法还是很片面的);

JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller);

26.JSP9个内置对象和4个域对象?

答:(19个内置对象:

  request:封装客户端的请求,其中包含来自GETPOST请求的参数;

  application:封装服务器运行环境的对象;

  response:封装服务器对客户端的响应;

  session:封装用户会话的对象;

  pageJSP页面本身(相当于Java程序中的this);

  configWeb应用的配置对象;

  exception:封装页面抛出异常的对象;

  pageContext:通过该对象可以获取其他对象;

  out(滚吧)用来传送回应的输出;

24个域对象

  page(当前页面)

  reques(一次请求)

  session( 一次会话)

  application(整个会话)

27.实现会话跟踪的技术有哪些?

答:由于HTTP协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配唯一的ID,下一次用户在请求中包含此ID,服务器根据此判断到底是哪一个用户。

  URL重写:在URL中添加会话信息作为请求的参数,或者将唯一的会话ID添加到URL结尾,以表示一个会话;

  ②设置表单隐藏域:将和会话跟踪相关的字段添加到隐藏域中,这些信息不会在浏览器显示,但是提交表单时会提交给服务器;

  cookiecookie有两种,一种是基于窗口的,浏览器关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置其有效路径和最大存活时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随相应信息储存在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器,让服务器识别用户身份。在使用cookie时要注意几点:首先不要在cookie中存放敏感信息;其次cookie存储的数据量有限(4k),不能将过多的内容存储cookie中;再者浏览器通常只允许一个站点最多存放20cookie。当然,和用户会话相关的其他信息(除了会话ID)也可以存在cookie方便进行会话跟踪;

  HttpSession:在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSessionsetAttribute方法可以将一个值放在HttpSession中,通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。与上面三种方式不同的是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存将满时将HttpSession中的对象移到其他存储设备中,但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializable接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。

28.你的项目中使用过哪些JSTL标签?

答:项目中主要使用了JSTL的核心标签库,包括<c:if><c:choose><c: when><c: otherwise><c:forEach>等,主要用于构造循环和分支结构,以控制显示逻辑。

29.使用标签库有什么好处?

答:使用标签库的好处包括以下几个方面:

  ①分离JSP页面的内容逻辑,简化Web开发;

  ②开发者可以创建自定义标签库来封装业务逻辑和显示逻辑;

  ③标签库具有很好的可移植性、可维护性和可重用性;

  ④避免了对Scriptlet(小脚本)的使用(很多公司的项目都不允许在JSP中书写小脚本)

30.表达式语言(EL)支持哪些运算符?

答:除了.[]运算符,EL还提供了:

①算术运算符:+-*/div%mod

②关系运算符:==eq!=ne>gt>=ge<lt<=le

③逻辑运算符:&&and||or!not

④条件运算符:${statement? A : B}(跟Java的三元运算符类似)

empty运算符:检查一个值是否为null或者空(数组长度为0或集合中没有元素也返回true

相关文章
|
16天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
46 2
|
5天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
29 14
|
21天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
26天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
23天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
46 4
|
24天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
78 4
|
24天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
38 1
|
1月前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
32 7
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
45 3
|
1月前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
15 2