java面试题收集(02)

1、jsp是什么?, Servlet是什么?jsp和Servlet的区别?

(1)jsp本质上就是一个Servlet,它是Servlet的一种特殊形式(由SUN公司推出),每个jsp页面都是一个servlet实例。

(2)Servlet 是由Java提供用于开发web服务器应用程序的一个组件,运行在服务端,由servlet容器管理,用来生成动态内容。一个servlet 实例是实现了特殊接口Servlet的Java类,所有自定义的servlet均必须实现Servlet接口。

区别:
1) jsp是html页面中内嵌的Java代码,侧重页面显示。
2) Servlet 是html代码和Java代码分离,侧重逻辑控制,mvc 设计思想中jsp位于视图层,servlet 位于控制层。
3) Jsp运行机制:如下图
java面试题收集(02)_第1张图片

4)JVM只能识别Java类,不能识别jsp代码。web容器收到以.jsp为扩展名的url请求时,会将访问请求交给tomcat 中jsp引擎处理,每个jsp页面第一次被访问时,jsp引擎将jsp代码解释为一个servlet源程序,接着编译servlet 源程序生成.class文件,再有web容器servlet 引擎去装载执行servlet程序,实现页面的交互。

2、servlet生命周期

Servlet加载一>实例化一>服务一>销毁。

2.1生命周期详解:

(1)init():
在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

(2)service():
它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。
在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

(3)destroy():
仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。
一个Servlet 在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

2.2 如何与Tomcat 结合工作步骤:

(1)Web Client 向Servlet容器(Tomcat)发出Http请求。
(2)Servlet容器接收Web Client的请求。
(3)Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
(4)Servlet容器创建一个HttpResponse对象。
(5)Servlet 容器调用HttpServlet对象的service 方法,把HttpRequest 对象与HttpResponse对象作为参数传给HttpServlet对象。
(6)HttpServlet 调用HttpRequest对象的有关方法,获取Http请求信息。
(7)HttpServlet 调用HttpResponse对象的有关方法,生成响应数据。

2.3 servlet 特性

(1)单例多线程
(2)servlet是单实例的

2.4 servlet线程安全问题

(1)是否安全?

Servlet对象并不是一个线程安全的对象。
Servlet 第一次被调用的时候,init()方法会被调用,然后调用service()方法,从第二次被请求开始,就直接调用service()方法。

(2)为什么不安全?

因为servlet是单实例的,所以后面再次请求同一个Servlet的时候都不会创建 Servlet实例,而且web容器会针对每个请求创建一个独立的线程,这样多个并发请求会导致多个线程同时调用service()方法,这样就会存在线程不安全的问题。

(3)如何解决不安全问题?

1)不要在servlet中使用成员变量。
2)可以给servlet中的方法添加同步锁,Synchronized,但是不提倡,数据并发访问会造成阻塞等待。
3)可以实现SingleThreadModel接口,如下。这样可以避免使用成员变量的问题,但不提倡,原因同上。

Public class Servlet1 extends HttpServlet implements Single ThreadModel{
 		………..
}

3、SpringMVC的工作流程

(1)用户发送请求至前端控制器DispatcherServlet。
(2)DispatcherServlet 收到请求调用HandlerMapping处理器映射器。
(3)HandlerMapping处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(假如有就生成)一并返回给DispatcherServlet。
(4)DispatcherServlet 调用HandlerAdapter处理器适配器。
(5)HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
(6)Controller执行完成返回ModelAndView.
(7)HandlerAdapter将controller 执行结果ModelAndView返回给 DispatcherServlet。
(8)DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
(9)ViewReslover解析后返回具体View。
(10)DispatcherServlet 根据 View进行渲染视图(即将模型数据填充至视图中)。
(11)DispatcherServlet响应用户。

4、MyBatis中#{}和${}的区别

#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将sq1中的#{}替换为?号,调用PreparedStatement的 set 方法来赋值。
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。

5、简述MyBatis的单个参数、多个参数如何传递及如何取值。

MyBatis 传递单个参数,如果是普通类型(String+8个基本)的,取值时在#{}得中可以任意指定,如果是对象类型的,则在#{}得中使用对象的属性名来取值。
MyBatis传递多个参数,默认情况下,MyBatis会对多个参数进行封装Map,取值时在#{}可以使用0,1,2…或者是param1,param2。
MyBatis传递多个参数,建议使用命名参数,在Mapper接口的方法的形参前面使用。
@Param( )来指定封装Map时用的key.取值时在#}中使用@Param指定的key。

6、MyBatis如何获取自动生成的(主)键值?

标签中使用useGeneratedkeys和keyProperty两个属性来获取自动生成的主键值。
示例:
在这里插入图片描述

7、简述Mybatis的动态SQL,列出常用的标签及作用

动态SQL是MyBatis的强大特性之一基于功能强大的OGNL表达式。
动态SQL主要是来解决查询条件不确定的情况,在程序运行期间,根据提交的条件动态的完成查询常用的标签:
java面试题收集(02)_第2张图片

8、SpringMVC的工作原理

(1)用户向服务器发送请求,请求被springMVC前端控制器DispatchServlet 捕获。
(2)DispatcherServle对请求URI进行解析,得到请求资源标识符(URL),然后根据该URL调用HandlerMapping将请求映射到处理HandlerExcutionChain。
(3)DispatchServlet 根据获得的Handler选择一个合适的HandlerAdapter适配器处理。
(4)Handler对数据处理完成以后将返回一个ModelAndView()对象给DisPatchServlet。
(5)Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver 试图解析器将逻辑视图转化为真正的视图View。
(6)DispatcherServle通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

java面试题收集(02)_第3张图片

9、谈谈你对Spring的理解

Spring 是一个开源框架,为简化企业级应用开发而生。Spring可以是使简单的JavaBean实现以前只有EJB才能实现的功能。Spring是一个IOC和AOP容器框架。
Spring容器的主要核心是:
(1)控制反转(IOC)
传统的java开发模式中,当需要一个对象时,我们会自己使用new或者getlnstance等直接或者间接调用构造方法创建一个对象。而在spring开发模式中,spring容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用spring提供的对象就可以了,这是控制反转的思想。

(2)依赖注入(DI)
spring使用javaBean 对象的set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。

(3)面向切面编程(AOP)
在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。AOP底层是动态代理,如果是接口采用JDK动态代理,如果是类采用CGLIB方式实现动态代理。

10、Spring中常用的设计模式

(1)代理模式
spring中两种代理方式,若目标对象实现了若干接口,spring 使用jdk的java.lang.reflect.Proxy类代理。若目标兑现没有实现任何接口,spring使用CGLIB库生成目标类的子类。
(2)单例模式
在spring的配置文件中设置bean默认为单例模式。
(3)模板方式模式
用来解决代码重复的问题。比如:RestTemplate、JmsTemplate、JpaTemplate。
(4)工厂模式
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。Spring中使用beanFactory来创建对象的实例。

你可能感兴趣的:(java面试题收藏,spring,java,面试,servlet,设计模式)