Java EE面试题解析(中)

11、 Servlet、Filter、Listener的启动顺序?【重点】

启动的顺序为:Listener -> Filter -> Servlet;

执行的顺序不会因为三个标签在配置文件中的先后顺序而改变。

监听器类型:

Servlet2.4规范定义,按监听的对象划分:

用于监听应用程序环境对象(ServletContext)的事件监听器

用于监听用户会话对象(HttpSession)的事件监听器

用于监听请求消息对象(ServletRequest)的事件监听器

按监听的事件类型划分:

用于监听域对象自身的创建和销毁的事件监听器;

用于监听域对象中的属性的增加和删除的事件监听器;

用于监听绑定到HttpSession域中的某个对象的状态的事件监听器;

在一个Web应用程序的整个运行周期内, Web容器会创建和销毁三个重要的对象,ServletContext,HttpSession,ServletRequest。

12、 Filter链是什么?【重点】

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

Web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter()方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。

在doFilter()方法中,开发人员如果调用FilterChain对象的doFilter ()方法,web服务器会检查FilterChain对象中是否还有filter,如果有,则调用下一个filter,如果没有,则调用目标资源。

13、 Filter的工作原理?【重点】

Filter接口中有一个doFilter()方法,Web服务器每次在调用Web资源的service()方法之前,都会先调用filter的doFilter()方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,执行一段代码;

判断是否调用目标资源;

调用目标资源之后,执行一段代码;

Web服务器在调用doFilter()方法时,会传递一个filterChain对象,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter()方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则服务器就会调用目标的service()方法,即Web资源就会被访问,否则Web资源不会被访问。

14、 钝化和活化?【重点】

Session与Session域中的对象一起从内存中被序列化到硬盘上的过程我们称为钝化,服务器关闭时会发生钝化。

Session与Session域中的对象一起从硬盘上反序列化到内存中的过程我们称为活化,服务器再次开启时会发生活化。

保证Session域中的对象能和Session一起被钝化和活化,必须保证对象对应的类实现Serializable接口。

15、 Session 的运行机制?【掌握】

在服务器端创建Session对象,该对象有一个全球唯一的ID。

在创建Session对象的同时创建一个特殊的Cookie对象,该Cookie对象的名字是JSESSIONID,该Cookie 对象的value值是Session对象的那个全球唯一的ID,并且会将这个特殊的Cookie对象携带发送给浏览器,以后浏览器再发送请求就会携带这个特殊的Cookie对象,服务器根据这个特殊的Cookie对象的value 值在服务器中寻找对应的Session对象,以此来区分不同的用户。

16、 Cookie对象的缺陷?【掌握】

Cookie是明文的,不安全;

Cookie对象的数量和大小有限制(不同的浏览器不同);

Cookie对象携带过多费流量;

Cookie对象中的Value值只能是字符串,不能放对象。

17、 响应乱码的原因与解决方案?【重点】

原因:服务器端默认使用ISO-8859-1字符集,而中文浏览器默认使用GBK字符集。

解决方案:方法1,设置响应头,对应代码:response.setHeader("Content-Type","text/html;charset=utf-8");

方法2,设置响应的内容类型,对应代码:response.setContentType("text/html;charset=utf-8");

通过以上两种方式可以在响应头中告诉浏览器响应体的字符集是UTF-8;但需要注意的是,两种方法一定要在response.getWriter()方法之前设置。

18、 Post请求中文乱码的原因与解决方案?【重点】

原因:因为服务器收到数据后,默认以ISO-8859-1字符集进行转换,与请求传递数据的字符集不一致。

解决方案:在获取请求参数之前调用request.setCharacterEncoding("utf-8"); 通知服务器端使用UTF8字符集进行转换。

19、 Get请求中文乱码的原因与解决方案?【重点】

原因:请求携带的数据字符集与服务器端的默认字符集ISO-8859-1不一致。

解决方案:

第一种方式:

使用URLEncoder和URLDecoder两个类来实现编解码,实现iso-8895-1转换到UTF-8字符集;

第二种方式,使用String类的方法实现字符集转换:

String str = new String (target.getBytes(“iso-8859-1”), ”utf-8” );

第三种方式,更改Tomcat的server.xml 配置文件实现字符集转换:

GET请求是URL地址栏中传递请求参数的,它会被Tomcat服务器自动转换字符集,而Tomcat服务器默认的字符集是ISO-8859-1,所以我们需要修改Tomcat服务器的字符集为UTF-8。

20、 Tomcat是如何创建Servlet实例的?原理是什么?【掌握】

容器启动时,读取在/webapps/WEB-INF/目录下的web.xml文件,对其进行解析,并读取Servlet注册信息。

然后,将每个应用中注册的Servlet类都进行加载,并通过反射的方式实例化。

Servlet注册时配置,如果为正数,则在启动容器时实例化,如果不写或为负数,则第一次请求实例化。

你可能感兴趣的:(Java,java-ee,java,面试)