Java面试题全集中.docx
《Java面试题全集中.docx》由会员分享,可在线阅读,更多相关《Java面试题全集中.docx(26页珍藏版)》请在冰豆网上搜索。
![Java面试题全集中.docx](https://file1.bdocx.com/fileroot1/2022-11/26/461f3895-73db-46a6-8961-3e50e3bb7595/461f3895-73db-46a6-8961-3e50e3bb75951.gif)
Java面试题全集中
Java面试题全集(中)
这部分主要是与JavaWeb和WebService相关的面试题。
96、阐述Servlet和CGI的区别?
答:
Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
补充:
SunMicrosystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。
Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,并将Servlet的响应回传给用户。
通常一个Servlet会关联一个或多个JSP页面。
以前CGI经常因为性能开销上的问题被诟病,然而FastCGI早就已经解决了CGI效率上的问题,所以面试的时候大可不必信口开河的诟病CGI,事实上有很多你熟悉的网站都使用了CGI技术。
97、Servlet接口中有哪些方法?
答:
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
-voidinit(ServletConfigconfig)throwsServletException
-voidservice(ServletRequestreq,ServletResponseresp)throwsServletException,java.io.IOException
-voiddestory()
-java.lang.StringgetServletInfo()
-ServletConfiggetServletConfig()
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
98、转发(forward)和重定向(redirect)的区别?
答:
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。
forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。
99、JSP有哪些内置对象?
作用分别是什么?
答:
JSP有9个内置对象:
-request:
封装客户端的请求,其中包含来自GET或POST请求的参数;
-response:
封装服务器对客户端的响应;
-pageContext:
通过该对象可以获取其他对象;
-session:
封装用户会话的对象;
-application:
封装服务器运行环境的对象;
-out:
输出服务器响应的输出流对象;
-config:
Web应用的配置对象;
-page:
JSP页面本身(相当于Java程序中的this);
-exception:
封装页面抛出异常的对象。
补充:
如果用Servlet来生成网页中的动态内容无疑是非常繁琐的工作,另一方面,所有的文本和HTML标签都是硬编码,即使做出微小的修改,都需要进行重新编译。
JSP解决了Servlet的这些问题,它是Servlet很好的补充,可以专门用作为用户呈现视图(View),而Servlet作为控制器(Controller)专门负责处理用户请求并转发或重定向到某个页面。
基于Java的Web开发很多都同时使用了Servlet和JSP。
JSP页面其实是一个Servlet,能够运行Servlet的服务器(Servlet容器)通常也是JSP容器,可以提供JSP页面的运行环境,Tomcat就是一个Servlet/JSP容器。
第一次请求一个JSP页面时,Servlet/JSP容器首先将JSP页面转换成一个JSP页面的实现类,这是一个实现了JspPage接口或其子接口HttpJspPage的Java类。
JspPage接口是Servlet的子接口,因此每个JSP页面都是一个Servlet。
转换成功后,容器会编译Servlet类,之后容器加载和实例化Java字节码,并执行它通常对Servlet所做的生命周期操作。
对同一个JSP页面的后续请求,容器会查看这个JSP页面是否被修改过,如果修改过就会重新转换并重新编译并执行。
如果没有则执行内存中已经存在的Servlet实例。
我们可以看一段JSP代码对应的Java程序就知道一切了,而且9个内置对象的神秘面纱也会被揭开。
JSP页面:
<%@pagepageEncoding="UTF-8"%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEhtml>
">
首页
*{font-family:
"Arial";}
Hello,World!
Currenttimeis:
<%=newjava.util.Date().toString()%>
对应的Java代码:
/*
*GeneratedbytheJaspercomponentofApacheTomcat
*Version:
ApacheTomcat/7.0.52
*Generatedat:
2014-10-1313:
28:
38UTC
*Note:
Thelastmodifiedtimeofthisfilewassetto
*thelastmodifiedtimeofthesourcefileafter
*generationtoassistwithmodificationtracking.
*/
packageorg.apache.jsp;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjavax.servlet.jsp.*;
publicfinalclassindex_jspextendsorg.apache.jasper.runtime.HttpJspBase
implementsorg.apache.jasper.runtime.JspSourceDependent{
privatestaticfinaljavax.servlet.jsp.JspFactory_jspxFactory=javax.servlet.jsp.JspFactory
.getDefaultFactory();
privatestaticjava.util.Map_jspx_dependants;
privatejavax.el.ExpressionFactory_el_expressionfactory;
privateorg.apache.tomcat.InstanceManager_jsp_instancemanager;
publicjava.util.MapgetDependants(){
return_jspx_dependants;
}
publicvoid_jspInit(){
_el_expressionfactory=_jspxFactory.getJspApplicationContext(
getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager=org.apache.jasper.runtime.InstanceManagerFactory
.getInstanceManager(getServletConfig());
}
publicvoid_jspDestroy(){
}
publicvoid_jspService(
finaljavax.servlet.http.HttpServletRequestrequest,
finaljavax.servlet.http.HttpServletResponseresponse)
throwsjava.io.IOException,javax.servlet.ServletException{
//内置对象就是在这里定义的
finaljavax.servlet.jsp.PageContextpageContext;
javax.servlet.http.HttpSessionsession=null;
finaljavax.servlet.ServletContextapplication;
finaljavax.servlet.ServletConfigconfig;
javax.servlet.jsp.JspWriterout=null;
finaljava.lang.Objectpage=this;
javax.servlet.jsp.JspWriter_jspx_out=null;
javax.servlet.jsp.PageContext_jspx_page_context=null;
try{
response.setContentType("text/html;charset=UTF-8");
pageContext=_jspxFactory.getPageContext(this,request,response,
null,true,8192,true);
_jspx_page_context=pageContext;
application=pageContext.getServletContext();
config=pageContext.getServletConfig();
session=pageContext.getSession();
out=pageContext.getOut();
_jspx_out=out;
out.write('\r');
out.write('\n');
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"
+request.getServerName()+":
"+request.getServerPort()
+path+"/";
//以下代码通过输出流将HTML标签输出到浏览器中
out.write("\r\n");
out.write("\r\n");
out.write("
DOCTYPEhtml>\r\n");
out.write("\r\n");
out.write("
\r\n");
out.write("out.print(basePath);
out.write("\">\r\n");
out.write("
首页\r\n");
out.write("\r\n");
out.write("\t*{font-family:
\"Arial\";}\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("
\r\n");
out.write("
Hello,World!
\r\n");
out.write("
\r\n");
out.write("
Currenttimeis:
");
out.print(newjava.util.Date().toString());
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
}catch(java.lang.Throwablet){
if(!
(tinstanceofjavax.servlet.jsp.SkipPageException)){
out=_jspx_out;
if(out!
=null&&out.getBufferSize()!
=0)
try{
out.clearBuffer();
}catch(java.io.IOExceptione){
}
if(_jspx_page_context!
=null)
_jspx_page_context.handlePageException(t);
else
thrownewServletException(t);
}
}finally{
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
100、get和post请求的区别?
答:
①get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
②get将表单中数据按照name=value的形式,添加到action所指向的URL后面,并且两者使用"?
"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
③get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
⑤get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。
101、常用的Web服务器有哪些?
答:
Unix和Linux平台下使用最广泛的免费HTTP服务器是Apache服务器,而Windows平台的服务器通常使用IIS作为Web服务器。
选择Web服务器应考虑的因素有:
性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。
下面是对常见服务器的简介:
-IIS:
Microsoft的Web服务器产品,全称是InternetInformationServices。
IIS是允许在公共Intranet或Internet上发布信息的Web服务器。
IIS是目前最流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。
IIS提供了一个图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。
IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。
它提供ISAPI(IntranetServerAPI)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。
-Kangle:
KangleWeb服务器是一款跨平台、功能强大、安全稳定、易操作的高性能Web服务器和反向代理服务器软件。
此外,Kangle也是一款专为做虚拟主机研发的Web服务器。
实现虚拟主机独立进程、独立身份运行。
用户之间安全隔离,一个用户出问题不影响其他用户。
支持PHP、ASP、ASP.NET、Java、Ruby等多种动态开发语言。
-WebSphere:
WebSphereApplicationServer是功能完善、开放的Web应用程序服务器,是IBM电子商务计划的核心部分,它是基于Java的应用环境,用于建立、部署和管理Internet和IntranetWeb应用程序,适应各种Web应用程序服务器的需要。
-WebLogic:
WebLogicServer是一款多功能、基于标准的Web应用服务器,为企业构建企业应用提供了坚实的基础。
针对各种应用开发、关键性任务的部署,各种系统和数据库的集成、跨Internet协作等Weblogic都提供了相应的支持。
由于它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发等优势,很多公司的企业级应用都选择它来作为开发和部署的环境。
WebLogicServer在使应用服务器成为企业应用架构的基础方面一直处于领先地位,为构建集成化的企业级应用提供了稳固的基础。
-Apache:
目前Apache仍然是世界上用得最多的Web服务器,其市场占有率很长时间都保持在60%以上(目前的市场份额约40%左右)。
世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支强大的开发团队、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
-Tomcat:
Tomcat是一个开放源代码、运行Servlet和JSP的容器。
Tomcat实现了Servlet和JSP规范。
此外,Tomcat还实现了Apache-Jakarta规范而且比绝大多数商业应用软件服务器要好,因此目前也有不少的Web服务器都选择了Tomcat。
-Nginx:
读作"enginex",是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
在2014年下半年,Nginx的市场份额达到了14%。
102、JSP和Servlet是什么关系?
答:
其实这个问题在上面已经阐述过了,Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。
JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。
JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
103、讲解JSP中的四种作用域。
答:
JSP中的四种作用域包括page、request、session和application,具体来说:
-page代表与一个页面相关的对象和属性。
-request代表与Web客户机发出的一个请求相关的对象和属性。
一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
-session代表与某个用户与服务器建立的一次会话相关的对象和属性。
跟某个用户相关的数据应该放在用户自己的session中。
-application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
104、如何实现JSP或Servlet的单线程模式?
答:
对于JSP页面,可以通过page指令进行设置。
<%@pageisThreadSafe=”false”%>
对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
说明:
如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
105、实现会话跟踪的技术有哪些?
答:
由于HTTP协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配唯一的ID,下一次用户在请求中包含此ID,服务器据此判断到底是哪一个用户。
①URL重写:
在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话。
②设置表单隐藏域:
将和会话跟踪相关的字段添加到隐式表单域中,这些信息不会在浏览器中显示但是提交表单时会提交给服务器。
这两种方式很难处理跨越多个页面的信息传递,因为如果每次都要修改URL或在页面中添加隐式表单域来存储用户会话相关信息,事情将变得非常麻烦。
③cookie:
cookie有两种,一种是基于窗口的,浏览器窗口关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置存在的时间。
当用