Java的面试汇总,有这些还担心不通过?
面试官提问的内容通常会由易到难,如果前面容易的内容都答不上来,往往就被刷了,如果是前面提问的都答上来了,他会问一些有深度的问题,这时候就算你回答不上来也不要慌张,他只是看看你的薪资水平而已
接下来我就说一下java面试通常会问到的一些知识点
如果你的简历上面没有写框架的东西,只写了web的一些技术,比如servlet和jsp,他一般会问java基础,但是如果写了框架,一般就不问java基础了,当然,servlet和jsp是要问的
一我这里就先开始说servlet
1:servlet的生命周期
void init(ServletConfig):出生之后(1次)
void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
void destroy():临死之前(1次);
这样说也够了,但是为了显示自己很厉害,还可以说明他们分别是什么时候使用,是干啥的
第一次创建servlet对象之后,服务器会调用init(ServletConfig),他是是用来初始化servlet,参数ServletConfig就是servlet的配置信息;每次接收请求,都会调用service(),他是用来处理请求;服务器关闭时会调用destroy(),destroy可以用来释放资源
2:servlet是干什么的
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:(1) 接收请求数据;(2) 处理请求;(3)完成响应。
3:servlet是怎么得到的
有三种:(1)实现servlet接口(2)继承GenericServlet抽象类(3)继承HttpServlet抽象类
这样答基本上就可以了,但是我们还可以解释一下
GenericServlet抽象类实现servlet接口,而HttpServlet抽象类是是GenericServlet抽象类的子类,通常用的都是继承HttpServlet抽象类,因为他是跟Http协议相关的,专门用来处理Http协议的请求
4:有哪些域对象
(1)域对象就是用来在多个Servlet中传递数据,底层是一个map,用来存数据和取数据
(2)ServletRequest;作用范围是一个请求
(3)HttpSession;l 一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;
(4)ServletContext;服务器会为每一个项目创建一个ServletContext对象!作用范围是整个项目 ServletContext对象的作用是在整个项目的动态资源之间共享数据!
5:重定向和请求转发和请求包含
(1)l请求转发是一个请求,而重定向是两个请求;
(2)请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用
请求转发和请求包含都是一次请求,而且请求转发是留头不留体,也就是的前一个servlet的响应头是可以设置的,但是响应体是不允许输出,而只能使用后一个servlet的
请求包含是留头又留体,响应体和响应头都允许输出
所以请求包含大多都是在jsp页面中,用来完成多页面的合并,请求转发大多都是在servlet中。转发目标大多是jsp页面
6关于servlet
Servlet是线程不安全的,而且是单实例对象,当多个请求向一个Servlet发出时,有可能会存在一个线程对其进行读操作。另一个对其进行写操作,
有三种解决方法
不要在Servlet中创建成员!创建局部变量即可!
可以创建无状态成员!(也就是没有get()、set()方法)
可以创建有状态的成员,但状态必须为只读的!(也就是没有set()方法)
二jsp
1:jsp是干什么的
JSP(Java Server Pages)是JavaWeb服务器端的动态资源。他是用来显示数据和获取数据。
JSP是一种特殊的Servlet,当JSP页面首次被访问时,容器(Tomcat)会先把JSP编译成Servlet,然后再去执行Servlet。所以JSP其实就是一个Servlet!
2:会话跟踪技术
(1)HTTP协议中可以使用Cookie来完成会话跟踪!在JavaWeb中,使用session来完成会话跟踪,session底层依赖Cookie技术
(2)cookie
不同浏览器之间是不共享Cookie的
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie
当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
cookie的生命,默认情况下是保存在浏览器内存中,一旦浏览器关闭cookie就消失了
但是可以通过设置时间来让他保存在磁盘中,这样在浏览器关闭之后也会存在,存在时间就是设置的时间
请求路径如果包含了Cookie路径,那么会在请求中包含这个Cookie,否则不会请求中不会包含这个Cookie。
这里要注意,cookie的路径要比请求的路径要大,应该这么想,一个cookie可以被多个请求带上
(3)session
HttpSession也是一个域对象
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。
当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
session保存在服务器,而sessionId通过Cookie发送给客户端,但这个Cookie的生命不-1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失了。
当用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把sessionId中到Cookie中发送给客户端。
这里有一个很重要的问题,就是页面的路径的范围小于等于Cookie的路径的范围
Cookie中不能存在中文
如果是在浏览器内存中就会出现当开两个相同的浏览器时是没有关联的,是属于两个用户
如果是在计算机硬盘中,说明就是有关联的,是属于一个用户
4三大指令:
page指令(定义整个页面的一些属性和值)、include指令(静态包含,先合并,再编译,如果是动态包含,就是先编译再合并)、taglib指令(导入标签库)
5九大内置对象:
out --> jsp的输出流,用来向客户端响应
page --> 当前jsp对象! 它的引用类型是Object,即真身中有如下代码:Object page = this;
config --> 它对应真身(就是转译成的Java文件,它其实是一个Servlet)中的ServletConfig对象!
pageContext --> 一个顶9个!(以下那些都和Servlet里的匹配起来,他们的使用方法是一样的)
request --> HttpServletEequest
response --> HttpServletResponse
exception --> Throwable
session --> HttpSession
application --> ServletContext(一个jsp页面!这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!)
代理其他域:pageContext.setAttribute("xxx", "XXX", PageContext.SESSION_SCOPE);
> 全域查找:pageContext.findAttribute("xxx");从小到大,依赖查找!
> 获取其他8个内置对象:
多个用户请求一个JSP页面时,要为每一个用户开辟一个线程
6.一般问到的是打开一个IE浏览器打开一个网站,之后再打开这个浏览器,也打开这个网站,总共有几个session对象创建
这个这样答比较详细:可能一个,也可能两个,因为session本身是存在于服务器端的,session的识别是通过cookie中的JSessionID,session的底层是依赖于cookie的,而如果cookie设置的时间是默认的(-1),说明cookie是存在于浏览器内存中,这样cookie是相对于浏览器存在的,一个浏览器一个对象;而如果设置的时间大于0,那么cookie就会存在于磁盘中,只要是相同的浏览器开启之后都会是一个session对象,而且虽然cookie存在于磁盘中,不同的浏览器也不会有相同的session对象,肯定是不一样的,不同的浏览器是不共享cookie的
7.还可能会问session是依赖于什么存在的
先回答是cookie,因为session对象本身是存在于服务器端的,而把JSessionID是存放在cookie中,当再次进行请求时,cookie中会带上JSessionID,这样就可以得到服务器端的session了
但是如果这个请求时没有cookie的,如果我们还想使用session,我们也可以通过URL重写的方式,这需要在每个URL后面都加上sessionId!这样用户的请求中就包含了sessionId,服务器就可以通过sessionId找到对应的session对象了。
所以session是依赖于cookie或者URL重写
三:过滤器
1过滤器是怎么执行的
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
doFilter()方法的参数中有一个类型为FilterChain的参数,它只有一个方法:doFilter(ServletRequest,ServletResponse)。执行这个方法就会放行
2有哪几种拦截方式
拦截方式:REQUEST、FORWARD、INCLUDE、ERROR,默认是REQUEST方式。
l REQUEST:拦截直接请求方式;
l FORWARD:拦截请求转发方式;
l INCLUDE:拦截请求包含方式;
l ERROR:拦截错误转发方式。
<filter-mapping>的配置顺序决定了过滤器的执行顺序!
四:Struts2
1拦截器的作用?拦截器与过滤器的区别?
1)一组拦截器构成了过滤器来实现,而过滤器和action是Struts2的核心组件,同时可以减轻代码冗余,提高重用率。
2) 过滤器是拦截用户请求的,范围明显比拦截器大的多。
2如何在 Struts2 中使用 Ajax 功能
3Struts2 如何访问 HttpServletRequest、HttpSession、ServletContext 三个域对象 (访问servlet的API)
(1)通过ActionContext来访问,这种方式可以访问这servlet的API对象,但是无法直接获得对象
(2)实现接口,ServletRequestAware,都是API+Aware,实现这些接口,并且写上相应的与对象的变量和set方法就可以了
(3)ServletActionContext的静态方法可以获取
4.为什么要使用 Struts2 & Struts2 的优点(Struts2和Struts1和webWork的关系)
5.Struts2的前端控制器是什么
StrutsPrepareAndExecuteFilter,他其实就是一个过滤器,他有两个功能,一个是预处理,一个是执行,预处理是通过他的生命周期方法init加载action配置文件,过滤器由一组拦截器组成,这些拦截器就是进行拦截
6action中是怎么编写的呢
a:只写个普通类,不实现任何接口,不继承任何类
b:实现action接口
c:继承actionSupport类(这个类就已经实现了action接口,还实现了很多其他的接口)
7Struts2的配置文件的加载顺序
struts.xml->struts.properties->web.xml
8:Struts2中的数据封装有哪几种方法
可以这么说,有两种,一个是属性封装,一个是模型驱动封装,属性封装有包括set方法和表达式封装
也可以说有三种,一个是属性封装,一个是模型驱动封装,一个是表达式封装
属性封装:设置属性的set方法
模型驱动封装:通过实现ModelDriver接口来接收请求参数;里面的泛型是要封装的类,之后手动构建对象;重写getModel()方法返回的就是Action所使用的数据模型对象
表达式封装:其实他本质上也是属性封装,只是当属性很多的时候,就会写很多set方法,这样很臃肿,所以就把这些属性和setget方法封装到一个对象中,在action中直接使用这个对象
区别:表达式封装是本质上就属于属性封装,只是当属性太多时,将这些属性封装到了一个对象中,直接使用对象,所以当属性少的时候就用属性封装,当属性多的时候就用表达式封装;而表达式封装和模型驱动封装本质上是不同的,如果操作现有的pojo对象,就用模型驱动封装,而如果操作的属性很多,但是不构成现有的pojo对象,或者构成了多个pojo对象,就需要使用表达式封装
9:拦截器是怎么进行拦截的?
拦截器是动态拦截action的调用对象,可以定义在执行action之前或之后可以执行的一些功能,也可以判断是否进行拦截
他这里用到了Aop思想,面向切面思想,也就是不通过修改源代码而去扩展功能
还有就是责任链(也叫拦截器链),将拦截器按照一定的顺序组成一个链,之后当访问这个action时会按照定义好的顺序进行拦截
五:spring
1:spring的特性是什么?
(1)spring是一站式框架,在web层有springMVC,在service层有IOC,在dao层有JDBCTamplate,对于常见的dao层框架也有相应的Template,
(2)IOC思想,控制反转:对象的创建不是通过new方式来实现,而是通过spring配置创建类对象
(3)AOP思想,面向切面编程:不通过修改源代码而实现功能的扩展
2:IOC底层原理是怎么实现的?
dom4j解析xml文件,工厂设计模式,反射(最主要就要说出反射)
3:spring是怎么配置创建类对象的?
可以这么答:有两种,一个是配置文件配置,一种是注解方式
配置的方式有三种:使用类的无参构造创建
为了让学习变得轻松、高效,今天给大家免费分享一套Java入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要入门的资料欢迎加入学习交流群:9285,05736