分享
 
 
 

JSP高级编程 1

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

第一章概述

1.1 Java技术

J a v a是一种简单易用、完全面向对象、具有平台无关性且安全可靠的主要面向I n t e r n e t的开

发工具。自从1 9 9 5年正式问世以来,J a v a的快速发展已经让整个We b世界发生了翻天覆地的变化。

随着Java Servlet的推出, J a v a在电子商务方面开始崭露头角,最新的Java Server Page技术的推

出,更是让J a v a成为基于We b的应用程序的首选开发工具。

要学习J a v a技术中的Java Server Page,J a v a基础是必不可少的,本书将在第2章为没有J a v a

基础的读者简单讲解J a v a的基础语法和Java Beans等,它们是在学习J S P之前必须掌握的J a v a知识。

这里,先回顾一下J a v a的发展历程,然后讲解几个后面将要用到的重要概念。

1.1.1 Java技术的发展

J a v a技术是由美国S u n公司倡导和推出的, J a v a技术包括J a v a语言和Java Media APIs 、

Security APIs、Management APIs、Java Applet、Java RMI 、J a v a B e a n s、J a v a O S、Java Servlet、

J D B C、J N D I、Enterprise JavaBeans等,下面是J a v a技术的发展简述。

1 9 9 0年,S u n公司James Gosling领导的小组设计了一种平台独立的语言O a k,主要用于为各

种家用电器编写程序。

1 9 9 5年1月,Oak 被改名为J a v a,1 9 9 5年5月2 3日,S u n公司在Sun World ‘9 5上正式发布

J a v a和H o t J a v a浏览器。

1 9 9 5年8月至1 2月,N e t s c a p e公司、O r a c l e公司、B o r l a n d公司、S G I公司、A d o b e公司、I B M

公司、AT & T公司、I n t e l公司获得J a v a许可证。

1 9 9 6年1月,S u n公司宣布成立新的业务部门─J a v a S o f t部,以开发、销售并支持基于J a v a

技术的产品,由Alan Baratz任总裁。同时推出J a v a开发工具包JDK(Java Development Kit) 1.0,

为开发人员提供编制J a v a应用软件所需的工具。

1 9 9 6年2月,S u n发布J a v a芯片系列,包括p i c o J a v a、M i c r o J a v a和U l t r a J a v a,并推出J a v a数据

库连接JDBC (Java Database Connectivity)。

1 9 9 6年3月,S u n公司推出Java Wo r k S h o p。

1 9 9 6年4月,M a c r o s o f t公司、S C O公司、苹果电脑公司( A p p l e )、N E C公司等获得J a v a许可证。

S u n公司宣布苹果电脑、H P、日立、I B M、微软、N o v e l l、S G I、S C O、Ta m d e m等公司将把J a v a

平台嵌入到其操作系统中。

第一部分JSP 入门

1 9 9 6年5月,H P公司、S y b a s e公司获得J a v a许可证。北方电讯公司宣布把J a v a技术和J a v a微

处理器应用到其下一代电话机中的计划。5月2 9日, S u n公司在旧金山举行第一届J a v a O n e世界

J a v a开发者大会,业界人士踊跃参加。S u n公司在大会上推出一系列J a v a平台新技术。

1 9 9 6年8月,Java Wo r k S h o p成为S u n通过互联网提供的第一个产品。

1 9 9 6年9月,A d d i s o n - We s l e y和S u n推出J a v a虚拟机规范和J a v a类库。

1 9 9 6年1 0月,德州仪器等公司获得J a v a许可证。S u n提前完成J a v a B e a n s规范并发布。发布第

一个Java JIT(Just-In-Ti m e )编译器,并打算在Java Wo r k S h o p和S o l a r i s操作系统中加入J I T。1 0月

2 9日,S u n发布J a v a企业计算技术,包括J a v a S t a t i o n网络计算机、6 5家公司发布的8 5个J a v a产品

和应用、7个新的J a v a培训课程和J a v a咨询服务、基于J a v a的S o l s t i c e互联网邮件软件、新的J a v a

开发者支持服务、演示HotJava Vi e w s、Java Tu t o r、完成Java Card API等。S u n宣布完成J a v a

Card API规范,这是智能卡使用的第一个开放A P I。Java Card规范将把J a v a能力赋予全世界的亿

万张智能卡。

1 9 9 6年11月,I B M公司获得J a v a O S和H o t J a v a许可证。N o v e l l公司获得Java Wo r k S h o p许可证。

S u n和I B M宣布双方就提供J a v a化的商业解决方案达成一项广泛协议, I B M同意建立第一个J a v a

检验中心。

1 9 9 6年1 2月,X e r o x等公司获得J a v a或J a v a O S许可证。S u n发布JDK 1.1、J a v a商贸工具包、

J a v a B e a n s开发包及一系列Java APIs。推出一个新的Java Server产品系列,其中包括Java We b

S e r v e r、Java NC Server和Java Server To o l k i t。S u n发布1 0 0 %纯J a v a计划,得到百家公司的支持。

1 9 9 7年1月,S A S等公司获得J a v a许可证。S u n交付完善的J a v a B e a n s开发包,这是在确定其

规范后不到8个月内完成的。

1 9 9 7年2月,S u n和A R M公司宣布同意使J a v a O S能运行在A R M公司的R I S C处理器架构上。

I n f o r m i x公司宣布在其Universal Server和其他数据库产品上支持JDK 1.1。N e t s c a p e公司宣布其

Netscape Communicator支持所有J a v a化的应用软件和核心A P I s。

1 9 9 7年3月,H P公司获得Java Wo r k S h o p许可证,用于H P - U X操作系统。西门子A G公司等获

得J a v a许可证。日立半导体公司、I n f o r m i x公司等获得J a v a O S许可证。N o v e l l公司获得J a v a

S t u d i o许可证。S u n发售JavaOS 1.0操作系统,这是一种在微处理器上运行J a v a环境的最小、最快

的方法,提供给S u n的J a v a O S许可证持有者使用。S u n发售HotJava Browser 1.0,这是一种J a v a浏

览环境,可以方便地按剪裁来编制专用的信息应用软件,如客户自助台和打上公司牌号的网络

应用软件。S u n推出JDK 1.1.1。

1 9 9 9年6月,Sun 发布JDK 1.3和Java Web Server 2.0。

1.1.2 JavaBeans

什么是J a v a B e a n s?J a v a B e a n s就是J a v a的可重用组件技术。A S P通过C O M来扩充复杂的功能,

如文件上载、发送e m a i l以及将业务处理或复杂计算分离出来成为独立可重复利用的模块。J S P通

过J a v a B e a n实现了同样的功能扩充。JSP 对于在Web 应用中集成JavaBean 组件提供了完善的支

持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开

发),也为JSP 应用带来了更多的可伸缩性。JavaBean 组件可以用来执行复杂的计算任务,或负

2第一部分JSP 入门

责与数据库的交互以及数据提取等。

在实际的J S P开发过程中,读者将会发现,和传统的A S P或P H P页面相比,J S P页面将会是非

常简洁的,由于J a v a B e a n s开发起来简单,又可以利用J a v a语言的强大功能,许多动态页面处理

过程实际上被封装到了J a v a B e a n s中。

1.1.3 JDBC

J D B C是用于执行S Q L语句的J a v a应用程序接口,由一组用J a v a语言编写的类与接口组成,

在J S P中将使用J D B C来访问数据库。J D B C是一种规范,它让各数据库厂商为J a v a程序员提供标

准的数据库访问类和接口,这样就使得独立于D B M S的J a v a应用程序的开发工具和产品成为可能。

一般的J a v a开发工具都带有J D B C - O D B C桥驱动程序,这样,只要是能够使用O D B C访问的数据

库系统,也就能够使用J D B C访问了。有趣的是,不同于O D B C是Open Database Connectivity的

简称,J D B C并不是Java Database Connecivity的简称,而是S U N的注册商标,至少官方说法是这

样的。

1.1.4 J2EE

电子商务和信息技术的快速发展以及对它们的需求给应用程序开发人员带来了新的压力。

必须以比以前更少的金钱、更少的资源来更快地设计、开发企业应用程序。

为了降低成本,并加快企业应用程序的设计和开发, J2EE 平台提供了一个基于组件的方法,

来设计、开发、装配及部署企业应用程序。J2EE 平台提供了多层的分布式的应用模型、组件再

用、一致化的安全模型以及灵活的事务控制。您不仅可以用比以前更快的速度向市场推出创造

性的客户解决方案,而且您的平台独立的、基于组件的J2EE 解决方案不会被束缚在任何一个厂

商的产品和API 上。

1. J2EE 规范定义了以下种类的组件

• 应用客户组件。

• Enterprise JavaBeans 组件。

• S e r v l e t及JavaServer Pages(JSP 页面)组件(也被称作Web 组件)。

• Applet。

一个多层的分布式的应用模型意味着应用逻辑被根据功能划分成组件,并且可以在同一个

服务器或不同的服务器上安装组成J2EE 应用的这些不同的组件。一个应用组件应被安装在什么

地方,取决于该应用组件属于该多层的J2EE 环境中的哪一层。这些层是客户层、We b层、业务

层及企业信息系统层( EIS )等。

(1) 客户层

J2EE 应用可以是基于Web 的,也可以是不基于Web 的。在一个基于Web 的J2EE 应用中,

用户的浏览器在客户层中运行,并从一个We b服务器Web 层中的静态HTML 页面或由J S P

或Servlet 生成的动态HTML 页面。在一个不基于Web 的J2EE 应用程序中,一个独立客户程序不

运行在一个HTML 页面中,而是运行在其他一些基于网络的系统(比如手持设备或汽车电话)

中,Applet 程序,在客户层中运行,并在不经过Web 层的情况下访问Enterprise Beans。这个不

第一章概述3

基于Web 的客户层可能也包括一个JavaBeans 类来管理用户输入,并将该输入发送到在企业层中

运行的Enterprise Beans类来进行处理。根据J2EE 规范,JavaBeans 类不被视为组件。

为J2EE 平台编写的JavaBeans 类有实例变量和用于访问实例变量中的数据的“ get 和set 方

法”。以这种方式使用的JavaBeans 类在设计和实现上通常都是简单的,但是它们必须符合

JavaBeans 规范中列出的命名和设计约定。

(2) Web 层

J2EE Web 组件可以由JSP 页面、基于Web 的A p p l e t以及显示HTML 页面的S e r v l e t组成。调

用S e r v l e t或者JSP 页面的HTML 页面在应用程序组装时与Web 组件打包在一起。就像客户层一

样,Web 层可能包括一个JavaBeans 类来管理用户输入,并将输入发送到在业务层中运行的

Enterprise Beans 类来进行处理。运行在客户层的Web 组件依赖容器来支持诸如客户请求和响应

及Enterprise Bean 查询等。

(3) 业务层

作为解决或满足某个特定业务领域(比如银行、零售或金融业)需要的逻辑的业务代码由

运行在业务层的Enterprise Beans 来执行。一个Enterprise Bean 从客户程序处接收数据,对数据

进行处理(如果需要),再将数据发送到企业信息系统层存储起来。一个Enterprise Beans 还从存

储中检索数据,并将数据送回客户程序。运行在业务层的Enterprise Beans 依赖于容器来为诸如

事务、生命期、状态管理、多线程及资源存储池等提供通常都非常复杂的系统级代码。业务层

经常被称作Enterprise JavaBeans (EJB )层。业务层和Web 层一起构成了3 层J 2 E E应用的中间

层,而其他两层是客户层和企业信息系统层。

(4) 企业信息系统层

企业信息系统层运行企业信息系统软件,这层包括企业基础设施系统,例如企业资源计划

(E R P)、大型机事务处理( mainframe transactionprocessing )、数据库系统及其他遗留信息系统

(legacy informationsystems )。J2EE 应用组件因为某种原因( 例如访问数据库) 可能需要访问企

业信息系统。J2EE 平台的未来版本将支持Connector 架构,该架构是将J2EE 平台连接到企业信

息系统上的一个标准A P I。

(5) 查询服务

因为一个J2EE 应用程序的组件是单独运行的,并且往往在不同的设备上运行,因此,需要

一种能让客户层和Web 层代码查询并引用其他代码和资源的方法。客户层和Web 层代码使用

Java 命名和目录接口(JNDI )来查询用户定义的对象(例如Enterprise Beans )、环境条目(例

如一个数据库驱动器的位置)、企业信息系统层中用于查找资源的JDBC DataSource对象,以及

消息连接。

(6) 安全和事务管理

诸如安全和事务管理这样的应用行为可以在部署时在Web 和Enterprise Beans 组件上进行配

置。这个特征将应用逻辑从可能随装配而变化的配置设定中分开了。

J2EE 安全模型允许配置一个Web 或Enterprise Beans 组件,使系统资源只能由授权的用户访

问。例如,一个Web 组件可以被配置成提示输入用户名和密码。一个Enterprise Beans 组件可以

被配置成只让特定团体中的成员调用其某些方法。或者,一个Servlet 组件可以被配置成让某个

4第一部分JSP 入门

组织中的所有人都能访问其某些方法,同时只让该组织中的某些享有特权的人访问其中一些方

法。同样是该Servlet 组件,可以针对另外一个环境而被配置成让每个人都能访问其所有方法,

或者仅让选定的少数人访问其所有方法。

J2EE 事务模型使得能够在部署时定义构成一个单一事务的方法之间的关系,以使一个事务

中的所有方法被处理成一个单一的单元。这是我们所希望的,因为一个事务是一系列步骤,这

些步骤要么全部完成,要么全部取消。例如,一个Enterprise Beans 可能有一组方法,使我们可

以通过从第一个账户借出并存入第二个账户的方式而将钱从第一个账户转移到第二个账户。我

们希望全部的操作被作为一个单元对待,这样,如果在借出之后存入之前发生了故障,该借出

操作被取消。事务属性是在装配期间定义在一个组件上的。这使得能将来自多个应用组件的方

法归到一个事务中,这说明,我们可以轻易变更一个J2EE 应用程序中的应用组件,并重新指定

事务属性,而不必改变代码或重新编译。在设计应用组件时,要记住,尽管Enterprise Beans 有

一个可使应用组件的容器自动启动多步事务的机制,但是Applet 和应用的客户容器可能并不支

持这一点。然而, Applet 和应用客户容器总是能够调用支持这一点的一个Enterprise Beans。还

应当注意, JSP 页面和Servlet 没有被设计成是事务的,它们通常应当将事务工作交给一个

Enterprise Bean 来完成。然而,如果事务工作在一个JSP 页面或Servlet 中是必须的,那么此种

工作也应当是非常有限的。

(7) 可重用应用组件

J2EE 组件(Applet 、应用的客户、Enterprise Beans 、JSP 页面及Servlet )都被打包成模块,

并以Java Archive (JAR )文件的形式交付。一个模块由相关的组件、相关的文件及描述如何配

置组件的配置描述文件组成。例如,在组装过程中,一个HTML 页面和Servlet 被打包进一个模

块之中,该模块包含H T M L文件、Servlet 组件及相关的配置描述文件,并以一个Web ARchive

(WAR )文件的形式交付,该WAR 文件是一个带.war 扩展名的标准JAR 文件。模块的使用使得

利用相同组件中的某些组件来组装不同的J2EE 应用程序成为可能。例如,一个J2EE 应用程序的

Web 版可能有一个Enterprise Beans 组件,还有一个JSP 页面组件。该Enterprise Beans 组件可以

与一个应用客户组件结合,以生成该应用程序的非Web 版本。这不需要进行额外的编码,只是

一个装配和部署的问题。并且,可重用组件使得将应用开发和部署过程划分成由不同的角色来

完成成为可能,这样,不同的人或者公司就能完成封装和部署过程的不同部分。

2. J2EE 平台定义了如下角色:

(1) J2EE 产品提供商

设计并使J2EE 平台、API 和在J2EE 规范中定义的其他特征能被其他公司或人购得的公司。

(2) 应用组件提供商

创建用于J2EE 应用程序的Web 组件、Enterprise Beans 组件、Applet 或应用客户程序的公司

或个人。在装配过程中,应用组件文件、接口及类被打包进一个JAR 文件中。

(3) 应用程序装配商

从组件提供商获得应用组件JAR 文件,并将它们组装成一个J2EE 应用的Enterprise Archive

(E A R)文件的公司或个人,这种文件是一个带. e a r扩展名的标准文件。应用装配商提供与该应

用程序相关的整体信息,并使用验证工具来检验EAR 文件的内容是正确的。组装和部署信息存

第一章概述5

储在一个基于文本的配置描述文件中,此种文件使用XML 标记来标记该文本。应用装配商可以

使用一个能通过交互式选择来正确添加XML 标记的装配和配置工具来编辑该配置描述文件。

(4) 部署商

部署( d e p l e y)J2EE 应用程序的公司或个人。其职责包括设定事务控制、安全属性,并根

据应用组件提供商提供的指示来标明一个Enterprise Bean 是自己处理自身的存储,还是由一个

容器来处理等。部署涉及配置和安装。在配置过程中,部署商遵循应用组件提供商提供的指示

来解决外部依赖问题,定义安全设定,以及分配事务属性。在安装过程中,部署商将应用组件

安装到服务器上,并生成容器特定的类和接口。

(5) 系统管理员

配置并管理运行J2EE 应用程序的计算环境和网络基础设施,并监督运行环境的人员。

(6) 工具提供商

生产被组件提供商、装配商及部署商使用的用于进行开发、组装和打包的工具的公司或个

人。

(7) 设计用户界面和引擎

在为J2EE 应用程序设计用户界面和后端引擎时,需要决定让该程序是基于We b,还是不基

于We b。在做出这个决定时,我们可能希望考虑平台配置、速度、安全、网络流量和网络服

务。

例如,包含有用户界面并且经常被大量用户访问的一个Applet 可能需要花很长的时间才能

被下来,这让用户沮丧。然而,如果知道该A p p l e t要运行在一个公司的内部网内的受控环境

中,那么,在这种情况下,该Applet 将拥有一个完全可接受的速度。另一个考虑是,繁重

的处理应当在哪里执行。例如,如果客户程序在一个蜂窝电话或呼机中执行,服务器应当完成

尽量多的计算和数据处理,而客户程序只应显示结果就可以了。然而,设计在一个强大的台式

机平台上运行的大型财务分析系统则应当在客户机上完成其复杂计算。应用的客户程序和A p p l e t

用户界面通常都是用Swing API 创建的,该API 可从标准版J a v a 2平台中获得。Swing API 提供了

一整套GUI 组件(表格、树形结构、按钮等),这些组件可以被用来实现一种比用一个典型的

HTML 页面所能实现的更为交互的体验。Swing 也支持HTML 文本组件,这个组件可以被用来

显示来自一个服务器的响应。客户程序可以直接访问Enterprise Beans 层或企业信息系统层。但

应谨慎实现这种程序。绕过EJB 层的程序可以使用JDBC API 来访问一个关系型数据库,但应被

限制于对数据库表格进行维护等管理任务上。

(8) 设计基于Web 的应用程序

基于Web 的应用程序是基于浏览器的,并且,如果它们运行在I n t e r n e t上,就可能被全世界

的人访问。当设计一个基于Web 的应用程序时,不仅需要决定用什么来处理内容和应用逻辑

(HTML 、XML 、JSP 页面及S e r v l e t),而且还应当考虑使该应用程序国际化。一个国际化的基

于Web 的应用程序向用户提供了选择一种语言,然后根据该选定语言加载应用的正文的方式。

对被支持的每种语言而言,应用正文都被存储在一个外部文件中,并且与另外一个文件的关键

词相对应。应用代码使用这些关键词及选定的语言来加载正确的文本。国际化API 还提供类来

根据选定的语言格式化日期和金钱。一旦制订了使应用程序国际化的细节,就可以决定用什么

6第一部分JSP 入门

来实现它了。总的来说,一个基于Web 的应用程序使用HTML 来显示数据; 用X M L来定义数据

以使其可被另一个程序读取并处理; 使用JSP 页面或S e r v l e t来管理用户与业务层或存储层之间的

数据流。

可以在J2EE 平台上实现的基于Web 的应用程序有四种。从简单到复杂排列,它们是:

• B基本H T M L。

• B带基本JSP 页面或Servlet 的H T M L。

• B带Java Beans 类的J S P页面。

• B将应用逻辑根据功能划分成区域的高度结构化的应用。

当设计一个基于Web 的应用程序时,需要决定用什么来建立它。如果是从建立一个简单的

应用程序开始着手,并且认为以后会给该应用程序添加功能,那么,设计就应当适应今后发展

的需要。

(9) 模型、视图和控制器架构

在基于组件的J2EE 平台充分内置了灵活性的情况下,剩下的问题可能是如何组织应用程序

以实现简单高效的应用程序升级和维护,以及如何让不懂程序代码的人员避开程序数据。答案

就在模型、视图和控制器架构( MVC )的使用之中。MVC 这样的架构是一个描述重现的问题

及其解决方案的设计范式,但每次问题重现时,解决方案都不会完全相同。

MVC 设计范式包括三种对象:模型( model )提供应用业务逻辑( Enterprise Beans 类);

视图( view )则是其在屏幕上的显示( HTML 页面、JSP 页面、Swing GUI ); 控制器则是

Servlet 、JavaBeans 或Session Beans 类,它用于管理用户与视图发生的交互。我们可以将控制

器想像成处在视图和数据之间,对视图如何与模型交互进行管理。通过使视图完全独立于控制

器和模型,就可以轻松替换前端客户程序。并且,通过将控制器和模型代码保持在视图之外,

那些不理解这些代码的人员就不能改变他们不应改变的东西。

将控制器和模型分开就可以在不影响模型的情况下改变控制器,也可以在不影响控制器的

情况下改变模型。例如,如果应用的前端是一个HTML 页面,HTML 专家就可以更新它。如果

使用一个J S P页面,将控制器的代码放到一个JavaBeans 或SessionBeans 类中,或使用动作标记

(action tags ),这样,JSP 页面就仅包含JSP 代码了。

本书将在第二部分中讲解如何使用J 2 E E来建立企业级的We b应用。

1.1.5 EJB

E J B就是前面说的Enterprise JavaBeans。E J B上层的分布式应用程序是基于对象组件模型的,

低层的事务服务使用了A P I技术。E J B技术简化了用J AVA语言编写的企业应用系统的开发、配置

和执行。E J B的体系结构规范由Sun Microsystems公司制定。

E J B技术定义了一组可重用的组件: Enterprise Beans。可以利用这些组件像搭积木一样你的

建立分布式应用程序。当你把代码写好之后,这些组件就被组合到特定的文件中去。每个文件

有一个或多个Enterprise Beans,在加上一些配置参数。最后,这些Enterprise Beans被配置到一

个装了E J B容器的平台上。客户能够通过这些B e a n s的Ho m e接口,定位到某个Be a n s,并产生这

个Be a n s的一个实例。这样,客户就能够调用B e a n s的应用方法和远程接口。

第一章概述7

E J B服务器作为容器和低层平台的桥梁,管理着E J B容器和函数。它向E J B容器提供了访问

系统服务的能力。例如:数据库的管理和事务的管理,或者其他的E n t e r p r i s e的应用服务器。

J2EE 应用程序中的Enterprise Beans

当编写管理特定业务功能(比如追踪雇员资料或进行复杂财务计算)的J2EE 应用程序时,

请将完成这些任务的业务逻辑放置在EJB 层的Enterprise Beans 中。通过这种方式,就可以使代

码集中在解决手边的业务问题,而利用Enterprise Beans 容器来支持低层服务,比如状态管理、

事务管理、线程管理、远程数据访问和安全等。将业务逻辑与低层系统逻辑分开意味着容器可

以在运行时创建和管理Enterprise Beans。按照规范编写的任何Enterprise Beans,都可以根据其

在一个特定的J2EE 应用程序中将被如何使用来对其事务管理或安全属性进行配置,并可以被部

署到任何一个与规范兼容的容器中。可重用组件使不必改变和重新编译Enterprise Beans 代码成

为可能。一个Enterprise Beans 由接口和类组成。客户程序通过Enterprise Beans的Home 和远程

接口来访问Enterprise Beans 的方法。Home 接口提供了创建、删除和定位Enterprise Beans 的方

法,而远程接口则提供了业务方法。在部署时,容器由这些接口来创建类,使客户能够创建、

删除、定位或调用位于Enterprise Beans 上的业务方法。Enterprise Beans 类提供了业务方法、创

建方法和查询方法的实现。如果Enterprise Beans 管理它自己的持久性的话,还为其生命期方法

提供了实现。有两种Enterprise Beans :Entity Beans 和Session Beans。

一个Session Beans 代表与客户程序的一个短暂会话,而且可能执行数据库读写操作。一个

Session Beans 可能会自己调用J D B C,或者它可能使用Entity Beans来完成此种调用。在后面这

种情况下,这个Session Beans 是该Entity Beans 的客户。一个Session Beans 的域包含会话状态,

而且是短暂的。如果服务器或者客户程序崩溃,该Session Beans 就丢失了。这种模式通常被用

于像PL/SQL 这样的数据库程序设计语言上。

一个Entity Beans 代表一个数据库中的数据及作用于该数据的方法。在一个关系型数据库中

的雇员信息表中,每一行都有一个Beans 来代表。Entity Beans 是事务的,并且是长寿命的。只

要数据留在数据库中, Entity Beans 就存在。这个模式可以被很容易地用于关系型数据库,而不

仅仅限于对象数据库。

Session Beans 可以是有状态的,也可以是无状态的。一个有状态的Session Beans 包含代表

客户程序的会话状态。该会话状态是该Session Beans实例的域值加上这些域值所引用到的所有

对象。有状态Session Beans 并不代表在一个持久数据存储中的数据,但是,它可以代表客户程

序访问和更新数据。无状态Session Beans 没有用于某个特定客户程序的任何状态信息。它们通

常被用于提供不保持任何特定状态的服务器端行为。无状态sessionBeans 要求更少的系统资源。

一个提供一种一般服务,或用于表示被存储的数据的一个被共享的视图的业务对象是无状态

Session Bean的一个例子。

因为Enterprise Beans 占用可观的系统资源和带宽,你可能希望将某些业务对象构造成数据

访问对象或值对象。数据访问对象完成诸如代表客户程序访问数据库等工作。值对象用于代表

容纳数据字段并提供简单的“ get 和set ”方法来访问这些数据的一个结构。另外,可以将程序

构造成使用Enterprise Bean 在客户和EJB 层的其他部分之间承担通信的任务。

对于一个使用容器管理的持久性来访问关系型数据库的Enterprise Beans,并不要求在B e a n s

8第一部分JSP 入门

的代码中使用任何JDBC 2.0 API 来进行数据库访问,因为容器完成了这些工作。然而,如果使

用Beans 管理的持久性,或者要访问一个非关系型数据库的企业信息系统,那么就必须在B e a n s

中提供相应的代码来完成这些工作。在Enterprise Beans 使用Beans 管理的持久性来访问一个数

据库的情况下,必须使用JDBC 2.0 API 代码来实现该Enterprise Beans 的生命期方法,以便处理

数据的加载和存储,以及运行时在系统和持久数据存储之间维持数据的一致性。

一个使用Beans 管理的持久性的Enterprise Beans,或一个需要访问企业信息系统的Web 组件

必须提供合适的代码。这些代码可能是用于进行数据库访问的JDBC 2.0 API ;或是用于访问一

个特定企业信息系统的企业信息系统API ;或是用于抽象企业信息系统API 的复杂性和低层细节

的一个访问对象,或是用于访问企业信息系统资源的一个连接对象。

尽管Web 层使用HTTP 或HTTPS 来在各层之间传输数据,但是EJB 层使用的是R M I - I I O P。

RMI-IIOP 是一个完整的分布式计算协议,能让任何访问Enterprise Bean 的客户层程序或Web 层

程序直接访问EJB 层的服务。这些服务包括用于查找和引用Enterprise Beans 的J N D I,发送和接

收异步消息的Java Message Service (JMS ),以及用于关系型数据库访问的J D B C。

1.1.6 Java Servlet

Java Servlet是J S P技术的基础,而且大型的We b应用程序的开发需要Java Servlet和J S P配合

才能完成,这里简单介绍S e r v l e t的相关知识,S e r v l e t的开发将在第二部分讲述。

S e r v l e t这个名称大概源于A p p l e t,现在国内的翻译方式很多,本书为了避免误会,决定直接

采用S e r v l e t而不做任何翻译,读者如果愿意,可以称之为“小服务程序”。S e r v l e t其实和传统的

C G I程序和I S A P I、N S A P I等We b程序开发工具的作用是相同的,在使用Java Servlet以后,用户

不必再使用效率低下的C G I方式,也不必使用只能在某个固定We b服务器平台运行的A P I方式来

动态生成We b页面。许多We b服务器都支持S e r v l e t,即使不直接支持S e r v l e t的We b服务器也可以

通过附加的应用服务器和模块来支持S e r v l e t。得益于J a v a的跨平台的特性, S e r v l e t也是平台无关

的,实际上,只要符合Java Servlet规范, S e r v l e t是完全平台无关且是We b服务器无关的。由于

Java Servlet内部是以线程方式提供服务,不必对于每个请求都启动一个进程,并且利用多线程

机制可以同时为多个请求服务,因此Java Servlet效率非常高。

但Java Servlet也不是没有缺点,和传统的C G I、I S A P I、N S A P I方式相同,Java Servlet是利

用输出H T M L语句来实现动态网页的,如果用Java Servlet来开发整个网站,动态部分和静态页

面的整合过程简直就是一场恶梦。这就是为什么S U N还要推出Java Server Pages的原因。

1.2 JSP技术

前面说过, Java Servlet的最大缺点就在于没有把网站的逻辑和页面的输出分开,导致整个

S e r v l e t代码混乱不堪。为了解决Java Servlet的这种缺点,S U N推出了Java Server Pages—J S P。

1.2.1 JSP技术概述

按照脚本语言是服务于某一个子系统的语言这种论述, J S P应当被看作是一种脚本语言,然

而,作为一种脚本语言, J S P又显得过于强大了,在J S P中几乎可以使用全部的J a v a类。

第一章概述9

作为一种基于文本的、以显示为中心的开发技术,J S P提供了Java Servlet 的所有好处,并且,

当与一个JavaBeans 类结合在一起时,提供了一种使内容和显示逻辑分开的简单方式。分开内容

和显示逻辑的好处是,更新页面外观的人员不必懂得Java 代码,而更新J a v a B e a n s类的人员也不

必是设计网页的行家里手,就可以用带JavaBeans 类的JSP 页面来定义Web 模板,以建立一个由

具有相似的外观的页面组成的网站。JavaBeans 类完成数据提供,这样在模板中就没有Java 代码,

这意味着这些模板可以由一个HTML 编写人员来维护。当然,也可以利用Java Servlet来控制网

站的逻辑,通过Java Servlet调用J S P文件的方式来将网站的逻辑和内容分离。本章我们后面将对

这种分离网站的逻辑和内容的设计方法做一些更深入的描述。

在选择使用一个Java Servlet,还是一个JSP 页面时,要记住的是, Java Servlet 是一个程序

设计工具,它最适用于不需要频繁修改的低级应用功能; 而J S P页面则通过以显示为中心的描述

性的方法将动态内容和逻辑结合在一起。对于使用一个JSP 页面的简单的基于Web 的应用程序,

可以使用定制标记或者S c r i p t l e t,而不是使用JavaBeans 类来将内容与应用逻辑结合起来。定制

标记被打包到一个标记库中,并被引入到一个JSP 页面中。S c r i p t l e t是直接嵌入在JSP 页面中的

很小的J a v a代码段。

一般来说,在实际的J S P引擎中, J S P页面在执行时是编译式,而不是解释式的。解释式的

动态网页开发工具如A S P、P H P 3等由于速度等原因已经满足不了当前大型电子商务应用的需要

了,传统的开发技术都在向编译执行的方式改变,如A S P→A S P +;P H P 3→P H P 4。而尽管J S P的

规范书中并没有要求实际的J S P引擎要使用编译式的执行方式,但估计一般是不会使用解释的方

式来执行J S P页面的。通常说来, J S P页面一般是翻译为S e r v l e t的J a v a源文件,再经过J a v a编译器

编译为S e r v l e t的c l a s s文件。为什么要编译为S e r v l e t呢?据说是为了让原先的S e r v l e t引擎可以直接

服务于J S P,而J S P引擎就仅仅需要将J S P转译为S e r v l e t就可以了。这里要注意的是: J S P规范书

中并没有规定如何将J S P页面转译为S e r v l e t,因此,不同的J S P引擎转译的结果也是不一样的。

在J S P文件转译为S e r v l e t以后,每次客户机(通常是用户的We b浏览器)向服务器请求这一个J S P

文件的时候,服务器将检查自上次编译后J S P文件是否有改变,如果没有改变,就直接执行

S e r v l e t,而不用再重新编译,其效率是相当高的。一般来说, J S P文件的编译是在第一个用户访

问到这个J S P页面时发生,而这第一个用户通常是开发人员自己,这样,正式放在服务器上让用

户访问的J S P文件一般都已经有了对应的编译好的S e r v l e t了。许多服务器都有设置,可以使J S P

文件在第一个用户访问之前就预先编译好,这样看来,效率就更高了。后面在第4章中,将展示

一个简单的J S P文件对应的S e r v l e t。

在J S P规范书中,并没有明确要求J S P中的程序代码部分(称为S c r i p t l e t)一定要用J a v a来写,

实际上,有一些J S P引擎就是采用的其他脚本语言,如:E M A C - S c r i p t、We b L等等,但实际上这几

种脚本语言也是构建在J a v a上面,编译为S e r v l e t来实现的。按照J S P规范书,完全和J a v a没有任何关

系的S c r i p t l e t也是可以的,不过,由于J S P的强大功能主要在于能和J a v a B e a n s、Enterprise JavaBeans

一起工作,所以即使是Scriptlet部分不使用Java,编译成的执行代码也应该是与Java相关的。

1.2.2 JSP的优势及与其他We b开发工具的比较

和传统的C G I相比较,J S P有相当的优势。首先,在速度上,传统的C G I程序需要使用系统

10第一部分JSP 入门

的标准输入输出设备来实现动态网页的生成,而J S P是直接和服务器相关联的。而且对于C G I来

说,每一个访问就需要新增加一个进程来处理,进程不断地建立和销毁对于作为We b服务器的计

算机将是不小的负担。其次, J S P是专门为We b开发而设计的,其目的是为了建立基于We b的应

用程序,包含了一整套的规范和工具。使用J S P技术可以很方便地将一大堆J S P页面组合成为一

个We b应用程序。

和I S PA I和N S A P I相比较, J S P的开发速度要快得多,开发难度也要小得多,在编译为J a v a

S e r v l e t以后,配合目前最新的J I T(Just In Ti m e)的J a v a解释器,其执行速度也慢不了多少。而

且,I S A P I和N S A P I这种和We b服务器过于紧密结合的技术在使用时的一旦出现错误,很容易使

We b服务器崩溃,而J S P就没有这个缺点。

J S P的真正对手是A S P和P H P,还有即将问世的A S P +,在We b技术方面A S P、P H P和J S P的比

较见表1 - 1。

注意:这里的A S P指A S P 3 . 0,J S P指J S P规范书1 . 1中指出的规范,P H P指P H P 4。

表1-1 ASP、J S P、P H P的比较

A S P J S P P H P

We b服务器I I S、P W S 等A p a c h e 、I I S 、P W S 、

Netscape Server等等

运行平台Wi n d o w s 等各种U N I X(S o l a r i s、L i n u x、

A I X、I R I X等)、Wi n d o w s

组件技术C O M 等C O M、J a v a B e a n s

自定义TA G语法无等无

开放性无等自由软件

脚本语言支持V B S c r i p t、J S c r i p t 等P H P

建立大型We b应用程序可以等不宜

程序执行速度快等极快

学习难度低等低

S e s s i o n管理有等有

统一的数据库连接有、A D O、O D B C 等无

后缀名a s p 等p h p、p h p 3、p h p s

1. We b服务器和运行平台

A S P目前仅仅被支持于Microsoft Internet Information Server(I I S)和Personal Web Server

(P W S),由于I I S和P W S仅仅有Wi n d o w s下的版本,故A S P目前只能在Wi n d o w s平台下使用。尽

管有第三方的插件号称可以在U N I X下使用A S P,但对基于C O M组件技术的A S P来说,在没有

C O M支持的U N I X平台下只能是一个“玩具”。

J S P仅仅是一个规范,尽管通过前面的论述可以得出J S P一般要用J a v a来实现的论断,但作为

跨平台的语言, J a v a可以在许多平台下使用。这样, J S P也就显而易见的是跨平台的了。目前的

第一章概述11

等A p a c h e、I I S 、P W S 、

Netscape Server 、i P l a n e t

等各种U N I X( S o l a r i s 、

L i n u x、A I X、I R I X等)、

Wi n d o w s、M a c O S等

等J a v a B e a n s、E J B

等有

等多家合作,包括S U N 、

I B M、BEA We b l o g i c、

N e t s c a p e、O r a c l e

等J a v a 、E M A C - S c r i p t、

We b L等

等可以

等极快

等较低

等有

等有、J D B C

等j s p

J S P的确可以在多种We b服务器和操作系统下使用。如Apache Web Server和Microsoft IIS等。

Apache Web Server是世界上占有率最高的We b服务器产品,可以在包括SUN Solaris、I B M

A I X、SGI IRIX、L i n u x和Wi n d o w s在内的许多操作系统下运行。Apache Web Server下J S P的实

现可以通过免费的Apache Jserv 和G N U J S P、J a k a r t a - To m c a t实现,也可以使用商业的J R U N

(L i v e S o f t w a r e)、We b l o g i c(B E A)、We b s p h e r e(I B M)来实现。

Microsoft IIS本身不直接支持J S P,但可以通过J R U N、We b l o g i c、We b s p h e r e来实现。

还可以使用应用服务器添加J S P支持的Netscape Enterprise Server及由之发展而来的可以直接

支持J S P的iPlanet Web Server等等。

P H P本身就对各种操作系统和We b服务器做了支持, P H P目前可以作为A p a c h e的一个附加模

块直接编译进入A p a c h e中去,由于A p a c h e支持多种操作系统, P H P相应地也就可以在各种操作

系统上实现。P H P也可以C G I方式或I S A P I方式插入到I I S或P W S中去。

2. 组件技术

A S P和J S P对组件技术的支持已经很完善了,而P H P直到前不久才开始支持C O M和J a v a B e a n s。

但支持也不是很完善,如果P H P不能在将来完善对组件技术的支持,在大型We b应用程序方面将

很难与J S P和A S P竞争。但由于P H P技术本身的易学易用,加上众多的函数支持和开放源代码的

特性,在中小型We b站点的开发上,P H P还是会占有一席之地的。

其实,J S P本身对于A S P和P H P并没有明显的优势, J S P的强大是因为其后面有强大的J a v a技

术做支持。包括J a v a B e a n s和J 2 E E技术在内的J a v a技术是J S P强大生命力的所在。

M i c r o s o f t最新推出的A S P +技术和A S P技术相比有了许多激动人心的进步,但是从企业级应

用的角度看, J S P技术仍然有相当的优势。有理由认为,在将来的We b开发中,中小型站点将出

现J S P、A S P +和P H P三分天下的局面,但是对于大型的电子商务站点, J S P及J 2 E E技术将成为首

选。

1.3 用J S P开发We b的几种主要方式

J S P作为J 2 E E的一部分,既可以用于开发小型的We b站点、也可以用于开发大型的、企业级

的应用程序,本节将讲述对于不同规模的We b系统,使用J S P进行开发的不同方式。

1.3.1 直接使用J S P

对于最小型的We b站点,可以直接使用J S P来构建动态网页,这种站点最为简单,所需要的

仅仅是简单的留言板、动态日期等基本的功能。对于这种开发模式,一般可以将所有的动态处

理部分都放置在J S P的S c r i p t l e t中,就像一般使用P H P或A S P开发动态网页一样。

1.3.2 JSP+JavaBeans

中型站点面对的是数据库查询、用户管理和小量的商业业务逻辑。对于这种站点,不能将

所有的东西全部交给J S P页面来处理。在单纯的J S P中加入J a v a B e a n s技术将有助于这种中型网站

的开发。利用J a v a B e a n s,将很容易完成如数据库连接、用户登录与注销、商业业务逻辑封装的

任务。如:将常用的数据库连接写为一个Java Beans,既方便了使用,又可以使J S P文件简单而

12第一部分JSP 入门

清晰,通过封装,还可以防止一般的开发人员直接获得数据库的控制权。

本书的第一部分将主要讲述这种开发方式,在第2章,将简要讲述如何开发J a v a B e a n s,没有

J a v a B e a n s基础的读者不用担心。

1.3.3 JSP+JavaBeans+Servlet

无论用A S P还是P H P开发动态网站,长期以来都有一个比较重要的问题,就是网站的逻辑关

系和网站的显示页面不容易分开。常常可以看见一些夹杂着i f . . . . . . t h e n . . . . . .、case select或是i f

{ . . . . . . }和大量显示用的H T M L代码的A S P、P H P页面,即使是有着良好的程序写作习惯的程序员,

其作品也几乎无法阅读。另一方面,动态We b的开发人员也在抱怨,将网站美工设计的静态页面

和动态程序和并的过程是一个异常痛苦的过程。

如何解决这个问题呢?在J S P问世以后,笔者的一位朋友认为S e r v l e t已经完全可以被J S P代

替,然而,事实是S e r v l e t在不再担负动态页面生成的任务以后,开始担负起决定整个网站逻辑

流程的任务。在逻辑关系异常复杂的网站中,借助于S e r v l e t和J S P良好的交互关系和J a v a B e a n s的

协助,完全可以将网站的整个逻辑结构放在S e r v l e t中,而将动态页面的输出放在J S P页面中来完

成。在这种开发方式中,一个网站可以有一个或几个核心的S e r v l e t来处理网站的逻辑,通过调

用J S P页面来完成客户端(通常是We b浏览器)的请求。后面我们将可以看到,在J 2 E E模型中,

S e r v l e t的这项功能可以被E J B取代。

1.3.4 J2EE开发模型

在J 2 E E开发模型中,整个系统可以分为三个主要的部分:

1. 视图

视图就是用户界面部分,在We b应用程序中也就是H T M L、X M L、J S P页面。这个部分主要

处理用户看到的东西,动态的J S P部分处理了用户可以看见的动态网页,而静态的网页则由

H T M L、X M L输出。

图1 - 1

第一章概述13

2. 控制器。

控制器负责网站的整个逻辑。它用于管理用户与视图发生的交互。可以将控制器想像成处

在视图和数据之间,对视图如何与模型交互进行管理。通过使视图完全独立于控制器和模型,

就可以轻松替换前端客户程序,就是说,网页制作人员将可以独立自由地改变We b页面而不用担

心影响这个基于We b的应用程序的功能。

在J 2 E E中,控制器的功能一般是由S e r v l e t、J a v a B e a n s、Enterprise JavaBeans 中的

S e s s i o n B e a n来担当的。

3. 模型

模型就是应用业务逻辑部分,这一部分的主要角色是Enterprise JavaBeans,借助于E J B强大

的组件技术和企业级的管理控制,开发人员可以轻松形创建出可重用的业务逻辑模块。

图1 - 1说明了上述三者在J 2 E E开发模型中的相互关系。

1.4 本书用到的软件及获取方法

1. JDK

Java Development Kit即J a v a开发工具包,进行J S P开发工作必须要有J D K。本书使用版本1 . 3,

可以在h t t p : / / j a v a . s u n . c o m找到。

同样,在S U N的主页上还可以找到一份J D K的中文文档,读者可能会觉得使用本地化的文档

更方便。

2. Jakarta-To m c a t

Apache Jakarta项目组开发的基于G P L自由软件协议的J S P引擎,配合J D K就可以搭建起一个

最简单的J S P试验平台。开放源代码,使用起来比较简单,缺点是不支持J 2 E E技术,无法使用

E J B。地址:h t t p : / / j a k a r t a . A p a c h e . o rg。需要说明的是,原先的G N U J S P项目的开发人员现在

已经完全转向了J a k a r t a - To m c a t项目,不建议使用A p a c h e J S e r v + G N U J S P搭建J S P平台,如果一定

要使用,也可以在h t t p : / / w w w. A p a c h e . o rg找到需要的软件。

3. Apache Web Server

仅仅使用To m c a t 来搭建J S P 的实用平台是不够的,一般小型站点使用J S P都是采用

A p a c h e + To m c a t的方式,因为作为独立的Web Server ,To m c a t的效率显然还不够,也不具有

A p a c h e的众多实用功能。Apache Web Server也可以在h t t p : / / w w w. A p a c h e . o rg。

4. J2SDKEE

在S U N的主页上可以找到被称为J 2 S D K E E的JavaTM 2 SDK,Enterprise Edition开发工具。

使用J 2 S D K E E可以用最小的开销获得一个J 2 E E的开发平台。地址: h t t p : / / j a v a . s u n . c o m / j 2 e e。

5. IBM We b s p h e r e

要想开发基于J 2 E E技术的We b应用程序,最好是使用一个商业化的应用服务器( A p p l i c a t i o n

S e r v e r),I B M的We b s p h e r e作为应用服务器在国内使用得比较多,文档和例子也不少,学习起来

比较方便。I B M公司提供免费的试用版供,可以在I B M公司的主页上找到。I B M公司在国内

也发布了不少光盘版的试用版,在各大F T P站点上也有。

6. BEA We b l o g i c

14第一部分JSP 入门

作为业界领先的应用服务器提供商, BEA We b l o g i c应用服务器在世界上的市场占有率遥遥

领先于其他的对手,不过BEA We b l o g i c应用服务器的使用难度大于IBM We b s p h e r e,而且文档

几乎都是英文的,国内读者可能会觉得比较困难。BEA We b l o g i c应用服务器在B E A S Y S的主页

上提供试用版本的地址为。h t t p : / / w w w. b e a s y s . c o m或h t t p : / / w w w. We b l o g i c . c o m。

7. UltraEdit

U l t r a E d i t并不是一个J a v a工具,但笔者认为它是一个比较好的J S P写作工具,在U l t r a E d i t的

主页上可以得到U l t r a E d i t的试用版和支持J a v a 2和J S P的语法文件地址为。h t t p : / / w w w. u l t r a e d i t

. c o m。

读者亦可以从其他的J S P引擎入手学习J S P,如LiveSoftware JRUN 、Inprise Application

S e r v e r、S e r v l e t E x e c等等,也有许多好的J a v a开发工具和文本编辑器可以使用,如: I n p r i s e

Jbuilder 3.5、IBM Virsual Age For Java、Symantec Virsual Café、E d i t P l u s、J a v a P a d等等。

最后说明一下本书的代码写作规范:

类名:类名由几个单词构成时,将这几个单词紧靠在一起,且大写每一个单词的首字母。

其他:和类名相仿,但是第一个单词的首字母小写。

每个程序块统一缩进一个Ta b制表符。但是对于那种长代码较多的代码段,统一取消缩进。

注释单独列为一行。

每行代码长度不超过6 0个字符(为了出版的需要)。

如:

class TestClass{

int a;

void TestFuncs() {

......

}

}

第一章概述15

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有