Servlet与JSP——Java Web(一)

 

1、页面请求的工作流程是怎样的

一个Web应用程序一般都是由客户端程序与服务器端程序两部分组成。其中,客户端主要是指用户和浏览器,用户可以通过浏览器查找所需的资源,而这些资源则位于服务器上。浏览器是一个工具软件,它主要有两个作用:是完成与服务器端的交互;二是完成HTML(Hyper-Text Markup Language,超文本标记语言,用来告诉浏览器怎样给用户展示内容)的解析,从而实现把用户需要查看的资源信息以直观的形式展现出来。服务器端用来接收客户端发来的请求,并对该请求进行处理,找到客户端请求的资源,最后把查找到的资源返回给客户端,这些资源主要包括HTML页面、图片、音频、视频、PDF文件等内容。

图5-1给出了最基本的页面访问的处理流程。


Servlet与JSP——Java Web(一)

1)用户通过浏览器输入链接地址来请求所需的资源。

2)浏览器接受用户的请求,并把该请求组装成指定的格式发送给服务器端,客户端与服务器端之间通过HTTP来完成具体的交互。其中请求的数据流中主要包含HTTP(HyperText Transfer Protocol,超文本传输协议,建立在TCP/IP基础上的一个协议,主要用来实现客户端与服务器端之间的通信)请求方法(GET或POST)、请求的网址(URL,Uniform Resource Locator,统一资源定位符)以及请求的一些参数信息。

3)服务器接收到客户端发来的请求,并查找用户所需要的资源。

4)服务器查找到用户请求的资源后,把该资源返回给客户端。

5)服务器通过把响应消息组装成特定的消息格式后返回给客户端,这个过程通过HTTP来完成。响应的数据流主要包含状态编码(代表请求成功或失败),Content-type(例如text、picture、HTML等),响应消息的内容(图片或HTML格式的内容)。

6)浏览器对HTML进行解析,并把响应结果展现给用户。
 

2、HTTP中 GET与POST方法有什么区别

HTTP请求的方法有很多种类,例如GET、POST、HEAD、TRACE、OPTIONS等,但是GETPOST是两个最常用的方法。其中,GET是最简单的一种请求方法,其主要功能是从服务器端获取用户所需资源,并将其作为响应返回给客户端,这些资源可以是HTML页面、图片、文档等内容中的任何一种,但需要注意的是,GET方法的作用主要用来获取服务器端资源信息,就如同数据库中查询操作一样,不会影响到资源自身的状态,例如删除、修改或新增资源都是不允许的。而POST方法提供了比GET方法更强大的功能,它除了能够从服务器端获取资源外,同时还可以向服务器上传数据

虽然GET方法主要用来从服务器上获取数据,也可以向服务器上传数据,但是一般不建议采用GET方法来向服务器上传数据,而是推荐使用POST方法实现该功能

具体而言,主要有以下两个方面原因:

1)采用GET方法向服务器上传数据时,一般将数据添加到URL后面,并且二者用“?”连接,各个变量之间用“&”连接。由于对URL的长度存在限制,因此采用这种方法能上传的数据量非常小,通常在1024Byte左右。而POST方法传递数据是通过HTTP请求的附件进行的,传送的数据量更大一些,一般默认为不受限制的

2)由于GET方法上传的数据是添加在URL中的,因此上传的数据被彻底“暴露”出来了,本身存在安全隐患,尤其是当用户需要向服务器提交一些敏感信息时。而POST方法向服务器提交的内容在URL中并没有明文显示,对用户都是不可见的,所以,安全性更好一些。
Servlet与JSP——Java Web(一)

 

3、什么是Servlet

HTML只能用来保存静态内容,而通常情况下,静态页面很难满足实际应用的需要,鉴于此,动态页面的概念被引入。所谓动态页面,指的是能够根据不同时间、不同用户而显示不同内容的页面,例如常见的论坛、留言板、电子商务网站等都是通过动态页面来实现的。那么如何才能生成动态页面呢?其中一种方法是采用公共网关接口(Common Gateway Interface,CGI)。CGI是一种用Perl脚本编写的程序,可以用来生成动态页面,而另一种方式则是采用Servlet技术

什么是Servlet呢?Servlet是采用Java语言编写的服务器端程序,它运行于Web服务器中的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容,而这正是HTML所不具备的功能

与其他生成动态页面的技术相比,Servlet有诸多优点,具体而言,主要表现在如下几个方面:

1)较好的可移植性。

由于Java语言具有跨平台和可移植性强的特点,使得Servlet也有较好的可移植性,即无需修改代码就可以部署到多种不同类型的Web服务器上。

2)执行效率高。

由于CGI针对每个请求都会创建一个进程来处理,而Servlet针对每个请求创建一个线程来执行,而创建线程比创建进程的开销要小,因此与CGI相比,Servlet在交互过程中有更短的响应时间,响应效率更高

3)功能强大。

Servlet可以与Web服务器进行交互,而CGI却无法与Web服务器直接交互。

4)使用方便。

Servlet提供了许多非常有用的接口以用来读取或设置HTTP头消息,处理Cookie和跟踪会话状态等。

5)可扩展性强。

由于Servlet是用Java语言编写的,因此它具备了Java语言的所有优点。

Java语言是健壮的、面向对象的编程语言,它很容易扩展,Servlet自然也具备这样的优点。为了更好地说明Servlet,在介绍Servlet处理请求的过程前,首先引入Servlet程序的基本结构,如下所示:
Servlet与JSP——Java Web(一)

从以上Servlet的程序结构中可以看出,在Servlet中,并没有main()方法,连所谓的入口方法都没有,那么它到底是如何执行的呢?其实,它是在容器的控制下执行的,最常被使用的容器为Tomcat当Web服务器获取到一个对Servlet的请求时,该服务器将会把这个请求交给对应的容器来处理,容器通过调用Servlet的方法(doGet()或doPost())来响应客户端的请求。
具体而言,Servlet处理客户端请求有如下几个步骤:

1)用户通过单击一个链接来向Servlet发起请求。

2)Web服务器接收到该请求后,会把该请求交给相应的容器来处理,当容器发现这是对Servlet发起的请求后,容器此时会创建两个对象:HttpServletResponse和HttpServletRequest

3)容器可以根据请求消息中的URL消息找到对应的Servlet,然后针对该请求创建一个单独的线程,同时把第2)步中创建的两个对象以参数的形式传递到新创建的线程中。

4)容器调用Servletservice()方法来完成对用户请求的响应,service()方法会调用doPost()doGet()方法来完成具体的响应任务,同时把生成的动态页面返回给容器。

5)容器把响应消息组装成HTTP格式返回给客户端。此时,这个线程运行结束,同时删除第2)步创建的两个对象。以上处理流程如图5-2所示。

容器会针对每次请求创建一个新的线程进行处理,同时会针对每次请求创建HttpServletResponse和HtpServletRequest两个对象。处理完成后线程也就退出了。
Servlet与JSP——Java Web(一)

Servlet与JSP——Java Web(一)

Servlet与JSP——Java Web(一)

4、doPost()方法与doGet()方法怎么选择

从Web容器处理HTTP请求的流程中可以看出,最终的请求都会交给Servlet来处理,而Servlet是通过调用service()方法来处理请求的,service()方法会根据不同的请求类型分别调用doPost()方法(用于处理POST请求)或doGet()方法(用于处理GET请求)来处理用户请求,实现对客户的响应。如果请求是GET,就调用doGet()方法;如果请求是POST,就调用doPost()方法。在Servlet接口和GenericServlet(一个通用的、不特定于任何协议的Servlet,它实现了Servlet接口)中是没有doGet()方法与doPost()方法的,而HttpServlet中定义了这些方法,但是都是返回error信息,所以,当定义一个Servlet时,都必须实现doGet()方法或doPost()方法。doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。

具体而言,当HTTP请求中的method属性为get时,调用doGet()方法;当method属性为post时,则调用doPost()方法。
 

5、什么是Servlet的生命周期

由于Servlet运行在容器中,没有main()方法,因此,整个生命周期都是由容器来控制的。简单而言,Servlet的生命周期只有两个状态:未创建状态与初始化状态。这两种状态的转换主要是由3个重要的方法来进行控制:init()、service()和destroy()。其中,init()方法是Servlet生命的起点,用于创建或打开任何与Servlet相关的资源以及执行初始化工作service()方法是Servlet中真正处理客户端传过来的请求的方法,它根据HTTP请求方法(GET、POST等)将请求分发到doGet()、doPost()等方法。destroy()方法释放任何在init()方法中打开的与Servlet相关的资源。

Servlet的状态图如图5-3所示。
Servlet与JSP——Java Web(一)

具体而言,Servlet的生命周期可以分为加载、创建、初始化、处理客户请求和卸载5个阶段。

1)加载。

容器通过类加载器使用Servlet类对应的文件来加载Servlet。

2)创建。

通过调用Servlet的构造函数来创建一个Servlet实例。

3)初始化。

通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已被创建但向客户端提供服务之前调用的,需要注意的是,init()方法只会被调用一次。

4)处理客户请求。

Servlet一旦被创建后,它就可以为客户端提供服务了。每当有新的客户请求到来时,容器都会创建一个新的线程来处理该请求,接着会调用Servlet的service()方法来完成客户端的请求,当然,service()方法会根据请求的method属性值的不同调用决定是调用doGet()方法还是调用doPost()方法来完成具体的响应。

5)卸载。

容器在卸载Servlet之前需要调用destroy()方法,让Servlet自己释放其占用的系统资源,一旦destroy方法被调用,容器就不会再向这个Servlet发送任何请求消息了。如果容器需要这个Servlet,那么就必须重新创建并初始化一个实例。需要注意的是,destroy()方法只会被调用一次。


Servlet与JSP——Java Web(一)

 

6、JSP 有哪些优点

JSP(Java Server Pages)是由Sun公司倡导、许多企业参与建立起来的一种动态技术标准,从本质上来讲,就是嵌入了Java代码的HTML文件(但需要注意的是,JSP页面最好少写Java代码)。在引入JSP之前,在Web应用程序中,所有业务逻辑和HTML的响应都是在Servlet中实现的,但在使用这种方式时,存在一个比较大的缺陷:必须把给用户响应的视图组装成一个很长的HTML格式的字符串写入println()方法中。所以,使用这种方式编程,在编写一段很长的HTML字符串时非常容易出错,而且代码的可读性也非常差,同时由于业务逻辑与视图没有分离,系统的可扩展性、可维护性都较差

JSP的引入在一定程度上解决了Servlet存在的缺点。其实现理念是让每个Servlet只负责其对应的业务逻辑的处理,让JSP来负责用户的HTML显示,因此实现了业务逻辑与视图实现的分离,从而极大地提高了系统的可扩展性。

在引入JSP后,Servlet的实现结构如下:


Servlet与JSP——Java Web(一)

 

7、JSP与Servlet有何异同

JSP与Servlet的相同点为:JSP可以被看作一个特殊的Servlet,它只不过是对Servlet的扩展,只要是JSP可以完成的工作,使用Servlet都可以完成,例如生成动态页面由于JSP页面最终要被转换成Servlet来运行,因此处理请求实际上是编译后的Servlet。

JSP与Servlet的不同点为:

Servlet的实现方式是在Java中嵌入HTML代码,编写和修改HTML非常不方便,所以它比较适合做流程控制、业务处理;而JSP的实现方式为在HTML中嵌入Java代码,比较适合页面的显示,例如,在Struts框架中,Servlet位于MVC设计模式的控制层,而JSP位于视图层。

Servlet中没有内置对象,JSP中的内置对象都是必须通过HtpServletRequest对象、HttpServletResponse对象以及HtpServlet对象得到。
 

8、如何使用JSP与Servlet 实现MVC模型

MVC是Model(模型)、View(视图)和Controller(控制器)3个单词的首字母组合。MVC是一种目前广泛流行的应用模型,其目的是实现Web系统的职能分工。图5-4为MVC模型关系图,其中模型层实现系统中的业务逻辑,通常可以用JavaBeanEJB来实现;视图层则用于与用户的交互,通常用JSP来实现;控制层则是模型与视图之间沟通的桥梁,它可以把用户的请求分派并选择恰当的视图来显示它们,同时它也可以解释用户的输入并将其映射为模型层能够执行的操作。

MVC强制性地分离Web应用的输入、处理和输出,使得MVC应用程序被分成3个核心部件:模型、视图和控制器。它们各自处理自己的任务。
Servlet与JSP——Java Web(一)

(1)模型(业务逻辑层)模型表示企业数据和业务逻辑,它是应用程序的主体部分。

业务流程的处理过程对其他层来说是黑箱操作,模型接收视图请求数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉设计人员按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难,可以使设计人员专注于业务模型的设计。
MVC把应用的模型按一定的规则抽象出来。抽象的层次很重要,这也是判断设计人员是否优秀的主要依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉设计人员应该如何组织管理这些模型,以便于模型的重构和提高重用性。业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据持续化,比如将一张订单保存到数据库,从数据库获取订单,将这个模型单独列出,所有相关数据库的操作只限制在该模型中。

(2)视图(表示层)视图是用户看到的并与之交互的界面。

对早期的Web应用来说,视图就是由HTML元素组成的界面,在新式的Web应用中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash以及诸如XHTML、XML/XSL等一些标识语言和Web服务等。
随着Web应用开发技术的发展,用户要求的日益提高,如何处理应用程序的界面已经变得越来越有挑战性。MVC架构一个大的好处是它能为Web应用处理很多不同的视图。在视图中其实没有真正的业务处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
视图功能强大,主要表现在以下两个方面:

1)根据客户类型显示信息。

2)显示商业逻辑(模型)的结构,而不关心信息如何获得何时获得。

(3)控制器控制器接收用户的输入并调用模型和视图去完成用户的需求。

所以当用户单击Web页面中的超链接和发送HTML表单时,控制器(例如Servlet)本身不输出任何东西,也不执行任何处理,它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。
MVC的处理过程是这样的:对于每一个用户输入的请求,先被控制器接收,并决定由哪个模型来进行处理,然后模型通过业务逻辑层处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过显示页面呈现给用户。
MVC这种特殊的设计结构,给应用开发带来了很多便利,通过使用MVC架构,大大提高了Web应用的开发效率,具体来说,MVC设计结构主要有以下几个方面的优点:

1)低耦合性。

由于视图层和业务层分离,这样就使得修改视图层代码时不需要重新编译模型和控制器的代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

2)高重用性和可适用性。由于技术的不断进步,现在访问应用程序可以有越来越多的方式。

MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何Web
(HTTP)浏览器或者无线浏览器(WAP),例如,用户可以通过计算机或手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,因此同样的构件能被不同的界面使用,例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令仅是改变视图层的实现方式,而控制层和模型层无需做任何改变。

3)较低的生命周期成本。

MVC使得开发和维护用户接口的技术难度降低。

4)部署快速。

使用MVC模式可以大大缩减开发时间,这使得后台开发人员集中精力于业务逻辑上,使界面开发人员(包括HTML和JSP开发人员)集中精力于表现形式上。

5)可维护性。

分离视图层和业务逻辑层也使得Web应用更易于维护和修改。

6)有利于软件工程化管理。

由于采用了分层思想,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
用JSP与Servlet实现的MVC模型如图5-5所示。


Servlet与JSP——Java Web(一)

在这个MVC模型中,视图模块采用JSP来实现,主要负责数据的展现。视图可以从控制器上获取模型的状态,当然不是直接从控制器上获取,而是控制器把模型的数据放到一个视图可以访问的地方,通过间接方式来访问模型的数据。控制器采用Servlet来实现,客户端的所有请求都发送给Servlet,它接收请求,并根据请求消息把它们分发给对应的JSP页面来响应,同时根据需求生成JavaBean实例供JSP来使用。模型采用JavaBean来实现,这个模块实现了实际的业务逻辑。


Servlet与JSP——Java Web(一)

9、Servlet 中forward 和redirect有什么区别

在设计Web应用程序时,经常需要把一个系统进行结构化设计,即按照模块进行划分,让不同的Servlet来实现不同的功能,例如可以让其中一个Servlet接收用户的请求,另外一个Servlet来处理用户的请求。为了实现这种程序的模块化,就需要保证在不同的Servlet之间可以相互跳转,而Servlet中主要有两种实现跳转的方式:forward方式与redirect方式

forward是服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,而客户端并不知道,因此在客户端浏览器的地址栏中不会显示转向后的地址,还是原来的地址。由于在整个定向的过程中用的是同一个Request,因此forward会将Request的信息带到被定向的JSP或Servlet中使用

redirect则是客户端的重定向,是完全的跳转,即客户端浏览器会获取到跳转后的地址,然后重新发送请求,因此浏览器中会显示跳转后的地址。同时,由于这种方式比forward方式多了一次网络请求,因此其效率要低于forward方式。需要注意的是,客户端的重定向可以通过设置特定的HTTP头或写JavaScript 脚本实现

图5-6可以更好地说明 forward与redirect的区别。


Servlet与JSP——Java Web(一)

鉴于以上区别,一般当forward方式可以满足需求时,尽可能地使用forward方式。但在有些情况下,例如,需要跳转到一个其他服务器上的资源,则必须使用redirect方式

引申:filter的作用是什么?主要实现什么方法?

filter使用户可以改变一个request并且修改一个response。filter不是一个Servlet,它不能产生一个response,但它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。filter 其实是一个“Servlet Chaining”(Servlet链)。

一个filter的作用包括以下几个方面:

1)在Servlet被调用之前截获。

2)在Servlet 被调用之前检查Servlet Request。

3)根据需要修改Request头和Request数据。

4)根据需要修改Response 头和Response数据。

5)在Servlet被调用之后截获。


Servlet与JSP——Java Web(一)

10、JSP的内置对象有哪些

在JSP中,内置对象又称为隐含对象,是指在不声明和不创建的情况下就可以被使用的一些成员变量。JSP一共提供有9个内置对象:request(请求对象)、response(响应对象)、pageContext(页面上下文对象)、session(会话对象)、application(应用程序对象)、out(输出对象)、config(配置对象)、page(页面对象)与exception(例外对象)。JSP内置对象的具体描述见表5-1。
Servlet与JSP——Java Web(一)

Servlet与JSP——Java Web(一)

根据以上9个内置对象的作用的不同,可以将它们分为4类第一类,与Servlet有关的page和config;第二类,与Input/Output有关的out,request和response;第三类,与Context有关的application,session和pageContext;第四类,与Error有关的exception。
Servlet与JSP——Java Web(一)

 

11、 request对象主要有哪些方法

当使用JSP与Servlet开发Web应用程序时,如何获取用户提交的请求信息是非常重要的内容之一。request对象就是用来封装用户请求数据的,每当有请求到达服务器时,系统都会创建一个request对象。在服务器进行处理时可以通过获取request对象的属性来获取用户的请求数据。此外,还可以通过对request对象设置新的一些属性来实现在Servlet与JSP之间跳转时传递一些参数的功能。具体来讲,request对象的方法见表5-2。
Servlet与JSP——Java Web(一)

Servlet与JSP——Java Web(一)

Servlet与JSP——Java Web(一)

12、JSP有哪些动作

JSP使用动作来实现动态地插入文件、实现重定向和对JavaBean的引用等功能。它共有6个基本动作:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward 和jsp:plugin。下面将分别对这些动作进行具体介绍。

1)jsp:include。

用来在页面被请求时引入一个文件。include指令是在JSP文件被转换成Servlet时引入文件,而jsp:include插入文件的时间是在页面被请求时,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),示例如下:
Servlet与JSP——Java Web(一)

以上代码表示在当前文件中可以引入test.jsp文件。

2)jsp:useBean。

用来寻找或者实例化一个JavaBean。它使得开发人员既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性,示例如下:
Servlet与JSP——Java Web(一)

以上代码表示实例化了一个com.Car类的实例。

3)jsp:setProperty。

用来设置已经实例化的Bean对象的属性,示例如下:
Servlet与JSP——Java Web(一)

以上代码用来将名字为car的实例的colour属性设置为red。

4)jsp:getProperty。

用来获取某个JavaBean的属性,示例如下:
Servlet与JSP——Java Web(一)

以上代码用来获取名字为car的实例的colour属性。

5)jsp:foward。

用来把请求转到一个新页面,示例如下:
Servlet与JSP——Java Web(一)

以上代码用来把当前页面重定向到/Servlet/login来处理。

6)jsp:plugin。

用于在浏览器中播放或显示一个对象。使用这个动作能插入所需的特定的浏览器的OBJECT或EMBED元素来指定浏览器运行一个JAVAApplet所需的插件,示例如下:
Servlet与JSP——Java Web(一)

以上代码用来在浏览器中运行一个applet插件。
 

13、JSP中include 指令和include动作有什么区别

include的主要作用是用来在当前文件中引入另外一个文件,以便在当前文件中使用,例如,当应用程序中的所有页面的某些部分(例如标题、页脚、导航栏等)都一模一样时,就可以考虑把相同的部分提取出来写入一个单独的文件中,然后通过include方式引入。

include有两种使用方法:include指令和include动作。其中,include指令的使用方法为:<%@include file="test.jsp"%>,include动作的使用方法为:<jsp:include page="test.jsp"flush="true"><jsp:param name="name"value="value"/></jsp:include>。include 指令与include动作之间的根本性差异在于二者被调用的时间。include指令是编译阶段的指令,即在编译时,编译器会把指令所指向目标文件的内容复制到指令所在的位置,替换指令,最终形成一个文件,在运行时只有一个文件。也就是说,include指令所包含文件的内容是在编译时插入到JSP文件中的,当文件内容有变化时就需要重写编译,因此适合于包含静态页面的情况,例如可以包含一个Servlet。而include动作是运行时的语法,在主页面被请求时,才将用到的页面包含进来,涉及两个文件,类似于方法调用,因此更适用于包含动态页面的情况。除此之外,二者的差别还有以下3点:

1)当使用include动作时,在页面中声明的变量不可用于另一文件,除非将变量放置在request、session、application作用域中;而在使用include指令时,当前页面和被包含页面可以共享变量。

2)当使用include指令时,新生成的JSP页面要符合JSP语法要求,应该避免变量名的冲突;而在使用include动作时,不存在变量名冲突问题。

3)include指令会修改被包含文件,但不会立即生效,除非修改主页面或删除主页面的类;而include动作修改了被包含的文件,会立即生效。

考虑到include动作在维护上的优势,当这两种方法都适用时,优先考虑使用include动作。仅在所包含文件中定义了主页面要用到的字段或方法,或所包含文件设置了主页面的响应报头时,才应该使用include指令,例如,很多站点的导航部分和版权信息部分都是相同的,在每个文件中都会出现,所以可以考虑把这些内容放在单独的文件中,然后使用<%@include%>指令引用即可。
Servlet与JSP——Java Web(一)

 

14、会话跟踪技术有哪些

在开发Web应用程序时,经常需要能够做到数据共享或者是在不同页面之间可以传递参数,而且,一个会话中的数据可能会在不同的地方使用,因此就需要有专用的机制来传递和保存这些数据。

所谓会话,指的是从客户端打开与服务器的连接并发出请求到服务器响应客户端请求的全过程。会话跟踪则是对同一个用户对服务器的连续请求和接受响应的监视,由于客户端与服务器端之间是通过HITTP进行通信的,而HTTP本身是无状态协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,在下一次请求时,需要重新建立连接,等到建立完连接后还需要判断是否是同一个用户,因此,要想对会话的过程进行监控,最好的方法就是使用会话跟踪技术

具体而言,会话跟踪技术主要有如下4种:

1)page。

代表与一个页面相关的对象和属性。一个页面由一个编译好的Java Servlet类(可以带有任何的include指令,但是没有include动作)表示。这既包括Servlet又包括被编译成Servlet的JSP页面。

2)request。

代表与Web客户端发送的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件。

3)session。

代表与用于某个Web客户端的一个用户体验相关的对象和属性,一个Web会话可以也经常会跨越多个客户端请求。

4)application。

代表与整个Web应用程序相关的对象和属性,这实质上是跨越多个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
 

15、cookie 和session有什么区别

cookie是在HTTP下,服务器或脚本可以维护客户工作站上信息的一种方式。它是由Web服务器保存在用户浏览器上的小文件,可以包含有关用户的信息(如身份识别号码、密码等信息)。sesion是指用来在客户端与服务器端之间保持状态的解决方案以及存储结构。

尽管二者都能够进行信息存储,但是也存在着区别。具体而言,二者有以下几个方面的区别:

1)cookie机制采用的是在客户端保持状态的方案,即数据存放在客户的浏览器上;而session机制采用的是在服务器端保持状态的方案,即数据放在服务器上。

2)cookie安全性不够。由于cookie信息存放在客户端,其他人可以很容易地得到存放在本地的cookie,并进行cookie欺骗;而session信息存放在服务器端,因此较为安全。

3)cookie 性能更高一些。由于session会在一定时间内保存在服务器上,因此当访问量增多时,会降低服务器的性能。

4)单个cookie保存的数据不能超过4KB,很多浏览器都限制一个站点最多保存20个cookie;而session不存在此问题。
鉴于以上几点区别,一般情况下,将用户登录信息等重要信息存放至session中,而其他需要保留的信息可以放在cookie中。