java⾯试题全集(中)--JavaWeb和WebService相关⾯试题
这部分主要是与Java Web和Web Service相关的⾯试题。
96、阐述Servlet和CGI的区别?
答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程⽅式运⾏其service()⽅法,⼀个实例可以服务于多个请求,并且其实例⼀般不会销毁,⽽CGI对每个请求都产⽣新的进程,服务完成后就销毁,所以效率上低于Servlet。
补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进⾏竞争,Servlet是⼀个特殊的Java程序,⼀个基于Java的Web应⽤通常包含⼀个或多个Servlet类。Servlet不能够⾃⾏创建并执⾏,它是在Servlet容器中运⾏的,容器将⽤户的请求传递给Servlet程序,并将Servlet的响应回传给⽤户。通常⼀个Servlet会关联⼀个或多个JSP页⾯。以前CGI经常因为性能开销上的问题被诟病,然⽽Fast CGI早就已经解决了CGI效率上的问题,所以⾯试的时候⼤可不必信⼝开河的诟病CGI,事实上有很多你熟悉的⽹站都使⽤了CGI技术。
97、Servlet接⼝中有哪些⽅法?
答:Servlet接⼝定义了5个⽅法,其中前三个⽅法与Servlet⽣命周期相关:
- void init(ServletConfig config) throws ServletException
- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
- void destory()
- java.lang.String getServletInfo()
springboor面试题- ServletConfig getServletConfig()
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页⾯:
<%@ page pageEncoding="UTF-8"%>
<%
String path = ContextPath();
String basePath = Scheme() + "://" + ServerName() + ":" + ServerPort() + path + "/";
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<title>⾸页</title>
<style type="text/css">
* { font-family: "Arial"; }
</style>
</head>
<body>
<h1>Hello, World!</h1>
<hr/>
<h2>Current time is: <%= new java.util.Date().toString() %></h2>
</body>
</html>
对应的Java代码:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.52
* Generated at: 2014-10-13 13:28:38 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory .getDefaultFactory();
private static java.util.Map<java.lang.String, java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private at.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String, java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _JspApplicationContext(
getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory .getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(
final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
// 内置对象就是在这⾥定义的
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = 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 = _PageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = ServletContext();
config = ServletConfig();
session = Session();
out = Out();
_jspx_out = out;
out.write('\r');
out.write('\n');
String path = ContextPath();
String basePath = Scheme() + "://"
+ ServerName() + ":" + ServerPort() + path + "/";
// 以下代码通过输出流将HTML标签输出到浏览器中
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <base href=\"");
out.print(basePath);
out.write("\">\r\n");
out.write(" <title>⾸页</title>\r\n");
out.write(" <style type=\"text/css\">\r\n");
out.write(" \t* { font-family: \"Arial\"; }\r\n");
out.write(" </style>\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" <h1>Hello, World!</h1>\r\n");
out.write(" <hr/>\r\n");
out.write(" <h2>Current time is: ");
out.print(new java.util.Date().toString());
out.write("</h2>\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)) {
out = _jspx_out;
if (out != null && BufferSize() != 0)
try {
out.clearBuffer();
} catch (java.io.IOException e) {
}
if (_jspx_page_context != null)
_jspx_page_context.handlePageException(t);
else
throw new ServletException(t);
}
} finally {
_leasePageContext(_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服务器产品,全称是Internet Information Services。IIS是允许在公共Intranet或Internet上发布信息的Web服务器。IIS 是⽬前最流⾏的Web服务器产品之⼀,很多著名的⽹站都是建⽴在IIS的平台上。IIS提供了⼀个图形界⾯的管理⼯具,称为Internet服务管理器,可⽤于监视配置和控制Internet服务。IIS是⼀种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别⽤于⽹页浏览、⽂件传输、新闻服务和邮件发送等⽅⾯,它使得在⽹络(包括互联⽹和局域⽹)上发布信息成了⼀件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接⼝;同时,它还提供⼀个Internet数据库连接器,可以实现对数据库的查询和更新。
- Kangle:Kangle Web服务器是⼀款跨平台、功能强⼤、安全稳定、易操作的⾼性能Web服务器和反向代理服务器软件。此外,Kangle也是⼀款专为做虚拟主机研发的Web服务器。实现虚拟主机独⽴进程、独⽴⾝份运⾏。⽤户之间安全隔离,⼀个⽤户出问题不影响其他⽤户。⽀持PHP、ASP、ASP.NET、Java、Ruby等多种动态开发语⾔。
- WebSphere:WebSphere Application Server是功能完善、开放的Web应⽤程序服务器,是IBM电⼦商务计划的核⼼部分,它是基于Java 的应⽤环境,⽤于建⽴、部署和管理Internet和Intranet Web应⽤程序,适应各种Web应⽤程序服务器的需要。
- WebLogic:WebLogic Server是⼀款多功能、基于标准的Web应⽤服务器,为企业构建企业应⽤提供了坚实的基础。针对各种应⽤开发、关键性任务的部署,各种系统和数据库的集成、跨Internet协作等Weblogic都提供了相应的⽀持。由于它具有全⾯的功能、对开放标准的遵从性、多层架构、⽀持基于组件的开发等优势,很多公司的企业级应⽤都选择它来作为开发和部署的环境。WebLogic Server在使应⽤服务器成为企业应⽤架构的基础⽅⾯⼀直处于领先地位,为构建集成化的企业级应⽤提供了稳固的基础。
- Apache:⽬前Apache仍然是世界上⽤得最多的Web服务器,其市场占有率很长时间都保持在60%以上(⽬前的市场份额约40%左右)。世界上很多著名的⽹站都是Apache的产物,它的成功之处主要在于它的源代码开放、有⼀⽀强⼤的开发团队、⽀持跨平台的应⽤(可以运⾏在⼏乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等⽅⾯。
- Tomcat:Tomcat是⼀个开放源代码、运⾏Servlet和JSP的容器。Tomcat实现了Servlet和JSP规范。此外,Tomcat还实现了Apache-Jakarta规范⽽且⽐绝⼤多数商业应⽤软件服务器要好,因此⽬前也有不少的Web服务器都选择了Tomcat。
- Nginx:读作"engine x",是⼀个⾼性能的HTTP和反向代理服务器,也是⼀个IMAP/POP3/SMTP代理服务器。 Nginx是由Igor Sysoev为俄罗斯访问量第⼆的站点开发的,第⼀个公开版本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,具体来说:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论