Java面试题全集中Word文件下载.docx
《Java面试题全集中Word文件下载.docx》由会员分享,可在线阅读,更多相关《Java面试题全集中Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
-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>
html>
head>
basehref="
%=basePath%>
>
title>
首页<
/title>
styletype="
text/css"
*{font-family:
Arial"
}
/style>
/head>
body>
h1>
Hello,World!
/h1>
hr/>
h2>
Currenttimeis:
<
%=newjava.util.Date().toString()%>
/h2>
/body>
/html>
对应的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<
java.lang.String,java.lang.Long>
_jspx_dependants;
privatejavax.el.ExpressionFactory_el_expressionfactory;
privateorg.apache.tomcat.InstanceManager_jsp_instancemanager;
publicjava.util.Map<
getDependants(){
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'
\n'
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"
+request.getServerName()+"
+request.getServerPort()+path+"
//以下代码通过输出流将HTML标签输出到浏览器中
out.write("
\r\n"
basehref=\"
out.print(basePath);
\"
styletype=\"
text/css\"
\t*{font-family:
\"
Arial\"
}\r\n"
\r\n"
"
out.print(newjava.util.Date().toString());
}catch(java.lang.Throwablet){
if(!
(tinstanceofjavax.servlet.jsp.SkipPageException)){
out=_jspx_out;
if(out!
=null&
&
out.getBufferSize()!
=0)
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就没有了;
另一种是将信息存储在一个临时文件中,并设置存在的时间。
当用户通过浏览器和服务器建立一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别用户身份。
会话中可以为用户保存信息。
会话对象