1、中间件技术,胡晓军,2,课程内容,概述 J2EE架构基础 Servlet、JSP、EJB开发 J2EE应用部署 J2EE应用开发架构 实例,3,软件开发技术的发展,基于主机的系统 两层的Client/Server系统 三层(n层)体系架构 表示层 业务逻辑层 数据层 基于Web的三层(n层)体系架构,4,中间件技术,最早具有中间件技术思想及功能的软件是IBM在60年代开发的CICS(Customer Information Control System)。80年代初期,Sun Microsystems开发了一种最早的中间件,作为其开放网络体系结构的一部分,这种中间件是基于RPC协议的。但由于C
2、ICS不是分布式环境的产物,而Sun Microsystems开发的不是完整的中间件产品,因此人们一般把Tuxedo作为第一个严格意义上的中间件产品,Tuxedo是在1984年由AT&T的贝尔实验室开发完成的。到90年代,中间件技术得到了巨大的发展和广泛的应用,出现了大量具有广泛影响的中间件产品,如OMG的Corba、Microsoft的DCOM/COM+、IBM的MQS等。,5,中间件技术,中间件是基础软件,处于操作系统(或网络协议)与分布式应用之间,从而屏蔽操作系统(或网络协议)的差异,实现分布式异构系统之间的互操作。目前,对中间件还没有形成一个统一的定义,比较公认的IDC的定义是:中间件
3、是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。,6,中间件技术,分类: 消息中间件(MOM: Message-Oriented Middleware) 数据库中间件(Database Middleware) 远程过程调用中间件(RPC: Remote Process Call) 对象请求代理中间件(ORB: Object Request Broker) 事务处理中间件(TP Monitor: Transaction Process Monitor) J2EE中间件,7,企业级应用的要求,分布式
4、可移植 面向Web体系 满足企业计算要求 一致性 事务性 安全性 好的特性 可伸缩 可扩展 易维护 遗留系统集成以上要求需要一个良好的基础架构来支持,8,企业级应用环境,9,什么是J2EE? Java 2 Platform, Enterprise Edition (J2EE),Open and standard based platform for developing, deploying and managing n-tier, Web-enabled, server-centric, and component-based enterprise applications 运用Java技术
5、开发企业应用的标准 包括了 多层应用开发模型 开发平台 - APIs 和服务 测试软件包 参考实现 将所有Sun的企业技术集合在一个体系结构下的平台 特定版本下的EJB, Servlet, JSP Java Web Server JNDI, JDBC, JTA, JMS, JavaMail, CORBA,10,Java 2 Platform,11,J2EE可以提供什么,分布式、可移植构件的框架 简化服务器端中间层构件的设计 为构件和应用服务器提供标准API,12,J2EE可以为开发者和用户带来,更短的开发时间 可重用组件 JSP EJB 自由的选择 基于开放的标准 简化的连接 XML,JDBC
6、,RMI-IIOP,Web Service,13,J2EE 技术架构,14,Browser,Servlet or JSP,Containers,EJB Server,HTTP,HOME,REMOTE,HOME,REMOTE,Data,Data,JDBC,RMI/IIOP,JDBC,AppServer,J2EE 应用体系结构,15,J2EE是端到端的解决方案,16,N层J2EE体系架构,17,J2EE主要技术概览,展示层 ServLet/JSP 中间层 EJB 中间层可用的企业服务 事务服务 JTA 目录服务 JNDI 消息服务 JMS 异步组件 Message-Driven EJB 数据层 -
7、 JDBC 远程调用 RMI/IIOP 使用现有资源 - JCA,18,J2EE 1.4 Contents,19,.Net与J2EE 的比较,20,Web 架构: J2EE vs .NET,表示层,业务逻辑层,数据层,J2EE,CLR,.NET Assembly ADO.NET (可使用 COM+ 服务; 比如事务),Web 表单 Server 控件 Code-Behind,ASP.NET IIS,JavaBeans EJBs,JSP Servlets,可运行于大多数主要应用及Web服务器,支持大多数数据库 (通过 JDBC 驱动程序),J2SE/EE JDBC (事务使用 JTA),.NET
8、,SQL Server Oracle DB/2, etc.,SQL Server Oracle DB/2, etc.,状态: ASP.NET Session, .NET 数据缓存,状态: 封装于 EJB 中, 也可在 Web Sessions 中,21,J2EE/.NET主要技术比较,JDBC JTA JNDI JMS JavaMail RMI/IIOP JAF,ADO.NET .NET Transaction Active Directory .NET Messaging SmtpMail Web Service/Remoting .NET JIT,22,技术的成熟性,Microsoft,J
9、2EE,1996,1997,1998,1999,2000,2001,LCE,MMC,VS.Net,.Net,23,J2EE的移植性与互操作性,理论上J2EE应用可以采用多个厂商的产品 只要符合J2EE的标准 实际情况 J2EE标准不完整,如 Web Service J2EE的技术需改进,如 EJB 各厂商发展各自的技术 不同产品很难协同和移植 J2EE可选择同一厂商支持的不同操作系统,24,.Net的移植性与互操作性,理论上.Net应用可移植到任何平台 CLS提交给标准化组织 只要支持CLR 实际情况 只有Windows/Free BSD .Net支持Web Service 可以使用任何平台运
10、行的Web Service 任何平台可使用.Net Web Service,25,技术比较结论,.Net和J2EE应用有着相似的架构 .Net和J2EE有相应的主要技术 .Net所有技术来自Microsoft J2EE的技术有多个厂商的实现 .Net和J2EE可以满足大多数应用的需求 主要的差别不在技术的可行性上 开发效率 性能 成本 稳定性,26,开发工具,JBuilder 商用 功能完备 Eclipse Open Source 插件丰富 myEclipse 版本管理 CVS,27,J2EE 应用开发,编写和编译组件代码 Servlet, JSP, EJB 编写组件的部署描述符 把组件装配成
11、可部署的软件包 将软件包部署到J2EE应用服务器上,28,部署描述符,提供容器如何管理和控制J2EE组件行为的操作指令 事务性 安全性 持久性 通过配置实现组件行为的定制 (不需要通过代码进行定制) XML文件 使代码具有可移植性,29,J2EE开发角色,J2EE角色组成,开发工具商:提供组件开发工具、应用程序集成工具、应用程序部署工具、界面编辑工具。 应用服务器提供商:负责设计和开发J2EE应用服务器(依据J2EE规范) 应用开发人员:负责开发组件、写部署描述文件、设计界面(显示数据) 应用集成人员:负责将各种界面、组件、描述文件、驱动程序、其他属性文件集成 部署人员:负责将J2EE集成文件
12、部署的应用服务器 系统管理员:负责调整服务器的运行参数、监视服务器的运行情况,30,应用服务器介绍,应用服务器是非常重要的企业软件,为现代业务系统提供了应用基础结构。 应用服务器源自支持与其它系统共享数据和资源的应用,以及为Web 页面和其它用户界面生成动态信息的需求。 它在 Web 服务器与底层应用和数据库之间形成了新的功能和服务层,31,应用服务器实现的功能,负载均衡 故障容错 Web 服务 网络透明 遗留集成 事务管理 安全性 消息 多线程 持久性 数据库连接 资源合并 开发、测试和封装功能 ,32,J2EE Containers & Components,33,容器与组件,容器处理,组
13、件处理,一致性安全性可获得性可伸缩性事务性分布性生命周期管理(持久性),表示 JSP, Servlet, Applet 业务逻辑 EJB 数据访问逻辑 EJB 应用系统访问 Web service,34,应用服务器产品,BEA WebLogic IBM WebSphere Sun Java System Application Server Oracle 9i/AS JBoss Tomcat(不支持EJB) Resin,35,Web服务器模型/CGI/Servlet,Web服务器模型 CGI/Servlet Server side module isapi mod_perl Server si
14、de script php asp jsp,36,Servlet,Servlet是Java技术对CGI编程的回答。Servlet程序在服务器端运行,动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。 高效 方便 可移植性好 节省投资,37,Servlet开发,如果某个类要成为Servlet,则它应该从HttpServlet 继承, 根据数据是通过GET还是POST发送,重载doGet、doPost方法之一或全部。 doGet和doPost方法都有两个参数,分别为HttpServle
15、tRequest 类型和HttpServletResponse 类型。 HttpServletRequest提供访问有关请求的信息的方法,例如表单数据、HTTP请求头等等。 HttpServletResponse除了提供用于指定HTTP应答状态(200,404等)、应答头(Content-Type,Set-Cookie等)的方法之外,最重要的是它提供了一个用于向客户端发送数据的PrintWriter 。 对于简单的Servlet来说,它的大部分工作是通过println语句生成向客户端发送的页面。 必须导入java.io包(要用到PrintWriter等类)、javax.servlet包(要用到
16、HttpServlet等类)以及javax.servlet.http包(要用到HttpServletRequest类和HttpServletResponse类)。 doGet和doPost这两个方法是由service方法调用的,有时你可能需要直接重载service方法,比如Servlet要处理GET和POST两种请求时,38,JSP Technology,JavaServer Pages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术。 JSP并没有增加任何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便,不必再用 println语句来输出每一行H
17、TML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计专家进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。 JSP一般在Web服务器端被编译成Servlet后执行 通过定制的Tag实现扩展,39,JSP Constructs 1,JSP文件有固定的文件名后缀.jsp 注释 Declaration Expression 向Response流中输出数据 类似于在浏览器中执行print 在表达式语句后面不能有分号 Scriplets 包含java代码 ,40,JSP Constructs 2,The value is: Value
18、is empty所有JSP页面中都隐含存在几个固有的对象 “request” Browsers Request Object Use to get HTTP headers, length etc “response” - HttpResponse Object,41,JSP Constructs 3,“session” internal HttpSession Object “pageContext” “application” “out”, same as “config” servlet configuration “page” “exception” JSP Directives 是针
19、对JSP的指示,42,JSP Constructs 4,不会产生任何输出 “page” directive 通常用来引入java类的路径 “include” directive用来包含一些静态文件 “taglib” 列出标签库描述文件的位置 在使用特定标签库的时候需要,43,在Web应用中使用Java Beans,一般用来实现数据传递和业务组件 与Java Beans在Swing和AWT中的用法相似 必须没有构造函数或者构造函数没有参数 每个Bean属性都必须有setter和getter方法 JSP标签也使用Java Bean,44,JSP Actions,JSP actions是一些会影响输
20、出流的特殊标签,通常用在Java Bean上 常用的JSP action, , 以下代码用来在输出流中显示student bean的lastName属性,45,JDBC,提供访问关系型数据库的标准Java API 使用SQL 对于Java编程API的实现由各厂商实现,针对不同数据库编写不同的驱动程序。,46,JDBC 的目标,SQL-Level 100% 纯Java 简单 高效 利用现有的数据库技术 提供多种方法简化不同功能需求的代码,47,JDBC 体系架构,Application,JDBC,Driver,Java 代码调用JDBC库 JDBC装载驱动 驱动与特定数据库连接 可以使用多个驱动
21、,也可以使用多个数据库 可以在不修改程序代码的情况下更换要使用的数据库,48,JDBC Drivers,Type I: “Bridge” Type II: “Native” Type III: “Middleware” Type IV: “Pure”,49,JDBC API,JDBC 的实现类在java.sql包中,需要在程序中通过import语句引入,50,DriverManager,DriverManager 试用各种驱动 使用第一个可以正确使用的驱动 一个驱动类装载时,自动在DriverManager中注册 Class.forName(“org.gjt.mm.mysql.Driver”)
22、; Connection c = DriverManager.getConnection(.);,51,JDBC对象类,DriverManager 装载、选择驱动 Driver 连接实际数据库 Connection 连接数据库的对象 Statement 执行独立的SQL语句 ResultSet Statement返回的结果集,52,JDBC 类的使用,DriverManager,Driver,Connection,Statement,ResultSet,53,JDBC URL,jdbc:subprotocol:source 不同的驱动有不同的URL写法 jdbc:odbc:DataSource
23、 例如jdbc:odbc:Northwind jdbc:mysql:/host:port/database 例如jdbc:mysql:/localhost/accounting,54,DriverManager,Connection getConnection(String url, String user, String password) 与给定的JDBC URL连接,并使用user和password参数 可能产生java.sql.SQLException 返回一个 Connection对象,55,Connection,Connection对象表示和一个特定数据的连接会话 SQL语句在Co
24、nnection环境里执行并得到返回结果 可以创建到一个数据库的多个Connection连接 在Connection中有一些方法能够得到数据库的metadata信息,如数据库中表结构和字段属性 在Connection还有保证数据库事务的方法,56,获得一个 Connection,String url = “jdbc:mysql:/localhost/test“; try Class.forName (“ org.gjt.mm.mysql.Driver “);Connection con = DriverManager.getConnection(url,”root”,”root”); catc
25、h (ClassNotFoundException e) e.printStackTrace(); catch (SQLException e) e.printStackTrace(); ,57,Statement,Statement对象用来执行SQL命令并获取相应的结果 Statement对象的主要方法 ResultSet executeQuery(String) Execute a SQL statement that returns a single ResultSet. int executeUpdate(String) Execute a SQL INSERT, UPDATE or
26、DELETE statement. Returns the number of rows changed. boolean execute(String) Execute a SQL statement that may return multiple results.,58,ResultSet,ResultSet用来访问Statement对象执行后得到的数据结果集 每个Statement每次只能打开一个ResultSet 数据库表中的记录按顺序获取 ResultSet对象维护一个指向当前记录的游标 Next方法把游标指向下一个记录 新的JDBC中允许游标指向上一个记录,有部分支持高版本JDB
27、C规范的驱动程序可以支持这个功能,59,JDBC类图,60,Enterprise JavaBeans(EJB) 是:Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。 EJB容器是:一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。 EJB服务器是:管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问。一个EJ
28、B服务器必须提供对可访问JNDI的名字服务和事务服务支持。,什么是EJB,61,EJB架构,62,Enterprise JavaBeans有三种类型: Entity Beans 代表数据 在服务器重启后仍然存在 可以通过EJB container (“CMP”) 或者程序 (“BMP”) 持续化到数据库 Session Beans 执行动作 等价于一般的 Java object, 只不过是在远程 可以是 stateless (是原子操作), 或 stateful (在一个 context中执行一系列的操作) Message Driven Bean,EJB介绍,63,Enterprise Jav
29、aBeans,64,EJB介绍,EJB服务器和容器,65,EJB介绍,EJB容器的责任,66,业务数据模型 对业务概念的反映,也称为领域类(domain class) 在持久存储中业务实体的对象视图 提供访问和操作数据的对象封装 支持多用户共享的数据 可以从数据库中存储的属性重新实例化 EJB 服务器崩溃后仍可重构 与数据库中的数据有一样长的生命,EJB介绍,实体bean(Entity Bean),67,Bean-Managed Persistence(自管理的持久性) 优点: 开发者有完全的控制 无需复杂的提供商支持 缺点: 编码复杂 在改变时需要重新编码和部署 影响可移植性 Contain
30、er-Managed Persistence(容器管理的持久性) 优点: 提供商解决,可能会有更好的缓冲和性能 在部署描述符中进行改变即可 可移植性好 缺点: 对容器提供商的工具依赖性强 可能不易反映复杂的数据关系,EJB介绍,实体bean的持久性,68,会话bean经常用于涉及多个实体bean的业务处理和控制逻辑,EJB介绍,会话bean(Session Bean)(1),69,相对生命较短(一般与客户同步)在EJB服务器崩溃时被删除不表示数据库中的数据,但可以访问数据作为一个客户的代表执行功能可以加入事务,EJB介绍,会话bean(Session Bean)(2),70,使用会话bean
31、对针对于某一客户的处理或控制对象建模 对工作流、任务和管理活动等建模(如订房、购物车等) 协调多个实体bean,控制实体bean之间的交互 将业务应用逻辑从客户端转移到服务器端,EJB介绍,何时使用会话Bean,71,会话bean 表示一个业务过程 每一客户一个实例 Short-lived:与客户生命同步暂态的 服务器崩溃后丢失 可以是事务性的,实体bean 表示业务数据 在多个客户间共享实例 Long-lived:与数据库中数据同步 持久的 服务器崩溃后可重构 总是事务性的,EJB介绍,会话Bean?实体Bean?,72,无状态(Stateless)bean 表达一个无状态的服务(如列表,m
32、ail) 不存储用户相关信息,进行对请求的响应 暂态的 可用来构造响应频繁而简单的访问的bean池 有状态(Stateful)bean 维护客户状态,EJB介绍,两种类型的会话bean,73,JNDI,Java Naming and Directory Interface J2EE应用利用JNDI来定位资源和对象,使软件更容易移植 应用程序通过JNDI用符号名称查找关联资源的对象 符号名称和对象之间的关联由系统管理人员在应用程序部署时配置 JNDI的使用 InitialContext ic = new InitialContext() ic.lookup(“resource name”),74
33、,J2EE Web目录结构,顶层目录通常是上下文路径 如:应用目录/tomcat/webapps/servletdemo 通常情况下URL应为http:/localhost:8080/servletdemo 包含JSP、其他静态内容和WEB-INF目录 /WEB-INF目录 这是一个受保护的目录,不能浏览这个目录下的文件 /classes 未打包的java类,会自动加到CLASS_PATH中 /lib web应用中的jar文件,75,Web应用部署结构,Project Folder,WEB-INF,classes,package1,package2,lib,JSP files HTML fil
34、es pictures,web.xml,Deployment descriptor,76,部署结构说明,*.html, *.jsp等 Html、jsp和其他需要被客户端访问的文件 WEB-INF/web.xml Web应用部署描述符 WEB-INF/classes 编译后的java类文件(包括servlet和非servlet) WEB-INF/lib Web应用需要的JAR文件,包括JDBC驱动程序等第三方模块,77,Web 部署描述符,/WEB-INF/web.xml J2EE标准的一部分 定义一个web应用中的servlet 给servlet和URL之间作映射 一个servlet可以映射到
35、多个URL上 定义web应用中可以使用的资源 定义安全 定义其他内容 设定Welcome file列表 设定会话超时 错误页面映射,78,Web应用打包(WAR),J2EE规范定义了如何把一个web应用归档成一个web application archive (WAR) WAR文件 后缀为.war的Java归档文件 用zip格式打包 符合J2EE规范的应用服务器都可以正确识别 WAR文件直接部署在Tomcat等应用服务器上,79,J2EE应用结构,EJBs,Web component,EJB DD EJB class Remote class Home class,Web DD JSP fil
36、es Servlet Class Pictures (GIF/JPG) HTML files,J2EE Application,J2EE DD,.war file,.ear file,.jar file,80,J2EE标准部署描述符,Enterprise Archive (ear) file Application.xml在META-INF目录下 Java Archive (jar) file ejb-jar.xml在META-INF目录下 Web Archive (war) file web.xml在WEB-INF目录下,81,J2EE设计模式(JSP为中心),优点 非常容易结合业务逻辑(J
37、SP:UseBean)、服务器处理过程和HTML(),在JSP页面中同时实现显示、业务逻辑和流程控制,从而快速完成应用开发 缺点 应用的实现一般是基于过程的,一组JSP页面完成一个业务流程,如果要进行改动,必须在多个地方进行修改。这样非常不利于应用扩展和更新。 由于应用不是建立在模块上,业务逻辑和表示逻辑混合在JSP页面中,没有进行抽象和分离。不利于应用系统业务的重用和改动。,82,J2EE设计模式(MVC框架),表示与逻辑分开View 表示:显示输入输出数据 (可以是 HTML,jsp,也可以是一个 windows 应用) Model 业务逻辑和数据:基于输入和定义的业务流程执行计算 或其它
38、操作(javabean or ejb) Controller 协调view 和 model,在它们之间交换数据(action or servlet),83,J2EE设计模式,MVC 的隐含式 J2EE 实现View 由 JSP 和 HTML 页面组成 Servlet 可以同时是 controller 和 model 直接存取数据,MVC 实现方法1,84,J2EE设计模式,将业务逻辑处理放在 Servlet 之外 HttpServlet 的子类应该仅做 servlet 份内的工作 管理 request、response 及 HttpSession 对象 将业务逻辑写在传统的Java类 仅传送普
39、通的 Java 类,不是 servlet 相关的类(例如 request, response 或 session) 比 servlet 容易开发、测试和重用,MVC 实现方法2,85,典型的 J2EE 方案View 由JSP 和静态 HTML 组成 Controller 是 servlet Model 是 EJB 很象使用传统的 Java 对象 只是运行在远程,J2EE设计模式,MVC 实现方法3,86,典型的Struts 方案View 由JSP 和静态 HTML 组成 Controller 是 Struts Model 是 EJB或javabean,J2EE设计模式,MVC 实现方法4,87
40、,应用实例,Sun Blueprint PetStore myPetStore - EJB version JPetStore struts + iBatis,88,大多数J2EE应用共享许多任务: 日志, 数据库存取, 数据校验, 属性管理, 异常操作, 生成HTML不要在每一个项目中重写这些 不要在同一个项目用不同的方法做这些! 一个 “framework” 设定通用的方式去做这些工作 通过重用代码 (和技能!) 可能是内部框架 (通过以前的项目) 可能是外部框架(e.g. JADE),技巧,使用框架,89,可以被缓存并可以被所有用户共享 InitialContext object JND
41、I EJB Home interfaces 所有用户都一样可以被单独的用户缓存 Database resultsets 例如,当你一次只显示部分数据时,缓存查询结果 可以在 servlet 中缓存, 可以在 session bean 中缓存,技巧,尽可能缓存对象,90,init()做尽可能多的工作 只在初始化是执行一次 尽可能少地使用 Synchronize 确保不要 synchronize 整个类 不要用任何实例变量 将被所有在线的用户使用 不要使用SingleThreadModel 虽然是 thread-safe, 但性能太差 对于非 Java 群体: 不要在 cookies 中存对象 使
42、用 HttpSession 代替,技巧,Servlet 技巧,91,保持尽量少的Java代码 JSP中的Java代码很难维护和测试 绝对不要将业务逻辑放在JSP中 编写 helper classes 从数据生成HTML 理想情况下只使用 “” tags 在每一个JSP只包含用于显示数据的简单对象 有时称之为 “view bean”, 但不用是一个真的 JavaBean 限定 JSP 只做显示工作, 抵制在其中编写的商业逻辑的诱惑,技巧,JSP 技巧,92,如果在页面中你要共享组件和项目, 使用如下表格 E.g. 对于菜单, 标题栏, 页脚,等等 可以使用 HTML 或者 JSP include
43、 指令 可以包括静态 HTML, 或者其它 JSP 不要忘记在整个 JSP 中使用 try/catch 如果在 JSP 中抛出一个异常, 它不能被 servlet 捕获 作为替代, 将所有有异议的代码放在头部, 将这一部分封装在try/catch 中,技巧,更多的 JSP 技巧,93,尽量将 session bean 写成 stateless EJB container 会缓存 stateless session bean 尽可能明确删除 stateful session bean 以减少不必要的passivation 对用户端, 不要直接存取 EJB 将它们封装在一个简单的传统的 Java
44、类中,用以处理诸如contexts, home and remote interfaces,等等 用基于适配器的代理 作为选择, 用JBuilder 可以向导式地创建 “access beans”,技巧,EJB 技巧,94,使用连接池 创建一定数量的数据库连接池,共享它们在使用任何资源之后释放它们 E.g. PreparedStatements Statements, Connections, ResultSets因为”raw SQL”使用是需要重新编译,因此效率低 使用 JDBC 的 PreparedStatement 代替 Statement 如果想更快 尽管移植性不好 使用数据库的存储过
45、程 (Stored Procedure),技巧,JDBC 和数据库技巧,95,确保放在session 中的每一个对象要实现 Serializable (or Externalizable) 不是必须的, 但在分布式应用中是一个好的方法 避免在 session 中存放大对象 手工使 session 无效 如果在JSP中不需要session,禁用它,技巧,HttpSession 对象技巧,96,如果可能,在 HTML 中尽量少用 JavaScript 使用单独的 JavaScript 文件,与 HTML 分开 可以被浏览器缓存 使 HTML 文件更小 可以被共享, 容易维护,技巧,JavaScript 技巧,97,考试题型,判断题(10题) 简答题(6题) 论述题(1题),98,复习要点,什么是中间件、企业级应用的要求、什么是J2EE J2EE的主要技术 Servlet、JSP的开发 EJB的种类和功能 JDBC数据库访问、JDBC与Entity EJB访问数据库的区别 J2EE应用的目录、文件组织结构、各种配置文件的功能和主要配置项 几种不同的应用开发模式(MVC),