一,请阐述HTTP请求的结构:
- HTTP请求包含三部分:请求行、请求头、请求体
请求行–通常在HTTP的第一行,说明了发送的方式(get/post),发送的地址、和HTTP的版本号。
请求头–说明了,从浏览器到服务器发送到辅助信息。
Accept-Language:zh-CN 说明浏览器优先使用中文
User-Agent:代表了用户的使用环境(判断用户使用的是手机还会电脑进行的访问,然后根据浏览器的规格不停进行不同的展现)
Content-Type:说明了提交的表单的格式
请求体–由浏览器向服务器发送的真实数据,请求题中,数据使用键值对的形式“键”和“值”之间使用“=”连接。多个键值对之间使用“&”进行分隔。(请求体,只有在post请求中才会存在,get请求中是没有请求体这一项的)请求体会被附加在url 后面发送到服务器。
- 响应–有服务器返回给浏览器的结果
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声明周期是什么?
- 装载–java应用程序启动的时候,tomcat会扫描web.xml文件,得知当前有哪些servlet.(装载时并不会实例化Servlet)(创建时java层面的对象创建)
- 创建–当 url 第一次访问servlet地址的时候进行创建。同时执行构造函数。
- 初始化–servlet在创建对象以后,马上执行init()初始化函数,对servlet进行初始化。(初始化,是servlet自身专门用于初始化servlet执行资源的方法)
- 提供服务–service()方法。
servlce()方法–对于发来的请求(无论是post/get),一律使用servlet方法接收处理。
如果将请求细化,service()方法下还可以细化为doGet()/doPost()方法。doGet()–只处理get请求,
doPost()–只处理post请求。 - 销毁–在web应用重启或关闭时使用destory()方法将servlet的资源彻底销毁。
七,请求转发与响应重定向之间的区别:
javaweb中有两种资源跳转的方式:
- 请求转发–是服务器跳转,只会产生一次请求。会将请求原封不动的转发给下一个请求。(服务器跳转)
- 语法:request.getRequestDispatcher().forward();
- 执行过程:浏览器向tomcat发送一个请求–》tomcat收到请求后,使用对应servlet对请求进行处理–》并在处理完后执行request.getRequestDispatcher().forward();–》把请求原封不动派发给另一个servlet–》servlet对请求进行处理后,产生响应对象–》通过tomcat把对应响应结果发送给浏览器–》浏览器看到最终响应结果(全局有且只有1个请求,且资源的跳转是在服务器内部产生的,浏览器感觉不到)
- 地址栏:请求转发只会显示唯一请求的url
- 响应重定向:是浏览器端的跳转,会产生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的区别
-
PreparedStatement是预编译的SQL语句,效率高于Statement。尤其执行复杂SQL语句或频繁执行某一SQL时,执行效率优势更明显。
-
PreparedStatement是支持参数化操作的,相比于Statement使用字符串连接阻止SQL语句更加灵活。可读性更好
-
PreparedStatement可以防止SQL注入,安全性高于Statement
2. 请说明JDBC使用步骤:
-
加载JDBC驱动
-
创建于数据库的链接(Connection)
-
创建命令(PreparedStatement/Statement)
-
对于查询的处理结果,要使用ResultSet对象进行接收,并通过遍历将结果进行处理。
-
关闭数据库连接
三,主流框架
1. 请说明Mybatis的开发流程:
- 引入MyBatis依赖:maven
- 创建核心配置文件:基于xml进行配置管理
- 创建实体(Entity)类/pojo简单对象:MyBatis作为持久层框架,最大特点是会把底层数据表和定义的java类进行一一对应,同时数据表中的字段和类中属性都有对应关系,与底层表对应的类我们称为实体类
- 创建Mapper映射文件:Mapper是MyBatis把实体和数据表进行映射的关键,通过Mapper文件来映射哪个表和哪个类是对应的,这个表中的字段和类中哪个属性是对应的
- 初始化SessionFactory:核心步骤,到了这步就进行编码环节,作用是读取配置文件,加载Mapper映射,同时也为后续处理做好前期准备
- 利用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机构最主要的项目:
- Spring Boot是目前Spring结构最顶级的项目,它是一个敏捷开发框架,用于简化基于Java的应用程序开发
- Spring Framework 是整个Spring的基础所在,所有的Spring 项目都是以Spring Framework框架为基础的。
- Spring Cloud (Spring 云)–对于 分布式架构和微服务提供了良好的支持。它是一整套完整的分布式解决方案。
- SpringData–用于简化和处理,关系型数据库、非关系型数据库、大数据等数据源进行交互的。SpringData提供了统一的接口,通过操作一组API底层就可以对MySql和Oracle,以及Hbase这样的NoSql数据库进行操作。
- Spring Batch – 用于高效率的批处理任务。如数据的批量导入,脚本批量执行。
- Sprintg Security – 行业中最著名的一款安全框架,系统中的登录验证、权限验证等通过它来完成。
- Spring AMQP 用于是对消息队列进行支持,为市面上的消息队列产品提供了统一的接口,自动进行适配,从而简化了对于MQ消息队列产品的开发。
- 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的理解,和常用命令的使用
-
mvn archetype:generate – 创建Maven工程结构
-
mvn validate – 验证工程结构。(创建Maven工程后自动执行)
-
mvn compile – 编译源代码(使用系统中的JDK完成的)
-
mvn test – 执行测试用例(进行单元测试)
-
mvn package – 项目打包(Java工程要打成jar包,web会打包成war包)
-
mvn install – 将jar包发送(安装)到本地仓库(这样本地的其它系统,就可以通过Maven的坐标系,引用到刚才的jar包)
-
mvn deploy – 将jar包发布至远程仓库(多人合作时,共享jar包)
9. 谈谈你对IOC和DI的理解
- IOC
-
IOC 控制翻转,是一种设计理念,由第三方来管理与控制对象。
-
通常我们创建对象时都是通过new 关键字来实现的。这就带来一些问题。
1,每次我们需要使用 对象时,都要手动创建。
2,当我们需要对某一个类进行修改时,需要手动将所有通过new 关键字创建的对象,从新编写。工作量将会非常恐怖。
-
解决办法就是使用“对象容器”,动态生成JavaBean 对象。通过使用“容器”(applicationContext)我们可以程序中有效的依赖实现“解耦”(降低耦合接触耦合)。
-
控制反转–传统情况下我们使用“new”关键字创建对象,也就是由我们编译的程序代码决定使用哪个对象,我们称之为“正向控制”。而“控制反转”则是将对象的控制权交个第三方的“对象容器”,由“对象容器”在运行时创建对应的对象,再赋值给对应的变量。
-
IOC–最大的优点就是,让 对象 和 对象之间的引用 实现了有效的解耦。因为是在运行时完成的,所以当我们系统底层的类发生变化的时候,只需要修改配置文件就可以了。(极大的方便了工程维护和代码管理)
-
这里的“对象容器”(applicationContext)我们通常称之为,“IOC”容器。
- DI
-
DI–依赖注入,是IOC控制翻转理念的具体技术实现,由对象容器在运行时动态注入对象。
-
DI-依赖注入是基于两种技术来实现的。
1,反射–在运行时,进行动态的创建、设置以及管理。
2,工厂模式
-
Java反射机制–在运行状态下,对于任意一个类都,能知道他的属性和方法;对于任意一个对象都能调用它的任意一个属性和方法。这种动态获取的信息以及动态调用方法的功能称为Java的反射机制。
10. AOP有几种通知类型:(AOP面向切面编程,在不修改原始程序的情况下,使用通知对程序进行扩展)
应用场景–对原有的程序进行扩展
-
Before–前置通知
-
After returning – 返回通知
-
After throwing – 异常通知
-
After – 后置通知
-
Around – 环绕通知