1、1,Web框架应用,Servlet JSP技术的两种使用模式 MVC及Struts JavaServer Face,2,1. Servlet,Servlet(服务器端小程序) 使用Java Servlet应用程序设计接口编写的Java程序。 由服务器端调用和执行。(Java编写的CGI) 源于请求/响应模式,可以接收来自客户端浏览器的Http请求,并产生一个响应,然后将这个响应发送到客户端。 是独立于平台和协议的服务器端的Java应用程序,可以生成动态的HTML页面,位于Web服务器内部,由Web服务器进行加载(该服务器必须包含支持Servlet的JVM) 实质就是运行在服务器上的类。,3,传
2、统CGI处理方式 HTML网页上放置字段(文字输入区)和“提交”(submit)按钮。 用户输入相应信息,单击“提交”,数据会随同一个URL传给服务器,告诉它运行指定地方的一个CGI(通用网关接口)程序,对提交的数据进行处理; Web服务器提供:调用CGI程序,用标准数据流输入和输出,CGI程序负责做其他一切事情: 首先,检查输入的数据,判断是否正确; 如果不正确,CGI生成相应的HTML代码,以网页形式,由服务器传回给用户(用户需要重新输入)。 如果输入数据正确,CGI处理数据(也许要添加到数据库等)。随后产生HTML网页,回传给用户,使用户看到处理后的结果。 Applet处理方式 使用客户
3、端运行的小程序检查数据,然后发出数据; 由服务器端程序接收和处理数据。 存在问题:不确定客户端是否有JVM,或是JVM的什么版本?,4,Servlet处理方式 可移植性 Servlet使用Java编写,Java具有跨平台性,Servlet的可移植性也很强,可以在不同的操作系统和应用服务器下移植运行。 灵活 Servlet接口非常精练,易于掌握,同时,又具有良好的扩展性。 效率高 传统CGI,每个请求都要启动一个新的进程;Servlet中,每个请求由一个轻量级的线程处理。 当JSP网页第一次运行时,速度很慢,这是因为服务器要将这些JSP程序转换为Servlet,而一旦转换完毕,编译后常驻在内存中
4、,访问JSP网页的速度就很快了。 功能强大 可以完成传统CGI很难实现的任务,如直接和服务器交互,在各个程序之间共享数据(数据库连接池的应用),5,Servlet与Applet Applet和Servlet程序中都没有main()方法,只有一些特定的方法用于启动、执行和退出。 不同的是,Servlet不提供用户界面,运行在服务器端,而Applet提供用户界面,运行于客户端。 Servlet和JavaBean一样,使用纯Java编写。 不同的是,JavaBean不能独立运行,只是提供接口供JSP等访问,而Servlet可以独立运行。 Servlet的生命周期 装载Servlet:动态执行。 创建
5、一个Servlet实例。 调用Servlet的init( )方法。 服务:如果容器接收到对此Servlet的请求,那么它调用service( )方法。 销毁:实例被销毁,调用destory( )方法。,6,7,Servlet的开发过程 基于HTTP协议的Servlet必须引入javax.servlet和javax.servlet.http包。 HttpServletRequest对象包含了客户端请求的信息,可能通过该参数取得客户端的一些信息以及HTTP请求类型; HttpServletReponse对象用于完成Servlet与客户端的交互,通过HttpServletRequest.getOut
6、putStream()方法取得向客户端输出的输出流,向客户端发送HTML页面。 编写doGet( )方法(对于POST请求,调用doPost()方法) 开发、部署一个简单的Servlet 编写HelloWorldServlet.java 部署好Servlet的目录结构。在classpath环境变量中添加: D:TOMCAT5.5COMMONLIBservlet-api.jar; D:TOMCAT5.5COMMONLIBjsp-api.jar 在浏览器中直接执行编译好的HelloWorldServlet.class,8,编辑web.xml 添加关于要执行的Servlet的标签:FirstServ
7、letservlet.FirstServlet添加Servlet的映射标签:FirstServlet/First在浏览器中执行 http:/localhost:8080/myServlet/First,9,10,11,使用HttpServlet处理客户端请求 Servlet是请求驱动的。 请求可能包含多个数据项,当Web容器接收到某个对Servlet的请求时,封装成一个HttpServletRequest对象; 将此对象传给Servlet的对应的服务方法doGet、doPost doGet 用于获取服务器信息,并将其作为响应返回客户端。 当由浏览器,或者通过HTML、JSP直接访问Servle
8、t的URL时,一般使用GET方式调用。 例:doGetTestServlet.java 会存在安全性上的问题。,12,doPost 用于客户端把数据传送到服务器端。 可以隐藏发送给服务器端的任何数据。 适合发送大量的数据。 例: doPostTestServlet.java doPut 允许客户端把真正的文件存放在服务器上,而不仅仅传送数据 doDelete 允许客户端删除服务器端文件或者Web页面。 doHead 由容器调用以使此Servlet能够处理Trace请求。 主要用于调试,不可以覆盖。 doOptions 处理客户端的Options调用,通过这个调用客户端可以获得此Servlet支
9、持的方法。,13,获得Servlet初始化参数 Servlet可以配置一些初始化参数 ServletConfig接口,获取这些参数 例: JDBCServlet.java jpeg_form.html,14,2. JSP 开发常用技巧,在不同的页面之间共享数据 把数据保存在Session中(useSession) 通过cookie(setcookie) 通过隐含的表单把数据提交到下一页面 通过ServletContext对象 通过Application对象 通过文件系统或者数据库 在不同的用户之间共享数据 通过ServletContext对象(聊天servletContext_chat) 通过
10、Application对象(testApplication) 通过文件系统或者数据库,15,3. JSP技术使用的两种模式,模式一 model 1 :JSP+JavaBean JSP页面独自响应请求并把处理结果返回客户。 所有的数据由Bean来处理,JSP实现页面的表现。 实现了页面的表现和页面的商业逻辑相分离的两层结构。 引起的问题:当大量使用此模式时,导致在页面中嵌入了大量的Java控制代码如果业务逻辑复杂,将会更加严重。 适合小型项目。 实例:简易论坛的设计,16,17,JSP作为视图,同时也有部分控制器的作用。 JavaBean组件作为模型和控制器组件。 HTTP请求到达JSP时,首先
11、设置JavaBeans组件的属性;然后调用其组件的方法 JavaBean组件通过连接数据库来执行业务逻辑; 最后, JavaBean组件把执行的结果返回给JSP显示。,index.jsp,showTypeList.jsp showSubList.jsp showSingle.jsp,Single.class SubSingle.class,数据源storeDB(MySql),DB.class,18,3. JSP技术使用的两种模式,模式二 model 2 :JSP+JavaBean+Servlet 遵循MVC模式。 使用一个或者多个Servlet作为C(Control,控制器)。 请求由前沿的S
12、ervlet接收并处理后,重新定向到JSP。 每个Servlet通常只实现很少一部分功能,多个Servlet结合起来完成复杂的任务。 对输入数据的检查和转换。 通过JavaBean访问数据库。 初始化JSP中要用到的JavaBean或对象。 根据处理中不同分支和执行的结果(如成功或失败),决定转向哪个JSP等 JavaBean作为M(Model,模型)使用。 实现各个具体的应用逻辑和功能。 JSP即为V(View,视图)。,19,20,客户端请求首先发送到Servlet; Servlet通过JDBC连接数据库,执行数据库操作; 完成后用JavaBean来封装执行的结果,将结果发送到请求对象中;
13、 最后把视图派发到显示的JSP页面。,index.jsp issue.jsp reversion.jsp,数据源storeDB(MySql),Single.class SubSingle.class,showTypeList.jsp showSubList.jsp showSingle.jsp,IssueCard.class ReverseCard.class,DB.class,21,4. MVC模式,MVCModel/View/Controller Model:应用对象(模型,真正完成任务的代码) View:应用对象在屏幕上的表示(视图,应该具有一定的功能性并遵守可用性的约束,但不应该处理数
14、据。 界面的每一部分都只能包含采集数据的足够逻辑,并把它传递给设计模式中的其他组成部分以进行处理。 Controller:定义用户界面对用户输入的响应方式(控制器,控制模型和视图之间的交互过程。) 决定向用户返回怎样的视图、检查通过界面输入的信息以及选择处理输入信息的模型。,22,23,5. Struts框架,Struts Framework是一种基于Java的技术框架,充分利用面向对象设计、代码重用以及“write once,run anywhere”的优点。 提供创建Web应用程序的框架,其中对应用程序的显示、表示和数据的后端代码进行了抽象。 视图:JSP 每一视图采用了定制标签库(由St
15、ruts Framework)提供的JSP的页面。全部表单元素都是用定制标签编码,每一个表单都通过映射JSP到Servlet的请求这一方式指向控制器的特定入口点。 控制器:Java Servlet 负责视图与模型之间的交互。控制器的每个入口点都由名为struts-config.xml的配置文件设置,把来自视图的请求映射为特定的Java类以进行相应的操作,还指定下一视图的位置。 模型:JavaBean 对进入控制器的每个入口点来说,Bean的作用是存储从视图获取的信息,同时被称为“动作类”(Action Class),实现业务逻辑。,24,假设,电子商务程序:1、现在程序要完成的 操作任务是提交
16、定单并返回定单号给客户,这就是关于做什么的问题,应该由Action类完成,2、但具体怎么获得数据库连接,插入定单数据到数据库表中,又怎 么从数据库表中取得这个定单号(一般是自增数据列的数据),这一系列复杂的问题,这都是解决怎么做的问题,则应该由一个(假设名为orderBo)业务对 象即Model来完成。orderBo可能用一个返回整型值的名为submitOrder( )的方法来做这件事。3、Action则是先校验定单数据是否正确;如果正确则简单地调用orderBo的submitOrder方法来得到定单号;它还要处理在调用过程中可能出现任何错误;最后根 据不同的情况返回不同的结果给客户。,25,
17、26,首先,控制器(Servlet)进行初始化工作,读取配置文件(struts-config.xml),为不同的struts模块初始化相应的ModuleConfig对象。 控制器接收HTTP请求,并从ActionConfig中找出对应于该请求的Action子类,如果没有对应的Action,控制器直接将请求转发给JSP或者静态页面。否则控制器将请求分发至具体Action类进行处理。 在控制器调用具体Action的execute方法之前, ActionForm对象利用HTTP请求中的参数来填充自己。(JavaBean) Action一般只包含execute()方法,它负责执行相应的业务逻辑(如果需
18、要,它也进行相应的数据检查),执行完成后,返回ActionForward对象,控制器通过该对象进行转发工作。 可以把Action要处理的业务逻辑封装在JavaBean中,若系统中还有EJB,可以通过JavaBean调用EJB来完成业务处理;如果没有EJB,直接在JavaBean中连接数据库,进行数据库相关操作。,27,6.配置struts应用,Struts架构包含有自定义的标签库: struts-html:创建动态HTML用户界面或者表格 struts-bean:将JavaBean代码放在JSP页面(通过标签实现) struts-logic:管理有条件地产生输出文本,遍历对象collectio
19、ns以重复产生输出文本;应用流控制。 struts-template:可以作为创建动态的JSP模板,这些页面都拥有一个公共的外观或者共同的格式。 配置工具: JDK和Servlet容器 XML解析器,JAXP1.1(Java API for XML)以上的解析器 JDBC2.0以上的包,28,struts体系结构中所使用的组件,29,核心组件,ActionServlet ActionServlet继承自javax.servlet.http.HttpServlet类,在Struts 体系结构中扮演的角色控制器,主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。
20、ActoinServlet必须在配置文件(web.xml)中描述。 当用户向服务器端提交请求的时候,实际上信息首先发送到ActionServlet,一旦控制器获得了请求,其就会将请求信息传交给一些辅助类处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。 在Struts中,这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类,从而实现自己的Action实例。 在收到请求后,ActionServlet会: 1.为这个请求选择适当的Action 2.如果需要,创建Action的一个实例 3.调用Action的execute()方法
21、,30,核心组件,Action Classes 一个Action 类的角色,就像客户请求动作和业务逻辑处理之间的一个适配器(Adaptor),其功能就是将请求与业务逻辑分开。这样的分离,使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能,比如:认证(authorization)、日志(logging)和数据验证(validation)。 execute()方法,31,核心组件,Action Mapping 将特定请求映射到特定Action的相关信息存储在ActionMapping中,ActionServelt将ActionMapping传送到A
22、ction类的perform()方法,Action将使用ActionMapping的findForward()方法,此方法返回一个指定名称的ActionForward,这样Action就完成了本地转发。若没有找到具体的ActionForward,就返回一个null。 方法 public ExceptionConfig findException(Class type) ,查找异常对象 public ActionForward findForward(String name) 在映射中动态添加,32,核心组件,ActionFrom Bean 一个应用系统的消息转移(或者说状态转移)的非持久性数据
23、存储,是由ActionForm Bean的负责保持的。 ActionForm的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定的情况下,还包括对数据进行校验)。Action负责对系统数据状态的保持,而Action则负责根据业务逻辑的需要,对数据状态进行修改,在改变系统状态后,ActionForm则自动的回写新的数据状态并保持。 典型的ActionFrom bean只有属性的设置与读取方法(getXXX),而没有实现事务逻辑的方法。只有简单的输入检查逻辑,使用的目的是为了存储用户在相关表单中输入的最新数据,以便可以将同一网页进行再生,同时提供一组错误信息,这样就可以让用
24、户修改不正确的输入数据。而真正对数据有效性进行检查的是Action类或适当的事务逻辑bean。,33,对于客户请求,Struts 体系结构在处理ActionForm的时候,一般需要经历如下几个步骤 :, 检查Action的映射,确定Action中已经配置了对ActionForm的映射; 根据name属性,查找form bean的配置信息; 检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例; 假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用;否则,就重新构建一个form bean的实例; fo
25、rm bean的reset()方法备调用; 调用对应的setter()方法,对状态属性赋值; 如果validatede的属性被设置为true,那么就调用form bean的validate()方法。 如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。,34,Struts-config.xml,全局转发 全局转发用来在JSP页之间创建逻辑名称映射。转发都可以通过对调用操作映射的实例来获得 : global-forwards forward name=“global“ path=“/Welcome.jsp“/ /
26、global-forwards ActionMapping ActionMapping对象进行框架内部的流程控制,可将请求URL映射到Action类,并且将Action类与ActionForm bean相关联。 ActionServlet在内部使用这些映射,将控制转移到特定Action类实例。 所有Action类使用perform()方法实现特定应用程序代码,返回ActionForward对象,其中包括响应转发的目标资源名称。,35,Struts-config.xml,ActionForm bean ActionServlet使用ActionForm来保存请求的参数,这些bean的属性名称与H
27、TTP请求参数中的名称相对应,控制器将请求参数传递到ActionForm bean的实例,然后将这个实例传送到Action类。 (完整的类路径)JDBC数据源 用data-sources元素可以定义多个数据源: data-sources data-source id=“DS1“ key=“conPool“ type=“org.apache.struts.util.GenericDataSource“ set-property id=“SP1“ autoCommit=“true“ description=“Example Data Source Configuration“driverClass
28、=“org.test.mm.mysql.Driver“ maxCount=“4“ minCount=“2“ url=“jdbc:mysql:/localhost/test“ user=“struts“ password=“ghq123“ / data-source/ /data-sources,36,7.Struts的标签,与框架组件进行交互。 自定义标签库主要有以下几类: Struts-html标签用于创建动态HTML用户界面或者表格 Struts-bean标签将JavaBean放到jsp页面中,提供了加强方式。 Struts-logic标签管理有条件地产生输出文本,应用流控制。 Strut
29、s-template标签作为页面创建动态JSP模板 Tiles标签用来创建tiles样式的页面。 Nested标签允许标签嵌套 使用前要在web.xml 中声明:/WEB-INF/struts-bean.tld/WEB-INF/struts-bean.tld在JSP文件中使用:,37,Html 标签库,38,39,Bean 标签库,40,Logic 标签库,41,Helloapp实例开发,应用Struts框架开发步骤: 分析应用项目的需求 应用需求套用基于MVC模式的Struts框架 创建视图组件,包括HTML表单(hello.jsp)和ActionFormBean(HelloForm.jav
30、a ) 创建ApplicationResource.properties资源文件 数据验证,包括表单验证和业务逻辑验证 创建控制器组件:HelloAction.java 创建模型组件:PersonBean.java 创建存放被各个模块共享的常量数据常量的java文件:Constants.java 创建配置文件:web.xml和struts-config.xml 编译、发布和运行helloapp应用,42,Helloapp实例开发,分析应用项目的需求 接受用户输入的姓名,然后返回字符串“Hello ”。 如果用户没有输入姓名就提交表单,将返回出错信息,提示用户首先输入姓名。 如果用户输入的姓名为
31、“Monster”,将返回出错信息,拒绝“Monster”打招呼。 为了演示模型组件的功能,使用模型组件来保存用户输入的姓名,43,运用Struts框架 模型:包括一个JavaBean组件PersonBean userName属性和get/set方法 ; save()方法用于存储数据(例如到数据库) 视图:包括一个JSP文件:Hello.jsp 提供用户界面,接收用户输入。 视图还包括一个ActionForm Bean 存放表单数据,并进行表单验证,如果用户没有输入,则返回错误信息。 控制器:包括一个Action类 HelloAction 业务逻辑验证:如果用户输入“Monster”,返回错误
32、信息 调用模型组件PersonBean的save方法,保存用户的输入 决定将合适的视图返回给用户。 web.xml和struts-config.xml配置,44,创建视图组件 视图包括两个组件:一个JSP文件:hello.jsp 提供用户界面。能够接受用户输入,并显示结果给用户 没有任何Java代码 使用Struts标签 没有直接提供文本内容,由资源文件给出 创建消息资源文件一个ActionForm Bean:HelloForm Bean 当用户提交HTML表单后,Struts框架将自动把表单数据组装到ActionForm Bean中。ActionForm Bean中的属性和HTML表单中的字
33、段一一对应。 还提供数据严整方法,及把属性重新设置为默认值的方法 。 实质是JavaBean,多了两个方法: Validate()方法用于表单验证 Reset()方法把属性重新设置为默认值,45,创建控制器组件-包括ActionServlet类和Action类 ActionServlet类是Struts框架自带的,它是整个Struts框架的控制枢纽,通常不需要扩展。 Struts框架提供了可以供扩展的Action类,它用来处理特定的HTTP请求。 HelloActionAction类的工作机制 Action是org.apache.struts.action.Action的子类。子类应该覆盖父类
34、的execute()方法。 当ActionForm Bean类被创建,并且表单验证顺利通过后,Struts框架就会调用Action类的execute()方法。 execute()方法包含以下参数: ActionMapping:包含Action配置信息,和struts-config.xml文件中对应 ActionForm:包含用户表单数据,当Struts框架调用execute()方法时,ActionForm中的数据已经通过了表单验证。 HttpServletRequest:当前请求对象 HttpServletResponse:当前响应对象,46,创建控制器组件-包括ActionServlet类和
35、Action类 访问封装的本地化文本 Action类的execute()方法首先获得MessageResources对象: MessageResources message = getResource(request); 访问文本信息: String title = message.getResource (“hello.jsp.title”); 业务逻辑验证 Struts框架会根据ActionForward对象包含的转发信息把请求转发到恰当的视图组件,视图组件通过标签把request范围内的ActionMessage对象中包含的错误信息显示出来,提示用户修改错误。,47,创建控制器组件-包括
36、ActionServlet类和Action类 访问模型组件HelloAction HelloAction类创建模型组件PersonBean对象并调用它的saveToPersistentStore()方法来保存userName属性: PersonBean pb = new PersonBean(); pb.setUserName(userName); pb.saveToPersistentStore(); Action类可以完成的其他功能: 从模型中读取数据,用于被视图组件显示;和多个模型组件交互;依据从模型中获得信息,决定返回哪个视图。 向视图组件传递数据 Action将数据存放在reques
37、t或session范围内方便向视图组件传递数据。 request.setAttribute( Constants.PERSON_KEY, pb); request.removeAttribute(mapping.getAttribute(); 转发HTTP请求给合适的视图 return (mapping.findForward(“SayHello“);,48,创建模型组件-PersonBean 创建存放常量的Java文件-Constants.java 创建配置文件web.xml servlet配置;taglib配置 struts-config.xml ,49,部署、发布和运行 在浏览器中运行h
38、ttp:/localhost:8084/helloapp; 在表单中输入信息; Servlet容器在web.xml文件中寻找属性为“*.do“的元素: action *.do Servlet容器依据以上元素在web.xml文件中寻找匹配的元素: action org.apache.struts.action.ActionServlet Servlet容器在web.xml文件中寻找属性为“*.do“的元素: action *.do /servlet-mapping,50,部署、发布和运行 Servlet容器把请求转发给以上元素指定的ActionServlet; ActionServlet依据用户
39、请求路径“/HelloWorld“,在Struts配置文件中检索path属性为“/HelloWorld“的Action元素: ActionServlet根据元素的name属性,创建一个HelloForm对象,把客户提交的表单数据传给HelloForm对象,再把HelloForm对象保存在元素的scope属性指定的request范围内。,51,由于元素的validate属性为true,ActionServlet调用HelloForm对象的validate()方法执行表单验证。 当文本框中不输入姓名的时候,vallidate()方法返回一个ActionErrors对象。里面包含一个ActionMe
40、ssage对象,封装了错误消息。消息key及文本为:hello.no.username.error=Please enter a UserName to say hello to! ActionServlet把HelloForm的validate()方法返回的ActionErrors对象保存在request内,然后根据元素的input属性,把客户请求转发给hello.jsp。 hello.jsp的标签从request范围内读取ActionErrors对象,在从ActionErrors对象中读取ActionMessage对象,将其显示在页面。 文本框中输入姓名“Monster”的时候,valli
41、date()方法返回ActionErrors对象。 ActionServlet查找HelloAction实例是否存在,如果不存在就创建一个实例,然后调用HelloAction的execute()方法。 HelloAction的execute()方法先进行逻辑验证,如果没有通过逻辑验证,就创建一个ActionMessage对象,这个ActionMessage对象封装了错误消息,execute()方法把ActionMessage对象保存在ActionMessages对象中,再把ActionMessages对象存放在request范围内。最后返回一个ActionForward对象,该对象包含的请求转
42、发路径为元素的input属性指定的hello.jsp。,52,部署、发布和运行 当文本框中输入其他姓名的时候,vallidate()方法返回ActionErrors对象中不包含任何ActionMessage对象,表示表单验证成功。 HelloAction的execute()方法进行逻辑验证,这次通过了验证,然后执行相关的业务逻辑,最后调用ActionMapping.findForward()方法,参数为“SayHello”:return (mapping.findForward(“SayHello“); ActionMapping.findForward()方法从元素中寻找name属性为“Sa
43、yHello”的子元素,然后返回与之对应的ActionForward对象,它代表的请求转发路径为“/hello.jsp”。 HelloAction的execute()方法把ActionForward对象返回给ActionServlet,ActionServlet再把客户请求转发给index.jsp。 index.jsp的标签从Resource Bundle中读取文本,把它们输出到网页上,最后生成动态网页。,53,8.JavaServer Face,概述 是Sun公司J2EE标准指定的Web应用框架;适应RAD(Rapid Application Development,快速应用开发)化的社会
44、。 通过将丰富的、强大的UI组件(如文本框、列表框、分页面板和数据网格等)的支持引入Web开发领域,使得Web开发更加容易。 JSF定义了: 基础组件架构定义了一种通用方式来建立UI 部件。此架构能驱动标准的JSF UI 组件(按钮、超链接、复选框、文本框等),也为第三方组件留出了空间。 标准的UI部件(widget)集 应用基础设施。 JSF和桌面UI框架(如Swing或者SWT)之间的不同之处在于:JSF 运行在服务器上。 运行在标准Java Web容器中,再向客户显示HTML或者其他标记语言。,54,8.JavaServer Face,55,8.JavaServer Face,幕后的技术
45、 HTTP-“无状态”协议(解决:cookie和URL重写) Servlet-使用session;JSP本质也是Servlet。 JSF 应用具有UI组件,和后台bean相关联,产生应用逻辑所使用的事件。Faces使用Servlet API作为其底层设施,应用开发人员可工作在更高的抽象层次:开发Web应用而无需过多关心HTTP或者Servlet API自身的特定之处。 Portlet-门户组件 大多数Web应用都需要从数据存储中通常是从数据库获得动态数据。 portlet规范定义了Portlet API。像Servlet API一样,它定义了大量的底层细节,但是并没有简化UI开发或者屏蔽掉HT
46、TP。,56,8.JavaServer Face,幕后的技术 JavaBeans -JavaBeans遵循一定的模式,以便其他Java类能够动态发现事件和除属性之外的其他一些元数据。 JavaBeans驱动了Swing技术,并使得 IDE能够提供GUI builder来构建桌面应用和applet。 可以开发组件,使其不仅可以很精确地与可视化的GUI builder一起工作,还可以提供特定的向导(或者定制器)以引导用户完成配置流程。 JavaBean 还包括一个强大的事件模型(与Swing和JSF组件所使用的一样)、持久化服务以及其他一些优雅的特征。 JSP和其他显示技术 servlet对Web
47、开发来说是低阶的构建块,不能简化显示动态内容的任务。必须手动处理每一个请求的响应。 (“ out.println”) 采用JSP技术来解决。具有可以进行定制处理或显示JavaBean 属性值的特殊标签,而且还可以在其中嵌入Java代码。,57,8.JavaServer Face,JSF是在Java中开发Web UI的框架。 String userName=(String)request.getParameter(“usrName”); JSF遵循MVC模式:业务逻辑代码不能混合到UI代码之中。 JSF(或Faces)总结: 是构建Java Web应用的UI框架,基于Java社区流程(JCP)开
48、发,JavaEE的一部分。主要目标是为Java Web应用开发领域带来RAD 风格的应用开发; 提供一系列标准部件、创建定制部件的模型以及在服务器端处理客户端产生事件的方式,并且有良好的工具支持。可同步UI组件与相关对象的值,不必编写太多代码。 所有应用都构建于Servlet API之上,使用HTTP进行通信,并且使用JSP之类的显示技术。 使用JavaBean来处理属性,提供基本的工具支持以及事件模型。 一个关键特征是支持Model 2(MVC)设计模式。可以很好地与其他框架集成,如Struts,并且与高层次框架的功能有一些重合之处。,58,可以将Web应用架构想象成一个服务栈。靠近栈底部的
49、服务没能抽象基础协议的许多细节,更接近底层。栈中靠近顶部的服务则隐藏了更多的细节,提供较高级别的抽象。最底层的服务由Web服务器、Servlet API和JSP处理。大部分框架都提供一些附加服务的子集。,59,60,4. 数据源和连接池,概念 在应用程序启动之前建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。 对于多于连接池中连接数的并发请求,应在请求队列中排队等待。 应用程序可根据池中的连接使用率,动态地增加或减少池中连接数。 优势 尽可能地重用了消耗内存的资源; 大大节省了内存; 提高了服务器的服务效率,提高程序运行效率。,61,4. 数
50、据源和连接池,类和接口 Javax.sql.ConnectionEvent:连接事件 Javax.sql.ConnectionPoolDataSourve:连接池数据源 Javax.sql.PooledConnection:被池化的连接 Javax.sql.ConnectionEventListener:连接事件监听接口 DataSource接口 getConnection( ) getConnection(String username,String password) getLogWriter( ) setLogWriter(PrintWriter out) getLoginTimeout() setLoginTimeout(int seconds),