Java程序员面试笔试宝典-Java Web(二)
1.7 Servlet中forward与redirect有什么区别?
1.9 JSP中的include指令和include动作有什么区别?
1. Servlet与JSP
1.1 页面请求的工作流程是怎样的?
1.2 HTTP中GET与POST方法有什么区别?
- GET
GET的主要功能是从服务端获取用户所需资源,并将其作为响应返回给客户端。不建议采用GET方法向服务端上传数据,因为GET的数据量通常只有1024Byte左右,并且是添加在URL中的,存在安全隐患。
- POST
POST除了能够从服务端获取资源外,同时还可以向服务器上传数据
1.3 什么是Servlet?
HTML只能用来保存静态内容,所以动态页面的概念被引入。其中一种方法是采用CGI(公共网关接口),另一种方法是采用Servlet技术。
Servlet是采用Java语言编写的服务端程序,它运行于Web服务器中的Servlet容器中,它的主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容。
Servlet的优点:
- 较好的可移植性;
- 执行效率高(CGI针对每个请求创建一个进程来处理,Servlet针对每个请求创建一个线程来处理);
- 功能强大(CGI无法与Web服务器直接交互,而Servlet可以);
- 使用方便;
- 可扩展性强;
Servlet是在容器的控制下执行的,最常被使用的容器是Tomcat,当Web服务器获取到一个对Servlet的请求时,该服务器将会把这个请求交给对应的容器来处理,容器通过调用Servlet的方法来响应客户端的请求。
Servlet处理客户端请求的步骤:
- 用户通过单击一个链接来向Servlet发起请求;
- Web服务器接收到该请求后,会把该请求交给相应的容器来处理,当容器发现这是对Servelt发起的请求后,容器会创建HttpServletRequest和HttpServletResponse对象;
- 容器可以根据请求消息中的URL消息找到对应的Servlet,然后针对该请求创建一个单独的线程;
- 容器调用Servlet的service()方法来完成对用户请求的响应,service()方法会调用doPost()或doGet()方法来完成具体的响应任务,同时把生成的动态页面返回给容器;
- 容器把响应消息组装成HTTP格式返回给客户端。
【注】doGet()和doPost()方法是在HttpServlet中定义的。
1.4 Servlet的生命周期?
- 加载
容器通过类加载器使用Servlet对应的文件来加载Servlet。
- 创建
通过调用Servlet的构造方法来创建一个Servlet实例。
- 初始化
通过调用Servlet的init()方法来完成初始化,会创建或打开任何与Servlet相关的资源以及执行初始化工作。
- 处理客户端请求
Servlet创建完成后,一旦有请求到来时,容器都会创建一个线程来处理,调用Servlet的service()方法。
- 卸载
通过调用Servlet的destory()方法,让Servlet释放其占用的系统资源。
【注】init()方法和destory()方法都只会调用一次。
1.5 JSP有哪些优点?
在引入JSP之前,在Web应用程序中,所有业务逻辑和HTML响应都是在Servlet中实现的,这种方法必须把给用户响应的视图组装成一个很长的HTML格式的字符串写入println()方法中。
JSP的引入让Servlet只负责其对应的业务逻辑的处理,让JSP来负责用户的HTML显示。
JSP最终要被转换成Servlet来运行,区别在于,Servlet是在Java中嵌入HTML代码,而JSP是在HTML中嵌入Java代码。
1.6 如何使用JSP与Servlet实现MVC模型?
MVC模型关系图:
用JSP与Servlet实现MVC模型:
1.7 Servlet中forward与redirect有什么区别?
- forward
forward是服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而客户端并不知道,因此在客户端浏览器的地址栏中不会显示跳转后的地址,还是原来的地址。由于在整个定向的过程中用的是同一个Request,因此forward会将Request信息带到被定向的JSP或Servlet中使用。
- redirect
redirect是客户端的重定向,是完全的跳转,即客户端浏览器会获取到跳转后的地址,然后重新发送请求,因此浏览器中会显示跳转后的地址。同时,由于这种方式比forward方式多了一次网络请求,因此其效率要低于forward方式。客户端的重定向可以通过设置特定的HTTP头或写JS脚本实现。
1.8 JSP的内置对象有哪些?
- request:客户端请求;
- response:用来表示服务端对客户端的响应;
- pageContext:提供了对JSP页面所有对象及命名空间的访问;
- session:用来表示客户端与服务端的一次会话;
- application:代表JSP所属的Web应用本身;
- out:用于在客户端浏览器输出信息;
- config:主要作用是取得服务器的配置信息;
- page:表示当前JSP页面;
- exception:用来表示异常。
1.9 JSP中的include指令和include动作有什么区别?
- include指令
<%@ include file="test.jsp" %>
include指令是编译阶段的指令,即在编译时,编译器会把指令所指向目标文件的内容复制到指令所在的位置,替换指令,最终形成一个文件,在运行时只有一个文件,适用于包含静态页面的情况。
- include动作
<jsp:include page="test.jsp"></jsp:include>
include动作是运行时的语法,在主页面被请求时,才将用到的页面包含进来,涉及两个文件,类似于方法调用,因此更适用于包含动态页面的情况。
1.10 cookie与session有什么区别?
cookie是在HTTP下,服务器或脚本可以维护客户工作站上信息的一种方式。它是由Web服务器保存在用户浏览器上的小文件,可以包含有关用户的信息。
session是指用来在客户端与服务端之间保持状态的解决方案以及存储结构。
区别:
- cookie机制采用的是在客户端保持状态的方案,即数据存放在客户端的浏览器上,而session机制采用的是在服务端保持状态的方案,即数据放在服务器上;
- cookie安全性不够,session比较安全;
- cookie性能更高一些;
- 单个cookie保存的数据不能超过4KB。
2. J2EE
2.1 什么是J2EE?
J2EE是Java平台企业版的简称,是用来开发与部署企业级应用的一个架构,它提供了一种统一的、开放标准的多层平台,该平台主要由构件、服务和通信3个模块构成:
- 构件
- 客户端构件
- Applets
- Application Clients
- 服务端构件
- Web构件
- Servlet
- JSP
- EJBs
- Web构件
- 客户端构件
- 服务:由J2EE平台提供商实现,分为Service API(开发时使用)和运行时服务。
- 通信:由容器提供的,支持协作构件之间的通信。
J2EE只是一个行业标准,主要用来通过Java开发服务端应用提供一个独立的、可移植的、多用户的企业级平台,从而能够简化应用程序的开发和部署。
2.2 J2EE中常用的术语?
- Web服务器
Web服务器是指驻留在Internet上的计算机程序,它是一种服务程序,其主要工作是接收来自客户端的请求,然后把对请求的处理结果返回给客户端。如IIS和Apache等。
- Web容器(Web应用服务器)
Web应用服务器是一种服务程序,用来给运行在其中的程序提供一个运行的环境。如Tomcat、JBoss、WebLogic和WebSphere等。
- EJB容器
EJB容器是一个服务端容器,是J2EE应用的业务层的技术标准,只要满足J2EE规范的组件就能在EJB容器中运行,EJB容器主要是为EJB组件提供一个运行的环境。
- Applet容器
Applet容器是一个客户端容器,包含的组件为Applet。Applet是一种嵌入在浏览器中的轻量级客户端,无法使用J2EE的各种Service和API。
- Application Client容器
Application Client容器是一个客户端容器,包含的组件为Application Client。Application Client是一种较重量级的客户端,可以使用J2EE的大多数Service和API。
- JNDI
Java命名与目录接口,提供了一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。
- JMS
Java消息服务,它是一个Java平台中面向消息中间件的API,主要实现各个应用程序之间进行异步通信。
- JTA
Java事务服务,它提供各种分布式事务服务,为J2EE实现分布式事务处理提供了重要的支撑。
- JAF
JavaBeans**框架,它是一个专用的数据处理框架,提供了一种统一处理不同数据格式的方法。
- RMI
远程方法调用,主要用于远程调用服务,通过它,可以像调用本地函数一样调用另外一台计算机上运行的程序。
2.3 EJB与JavaBean有什么异同?
EJB是基于RMI的技术,可以被远程访问,但它必须被部署在Webspere、WebLogic等容器中。
JavaBean是可复用的组件,是被容器如Tomcat创建的,是不能被跨进程访问的。
EJB | JavaBean |
主要用在服务端的开发 |
主要用在客户端的开发 |
可以作为独立的单元被部署到EJB容器中 | 不可被部署 |
支持使用部署描述符对EJB应用进行定制化 | 定制化只能在开发阶段 |
EJB构建分布式对象,可以被远程的对象访问 | JavaBean构建不是分布式对象,只能在应用程序内部被访问 |
EJB构件对终端用户不可见 | 部分JavaBean对终端用户可见 |
2.4 什么是Web Service?
Web Service是一种基于网络的分布式模块化组件,它可以将可调用的功能发布到Web上以供应用程序访问。
调用Web Service时,服务提供者把所提供的服务发布到服务代理的一个目录上,然后服务请求者使用UDDI首先到服务代理提供的目录上搜索服务,得到如何调用该服务的信息(WSDL),然后根据得到的调用信息使用SOAP调用服务提供者提供的服务。
2.5 SOAP与REST有什么区别?
SOAP是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据,SOAP数据使用XML数据格式,定义了一整套复杂的标签,来描述调用的远程过程、参数、返回值和出错信息等内容。
REST是一种软件架构风格,而不是一个具体的协议或标准,而且它是面向资源的。
2.6 J2EE开发有哪些调优的方法?
- 优化设计(小心使用继承、简化类结构、面向接口编程、尽量使用主要类型、避免对象的过度使用等);
- 尽可能使用数据库连接池;
- 给Web容器配置合理的线程数量来处理客户端的HTTP请求;
- 根据实际情况设置JVM中堆空间的大小;
- 使用框架来提高系统的效率;
- 把一些经常被访问的Servlet或JSP缓存起来;
- 优化I/O性能;
- 优化查询;
- 对session进行合理管理与设置。
3. 框架
3.1 Struts?
Struts是由自定义标签、信息资源、Servlet和JSP组成的一个可重用的MVC2模式的框架,它的结构图如下所示:
优点:
- 采用MVC模式,大量的tag有助于提高开发效率;
- 提供了页面导航功能;
- 提供了表单的验证功能;
- 提供了数据库连接池管理;
- 提供了Exception处理机制;
- 支持国际化。
不足:
- 大量的tag对于初学者难度较大;
- 包含大量XML格式的配置文件,不易调试也不便于管理;
- 只能支持Web应用程序的开发;
- Action不是线程安全的,且必须进行同步;
- 单元测试不方便;
- 部署繁琐;
- 对Servlet的依赖性过强。
【注】Sturts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有请求,而Struts2 Action对象为每一个请求产生一个实例,因此不存在安全问题。
3.2 IoC?
IoC即控制反转或依赖注入。是一种降低对象之间耦合关系的设计思想。
一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行,即调用者依赖于被调用者。而通过IoC的方式,使得上层不再依赖于下层的接口,即通过一定的机制来选择不同的下层实现,完成控制反转,使得由调用者来决定被调用者。
IoC通过注入一个实例化的对象来达到解耦的目的,使用这种方法后,对象不会被显示地调用,而是根据需求通过IoC容器来提供。
优点:
- 开发人员不需要关心对象是如何被创建的,增加新类非常方便;
- 便于进行单元测试。
不足:
- 对象是通过反射机制实例化出来的,因此会对系统的性能有一定的影响;
- 创建对象的流程变得比较复杂。
3.3 AOP?
AOP即面向切面编程。是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态地修改模型以满足新的需求,如增加日志、安全或异常处理的功能。
3.4 Spring?
Spring是一个J2EE框架,提供了对轻量级IoC的支持和对APO的封装。
Spring的设计非常模块化,由7个模块组成:
- Spring AOP:提供AOP支持,还提供了事务管理;
- Spring ORM:提供ORM框架的支持;
- Spring DAO:提供对DAO模式和JDBC的支持;
- Spring Web:提供Servlet监听器的Context和Web应用的上下文;
- Spring Context:提供Spring上下文,包括国际化、E-mail和JNDI访问等;
- Spring Web MVC:提供Web应用的MVC实现;
- Spring Core:Spring核心容器,最主要的BeanFactory组件提供了组件生命周期的管理,组件的创建、装配、销毁等功能。
3.5 Hibernate?
Hibernate是一个开放源代码的ORM框架,不仅可以运行在J2EE容器中,还可以在J2EE容器外运行,它对JDBC进行了非常轻量级的对象封装。
Hibernate如何提高性能:
- 延迟加载:当Hibernate从数据库获取某一个对象数据、获取某一个对象的集合属性值时或者获取某一个对象所关联的另一个对象时,并不会立即从数据库中把数据加载到对象中,而是通过建立一个代理对象,把这个对象的属性都设置为默认值,只有当这些数据在被使用时才会从数据库中去加载对应的数据;
- 缓存技术:一级缓存和二级缓存;
- 优化查询语句。
Hibernate的一级缓存和二级缓存:
- 一级缓存由Session来管理,在使用时必不可少。当使用Session查询数据时,首先会在该Session内部查找该对象是否存在,若存在,则直接返回,否则就到数据库中去查询,并将查询的结果缓存起来以便后期使用。缺点就是Session表示一次会话,生命周期较短,而且是线程不安全的。
- 二级缓存由SessionFactory来管理,在使用时可有可无。在使用二级缓存后,当查询数据时,会首先在内部缓存中去查找,如果不存在,接着在二级缓存中查找,最后才去数据库中查找。二级缓存是独立于Hibernate的软件部件,属于第三方的产品。