转载:Java面试题全集(中)096 - 125
个人认为原帖的排版不太好,所以复制过来重新排下版,有少量的修改本帖主要是给自己看的,有不懂的地方可以看下原帖
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, IOException
- void destory()
- java.lang.String getServletInfo()
- ServletConfig getServletConfig()
Web 容器加载 Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其 init() 方法进行 Servlet 的初始化;请求到达时调用 Servlet 的 service() 方法,service() 方法可以根据需要调用与请求对应的 doGet() 或 doPost() 等方法;当服务器关闭或项目被卸载时服务器会将 Servlet 实例销毁,此时会调用 Servlet 的 destroy() 方法。
98、转发(forward)和重定向(redirect)的区别?
//相关方法: servletRequest.getRequestDispatcher().forward(); httpServletResponse.sendRedirect();
99、JSP 有哪些内置对象?作用分别是什么?
- 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 实例。
100、get 和 post 请求的区别?
- get 请求用来从服务器上获得资源;post 是用来向服务器提交数据;
- get 将请求参数拼接到 URL 后面,容易暴露隐私数据;post 将数据放在请求头或消息体中,比较安全;
- get 传输的数据要受到 URL 长度限制(1024 字节);post 可以传输大量的数据,且可以传输文件;
- get 使用 MIME 类型 application/x-www-form-urlencoded 的 URL 编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是 "%20"。
101、常用的 Web 服务器有哪些?
Unix 和 Linux 平台下使用最广泛的免费 HTTP 服务器是 Apache 服务器,而 Windows 平台的服务器通常使用 IIS 作为 Web 服务器。选择 Web 服务器应考虑的因素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序等。下面是对常见服务器的简介:
- IIS:微软的 Web 服务器,全称是 Internet Information Services,允许在公共 Intranet 或 Internet 上发布信息。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 服务器,目前的市场份额约 40% 左右。它的成功之处主要在于它的源代码开放、有一支强大的开发团队、支持跨平台的应用(可以运行在几乎所有的 Unix、Windows、Linux 系统平台上)以及它的可移植性等方面。
- Tomcat:Tomcat 是一个开放源代码、运行 Servlet 和 JSP 的容器。Tomcat 实现了 Servlet 和 JSP 规范。此外,Tomcat 还实现了 Apache-Jakarta 规范而且比绝大多数商业应用软件服务器要好。
- Nginx:一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
102、JSP 和 Servlet 是什么关系?
103、讲解 JSP 中的四种作用域。
- page 代表与一个页面相关的对象和属性。
- request 代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件。
- session 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
- application 代表与整个 Web 应用相关的对象和属性,实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
104、如何实现 JSP 或 Servlet 的单线程模式?
对于 JSP 页面,可以通过 page 指令进行设置:
<%@page isThreadSafe=”false”%> 对于 Servlet,可以让自定义的 Servlet 实现 SingleThreadModel 标识接口。
说明:将 JSP 或 Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下不会这么做。
105、实现会话跟踪的技术有哪些?
由于 HTTP 协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配唯一的 ID,下一次用户在请求中包含此 ID,服务器据此判断是哪个用户。
- URL重写:在 URL 中添加会话的信息作为请求参数,或将会话 ID 添加到 URL 结尾以标识一个会话。
- 设置表单隐藏域:将和会话跟踪相关的字段添加到隐式表单域中,提交表单时这些数据会一并提交。
说明:这两种方式很难处理跨越多个页面的信息传递。
- Cookie:Cookie 有两种,一种是基于窗口的,浏览器窗口关闭后,Cookie 就没有了;另一种是将信息存储在一个临时文件中,并设置存在的时间。当用户通过浏览器和服务器建立一次会话后,会话 ID 就会随响应信息返回,并存储在 Cookie 中,下一次请求时这个会话 ID 又会提交给服务器让服务器识别用户身份。会话可以为用户保存信息。会话对象是在服务器内存中的,而 Cookie 是在客户端的内存或硬盘中的。如果浏览器禁用了 Cookie,那么就需要通过上面两种方式进行会话跟踪。当然,在使用 Cookie 时要注意几点:首先不要在 Cookie 中存放敏感信息;其次 Cookie 存储的数据量有限(4k),不能将过多的内容存储 Cookie 中;再者浏览器通常只允许一个站点最多存放 20 个 Cookie。当然,和用户会话相关的其他信息(除了会话 ID)也可以存在 Cookie 方便进行会话跟踪。
- HttpSession:功能最多也最强大。当一个用户第一次访问某个网站时会自动创建 HttpSession,每个用户可以访问他自己的 HttpSession。可以通过 HttpServletRequest#getSession() 方法获得 HttpSession,通过 HttpSession#setAttribute() 方法可以将一个值放在 HttpSession 中,通过调用 HttpSession#getAttribute() 方法,同时传入属性名就可以获取保存在 HttpSession 中的对象。与上面三种方式不同的是,HttpSession 放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 Servlet 容器可以在内存将满时将 HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到 HttpSession 中的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
补充:HTML5 中可以使用 Web Storage 技术通过 JavaScript 来保存数据,例如可以使用 localStorage 和 sessionStorage 来保存用户会话的信息,也能够实现会话跟踪。
106、过滤器有哪些作用和用法?
Java Web 开发中的过滤器(filter)是从 Servlet 2.3 规范开始增加的功能,并在 Servlet 2.4 规范中得到增强。对 Web 应用来说,过滤器是一个驻留在服务器端的 Web 组件,它可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。当 Web 容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对 XML 的输出应用 XSLT 等。
和过滤器相关的接口主要有:Filter、FilterConfig 和 FilterChain。
107、监听器有哪些作用和用法?
Java Web 开发中的监听器(listener)可以监听 application、session、request 三个对象的创建、销毁和属性变动,如下所示:
- ServletContextListener:对 ServletContext 的创建和销毁进行监听。
- ServletContextAttributeListener:监听 ServletContext 中属性的添加、删除和替换。
- HttpSessionListener:对 Session 的创建和销毁进行监听。
session 的销毁有两种情况:1). session 超时(可以在 web.xml 中通过 <session-config>/<session-timeout> 标签配置超时时间);2). 调用了 session 对象的 invalidate() 方法。
- HttpSessionAttributeListener:监听 Session 中属性的添加、删除和替换。
- ServletRequestListener:对请求对象的创建和销毁进行监听。
- ServletRequestAttributeListener:监听请求对象中属性的添加、删除和替换。
监听器用途举例:统计网站在线人数(通过 ServletContextListener 在程序启动时给 ServletContext 添加两个属性 onLineCount 和 maxOnLineCount,然后通过 HttpSessionListener 在创建或销毁 Session 时更新 onLineCount 和 maxOnLineCount 的值)。
108、web.xml 文件中可以配置哪些内容?
web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet 、相关参数、会话超时时间、安全验证方式、错误页面等。比如使用 Spring 时就需要在这里配置 ContextLoaderListener 。
说明:对 Servlet(小服务)、Listener(监听器)和 Filter(过滤器)等 Web 组件的配置,在 Servlet 3 中可以分别使用 @WebServlet、@WebListener、@WebFilter 注解进行配置。补充:如果 Web 提供了有价值的商业信息或者敏感数据,那么站点的安全性就是必须考虑的问题。安全认证是实现安全性的重要手段,认证就是要解决 “Are you who you say you are?” 的问题。认证的方式很多,可分为三类:A. What you know? — 口令B. What you have? — 数字证书(U盾、密保卡)C. Who you are? — 指纹识别、虹膜识别Tomcat 可以通过建立安全套接字层(Secure Socket Layer,SSL)和基本验证/表单验证来实现对安全性的支持。
109、你的项目中使用过哪些 JSTL 标签?
主要使用了 JSTL 核心标签库,如 <c:if>、<c:choose>、<c: when>、<c: otherwise>、<c:forEach> ,用于构造循环和分支结构以控制显示逻辑。
说明:虽然 JSTL 标签库提供了 core、sql、fmt、xml 等标签库,但是实际开发中建议只使用核心标签库(core),而且最好只使用分支和循环标签并辅以表达式语言(EL),这样才能真正做到数据显示和业务逻辑的分离。
110、使用标签库有什么好处?如何自定义JSP标签?
使用标签库的好处包括以下几个方面:
- 分离 JSP 页面的内容和逻辑,简化了 Web 开发;
- 开发者可以创建自定义标签来封装业务逻辑和显示逻辑;
- 标签具有很好的可移植性、可维护性和可重用性;
- 避免了对 Scriptlet(小脚本)的使用(很多公司的项目开发都不允许在 JSP 中书写小脚本)
- 实现 Tag/BodyTag/IterationTag 接口(更常见的是继承 TagSupport 或 BodyTagSupport 或 SimpleTagSupport 类,这是对缺省适配模式的应用),重写 doStartTag() 和 doEndTag() 等方法;
- 编写 xxx.tld 标签描述文件对自定义标签进行部署(通常放在 WEB-INF 或其子目录中);
- 在 JSP 页面中使用 taglib 指令引用该标签库。
提示:如果要将自定义的标签库发布成 JAR 文件,需要将标签库描述文件(tld 文件)放在 JAR 文件的 META-INF 目录下,可以 JDK 中的 jar 工具完成 JAR 文件的生成。
111、说一下表达式语言(EL)的隐式对象及其作用。
${pageContext.request.method}
${pageContext["request"]["method"]}
${pageContext.request["method"]}
${pageContext["request"].method}
${initParam.defaultEncoding}
${header["accept-language"]}
${headerValues["accept-language"][0]}
${cookie.jsessionid.value}
${sessionScope.loginUser.username} 补充:表达式语言的 . 和 [] 运算作用一样,唯一的差别是:如果访问的属性名不符合 Java 标识符命名规则(如 accept-language 就不是一个有效的 Java 标识符),那么这时候就只能用 [] 运算符而不能使用 . 运算符获取它的值。
112、表达式语言(EL)支持哪些运算符?
除了 . 和 [] 运算符,EL 还提供了:
- 算术运算符:+ 、- 、* 、/ 或 div 、% 或 mod
- 关系运算符:== 或 eq 、!= 或 ne 、> 或 gt 、>= 或 ge 、< 或 lt、<= 或 le
- 逻辑运算符:&& 或 and、|| 或 or、! 或 not
- 条件运算符: A : B(跟 Java 的条件运算符类似)
- empty 运算符:检查一个值是否为 null 或者空(数组长度为 0 或集合中没有元素也返回 true)
113、Java Web 开发的 Model 1 和 Model 2 分别指的是什么?
Model 1 是以页面为中心的 Java Web 开发,使用 JSP+JavaBean 技术将页面显示逻辑和业务逻辑处理分开,JSP 实现页面显示,JavaBean 对象用来保存数据和实现业务逻辑。Model 2 是基于 MVC(模型-视图-控制器,Model-View-Controller)架构模式的开发模型,实现了模型和视图的彻底分离,利于团队开发和代码复用。
114、Servlet 3 中的异步处理指的是什么?
在 Servlet 3 中引入了一项新的技术可以让 Servlet 异步处理请求。如果一个任务处理时间相当长,那么 Servlet 或 Filter 会一直占用着请求处理线程直到任务结束,随着并发用户的增加,容器将会遭遇线程超出的风险,这这种情况下很多的请求将会被堆积起来而后续的请求可能会遭遇拒绝服务,直到有资源可以处理请求为止。异步特性可以帮助应用节省容器中的线程,特别适合执行时间长而且用户需要得到结果的任务,如果用户不需要得到结果则直接将一个 Runnable 对象交给 Executor 并立即返回即可。
补充:多线程在 Java 诞生初期无疑是一个亮点,而 Servlet 单实例多线程的工作方式也曾为其赢得美名,然而技术的发展往往会颠覆我们很多的认知,就如同当年爱因斯坦的相对论颠覆了牛顿的经典力学一般。事实上,异步处理绝不是 Serlvet 3 首创,如果你了解 Node.js 的话,对 Servlet 3 的这个重要改进就不以为奇了。
@WebServlet(urlPatterns = {"/async"}, asyncSupported = true)
public class AsyncServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 开启Tomcat异步Servlet支持
req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
final AsyncContext ctx = req.startAsync(); // 启动异步处理的上下文
// ctx.setTimeout(30000);
ctx.start(new Runnable() {
@Override
public void run() {
// 在此处添加异步处理的代码
ctx.complete();
}
});
}
}
115、如何在基于 Java 的 Web 项目中实现文件上传和下载?
在 Sevlet 3 以前,Servlet API 中没有支持上传功能的 API,因此要实现上传功能需要引入第三方工具从 POST 请求中获得上传的附件或者通过自行处理输入流来获得上传的文件,我们推荐使用 Apache 的 commons-fileupload。
从 Servlet 3 开始,文件上传变得无比简单,步骤:
- form 表单:method="post" 且 enctype="multipart/form-data"
- servlet:request.getPart(filename).write(path)
116、服务器收到用户提交的表单数据,到底是调用 Servlet 的 doGet() 还是 doPost() 方法?
根据 form 表单的 method 属性来确定,它用来指定提交表单的方式,其值可以是 get 或 post。
117、JSP 中的静态包含和动态包含有什么区别?
118、Servlet 中如何获取用户提交的查询参数或表单数据?
- 通过请求对象(HttpServletRequest)的 getParameter() 方法通过参数名获得参数值。
- 如果有包含多个值的参数(例如复选框),可以通过请求对象的 getParameterValues() 方法获得。
- 通过请求对象的 getParameterMap() 获得一个参数名和参数值的映射(Map)。
119、Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
重写 Servlet 接口的 init(ServletConfig) 方法:
- 通过 servletConfig.getInitParameter() 方法来获取初始化参数;
- 通过 servletConfig.getServletContext().getInitParameter() 方法来获取服务器上下文参数。
ServletContext 对象也在 doGet() 等方法中通过请求对象的 getServletContext() 方法来获得。
120、如何设置请求的编码以及响应内容的类型?
通过请求对象(ServletRequest)的 setCharacterEncoding(String) 方法可以设置请求的编码,其实要彻底解决乱码问题就应该让页面、服务器、请求和响应、Java 程序都使用统一的编码,最好是 UTF-8;
通过响应对象(ServletResponse)的 setContentType(String) 方法可以设置响应内容的类型,或通过 HttpServletResponse 对象的 setHeader(String, String) 方法来设置。
说明:现在如果还有公司在面试的时候问 JSP 的声明标记、表达式标记、小脚本标记这些内容的话,这样的公司也不用去了,其实 JSP 内置对象、JSP 指令这些东西基本上都可以忘却了。
121、解释一下网络应用的模式及其特点。
补充:此题要跟电子商务模式区分开,因为有很多人被问到这个问题的时候马上想到的是 B2B(如阿里巴巴)、B2C(如当当、亚马逊、京东)、C2C(如淘宝、拍拍)、C2B(如威客)、O2O(如美团、饿了么)。对于这类问题,可以去百度上面科普一下。
122、什么是 Web Service(Web 服务)?
从表面上看,Web Service 就是一个应用程序,它向外界暴露出一个能够通过 Web 进行调用的 API。这就是说,你能够用编程的方法透明的调用这个应用程序,不需要了解它的任何细节,跟你使用的编程语言也没有关系。例如可以创建一个提供天气预报的 Web Service,那么无论你用哪种编程语言开发的应用都可以通过调用它的 API 并传入城市信息来获得该城市的天气预报。之所以称之为 Web Service,是因为它基于 HTTP 协议传输数据,这使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。
补充:这里必须要提及的一个概念是 SOA(Service-Oriented Architecture,面向服务的架构),SOA 是一种思想,它将应用程序的不同功能单元通过中立的契约联系起来,独立于硬件平台、操作系统和编程语言,使得各种形式的功能单元能够更好的集成。显然,Web Service 是 SOA 的一种较好的解决方案,它更多的是一种标准,而不是一种具体的技术。
123、概念解释:SOAP、WSDL、UDDI。
- SOAP:简单对象访问协议(Simple Object Access Protocol),是 Web Service 中交换数据的一种协议规范。
- WSDL:Web 服务描述语言(Web Service Description Language),描述了 Web 服务的公共接口。这是一个基于 XML 的关于如何与 Web 服务通讯和使用的服务描述;即描述与目录中列出的 Web 服务进行交互时需要绑定的协议和信息格式。通常采用抽象语言描述该服务支持的操作和信息,使用时再将实际的网络协议和信息格式绑定给该服务。
- UDDI:统一描述、发现和集成(Universal Description, Discovery and Integration),它是一个基于 XML 的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务。简单的说,UDDI 是访问各种 WSDL 的一个门面(可以参考设计模式中的门面模式)。
提示:关于 Web Service 的相关概念和知识可以在 W3CSchool 上找到相关的资料。
124、Java 规范中和 Web Service 相关的规范有哪些?
- JAX-WS(JSR 224):这个规范是早期的基于 SOAP 的 Web Service 规范 JAX-RPC 的替代版本,它并不提供向下兼容性,因为 RPC 样式的 WSDL 以及相关的 API 已经在 Java EE5 中被移除了。WS-MetaData 是 JAX-WS 的依赖规范,提供了基于注解配置 Web Service 和 SOAP 消息的相关 API。
- JAXM(JSR 67):定义了发送和接收消息所需的 API,相当于 Web Service 的服务器端。
- JAX-RS(JSR 311 & JSR 339 & JSR 370):是 Java 针对 REST(Representation State Transfer)架构风格制定的一套 Web Service 规范。REST 是一种软件架构模式,是一种风格,它不像 SOAP 那样本身承载着一种消息协议, (两种风格的 Web Service 均采用了 HTTP 做传输协议,因为 HTTP 协议能穿越防火墙,Java 的远程方法调用(RMI)等是重量级协议,通常不能穿越防火墙),因此可以将 REST 视为基于 HTTP 协议的软件架构。REST 中最重要的两个概念是资源定位和资源操作,而 HTTP 协议恰好完整的提供了这两个点。HTTP 协议中的 URI 可以完成资源定位,而 GET、POST、OPTION、DELETE 方法可以完成资源操作。因此 REST 完全依赖 HTTP 协议就可以完成 Web Service,而不像 SOAP 协议那样只利用了 HTTP 的传输特性,定位和操作都是由 SOAP 协议自身完成的,也正是由于 SOAP 消息的存在使得基于 SOAP 的 Web Service 显得笨重而逐渐被淘汰。
125、介绍一下你了解的 Java 领域的 Web Service 框架。
Java 领域的 Web Service 框架很多,包括 Axis2(Axis 的升级版本)、Jersey(RESTful 的 Web Service 框架)、CXF(XFire 的延续版本)、Hessian、Turmeric、JBoss SOA 等,其中绝大多数都是开源框架。
提示:面试被问到这类问题的时候一定选择自己用过的最熟悉的作答,如果之前没有了解过就应该在面试前花一些时间了解其中的两个,并比较其优缺点,这样才能在面试时给出一个漂亮的答案。