




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
J2EE宝典对于所有可以打上企业级标签的应用,通常都会具有一系列明显的特征,例如:l 饱含存有许多关系到公司成败的关键信息的数据库l 一系列访问部分数据库的小应用程序l 一系列来自公司不同部门的应用集成在一起,好像一个整体l 少数开发人员竭力维护这个应用并在特定的基础上提供新的功能l 如果公司使用Internet或同其他公司存在大量交易,会具有某种形式的Web页面来访问信息并在公司内部提供服务电子商务网站的必要特征:l 搜索引擎,使客户可以在成百上千的页面中找到所需要的页面l 购物篮存放客户决定购买的东西l 一些针对客户的需要定制的个性化页面,如最近购买纪录l 同第三方供应商的链接,如运输公司以及借记客户信息卡的发卡机构企业级应用的代码分布在许多计算机上,划分代码以运行在多台计算机上这个方法使用了多层设计理论。一条信息从客户端到达数据库又返回客户端需要穿越不同的代码层。l 两层应用:传统的两层应用包含用户接口和后台程序,后台程序通常是一个数据库,用户接口直接同数据库进行对话,在许多情况下他们在同一台计算机上。l 三层应用:在用户接口代码和数据库中加入了一个附加的逻辑层(商业逻辑层),它是对业务功能的提取,这是不再需要担心数据库的实现,因为用户接口代码现在同这个提取表示层进行对话。在这个中间层,通常需要使用提供了一定等级抽象功能的技术,这样我们看到的功能就是一个对象的集合,而不是SQL调用。通常选用的这种技术是EJB(Enterprise Java Bean)、通用对象请求代理结构(CORBA)和微软的分布式组件对象模型(DCOM)。使用这种结构的原因是它能够很容易增加第一层的服务器和服务。l N曾应用:中间层不仅仅是提取层,他还可以作为定向查询和修改不同系统的路由器。在分析一个企业级应用时,可以将代码划分成一系列的功能模块。1用户表示在这个模块系统对所有的数据进行处理并用用户平常可以理解的方式表达出来。Visual、Delphi、PB、JBuilder等都是用户表示工具。2数据存储和获取从应用程序的角度,在这个层需要决定如何存储数据,一旦确定数据如何存储,就可以寻找合适的API集合,这些API向程序员提供了完成工作所需要的数据提取方法。如有可能,API应独立于数据库,但也允许一些对原始数据的低级访问。例如,当谈到关系型数据库管理系统,一般希望使用SQL语言来获取最好的性能和扩展性。3系统间通信企业级系统一个日益重要的表现是同现有系统以及第三方资源的集成能力。为了同这些独立的系统协同工作,需要实现一个层来对他们进行抽象。通常解决这个问题的唯一方法是使他们都能理解相同的数据。最好的选择是使用预先定义的元语言,允许特定的应用程序供应商创建自己的协议。结果是我们可以不再需要担心如何转换这些文件,而是更关心包含在文件中的数据。4创建组件在数据库和用户表示层之间为数据创建一个抽象的表现层是很有好处的,我们可以:l 一次实现功能,其他用户可以继续利用l 对系统的某部分进行扩展而不会影响其它部分l 通过阻止非授权访问和操作来保护存放在数据库中的关键商业信息l 将所有信息处理为单一来源而不论信息是来自本地还是远端资源(或两者的结合)5不同时期的扩展为了提供更高等级的事务控制能力,可以使用另一个独立的控制集合,这是会在系统中形成一个独立的层。企业级Java简史Java核心类库包括三个不同的版本:袖珍版(Macro)、标准版(Standard)和企业版(Enterprise)l 袖珍版(J2ME):功能非常有限的版本,设计用于嵌入式设备,这些设备有非常有限的硬件和处理能力,以及有限的显示能力。l 标准版(J2SE):包含原始的核心类库,设计用于撰写桌面应用程序或浏览器中的小应用程序。主要由GUI框架、一些网络功能和I/O处理库组成。l 企业版(J2EE):非常全面的版本,包括实现查找和连接几乎任何形式的计算机化数据资源功能的类库。是J2SE类库的超集,主要的扩展在于数据处理和后台市场。企业级环境中的Java最有力的特性之一是在引入新的技术的同时对现有技术的整合。为了实现这个目的,他坚持在Java核心环境中建立起来的哲学:提供遵循80/20规则的非常一致的API集合以加快应用程序开发。J2EE具有许多不同的功能,它是一个为企业级应用开发者设计的十分庞大的工具包,对Java核心规范在大小和广度上都有巨大的扩展。J2EE API同样可以划分成多个类似的模块:1用户表示:表示层的目标就是将获得的数据返回给用户。通常是一个在服务器端使用Servlet或JSP技术的Web浏览器。(另外一个是Java Mail)l Servlet:使用Java语言提供动态网站支持,在Web服务器的后台运行,为动态服务制执行查询,但功能复杂;l JSP:用于简单的、动态的Web服务器功能,Java代码和HTML代码混合在一起并逐行处理;l Java Mail:实现电子邮件和新闻组功能的接口。用于同任何形式的电子邮件系统进行交互以接收或发送电子邮件。2数据存储:数据存储API对各自独立的协议提供了一个提取层,有两个主要的API供使用,这两个API都对低级的数据库连接进行抽象并提供一个存储在数据源中数据的抽象表达。他们都使用了服务提供着这个概念来实现接口以实现数据源和代码之间的数据抽象。这个技术允许提供者在编写实现的时候不用向你开放对其内部代码的访问,为了区别不同的服务提供者,就要使用一个字符串描述起始类的名字,这样就可以通过正常的接口对后台的数据资源进行查询和使用。l JDBC:Java数据库连接实现,是对使用SQL同数据库进行交互功能的抽象表达。它允许创建一个查询并使用Java而不是原始文本处理的风格同查询结果进行交互;l JNDI:Java名字和目录接口,是对许多不同类型的目录服务的抽象表达,但最常使用的还是LDAP数据库,也有可能用在DNS、文件系统以及特征系统(例如微软的Windows注册表)。3系统内通信:J2EE仅仅提供一个基于XML的系统内部通信接口。在XML领域J2EE只支持4个规范:l JAXP:用于XML处理的Java API,最高等级处理XML文档的API以及相关技术。允许在创建解析器时不用知道其具体实现。最新版本还支持XML框架和样式表解析(XSLT);l SAX:XLM简单API,是对一个XML解析器的表达,通过一系列的格式来表示信息,这个接口由Java开发共同体制定。l DOM:文档对象模型,XML文档被解析后在内存中的表达。4抽象对象:EJB和CORBA发展的主要动力是抽象原则,这个中间层提供许多不同的方法对系统的细节进行抽象,所使用的方法依赖于所编写的应用类型。提供抽象对象功能的API:l RMI:远程方法调用,Java规定的对远程对象的简单表达。包含其自有的网络协议和基础结构;l EJB:企业级Java Bean,一个管理抽象对象的高级框架。抽象对象和其服务器之间的后台通信可以使用RMI;l CORBA:通用对象请求代理结构,是RMI和EJB的处理器。它可以再多语言环境中运行。5大系统使用J2EE发布庞大的企业级应用,同其他企业级API协同工作,提供系统稳定性和可靠性。l JTA:Java事务处理API,遵循ACID原则保证系统的稳定性和可靠性l JMS:Java消息服务,基于消息系统的接口,如同主机的通信6连接点主要目的是帮助J2EE应用程序同现有的环境相适应,并使已有的独立的J2EE API组件很好结合并协同工作。连接J2EE同其他应用程序的API:l Activation:主要定位和运行在外部应用上,以及使用MIME类型描述文件和网络概念;l JAAS:Java认证和授权服务,一个插件API,用于提供安全服务;l J2EE Connector Architecture:将J2EE应用同现存的企业级应用进行集成所用到的结构和API,这些企业级应用如ERP和CRM系统。建议:对于程序员:从核心API协议开始,逐渐学习更多所需要的技术。如果启动一个全新的项目,建议完全使用J2EE环境,对于已有的项目,很有可能使用CORBA API或JMS。运行J2EE所需要的基本的和完全安装过程1 首先,需要可以运行在特定平台上的JDK副本,JDK提供了基本的开发需求编译器、文档产生器以及J2SE环境的核心类库。2 下面,要得到一个J2EE规范的实现。a) SUN公司站点的J2EE部分提供一个简单的环境b) 建议在真正开发时不使用这个环境,寻找一个实现J2EE规范的商业程序包(Apache的Tomcat/Jakarta是比较好的开放源码的J2EE环境)3 得到一个完全的开发环境(集成开发环境IDE)a) IBM的VisualAge(Eclipse)b) SUN的ForteXML项目对于XML项目,开始是最好是用一个已经存在的XML DTD。在创建一个XML项目时,最好从实现一个DOM解析器开始。一旦确定自己拥有解析一个XML文档的能力,则可以接着通过编程创建一个XML文档。EJB项目EJB是一个相当复杂的标准。它包含许多其他Java技术。在编写EJB程序前,应保证已经对RMI、XML以及可能涉及的JNDI相当熟悉。所有这些API都会被用来创建成EJB系统。一个简单的EJB项目的开始是创建一个商业组织功能的抽象,接下来,需要对商业逻辑进行扩展以包含库存管理以及购买和销售他们的能力。目录项目JNDI项目在处理LDAP数据库时非常有用,还可以用在几乎所有的存储和获得J2EE API安装信息的地方。最好的开始项目的方法是找一个具有数据的LDAP示例框架。在从LDAP数据库创建接口中所学到的东西同样可以用在其他所有使用JDNI的地方。一个应用事实上可能有许多可辨认的传统意义上的独立进程在同时运行。从用户的角度看,任何应用都属于下面两种类型中的一类:企业对客户(B2C)应用和企业对企业(B2B)应用。1 公司对客户应用(B2C):是从应用的外部使用者角度进行定义。有两个基本表现类型:a) 作为客户接口的浏览器b) 定制的接口,通常在一个完成单一任务的固定系统中在这个定义中,客户一般指社会公众。而公司指像DELL这样的公司,它需要人们不断的订货并进行生产,所以需要这样的一个系统。这些应用在软件设计时并不考虑客户,而只是考虑公司的需求。示例:电子商务网站通常,电子商务网站具有下列显著的特点:l 用于销售的在线产品目录l 用于存放希望购买商品的购物车l 用于在线购买和填写送货地址的订单l 其他通过浏览器表示的客户接口所有的电子商务应用都趋向于使用标准的系统体系(包括财务管理、运输、库存管理、销售、信用卡管理、交互式语音响应系统),这是一个古典的N层结构,包括客户层(页面浏览器)、中间层(Web服务器以及相关软件)、第三层(中间件组件)和最后层(数据库和外部组件)。在电子商务网站中使用了许多不同的技术,最重要的是中间层。l 页面生成:Servlet/JSPl 中间件:EJB/CORBAl 数据库服务器:Oracle/Informix/Sybase示例:机票预订系统(不使用Web界面的系统)这样的预订系统向用户提供许多实现功能的渠道,这里有一个核心系统,所有的功能都在其上实现,包围这个核心的是一些表示层的应用,他们在特定的输出设备上执行相应的功能。这个预订系统是一个不同系统的大集合,它是一个需要同现存系统一起协同工作的好例子。2企业对企业应用:主要用于不使用客户接口的信息交换。在许多情况下,他们是自动完成的。也就是说,一个公司决定其库存底线,并自动向供应商发送供货要求。这里基本上没有人工的干预。如果有的话,也是使用本地系统查看存活数量并通过接口发出供货请求而不是直接发送给供应商。示例:存货系统存货系统监视用户消费数量并在库存较低时向供应商提出供货要求。对于存货系统,主要思想是使用一个自动系统代替老的纸质介质和电话系统。这个应用的重要特征是同一个或多个外部系统相连(即各个供应商)。用于存货系统的Java技术l EJB:抽象商业逻辑l XML:交换信息和订单l JNDI:客户和供应商目录管理示例:电子支付电子支付网关只有一个目的记录信用卡号码并在银行账户上借记正确的金额。这个系统仅有一个实体,但却要保证相当的安全。多个层次的防火墙和加密的网络连接是这个系统常常具有的部分。通常在开发的代码中有两个明显的部分:银行代码和自有代码。所有的支付网关都使用一套相似的技术,这些技术必须保证同金融机构安全的网络连接。l JTAPI:建立和管理同金融机构专有的拨号链接l JSSEL:创建安全套接字连接并管理数据证书l Servlet:处理通过防火墙过来的支付请求2 后台应用:那些运行在服务器上、周期性运行、没有任何直接输入的应用。两个最常见的后台应用是通信系统和电子杂志/新闻网站。示例:通信应用如用于呼机和电话的无线网络,WAP市场更是使用基于Java的技术,并且最新的移动电话包含着Java处理能力,使用J2ME规范直接在手机上运行代码。示例:月度电子新闻每个主要的新闻站点和许多其它站点允许签约使用常规的电子邮件服务,当发生热点事件时,该站点就会启动一个应用,在电子邮件中装入相应的消息并发送到接收者列表中。批处理的邮件系统包括四个部分(忽略签约部分),两个最重要的部分是消息文本和接收者列表。在许多简单的情况下,可以使用文本文件保存消息,并使用一个电子邮件列表处理器发送消息。创建一个Java版本的电子邮件处理器:l JavaMail:电子邮件系统的接口l XML:存储格式化消息的信息l JDBC:从数据库获取地址信息首先,需要在数据库中存储所有电子邮件的地址,接下来,需要使用XML文档预定义消息的格式,通过使用XSL,可以根据接收者的要求向其发送HTML或纯文本格式的消息。最后,需要直接操作SMTP邮件服务器,而JavaMail会完成这个工作。在常见的Java企业级应用中,同客户对话的第一个对象常常是Servlet或JSP。Servlet是运行在Java虚拟机上的对象,他在服务器上运行并对客户的请求产生响应。通常在J2EE应用程序中,客户将通过JSP同Servlet进行通信。Servlet将调用一个会话Bean,并同一个或多个实体Bean交互。而实体Bean将使用Java数据库连接器(JDBC)同数据库进行通信。Servlet是企业级系统的二垒手,当得到一个请求,他们可能会自己处理并向客户端发送一个响应,但更多的情况下,他们接受请求,进行转换,并丢到系统的其他部分进行处理。Servlet可以用来实现商业逻辑并调用相应的组件访问数据库。Servlet通过使用init()方法初始化就可以长期存在。可以利用其持续性不断访问他们,共享信息,以及连接其他资源。Servlet在Java虚拟机中一个叫做Servlet容器的应用程序中运行,这个容器将替你管理Servlet的生命周期,不用关心服务器上运行的是什么操作系统。编辑web.xml文件:web.xml文件将对应Servlet的URL变得更为贴近实际情况l 标签中指明实际servlet及其包的名称n :servlet类名称,如Hellon :带servlet包名的类名称,如Greetings.Hellol 标签中指明在URL中的名称n :同上n :映射到URL中的路径名称,如/Hi这样形成的地址既清楚又紧凑,同时还不包含产生这个Servlet的文件名称信息,这个技术意味着你如何创建Web文档的信息是保密的。Servlet API简介Servlet的主要工作是对请求进行处理并产生响应。GenericServlet实现了Servlet接口和ServletConfig接口。而service()方法是其唯一的抽象方法。HttpServlet抽象类扩展了GenericServlet类并加入了处理HTTP请求的方法,他没有抽象方法,但是如果你不对其基本方法进行重载,这个类就没有任何有用的功能。1Servlet接口当用户向一个Servlet类发送请求时,如果其实例不存在,容器将创建这个类的一个实例。如果有init()方法,则会调用这个方法。只有初始化成功,这个Servlet才能接收客户请求。在init()方法返回后,容器可能不调用、一次或多次调用service()方法,将ServletRequest和ServletResponse对象作为参数进行传递。最后,容器会调用destroy()方法终止这个Servlet的运行并释放所用的资源。可以使用web.xml文件传递用于初始化Servlet的参数,这些参数使用名值对的方式进行传递。nameElena相应的init()方法如下:String name;Public void init() throws ServletException name = getInitParameter(“name”);Servlet接口提供对init()、service()和destroy()方法的重载,这个接口还声明了getServletConfig()和getServletInfo()方法:l getServletInfo()会返回Servlet的一些非技术性信息,可以使用第二个方法返回一个包含作者名字和联系方式的字符串;l getServletConfig()会返回一个ServletConfig对象,他定义的方法会返回一些Servlet初始化参数的信息。2GenericServlet抽象类:提供了Servlet和ServletConfig接口除了sevice()方法外所有其他方法的实现。介绍ServletConfig接口中的4个方法l getInitParameterNames():获得初始化参数的枚举类型l getInitParameter():获得初始化参数信息的字符串格式表示l getServletName():获得Servlet实例的名字l getServletContext():获得ServletContext句柄GenericServlet类还包含两个log()方法,第一个方法将一个String类型作为参数,它是将写入Servlet日志文件的消息,这个消息是用特定的Servlet名字进行标记(便于查到每个消息属于哪个Servlet)。第二个版本的log()方法将Throwable类的一个实例作为第二个参数,在日志中记录第一个参数中的消息并在跟踪堆栈时将异常写入日志文件。3HttpServet抽象类:是对GenericServlet类的扩展,该类中增加了处理HTTP请求的方法。对Get和Post请求的处理用到了HttpServlet类中的doGet()和doPost()方法。而doDelete()、doHead()、doOptions()、doPut()和doTrace()方法可以用来处理DELETE、HEAD、OPTIONS、PUT和TRACE操作。每个方法都用到了HttpServletRequest和HttpServletResponse对象作为参数,并抛出ServletException或IOException异常。在HttpServlet类中增加的最后一个方法是getLastModified()方法,它可以帮助客户端不去重新装入上次访问后没有改变过的页面。4ServletRequest家族HttpServletRequest接口是对ServletRequest接口的扩展,这个API还包括包装类ServletRequestWrapper和HttpServletRequestWrapper。ServletRequest接口主要由访问方法组成:l get( )类型的方法具有处理一般Servlet请求所需要的所有东西n 获得编码属性n 内容长度n 属性名称和值n 发送请求的客户名称和地址n 接受请求的服务器名称和端口号l 改变请求的方法n removeAttribute()方法可以从请求中删除特定的属性n setAttribute()可以向请求中的属性设置特定值n setCharacterEncoding()方法可以设置用于请求的编码属性HttpServletRequest接口新增了4个常量和25个访问方法。每个常量都支持基本的认证。这些方法通常会返回HTTP相关信息(如关于会话、cookie、查询字符串、路径以及标头等信息)。5ServletResponse家族用于处理响应信息。ServletResponse接口勾勒出向客户端发送响应信息的功能。HttpServletResponse增加了用于处理HTTP任务的方法,以及用于表现不同状态代码的常量。该家族同样有ServletResponseWrapper和HttpServletResponseWrapper包装类。Response.getWriter()方法返回一个PrintWriter对象,用于向客户发送HTML语句,它是向客户发送文本数据的标准方法。还可以通过response.getOutputStream()方法获得的ServletOutputStream对象向客户发送二进制数据。在获得PrintWriter对象前,需要指定发送信息的内容类型(response.setcontentType())。这个接口提供了十几个方法来处理响应。l getBufferSize()、getCharacterEncoding()、geLocale()方法用于获得相关信息l setBufferSize()、setContentLength()、setLocale()方法用于设置相关信息l isCommitted()方法测试响应是否被提交l resetBuffer()方法清除缓冲区但不清楚标头和状态代码l reset()方法清除整个缓冲区(包括标头和状态代码)l flushBuffer()方法强制将缓冲区的内容发送到客户端HttpServletResponse接口是对ServletResponse接口的扩展,在这个接口中使用了40多个常量来表示不同的状态代码(在查询Java文档列表时,会看到一个关于常用状态代码以及对应常量名称的列表)。这个接口中的许多方法都会返回一个状态代码。可以通过调用setStatus()方法设置响应的状态代码,该方法用到的唯一参数是一个整型变量代表不同的状态代码。还可以使用sendError()方法向客户端发送出错信息。有7个方法用于处理响应标头信息。l 可以通过使用addHeader()和setHeader()方法在响应标头信息中添加或设置预定义的名称和值l 还可以通过使用指定的名称和数据来添加或设置响应的标头信息l 通过使用addIntHeader()和setIntHeader()方法用指定的整数值来添加或设置响应标头信息l 通过使用containsHeader()方法说明已经设定了响应标头信息该接口中还有用于实现cookie、对URL进行编码、以及重定向页面功能的方法。l addCookie()方法会在指定的响应中增加cookie对象l encodeURL()方法可以对一个URL进行编码以增加会话ID信息l sendRedirect()方法将客户端重定向到一个指定的URLl encodeRedirectURL()方法可以对URL既编码又进行重定向6保存和共享信息在更多的Servlet之间、更多的用户之间或同一用户的不同时间段之间共享信息。对于在相同的上下文中运行的Servlet来说,可以通过共享属性实现这个功能。可以将上下文理解为运行在相同Java虚拟机中的Servlet,并且这些Servlet在webapps目录下有相同的子目录。会话跟踪是很重要的信息内容,有三个技术可以实现:隐藏表单域、URL重写、cookie。l 如果在一个表单中使用POST方法,可以在一些元素上使用TYPE=hidder,并对内容进行传递,在另一端,用于接收的Servlet可以通过调用getParameter()来方法访问这个隐藏的属性。l 还可以对URL进行重写以传递信息或跟踪会话,对URL重写的支持包含在HttpServletResponse中,encodeURL()方法将URL转换成一个字符串类型,并在需要时在其中增加会话ID。如果客户端浏览器不支持cookie,或会话跟踪被关闭,则需要使用此方法以实现会话跟踪。l HttpServletResponse接口中的addCookie()方法将Cookie对象作为参数,getCookie()方法用户获得客户在请求中发送的Cookie对象的数组。Cookie对象包含对cookie进行操作的方法。其构造方法使用了两字符串类:cookie的名字和相应值,可以使用getName()方法从getCookie()方法中返回cookie数组中获得cookie的名字。除此之外,还包括对注释、域、cookie的最大生存期、路径、浏览器是否能够通过安全协议发送cookie、值以及版本信息的获取或设置方法。(不能对一个已有的cookie设置其名称)使用ServletContextServletRequest家族中包含的主要是设置和获取属性的方法。可以通过使用这些方法在Servlet间共享信息。可以通过使用ServletContext对象设置或获取属性来传递信息。l getServletContext()方法获得一个ServletContext对象的句柄l context.setAttribute()方法用于设置属性,第二个参数是一个Object类型,这意味着可以向任何类型的对象传递一个对象的引用,同时为了获得这个属性的值,需要对对象的类型进行转换。l getAttribute()方法用于获得属性值对于一般的java编程,当一个类无法实现所有要求的功能时,就需要将该类分割为更小的对象,并协同工作以获得要求的功能并获得更好的扩展性。这意味着在需要进行职能划分时,可以获得更合适的手段。1在Servlet中使用过滤器Filter、FilterChain和FilterConfig接口主要用于Servlet的预处理或事后处理。他们可以在一个Servlet被调用前改变请求或改变Servlet产生的响应。还可以将多个过滤器连接在一起放在Servlet的前面、后面或前后以产生需要的效果。这意味着可以编写具有特定功能的过滤器并在不同的Servlet之间使用。需要编辑web.xml发布描述器以登记这些过滤器并映射使用的位置。FilterNamepackageName.classNameFilterNameservletNameFilter接口文档建议在认证、日志和审核、图像转换、数据压缩、加密、访问令牌、事件触发、XSLT和MIME类型链方面使用过滤器。过滤器只是完成一个特殊的任务并可能被用在不同的Servlet上。Filter接口指定了init()、destroy()和doFilter()三个方法。除了获得ServletRequest和ServletResponse对象句柄外,doFilter()方法还需要获得FilterChain的句柄,FilterChain接口只有一个方法doFilter(),它将一个ServletRequest和一个ServletResponse对象作为参数。如果过滤器在一个过滤器链之中,可以通过调用chain.doFilter()方法将控制传递到下一个过滤器。2使用forward()在Servlet间转移控制通过过滤这个方法,可以使单一的Servlet在服务器上同其他Java对象一起工作。而通过使用转送,第一个Servlet可以对请求进行一定程度的处理并将请求转送到另一个Servlet或其他资源。可以在将Servlet作为控制器或使用JSP进行显示的站点使用转送功能。不能在一个Servlet产生响应信息后再将请求转送到另一个Servlet。首先使用RequestDispatcher对象包装被调用的Servlet,dispatch实例知道转送的目标和资源,获得RequestDispatcher对象后,就可以使用这个对象将一个请求转送(使用它的forward()方法)到另一个指定的Servlet(转送目标也可以是一个JSP或HTML文件)。前一个Servlet的request中的属性,可以传递到下一个Servlet中。3在不同资源间拼接内容不能使用forward()方法在不同的Servlet之间连接响应信息。如果希望将一个资源的输出信息同自己的Servlet的输出信息进行拼接,必须使用include()方法。首先通过request.getRequestDispatcher()方法创建RequestDispatcher对象,同时告知需要进行拼接的资源位置。再使用dispatcher.include()方法调用其他的资源。JSP可以在页面中直接增加Java代码并且同JavaBean进行交互以及自定义标记。通常,同数据库交互的后台系统通过EJB实现,JSP和Servlet都被用来实现大型企业级应用的前台系统。像表示这样的任务使用JSP处理更为方便,而数据流程和商业逻辑最好由Servlet进行处理。JSP在第一次被调用时会被转换成一个Servlet,并被一个JSP容器编译。JSP容器是一个专门执行转换任务的应用(通常是一个Servlet)不同的Web服务器对JSP页面有不同的处理。Javax.servlet.jsp包中包含被JSP容器以及其产生的Servlet使用的类、接口和异常。通过JSP容器产生的Servlet代码:l 导入恰当的包l 设置内容类型l 初始化JspFactory、PageContext、HttpSession、ServletContext、ServletConfig、JspWriter、Object对象实例_jspxFactory = JspFactory.getDefaultFactory();pageContext = _jspxFactory.getPageContext(this,request,response,”,true,8192,true);pageContext = pageContext.getServletContext();config = pageContext.getServletConfig();session = pageContext.getSession();out = pageContext.getOut();使用JSP的最好方法是将它作为在开发小组划分责任的工具。程序员负责搭建框架而使页面设计人员能在框架内更好地工作并做出成绩。页面设计人员不需要在页面中实现复杂的商业逻辑。1在JSP中嵌入Java代码脚本元素以标记结束,JSP默认的脚本语言是Java。l 注释:JSP注释包含在之间,这些注视不会出现在页面上。还可以在脚本中包含Java风格的注释和声明。l 表达式:,表达式将通过不同的toString()方法统一转换成一个String。l 声明:,通过这个方法声明的变量将会在相应的Servlet中转换成一个实体变量,一个客户端修改变量的结果会影响到其他客户结果。l 脚本语句:当希望在一个JSP页面中使用Java代码执行一些任务时,需要使用脚本语句。2使用JSP指令JSP中有三个指令:page、include和taglib,他们可以在页面中进行参数设置。l page指令:可以在一个page指令中设置一个或多个属性,可以选择的属性包括autoflush、buffer、contentType、errorPage、extends、import、info、isErrorPage、isThreadSafe、language和session。l taglib指令:指定一个特定的标记库,使得库中定义的标记可以在JSP页面中使用。在使用taglib时,需要使用在prefix中定义的快捷名称以便在页面中对特定的标记进行引用。l include指令:在当前文件中包含特定文件的内容。3使用JSP动作jsp:actionNameJSP中的动作可以用来调用JavaBean,向其他资源传输控制以及包含其他资源。Include属性只是将包含的文件复制到出现该标记的行。而include动作在Servlet中将转换成javax.Servlet.jsp.PageContext.include()方法调用。JavaBean的使用JavaBean需要遵循一些原则。他们没有父类需要扩展或bean接口需要实现。他们必须有一个没有参数的构造方法。JavaBean的属性可以被其他Java对象读取或赋值。属性通常同实例变量相关,通常具有private访问权限,这些属性遵循一个简单的命名约定。获得boolean值属性的手段是调用isProperty()方法,而设置属性的方法是调用setProperty()方法。对于非boolean的属性,设置方法类似,但是获取方法需要调用getProperty()方法。JavaBean需要实现java.io.Serializable接口。他是一个标记接口,Serializable使命这个对象可以被串行化。有三个基本的JSP bean标记,允许执行三个基本的任务。l 允许创建同需要使用的JavaBean的连接l 和允许通过不同的方式获得或设置JavaBean的属性1此标记允许在JSP页面中是用指定的JavaBean,这个标记的主要任务时将页面中调用的JavaBean名称同相应的类文件进行匹配。这个JavaBean实例的名字就是他的id,不能在同一个JSP页面中使用相同的名字对应不同的JavaBean。其他可以指定的属性是scope、type、beanName。l type属性用于设置JavaBean的类型,如superclass或interface,默认值与该类相同。l beanName属性用于串行化创建一个新的实例l scope属性的可选值包括page、request、session和application。如果值为page,那么每次该页面被调用时都会创建这个bean,同时不同的访问之间不会有信息的共享。如果值为request,则允许在使用和标记时将该bean传送给其他JSP页面以及Servlet。这是保存信息的一个很好的方法,因为可以在处理一个请求时保存信息并在Web应用的其他地方使用这些内容。2该标记用于设置Bean的属性。对于属性所属的JavaBean的引用通过在标记中的id属性指定的名字实现。如果属性值是在运行时通过其他的值运算得到的,可以通过以下方式传递结果:jsp:setProperty name=”bean instance name” property=”property name” value=” /。如果属性的值是通过页面的request对象获得,应该通过以下方式设置:。同时客户端会在请求这个JSP页面的查询字符串中设置指定的属性值(采用URL?property name=value形式)。如果希望在多个甚至所有属性上这么做,既可以分别指定值,也可以对value赋予一个通配符“*”:。这允许客户端在知道属性值已经存在的情况下对属性进行赋值。3通过此方法获得的属性值会使用String对象来表示。还可以在JSP页面中使用表达式()显示一个属性的值。自定义标记能够让程序员向页面设计人员提供最好的技术支持,如果设计人员需要具有特定功能的函数,就可以创建这个函数并使用XML标记方式提供。页面设计人员可以在页面中安全地调用他们。自定义标记可以创造出Java代码更少而功能更强的用于JSP页面中的标记。可以创建自己的标记库作为对公开标记库的补充。开发和使用一个标记库的过程分成三个基本步骤:l 首先程序员创建并编译一个Java类,该类通常是javax.Servlet.jsp.tagext包中TagSupport或BodyTagSupport类的扩展。这个类通过doStartTag()和doEndTag()方法指定了一个标记在开始和结束时所作的工作。同样使用set和get方法操作标记的属性l 第二,程序员将一个叫做标记库描述器(tag library descriptor, TLD)的实体,放到一个XML文档中。这个实体包括将用来引用这个标记的名字,所对应的Java类,以及其他用来指定标记格式的信息。tag namepackagename.classnameinformation messageattributeNametrue|falsel 第三,页面设计人员使用这个标记编写JSP页面。设计人员首先需要使用taglib指明在第二步中创建的TLD文件的位置,接着就可以按照TLD文件中的使用规则使用这个标记了。声明:使用:对JSP页面和Servlet使用模式视图控制器(Model-View-Controller, MVC)结构(一般使用模式2),Servlet充当控制器的角色,JSP页面作为视图,JavaBean和EJB作为模式。Servlet控制器接收请求,在传送之前对请求作一些处理,为了做一些初始化处理,它可能会使用过滤器或其他Java对象。初始化过程可能还包括启动JavaBean或存储数据,接着,Servlet决定哪个JSP页面能够更好地处理请求的结果并将预处理结果发送到该页面。JSP页面接着使用JaveBean、其他JSP、Servlet以及静态页面来产生客户端可以在浏览器上看到的结果。使用JavaMail发送和接收电子邮件l 一个邮件包含了许多与邮件里所写的正文没有严格关系的信息。当按下发送按钮时,编辑器接受所编辑的文本,加上地址信息和一些其他的域,一起组成一个完整的邮件。l 形成这个完整的邮件后,他会连接到一个邮件服务器,一般是一个SMTP邮件服务器,并发送邮件。(所有在Internet上发送的邮件都采用SMTP协议,如果邮件服务器内部没有使用SMTP协议,那么邮件在进入Internet之前,必须转换成SMTP消息,同样,进入到系统中的邮件是SMTP格式,因此在Interne和内部之间必须有一个网关对邮件格式进行转换)l 一旦邮件进入了庞大的Internet,SMTP服务器必须找到一条发送路径:首先获取电子邮件的目的地址,从里面剥离出域名,然后通过相应的服务器来定位这个域。如果这个域中没有一个明确的邮件服务器,他就会在起这个域的父域中找,直到找到一个邮件服务器。这个服务器就是内部网络中为这个特定域的所有邮件所作的网关。l 一旦邮件到达网关机器,网关就有责任来管理内部网络中的消息。l 现在邮件已经存在目的服务器中,最后一步就是由用户去真正地读他。这是用户可以有多种选择:多多数用户会使用邮局协议(POP3)将邮件下载到本机的邮件客户端上。这个协议通常是将邮件从服务器上拷贝到本地机器上,然后将他从服务器中删除。UNIX用户采用不同的方法,邮件客户程序可以直接从存放那些收进来的邮件的目录中获取邮件。有影响的用户、移动用户和那些有单独的电子邮件账号的用户会使用IMAP(网际邮件应用协议)系统,IMAP可以使你在邮件服务器创建你所拥有的邮件文件夹,这样可以不必将所有的邮件移到本机上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电缆产品知识培训课件
- 河南省三门峡市陕州区2022-2023学年九年级上学期期中化学试题(含答案)
- 电站防汛知识培训心得课件
- 电磁兼容EMC基础知识培训课件
- 本科护理化学考试题库及答案
- 北京高中语文考试卷子及答案
- 北航研究生期末考试题及答案
- 新解读《GB-T 3000-2016致密定形耐火制品 透气度试验方法》
- 电焊基础培训知识课件
- 电焊初级基础知识培训内容课件
- 2025年春季学期1530学生安全教育记录表
- 《椅旁CADCAM全瓷修复技术指南》
- 空调维修保养合同范本
- 钣金安全生产培训
- 老年人口腔护理宣教
- 无人售货机的食品安全管理制度
- 鼻饲肠内营养腹泻的护理
- 高压氧舱培训
- 中餐分餐课件教学课件
- 检验科技术人员基本技能考核表2014
- 小学生防性侵安全教育主题班会课件
评论
0/150
提交评论