Java Web+数据处理+主流框架面试题

一,请阐述HTTP请求的结构:

  1. HTTP请求包含三部分:请求行、请求头、请求体
    请求行–通常在HTTP的第一行,说明了发送的方式(get/post),发送的地址、和HTTP的版本号。
    请求头–说明了,从浏览器到服务器发送到辅助信息。
    Accept-Language:zh-CN 说明浏览器优先使用中文
    User-Agent:代表了用户的使用环境(判断用户使用的是手机还会电脑进行的访问,然后根据浏览器的规格不停进行不同的展现)
    Content-Type:说明了提交的表单的格式
    请求体–由浏览器向服务器发送的真实数据,请求题中,数据使用键值对的形式“键”和“值”之间使用“=”连接。多个键值对之间使用“&”进行分隔。(请求体,只有在post请求中才会存在,get请求中是没有请求体这一项的)请求体会被附加在url 后面发送到服务器。
    在这里插入图片描述
  2. 响应–有服务器返回给浏览器的结果
    HTTP响应包含3部分内容:响应行、响应头、响应体。
    响应行–通常在响应的第一行,包含http版本、状态码、状态码的英文描述
    200–表示访问成功
    404–表示资源未找到
    500–代表的是服务器的内部错误。
    响应头–表述了返回数据的一些辅助信息,使用了哪种web服务器、
    Service–表示使用了哪种web服务器、
    Content-Type:表示数据返回给浏览器以后,浏览器采用什么样的方式进行处理呢。(text/html–表示把返回的数据解释成html进行显示)
    Date–响应数据产生的时间
    响应体–服务器向浏览器返回的真实数据,(html片段、二进制的内容、xml)

二,请说明Servlet执行流程?

  • 客户端向tomcat服务器发送http请求,包含servlet映射地址和要传递的参数–》tomcat解析每一个web.xml文件,找到与之匹配的url和对应的servlet name–》根据servlet name找到对应的servlet,并对这个servlet进行实例化和初始化–》tomcat执行servlet实例中的service()方法–》方法运行后把程序执行结果通过响应返回浏览器–》浏览器接收到这段代码后进行解释。
    在这里插入图片描述

三,Servlet实例化时机:
servlet默认情况下是第一次访问的时候实例化的,也可以通过web.xml配置loadon-startup,使其在十五期启动时候实例化

四,servlet在并发环境下是如何处理的?
servlet是基于单例多线程处理的并发情况。利用多线程技术提供web服务。

五,多线程处理的情况下,如何解决线程安全问题?
所有的线程,都共享一个servlet实例。所以我们在使用servlet时,不允许在servlet内创建,存在状态的变量和对象。因为这样会在并发访问时产生无法预期的结果。

六,Servlet声明周期是什么?

  1. 装载–java应用程序启动的时候,tomcat会扫描web.xml文件,得知当前有哪些servlet.(装载时并不会实例化Servlet)(创建时java层面的对象创建)
  2. 创建–当 url 第一次访问servlet地址的时候进行创建。同时执行构造函数。
  3. 初始化–servlet在创建对象以后,马上执行init()初始化函数,对servlet进行初始化。(初始化,是servlet自身专门用于初始化servlet执行资源的方法)
  4. 提供服务–service()方法。
    servlce()方法–对于发来的请求(无论是post/get),一律使用servlet方法接收处理。
    如果将请求细化,service()方法下还可以细化为doGet()/doPost()方法。doGet()–只处理get请求,
    doPost()–只处理post请求。
  5. 销毁–在web应用重启或关闭时使用destory()方法将servlet的资源彻底销毁。

七,请求转发与响应重定向之间的区别

javaweb中有两种资源跳转的方式:

  1. 请求转发–是服务器跳转,只会产生一次请求。会将请求原封不动的转发给下一个请求。(服务器跳转)
  • 语法:request.getRequestDispatcher().forward();
  • 执行过程:浏览器向tomcat发送一个请求–》tomcat收到请求后,使用对应servlet对请求进行处理–》并在处理完后执行request.getRequestDispatcher().forward();–》把请求原封不动派发给另一个servlet–》servlet对请求进行处理后,产生响应对象–》通过tomcat把对应响应结果发送给浏览器–》浏览器看到最终响应结果(全局有且只有1个请求,且资源的跳转是在服务器内部产生的,浏览器感觉不到)
  • 地址栏:请求转发只会显示唯一请求的url
    在这里插入图片描述
  1. 响应重定向:是浏览器端的跳转,会产生2次请求
  • 语法:response.sendRedirect()
  • 执行过程:浏览器向tomcat发起请求–》送达后servlet1调用response.sendRedirect()方法,返回一个响应通过tomcat发给浏览器,告诉浏览器创建一个新的请求–》浏览器接收到信息,发送第二个请求给servlet2–》servlet2对请求2进行处理,并把结果返回给浏览器–》浏览器显示结果
  • 地址栏:只会显示第二次响应的url
    在这里插入图片描述
    八,session的工作原理
    session–又被称为用户会话,与客户端浏览器窗口绑定的,且存储在服务器内部的用户数据。
    session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器的cookie中。只要浏览器没关闭,这个cookie是一直存在的。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。
    在这里插入图片描述
    八,JSP九大内置对象:
    在这里插入图片描述

数据处理

1. JDBC 中使用Statement 和 PreparedStatement的区别

  1. PreparedStatement是预编译的SQL语句,效率高于Statement。尤其执行复杂SQL语句或频繁执行某一SQL时,执行效率优势更明显。

  2. PreparedStatement是支持参数化操作的,相比于Statement使用字符串连接阻止SQL语句更加灵活。可读性更好

  3. PreparedStatement可以防止SQL注入,安全性高于Statement

2. 请说明JDBC使用步骤:

  1. 加载JDBC驱动

  2. 创建于数据库的链接(Connection)

  3. 创建命令(PreparedStatement/Statement)

  4. 对于查询的处理结果,要使用ResultSet对象进行接收,并通过遍历将结果进行处理。

  5. 关闭数据库连接
    在这里插入图片描述
    在这里插入图片描述

三,主流框架

1. 请说明Mybatis的开发流程:

  1. 引入MyBatis依赖:maven
  2. 创建核心配置文件:基于xml进行配置管理
  3. 创建实体(Entity)类/pojo简单对象:MyBatis作为持久层框架,最大特点是会把底层数据表和定义的java类进行一一对应,同时数据表中的字段和类中属性都有对应关系,与底层表对应的类我们称为实体类
  4. 创建Mapper映射文件:Mapper是MyBatis把实体和数据表进行映射的关键,通过Mapper文件来映射哪个表和哪个类是对应的,这个表中的字段和类中哪个属性是对应的
  5. 初始化SessionFactory:核心步骤,到了这步就进行编码环节,作用是读取配置文件,加载Mapper映射,同时也为后续处理做好前期准备
  6. 利用SqlSession对象操作数据:如果要对某个表或数据增删改查操作,要利用SqlSession对象。SqlSession对象是由SessionFactory对象进行创建的,每一个SqlSession对象可以看做是一个数据库连接Connection,只是在原本基础上进行了很多方法的扩展
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2. Mybatis的缓存机制:
  • 缓存–将一些不太常变更的数据,保存在内存中,或者某些高速存储器上,从而提升我们查询数据的效率。
  • Mybatis有两级缓存:
    1,一级缓存与SqlSessoin会话绑定,默认开启。
    2,二级缓存是应用程序全局缓存,所有SqlSession共享。默认不开启。
  • 一级缓存是将数据保存在内存中(一个巨大的HashMap),一个SqlSession对应一个HashMap…一级缓存随着SqlSession创建而创建,当SqlSessioin Close关闭时也就跟着销毁了。随意一级缓存声明周期通常较短
  • 二级缓存是应用程序全局的缓存,只要Mybatis在启动的过程中,这个二级缓存就会一直存在,二级缓存的载体可以是内存中的一个HashMap,也可以是一个单体的缓存框架,例如ehcach/分布式NoSql数据库Redis.对于二级缓存来说所有的SqlSesion都可以访问其中的数据。二级缓存的生命周期,随着MybatisSessionFactory 的创建而创建,在SessionFactory销毁时消失。
    所以相较与二级缓存,一级缓存需要的空间更大,不过期缓存的命中率更高
    默认情况下,一级缓存是开启的:
  • 执行第一个查询代码时,是从数据库中获取数据,然后将获得的对象保存到缓存中,而当执行第二句查询语句时,会从缓存中获取数据,所以二者的内存地址才会相同
  • 如何开启二级缓存?
    通过配置来开启二级缓存
    在这里插入图片描述
  • 通常我们针对查询结果为多个对象时,不建议使用二级缓存。因为list列表中任何一个元素发生变化后,Mybatis为了保证缓存中的数据和数据库中数据的一致,会将整个list进行处理。
  • SQL语句单独使用 或 不使用二级缓存的代码
    在这里插入图片描述
  • 另外,注意对实体类进行序列化(使用二级缓存必须的,否则会报错)
    在这里插入图片描述
    使用二级缓存的运行结果,虽然两个session不同,但因为使用了二级缓存,对象是存储到了“SessionFactory”应用程序全局的。
    在这里插入图片描述
    3. Spring、SpringMVC与SpringBoot的区别:
  • Spring–是所有Spring应用的基础,通过Spring IOC 提供的控制翻转 和 AOP(面向切面编程)的特性,可以轻松的对对象进行管理。
  • Spring MVC 是Spring的子项目用于提供Web支持,作用是替代传统J2EE中的Servlet,可以提升web应用程序的兼容性和可维护性。
    在底层,SpringMVC 的Controller,也是要被SpringIOC容器管理的。SpringMVC的拦截器使用了AOP的特性,对Controller的行为进行扩展和控制。
  • SpringBoot是Spring体系的敏捷开发框架,它是使用一套市场上最优的默认模板,来对Spring进行自动化配置和处理。其底层是基于Spring和SpringMVC,并在此基础上额外的拓展了使用的功能,和默认配置模板。只需要简单地配置就可以实现Spring/Spring MVC 的复杂功能。提高了程序的开发效率。SpringBoot对整个Spring体系都有良好的支撑。

4. Spring机构最主要的项目:

  1. Spring Boot是目前Spring结构最顶级的项目,它是一个敏捷开发框架,用于简化基于Java的应用程序开发
  2. Spring Framework 是整个Spring的基础所在,所有的Spring 项目都是以Spring Framework框架为基础的。
  3. Spring Cloud (Spring 云)–对于 分布式架构和微服务提供了良好的支持。它是一整套完整的分布式解决方案。
  4. SpringData–用于简化和处理,关系型数据库、非关系型数据库、大数据等数据源进行交互的。SpringData提供了统一的接口,通过操作一组API底层就可以对MySql和Oracle,以及Hbase这样的NoSql数据库进行操作。
  5. Spring Batch – 用于高效率的批处理任务。如数据的批量导入,脚本批量执行。
  6. Sprintg Security – 行业中最著名的一款安全框架,系统中的登录验证、权限验证等通过它来完成。
  7. Spring AMQP 用于是对消息队列进行支持,为市面上的消息队列产品提供了统一的接口,自动进行适配,从而简化了对于MQ消息队列产品的开发。
  8. Spring Mobile–用于手机开发,提供了响应式布局,和一些与移动web应用相关的特性。
    5. Spring Initializr 是创建 Spring Boot Projects(工程)的唯一方法吗?
    Spring Initializr – Spring向导
    答案:不是的,Spring Initializr 本质上就是一个Maven工程,使用Maven手动创建也会可以的。Spring Boot 的兼容性很好,基于Maven我们可以在各种环境和各种IDEA之间进行切换。
    6. Spring Boot 支持几种配置文件?
    Spring Boot目前只支持两种配置文件:
    第一种:属性文件,propertis,…在属性文件中我们通过单行来描述要配置的选项。
    但,这种方式不是Spring Boot推荐的,因为当配置项很多的情况下,会导致配置非常混乱,阅读性很差。
    在这里插入图片描述
    第二种:yml文件,yml文件是按层级进行区分,统一个类型的配置项都是集中在一起的,利于程序段维护。
    在这里插入图片描述
    7. 请列举至少5个Spring Boot中的配置选项
  • server.port – 设置SpringBootWeb应用程序的端口号

  • server.servlet.context-path–设置应用上下文

  • loggin.file – 设置日志文件的输出路径,默认情况下是不会将日志文件进行输出的,只会在控制台进行打印。

  • logging.level–最低日志输出级别,默认为“info”

  • debug–用于开启/关闭调试模式,在debug模式下可以看到更多的输出信息,有助于对程序进行调试。

  • spring.datasource.(".")–表示一组配置信息,表示设置与数据库相关配置。

  • datasource.draverClassName–代表驱动程序

  • datasource.url–表示连接字符串

  • datasource.password–数据库密码

  • datasource.userName–数据库用户名

8.Maven的构建声明周期:考察对Maven的理解,和常用命令的使用

  1. mvn archetype:generate – 创建Maven工程结构

  2. mvn validate – 验证工程结构。(创建Maven工程后自动执行)

  3. mvn compile – 编译源代码(使用系统中的JDK完成的)

  4. mvn test – 执行测试用例(进行单元测试)

  5. mvn package – 项目打包(Java工程要打成jar包,web会打包成war包)

  6. mvn install – 将jar包发送(安装)到本地仓库(这样本地的其它系统,就可以通过Maven的坐标系,引用到刚才的jar包)

  7. mvn deploy – 将jar包发布至远程仓库(多人合作时,共享jar包)

9. 谈谈你对IOC和DI的理解

  1. IOC
  • IOC 控制翻转,是一种设计理念,由第三方来管理与控制对象。

  • 通常我们创建对象时都是通过new 关键字来实现的。这就带来一些问题。

    1,每次我们需要使用 对象时,都要手动创建。

    2,当我们需要对某一个类进行修改时,需要手动将所有通过new 关键字创建的对象,从新编写。工作量将会非常恐怖。

  • 解决办法就是使用“对象容器”,动态生成JavaBean 对象。通过使用“容器”(applicationContext)我们可以程序中有效的依赖实现“解耦”(降低耦合接触耦合)。

  • 控制反转–传统情况下我们使用“new”关键字创建对象,也就是由我们编译的程序代码决定使用哪个对象,我们称之为“正向控制”。而“控制反转”则是将对象的控制权交个第三方的“对象容器”,由“对象容器”在运行时创建对应的对象,再赋值给对应的变量。

  • IOC–最大的优点就是,让 对象 和 对象之间的引用 实现了有效的解耦。因为是在运行时完成的,所以当我们系统底层的类发生变化的时候,只需要修改配置文件就可以了。(极大的方便了工程维护和代码管理)

  • 这里的“对象容器”(applicationContext)我们通常称之为,“IOC”容器。
    在这里插入图片描述

  1. DI
  • DI–依赖注入,是IOC控制翻转理念的具体技术实现,由对象容器在运行时动态注入对象。

  • DI-依赖注入是基于两种技术来实现的。

    1,反射–在运行时,进行动态的创建、设置以及管理。

    2,工厂模式

  • Java反射机制–在运行状态下,对于任意一个类都,能知道他的属性和方法;对于任意一个对象都能调用它的任意一个属性和方法。这种动态获取的信息以及动态调用方法的功能称为Java的反射机制。

10. AOP有几种通知类型:(AOP面向切面编程,在不修改原始程序的情况下,使用通知对程序进行扩展)

应用场景–对原有的程序进行扩展

  1. Before–前置通知

  2. After returning – 返回通知

  3. After throwing – 异常通知

  4. After – 后置通知

  5. Around – 环绕通知

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值