全部面试笔记-2

​ Java面试的笔记-2,全面回忆

4.前端部分

4-1.html,css,javascript在网页开发中的定位?

HTML 超文本标记语言 定义网页的结构

CSS 层叠样式表,用来美化页面

JavaScript主要用来验证表单,做动态交互(其中ajax)

4-2.Ajax?

​ 什么是Ajax?

​ 异步的javascript和xml

​ 作用是什么?

​ 通过AJAX与服务器进行数据交换,AJAX可以使网页实现布局更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

​ 怎么来实现Ajax的XmlHttpRequest对象,使用这个对象可以异步向服务器发送请求,获取获取响应,完成局部更新。Open send responseText/responseXML 局部响应。

​ 使用场景:登陆失败时不跳转页面,注册时提示用户名是否存在,二级联动等等使用场景

4-3.js和jQuery的关系?

​ jQuery是一个js框架,封装了js的属性和方法,让用户使用起来更加便利,并且增强了js的功能.

​ 使用原生js是要处理很多兼容性的问题(注册事件等),由jQuery封装了底层,就不用处理兼容性问题。

​ 原生的js的dom和事件绑定和Ajax等操作非常麻烦,jQuery封装以后操作非常方便。

4-4.jQuery的常用选择器?

  • ID选择器 通过ID获取一个元素

  • Class选择器 通过类(css)获取元素

  • 标签选择器 通过标签获取元素

  • 通用选择器(*) 获取所以的元素

    ​ div.myCls 获取有myCls这个类的div

  • 层次选择器

    ​ 儿子选择器 > 获取下面的子元素

    ​ 后代选择器 空格 获取下面后代,包括儿子、孙子等后代

  • 属性选择器

1
2
3
4
5
6
7
8
Tag[attrName=’test’] 
获取有属性名为xxxx并且属性的值为test的所有xxx标签

<input type="checkbox" name="hobby"/> 吃饭<br/>
<input type="checkbox" name="hobby"/> 睡觉<br/>

Input[name=’hobby’]
表示获取属性名为name并且name属性值为hobby的的所有input标签元素

4-5.jQuery的页面加载完毕事件?

​ 需要获取元素,但是必须等到该元素被加载完成后才能获取。我们可以把js代码放到该元素的后面,但是这样就会造成js在我们的body中存在不好管理。所有页面加载完毕后所有的元素当然已经加载完毕。一般获取元素做操作都要在页面加载完毕后操作。

$(document).ready(function(){}); $(function(){});
$(document)把原生的document这个dom对象转换为jQuery对象,转换完成后才能调用ready方法 当页面加载完毕后执行里面的函数,这一种相对简单,用得最多。
ready(fn),表示的是页面结构被加载完毕后执行传入函数fn

window.onload的区别

​ 1、jQuery中的页面加载完毕事件,表示的是页面结构被加载完毕。

​ 2、window.onload 表示的是页面被加载完毕。

onload必须等等页面中的图片、声音、图像等远程资源被加载完毕后才调用

jQuery中只需要页面结构被加载完毕。

4-6.Jquery的Ajax和原生Js实现Ajax有什么关系?

​ jQuery中的Ajax也是通过原生的js封装的。封装完成后让我们使用起来更加便利,不用考虑底层实现或兼容性等处理。

​ 如果采用原生js实现Ajax是非常麻烦的,并且每次都是一样的。如果我们不使用jQuery我们也要封装Ajax对象的方法和属性。

​ 有像jQuery这些已经封装完成,并经过很多企业实际的框架,比较可靠并且开源。我们就不需要封装,直接使用成熟的框架(jQuery)即可.

4-7.html5?

​ Html5是最新版本的html,是在原来html4的基础上增强了一些标签。

​ Html增加一些像画板、声音、视频、web存储等高级功能。但是html5有一个不好的地方,那就是html5太强调语义了,导致开发中都不知道要选择那个标签。

​ 在做页面布局是,无论头部、主题、导航等模块都使用div来表示,但是html5的规范,需要使用不同的标签来表示。(header footer等)

4-8.css3?

Css3是最新版本的css,是对原理css2的功能增强。

Css3中提供一些原来css2中实现起来比较困难或者不能实现的功能。

​ 1、盒子圆角边框

​ 2、盒子和文字的阴影

​ 3、渐变

​ 4、转换 移动、缩放、旋转等

​ 5、过渡、动画都可以使用动画。

​ 6、可以使用媒体查询实现响应式网站。

Css3最大缺点就是要根据不同的浏览器处理兼容性。对应有一些处理兼容性的工具。不用担心.

4-9.bootstrap是什么?

​ BootStrap是一个移动设备优先的UI框架。我们可以不用谢任何css,js代码就能实现比较漂亮的有交互性的页面。我们程序员对页面的编写是有硬伤的,所有要自己写页面的话就要使用类似于bootstrap这样的UI框架。

5.后端部分

5-1.什么是框架?

框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。

​ IT语境中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。

​ 1)框架本身一般不完整到可以解决特定问题,但是可以帮助您快速解决特定问题;

​ 2)框架天生就是为扩展而设计的;

​ 3)框架里面可以为后续扩展的组件提供很多辅助性、支撑性的方便易用的实用工具(utilities),也就是说框架时常配套了一些帮助解决某类问题的库(libraries)或工具(tools)。

​ java中就是一系列的jar包,其本质就是对jdk功能的扩展.

5-2. MVC模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写

​ 一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

​ 最简单的、最经典就是Jsp(view) +Servlet(controller) + JavaBean(model)

6

​ 1、当控制器收到来自用户的请求

​ 2、控制器调用JavaBean完成业务

​ 3、完成业务后通过控制器跳转JSP页面的方式给用户反馈信息

​ 4、Jsp个 用户做出响应。

5-3.MVC框架

​ 是为了解决传统MVC模式(Jsp + Servlet + JavaBean)的一些问题而出现的框架。

传统MVC模式问题

​ 1、所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml就太庞大,并且不能实现模块化管理。

​ 2、Servlet的主要功能就是接受参数、调用逻辑、跳转页面,比如像其他字符编码、文件上传等功能也要写在Servlet中,不能让Servlet主要功能而需要做处理一下特例。

​ 3、接受参数比较麻烦(String name = request.getParameter(“name”),User user=new User user.setName(name)),不能通过model接收,只能单个接收,接收完成后转换封装model.

​ 4、跳转页面方式比较单一(forword,redirect),并且当我的页面名称发生改变时需要修改Servlet源代码.

5-4.SpringMVC的执行流程?

  1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

  3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)

  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

  5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

  6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

  7. ViewResolver 结合Model和View,来渲染视图

  8. 将渲染结果返回给客户端。

7

​ HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

​ 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

​ 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

​ 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

面试:

1、 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获(捕获)

2、 DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;(查找handler)

3、 DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller), Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象(执行handler)

4、DispatcherServlet 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver) (选择ViewResolver)

5、通过ViewResolver 结合Model和View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回)

快速记忆技巧:

​ 核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回

5-5.struts2和springMVC有什么不同?

对SpringMvc和Struts2进行各方面的比较:

  1. 核 心控制器(前端控制器、预处理控制器):对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求 (控制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。

  2. 控制器实例:Spring Mvc会比Struts快一些(理论上)。Spring Mvc是基于方法设计,而Sturts是基于对象,每次发一次请求都会实例一个action,每个action都会被注入 属性,而Spring更像Servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题)。

  3. 管理方式:大部分的公司的核心架构中,就会使用到spring,而spring mvc又是spring中的一个模块,所以spring对于spring mvc的控制器管理更加简单方便,而且提供了全 注解方式进行管理,各种功能的注解都比较全面,使用简单,而struts2需要采用XML很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那 样使用)。

  4. 参数传递:Struts2中自身提供多种参数接受,其实都是通过(ValueStack)进行传递和赋值,而SpringMvc是通过方法的参数进行接收。

  5. 学习难度:Struts更加很多新的技术点,比如拦截器、值栈及OGNL表达式,学习成本较高,springmvc 比较简单,很较少的时间都能上手。

  6. intercepter 的实现机制:struts有以自己的interceptor机制,spring mvc用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。

  7. spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

  8. spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间 也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

  9. spring mvc处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,spring mvc自动帮我们对象转换为JSON数据。而struts2是通过插件的方式进行处理

​ 在SpringMVC流行起来之前,Struts2在MVC框架中占核心地位,随着SpringMVC的出现,SpringMVC慢慢的取代struts2,但是很多企业都是原来搭建的框架,使用Struts2较多。

5-6.Spring中的两大核心?

​ Spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

  1. IOC(Inversion of Control )或DI(Dependency Injection):控制权反转

​ 原来:我的Service需要调用DAO,Service就需要创建DAO

​ Spring:Spring发现你Service依赖于dao,就给你注入.

​ 核心原理:就是配置文件+反射(工厂也可以)+容器(map)

2、AOP:面向切面编程

​ 核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。

​ 我们主要使用AOP来做:

​ 1、事务处理

​ 2、权限判断

​ 3、日志

​ 4、….

5-7.AOP是什么?你都拿它做什么?

AOP:面向切面编程

​ 核心原理:使用动态代理的设计模式在执行方法前后或出现异常做加入相关逻辑。

​ 我们主要使用AOP来做:

​ 1、事务处理:执行方法前,开启事务、执行完成后关闭事务、出现异常后回滚事务

​ 2、权限判断:在执行方法前,判断是否具有权限

​ 3、日志:在执行前进行日志处理

​ 4、….

5-8.Spring的事务传播特性

  1. PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启

  2. PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

  3. PROPAGATION_MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

  4. PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

  5. PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。

  6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常

  7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED属性执行

Required: 需要:如果存在一个事务,则支持当前事务。如果没有事务则开启

Supports: 支持:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

Mandatory: 必要的:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

required_new: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

Not_support: 总是非事务地执行,并挂起任何存在的事务。

Never: 绝不:总是非事务地执行,如果存在一个活动事务,则抛出异常

Nested: 嵌套的:如果有就嵌套、没有就开启事务

5-9.Spring事务的隔离级别

  1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。 另外四个与JDBC的隔离级别相对应

  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。

  3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

其中的一些概念的说明:

  • 脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一 个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
  • 不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。 那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
  • 幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及 到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

5-10.什么是ORM?

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象关系数据库存在的互不匹配的现象的技术。

​ 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

​ 那么,到底如何实现持久化呢?

​ 一种简单的方案是采用硬编码方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。

这种方案存在以下不足:

​ 1.持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口

​ 2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化曾的相关程序代码,增加了软件的维护难度。

​ ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。

​ Java典型的ORM框架有:Hibernate、mybatis、speedframework。

ORM的方法论基于三个核心原则:

   简单:以最基本的形式建模数据。

   传达性:数据库结构被任何人都能理解的语言文档化。

   精确性:基于数据模型创建正确标准化了的结构

5-11.mybatis与Hibernate有什么不同?

相同点:

​ 都是java中orm框架、屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以完成对数据库的持久化操作。

​ jdbc api编程流程固定,还将sql语句与java代码混杂在了一起,经常需要拼凑sql语句,细节很繁琐。

mybatis的好处:

  • 屏蔽jdbc api的底层访问细节
  • 将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能.queryForList返回对象集合,用queryForObject返回单个对象
  • 提供了自动将实体对象的属性传递给sql语句的参数。

Hibername的好处:

  • Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,并执行并返回java结果。

不同点:

​ 1、hibernate要比mybatis功能强大很多。因为hibernate自动生成sql语句。

​ 2、mybatis需要我们自己在xml配置文件中写sql语句,hibernate我们无法直接控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用mybatis就是不错的选择,因为mybatis还是由我们自己写sql语句。

​ 3、mybatis可以出来复杂语句,而hibernate不能。

​ 4、mybatis要比hibernate简单的多。mybatis是面向sql的,不同考虑对象间一些复杂的映射关系。

6.其他方面(待续…)

-------------本文结束感谢您的阅读-------------

本文标题:全部面试笔记-2

文章作者:Linhuide

发布时间:2020年03月25日 - 20:03

最后更新:2020年03月25日 - 22:03

原始链接:https://linhuide.github.io/post/c0e5897b.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!