Java面试题集116135.docx
《Java面试题集116135.docx》由会员分享,可在线阅读,更多相关《Java面试题集116135.docx(28页珍藏版)》请在冰豆网上搜索。
Java面试题集116135
摘要:
这一部分讲解基于Java的Web开发相关面试题,即便在Java走向没落的当下,基于Java的Web开发因为拥有非常成熟的解决方案,仍然被广泛应用。
不管你的Web开发中是否使用框架,JSP和Servlet都是一个必备的基础,在面试的时候被问到的概率还是很高的。
116、说出Servlet的生命周期,并说出Servlet和CGI的区别?
答:
Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service方法,service方法会调用与请求对应的doGet或doPost等方法;当服务器关闭会项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy方法。
Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
【补充1】SUN公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程序,一个基于Java的Web应用通常包含一个或多个Servlet类。
Servlet不能够自行创建并执行,它是在Servlet容器中运行的,容器将用户的请求传递给Servlet程序,此外将Servlet的响应回传给用户。
通常一个Servlet会关联一个或多个JSP页面。
以前CGI经常因为性能开销上的问题被诟病,然而FastCGI早就已经解决了CGI效率上的问题,所以面试的时候大可不必诟病CGI,腾讯的网站就使用了CGI技术,相信你也没感觉它哪里不好。
【补充2】Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
1.voidinit(ServletConfigconfig)throwsServletException
2.voidservice(ServletRequestreq,ServletResponseresp)throwsServletException,java.io.IOException
3.voiddestory()
4.java.lang.StringgetServletInfo()
5.ServletConfiggetServletConfig()
117、转发(forward)和重定向(redirect)的区别?
答:
forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用转发(通过RequestDispatcher对象的forward方法,RequestDispatcher对象可以通过ServletRequest对象的getRequestDispatcher方法获得),并且,这样也有助于隐藏实际的链接;在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect方法)。
118、JSP有哪些内置对象?
作用分别是什么?
答:
JSP有9个内置对象:
1.request:
封装客户端的请求,其中包含来自GET或POST请求的参数;
2.response:
封装服务器对客户端的响应;
3.pageContext:
通过该对象可以获取其他对象;
4.session:
封装用户会话的对象;
5.application:
封装服务器运行环境的对象;
6.out:
输出服务器响应的输出流对象;
7.config:
Web应用的配置对象;
8.page:
JSP页面本身(相当于Java程序中的this);
9.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页面:
[html] viewplain copy
1.<%@ page pageEncoding="UTF-8"%>
2.<%
3.String path = request.getContextPath();
4.String basePath = request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
5.%>
6.
7.
DOCTYPE html>
8.
9.
10. ">
11.
首页 12.
15.
16.
17.
18.
Hello, World!
19.
20.
Current time is:
<%= new java.util.Date().toString() %>
21.
22.
对应的Java代码:
[java] viewplain copy
1./*
2. * Generated by the Jasper component of Apache Tomcat
3. * Version:
Apache Tomcat/7.0.52
4. * Generated at:
2014-10-13 13:
28:
38 UTC
5. * Note:
The last modified time of this file was set to
6. * the last modified time of the source file after
7. * generation to assist with modification tracking.
8. */
9.package org.apache.jsp;
10.
11.import javax.servlet.*;
12.import javax.servlet.http.*;
13.import javax.servlet.jsp.*;
14.
15.public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
16. implements org.apache.jasper.runtime.JspSourceDependent {
17.
18. private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory
19. .getDefaultFactory();
20.
21. private static java.util.Map _jspx_dependants;
22.
23. private javax.el.ExpressionFactory _el_expressionfactory;
24. private org.apache.tomcat.InstanceManager _jsp_instancemanager;
25.
26. public java.util.Map getDependants() {
27. return _jspx_dependants;
28. }
29.
30. public void _jspInit() {
31. _el_expressionfactory = _jspxFactory.getJspApplicationContext(
32. getServletConfig().getServletContext()).getExpressionFactory();
33. _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory
34. .getInstanceManager(getServletConfig());
35. }
36.
37. public void _jspDestroy() {
38. }
39.
40. public void _jspService(
41. final javax.servlet.http.HttpServletRequest request,
42. final javax.servlet.http.HttpServletResponse response)
43. throws java.io.IOException, javax.servlet.ServletException {
44.// 9个内置对象就是在这里定义的
45. final javax.servlet.jsp.PageContext pageContext;
46. javax.servlet.http.HttpSession session = null;
47. final javax.servlet.ServletContext application;
48. final javax.servlet.ServletConfig config;
49. javax.servlet.jsp.JspWriter out = null;
50. final java.lang.Object page = this;
51. javax.servlet.jsp.JspWriter _jspx_out = null;
52. javax.servlet.jsp.PageContext _jspx_page_context = null;
53.
54. try {
55. response.setContentType("text/html;charset=UTF-8");
56. pageContext = _jspxFactory.getPageContext(this, request, response,
57. null, true, 8192, true);
58. _jspx_page_context = pageContext;
59. application = pageContext.getServletContext();
60. config = pageContext.getServletConfig();
61. session = pageContext.getSession();
62. out = pageContext.getOut();
63. _jspx_out = out;
64.
65. out.write('\r');
66. out.write('\n');
67.
68. String path = request.getContextPath();
69. String basePath = request.getScheme() + ":
//"
70. + request.getServerName() + ":
" + request.getServerPort()
71. + path + "/";
72.// 以下代码通过输出流将HTML标签输出到浏览器中
73. out.write("\r\n");
74. out.write("\r\n");
75. out.write("
DOCTYPE html>\r\n");
76. out.write("\r\n");
77. out.write("
\r\n");
78. out.write("
79. out.print(basePath);
80. out.write("\">\r\n");
81. out.write("
首页\r\n");
82. out.write(" \r\n");
85. out.write(" \r\n");
86. out.write(" \r\n");
87. out.write("
\r\n");
88. out.write("
Hello, World!
\r\n");
89. out.write("
\r\n");
90. out.write("
Current time is:
");
91. out.print(new java.util.Date().toString());
92. out.write("\r\n");
93. out.write(" \r\n");
94. out.write("\r\n");
95. } catch (java.lang.Throwable t) {
96. if (!
(t instanceof javax.servlet.jsp.SkipPageException)) {
97. out = _jspx_out;
98. if (out !
= null && out.getBufferSize() !
= 0)
99. try {
100. out.clearBuffer();
101. } catch (java.io.IOException e) {
102. }
103. if (_jspx_page_context !
= null)
104. _jspx_page_context.handlePageException(t);
105. else
106. throw new ServletException(t);
107. }
108. } finally {
109. _jspxFactory.releasePageContext(_jspx_page_context);
110. }
111. }
112.}
119、get和post请求的区别?
答:
①get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
②get将表单中数据按照name=value的形式,添加到action所指向的URL后面,并且两者使用“?
”连接,而各个变量之间使用“&”连接;post是将表单中的数据放在HTML头部(header),传递到action所指向URL;
③get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件只能使用post方式;
④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
⑤get使用MIME类型application/x-www-form-urlencoded的URL编码(URLencoding,也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。
120、常用的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:
Kangle Web服务器是一款跨平台、功能强大、安全稳定、易操作的高性能Web服务器和反向代理服务器软件。
此外,Kangle也是一款专为做虚拟主机研发的Web服务器。
实现虚拟主机独立进程、独立身份运行。
用户之间安全隔离,一个用户出问题不影响其他用户。
支持PHP、ASP、ASP.NET、Java、Ruby等多种动态开发语言。
∙WebSphere:
WebSphereApplicationServer是功能完善、开放的Web应用程序服务器,是IBM电子商务计划的核心部分,它是基于Java的应用环境,用于建立、部署和管理Internet和IntranetWeb应用程序,适应各种Web应用程序服务器的需要,范围从简单到高级直到企业级。
∙WebLogic:
BEAWebLogicServer是一种多功能、基于标准的Web应用服务器,为企业构建自己的应用提供了坚实的基础。
各种应用开发、部署所有关键性的任务,无论是集成各种系统和数据库,还是提交服务、跨Internet协作,Weblogic都提供了相应的支持。
由于它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发,基于Internet的企业都选择它来开发、部署最佳的应用。
BEAWebLogicServer在使应用服务器成为企业应用架构的基础方面一直处于领先地位,为构建集成化的企业级应用提供了稳固的基础,它们以Internet的容量和速度,在连网的企业之