* 一 般 知 识 * 一、计算机应用程序的一般特点 : 二、应用程序开发模型的变迁过程: 单层 两层 三层 N层 * 一 般 知 识 * 一、计算机应用程序的一般特点 : 大多数应用,从PC机上的简单报表程序到大型机上的复杂计算,都由三部分组成: 用户界面部分:表示层 应用逻辑部分:业务逻辑层 数据访问部分:数据访问层 二、应用程序开发模型的变迁过程: 单层 两层 三层 N层 1 2 3 1 2 3 1 2 3 1 2 3 4
主机系统或单层结构 数据访问、表示和业务逻辑在一个应用中 功能紧紧耦合在一起 代码复用、代码可维护性、和代码的修改十分困难。 不是分布式的,不具有可伸缩性。
传统的客户/服务器: “胖”客户端 胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯 Fat client 服务器的数据库必须同每一个活动的客户保持连接,消耗大量的运算资源,随着客户数目的增加性能不断下降,且存在死锁及崩溃的可能 数据模型“紧耦合”在每一客户端,数据库结构改变将导致全体客户端改变,不利于更新和维护 用户界面和程序逻辑绑在一起,代码难以重用 不适应在多用户、多数据库、且非安全的网络环境,可扩展性差
三层分布式对象架构 客户端:业务数据模型与用户界面分离 ,“瘦” 业务逻辑在中间层,成为“对象服务” 中间层可以处理多客户端和多数据库
三层Web应用程序模型 第一层浏览器是表示层,完成用户接口功能。更“瘦” 第二层Web服务器是功能层,完成客户的应用功能。 第三层数据库服务器是数据层,完成数据处理请求。 Web服务器接受客户请求,建立数据库连接,请求数据处理,而后数据库结果返回Web服务器,再传至客户端。
三层Web应用程序模型 功能层的缺点: *体积庞大、功能臃肿、复用性差 *须自己考虑诸如分布处理、负载平衡、事务逻辑、持久性和安全性等诸多问题
N层应用模型 一分为二:显示逻辑层和业务逻辑层 显示逻辑层:接受客户请求,调用业务逻辑层的服务,并将结果呈现给客户端。 业务逻辑层:完成具体的业务处理。其中隐含了分布处理、负载平衡、事务逻辑、持久性和安全性等技术。
应用模型 从逻辑角度看,系统分成客户端、Web服务器、应用服务器、数据库服务器四层
为什么需要J2EE 在企业级应用开发中所面临的而且必须解决的问题: 分布式 可移植 面向Web体系 可装配 能满足企业计算要求 一致性 事务性 安全性 还要有好的特性 可伸缩 可扩展 易维护
为什么需要J2EE J2EE提供了一套完整的解决所有这些问题的框架方案: 提供了分布式、可移植构件的框架 简化了服务器端中间层构件的设计(容器的机制) 为构件与应用服务器提供标准API(与现有的企业信息系统集成) 获得了业界的广泛支持(全球70%的分布式应用是由J2EE体系支撑)
什么是J2EE Open and standard based platform for developing, deploying and managing n-tier, Web-enabled, server-centric enterprise applications 开放的、基于标准的平台,用以开发、部署和管理N层结构、面向Web的,以服务器为中心的企业级应用
客户层 中间层 EIS层 Web层 遗留 系统 业务层 EIS 系统 数据库 客户方 计算机 EIS/数据库服务 J2EE服务器(服务器方中间层)
J2EE的四层模型 浏览器 Java Bean Applet Web服务器 JSP Servelet EJB容器 EJB 桌面 Java应用 数据库 客户端 显示逻辑 商业逻辑 企业信息系统
四层结构 客户层:面向客户的应用和applet Web层:包含用于扩展传统http web服务器的组件,通过java servlet和jsp实现 业务层:包含以EJB形式来提供业务逻辑的组件 企业信息系统层:J2EE的connector结构使得J2EE产品能同EIS层上的企业信息系统进行集成 通常,web和业务层在同一台server(J2EE SERVER)上运行,它们被认为是中间层的子层 J2EE应用通常被认为是三层结构
J2EE在现实环境中的典型应用
支持J2EE标准的厂家 IBM HP Sun Oracle BEA Inprise Macromedia
一些比较小的、可以用来做学习和研究的、提供源代码的产品,如OpenEjb、EJBoss、JonAS、Enhydra。
基本概念 组件 模块 容器
组件 J2EE中的组件实际是标准的java类 与传统java类的差别:组件是特意作为可重用,独立的程序单元创建的,它们可进行组装形成J2EE应用 最终要部署到合适的层上,在层上的对应容器中执行 容器为组件提供访问特定的,标准化的服务和API的能力 一旦对组件进行了部署,就可对其进行配置
组件 客户组件:构建J2EE客户 Applet:在浏览器中运行 标准java应用:在浏览器外独立运行 Web组件:处理客户请求,并为其创建和返回一个合适的响应 Servlet, JSP, web过滤器,web事件监听器 在web容器里面执行 EJB
模块 为了对组件进行部署,组件必须首先组装到模块中,模块是J2EE应用的基本组成单元 模块是J2EE的软件单元,由一个或多个相同组件类型的组件组成,这些组件连同相应的部署描述文件一同绑定到java Archive(JAR)文件中 部署描述文件是XML文件,包含声明语句(非程序代码),描述模块中的每个组件及相关配置或定制需求——包括与其他模块的依赖 J2EE应用由一个或多个模块组成,它们被打包成带有.ear的JAR文件
JAR文件 JAR文件是组合到一个单一的,平台无关的文件中的文件集合,为开发人员提供一种有效方式来聚集和管理J2EE应用功能集 企业应用档案(ear):对组成J2EE应用的各种模块打包 Web应用档案(war):将web层组件打包到war模块 资源适配器档案(rar):将资源适配器组件和相关联的(用于特定EIS的connector)信息打包成RAR模块
Web容器 EJB容器 Web页面, Applet, 可选的 javaBean 过滤器 EJB 事件监听器 数据库 WEB服务器 JSP HTTPS, HTML, XML EJB servlet 事件监听器 数据库 WEB服务器 J2EE服务器
容器 J2EE受到执行它的容器的管理与支持 容器作用是为组件提供与部署,执行,生命周期管理,安全和其他组件需求相关的服务 不同类型的容器为其所管理的组件提供附件服务,如EJB容器为其EJB提供事务服务和持久性服务 对每一种主要组件类型定义相应的容器类型
容器 一致性 安全性 可获得性 可伸缩性 事务性 分布性 生命周期管理 (持久性)
EJB 容器的责任
容器类型 J2EE服务器:是J2EE产品的运行部分。一个J2EE服务器提供EJB容器和Web容器。 Enterprise JavaBeans(EJB)容器:管理J2EE应用程序的enterprise bean的执行。Enterprise bean和它的容器运行在J2EE服务器中。 Web容器:管理J2EE应用程序的JSP和Servlet组件的执行。Web组件和它的容器也运行在J2EE服务器中。 客户端应用程序容器:管理应用程序客户端组件的运行。 Applet容器:管理applet的执行。由运行在客户端的一个Web浏览器和Java插件一同组成。
J2EE平台
J2EE架构及核心技术
公共服务 JNDI (名字和目录服务):共享用户,网络设备,软件组件,应用模块,服务及其他信息 RMI/IIOP (支持IIOP协议的远程方法调用): 访问与RMI编程规则兼容的CORBA服务 JMS(消息服务):在企业中异步交换业务数据和事件的灵活而可靠的机制 JDBC (数据库连接服务) JTS(java transaction service)/JTA (java transaction API) JavaMail和JAF(JavaBeans Activation Framework) JCA/JCE/JSSE/JAAS(安全服务体系)//Cryptography 使用JAXP(Java API for XML Parsing)的XML解析服务 Web Services - J2EE 1.4规范新特性 ············
Web组件
Servlet技术 Servlets(=Server +Applet):是一些运行于Web服务器端的Java小程序,用来扩展Web服务器的功能。 Servlets用特定的Java解决方案替代了其它的Web服务器方编程模式(如:CGI,ISAPI等),继承了Java的所有特性(跨平台、多线程、OO),能够访问整个Java API库。 Servlets使用HTTP协议与客户端进行通讯,所以有时也称Sevlets为“HTTP Servlets”。
请求的处理 每当有客户请求时,容器会将其封装成一个HttpServletRequest对象,然后传给Servlet对应的服务方法,有doGet, doPost等 GET调用:获取服务器信息,并将其作为响应返回给客户端 POST调用:用于客户端把数据传到服务器
HTTP Servlet请求
1加载,实例化和初始化servlet: 容器首先判断servlet的实例是否存在,若不存在,则容器加载该servlet,并从该servlet类创建实例.接着,容器调用init方法对该servlet实例进行初始化 2调用该servlet的service方法: 假定该servlet实例存在,且已进行了初始化.则容器调用service方法,用其将一个请求对象和一个响应对象传给该servlet.
3 清除servlet的响应,将控制权返回给web服务器: Servlet处理了请求后,响应被交给容器。在容器将控制权返回给web服务器前,会将响应清除,然后由web服务器将该响应传送给客户
public class SimpleCounter extends HttpServlet { int count = 0; public void doGet(HttpServletRequest req, HttpServletResponse res) { res.setContentType("text/plain"); //建立输出的类型 PrintWriter out = res.getWriter(); //得到输出流 int local_count; synchronized(this) { //local_count在多线程环境下同步 local_count = ++count; } //构造一个返回给客户浏览器的HTML页 out.println("<HTML>"); out.println("<HEAD><TITLE= A Simple Counter </TITLE></HEAD>"); out.println("<BODY>"); out.println("<h5 align=\"center\">" + "<font color=\"#0000FF\">"); out.println("Since Web server has startuped, the servlet has been accessed " + "<h1>" + local_count + " times" + "</h1>"); out.println("</font></h5>"); out.println("</BODY></HTML>"); }
JSP技术 在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp) JSP是服务器端的脚本语言,是以Java和Servlet为基础开发而成的动态网页生成技术,它的底层实现是Java Servlet。 JSP由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。 一般和JavaBeans结合使用,从而将界面表现和业务逻辑分离。
JSP生命周期 翻译:建立JSP请求时,容器寻找相应servlet类,若相应类不存在,则该JSP页面由其容器动态翻译成servlet代码,接着编译成java代码 编译:java代码被编译成servlet类 执行:由容器调用 下同serlvet
<%@ page import=" java.math.*, javax.naming.*" %> <html> <head> <title>Converter</title> </head> <body bgcolor="white"> <p>Enter an amount to convert:</p> <form method="get"> <input type="text" name="amount" size="25"> <br> <p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> <% String amount = request.getParameter("amount"); if ( amount != null && amount.length() > 0 ) { BigDecimal d = new BigDecimal (amount); %> <p> <%= amount %> dollars are <%= converter.dollarToYen(d) %> Yen. <p> <%= amount %> Yen are <%= converter.yenToEuro(d) %> Euro. <%}%> </body></html>
Servlet容器 浏 览 器 servlet EJB JSP EJB servlet 1客户端经由HTTP进行请求 2 web server将请求传送给容器 3 容器执行servlet 4 servlet产生响应(根据需要同其他web组件和业务组件进行交互) 5 web sever将响应返回给客户
Java Servlet和JSP的比较 两者都是基于Java的技术,所以都继承了Java的所有特性(跨平台、多线程、OO ),都可以使用Java强大的API。 两者工作方式相似:JSP代码先被JSP容器转换为Servlet代码再编译为类。 两者在J2EE体系结构中的工作层次相同,都负责与客户端的连接。 都是Web服务器的功能扩展,Servlet创建动态页面;JSP可动态,静态创建页面 Servlets是一些运行于Web服务器端的Java小程序;而JSP是脚本,编写起来更简单容易。
JavaBean技术 JavaBean是基于Java的组件模型,类似于Microsoft的COM组件。 JavaBean传统的应用在于可视化的领域,如AWT下的应用。自从JSP诞生后,JavaBean更多的应用在了非可视化领域,在服务器端应用方面表现出来了越来越强的生命力。
Java Bean-SimpleBean.java package hall; public class SimpleBean { private String message = "No message specified"; public String getMessage() { return(message); } public void setMessage(String message) { this.message = message;
Java Bean-BeanTest.jsp <HEAD> <TITLE>Reusing JavaBeans in JSP</TITLE> </HEAD> <BODY> <CENTER> <TABLE BORDER=5> <TR><TH CLASS="TITLE"> Reusing JavaBeans in JSP</TABLE> </CENTER> <P> <jsp:useBean id="test" class="hall.SimpleBean" /> <jsp:setProperty name=“test” property="message“ value="Hello WWW" /> <H1>Message: <I> <jsp:getProperty name="test" property="message" /> </I> </H1> </BODY>
Java Bean Reusing JavaBeans in JSP Message:Hello WWW