第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP程序员常用的技术
第1章 JSP及其相关技术导航
【本章专家知识导学】
JSP是一种编程语言,也是一种动态网页开发技术,要用它完成实践项目工程的开发,需要掌握的知识点比较多。为了让读者对JSP这一开发技术的知识体系有个全面、清晰的了解,为后续的学习打下基础,本章将首先讲述作为一名JSP程序员应该掌握的技术知识体系和本书的内容安排。接着,对JSP技术进行了简要的介绍,使读者了解JSP技术的功能和优势。读者在读完本章后,应当能够了解要成为一个优秀的JSP程序员所要掌握的知识内容,并对JSP技术的要点有了一个整体性的认识,从而在以后的学习中做到有的放矢,完善自己的知识积累。
1.1 JSP程序员常用的技术
如今,开发Web应用程序的技术已经变得相对成熟与复杂了。构建一个Web应用程序不仅仅需要基本的HTML知识,还需要开发者对数据库访问、脚本语言和Web应用服务器管理等方面的知识有所了解,下面介绍JSP程序员常用的一些技术。
1.HTML语言
HTML语言(Hypertext Marked Language,超文本标记语言)是一种用来表示网页中的信息的符号标记语言。通过使用HTML可以在Web页面中加入图片、声音、动画、视频等内容,从一个文件跳转到另一个文件,自由链接。用HTML编写的超文本文档称为HTML文档,它能独立于各种操作系统平台(如UNIX、Windows等)。自1990年以来HTML就一直被用作Internet上的信息表示语言,它是Web程序员需要掌握的基础知识。
JSP技术是一种主流的开发动态网页的技术,JSP程序员理所当然应熟悉HTML。虽然现在制作网页的可视化开发工具很多,功能也强大,例如Dreamweaver、FrontPage,可以自动生成HTML文件中的部分代码,但是在开发过程中,很多地方仍然要求开发人员手工修改HTML代码。所以,作为一个合格的JSP程序员必须要熟练掌握HTML。
2.JavaScript脚本语言
HTML仅仅是一种标记语言,用它可作的事是有限的。用HTML创建的网页是静态的,这种网页不能处理和应答用户的客户端活动。例如,Web页面可能要求用户必须输入用户名、密码等信息,如果用户没有输入这些信息,网页要给出提示信息。如果为了核对用户输入是否为空,把数据送到服务器处理,然后服务器再返回处理结果,这样势必导致大量的网络通讯量。如果这些工作可以在客户端得到处理,将大大降低服务器的负担和网络的通讯量。正是Web网页可交互性的需要导致了脚本语言的出现。脚本语言使网页变成了可交互式的,它允许开发者获取客户端的每个事件,但无需与服务器交互。所以,掌握一种脚本语言成为JSP程序员的必备技能。
推荐读者使用目前最流行的脚本语言JavaScript。JavaScript是一种独立的编程语言,它与Java没有任何关系。JavaScript与Java的区别比较大。首先,JavaScript是一种解释性语言,用JavaScript语言写出的脚本不用编译就可在客户端浏览器上执行,而Java语言编写的程序在执行前是要被编译的。其次,如JavaScript这样的解释语言没有复杂的语法和规则,因此比Java这种被编译语言更容易学习。JavaScript编写的脚本都是集成在HTML当中,用于处理客户端的交互活动,而且是不可扩展的,而Java应用不与HTML直接集成。总之,JavaScript语言与Java语言是性质完全不同的两种语言,两者使用的领域范围不同,两者所能实现的功能也有区别。
3.Java语言基础
Java是JSP的基础,要学习JSP技术,Java基础是必不可少的。在用JSP技术编写Web页面时,很多时候要用到Java语言和Java编程的思想,所以如果读者想深入学习JSP技术,就必须对Java语言有深刻的理解。
Java是一种简单易用、完全面向对象、具有平台无关性、安全可靠的主要面向Internet的编程语言。自它问世以来,Java的快速发展和广泛应用已经让整个Web世界发生了翻天覆地的变化。随着Java Servlet和Java Server Page技术的推出,Java开发工具的功能不断强大,Web服务器软件功能的增强,Java已成为主流的软件开发语言之一。
4. SQL和JDBC
如今,大多数Web应用程序需要访问关系数据库中的数据。作为一个JSP程序员,你需要知道如何存储、得到并操作数据库中的数据。有时候,也需要设计数据库,构建数据库中的表和其他结构。SQL(Strutured Query Language,结构化查询语言)就是用来操作数据库中数据的语言。程序员通常需要编写SQL语句(常常是动态的),把它们传送到数据库服务器,再由数据库服务器执行SQL语句并返回SQL语句执行的结果。
Java语言中需要使用JDBC来帮助Web应用程序和数据库服务器进行通信。JDBC是用于执行SQL语句的Java应用程序接口,由一组用Java语言编写的类与接口组成,在JSP中将使用JDBC来访问数据库。JDBC是一种规范,它让各数据库厂商为Java程序员提供标准的数据库访问类和接口,这样就使得独立于数据库管理系统的Java应用程序统一了开发接口,便于模块化开发。在Windows操作系统中,还可以使用JDBC-ODBC桥驱动程序,这样只要是能够使用ODBC访问的数据库系统,也就能够使用JDBC访问了。
5.Web 服务器管理和应用程序的部署
服务器是对Web浏览器检索信息的请求做出响应,进而将HTML文档回传到客户机的浏览器。JSP页面和Java Servlet必须在特定的Web服务器中运行。因此,你至少需要知道如何配置Web服务器,以及如何为测试、生产运行应用程序而部署相关的Web资源。例如,如果运用Tomcat,你需要了解怎样安装配置它,需要了解如何映射配置文件(server.xml)中相关的应用程序,使Tomcat知道如何调用JSP页面、Servlet组件等资源。
推荐读者使用现在最流行的Web服务器中间件软件Tomcat、Weblogic或Websphere,其中Tomcat是开源免费的,读者可以从http://www.apache.org网站下免费下载得到,本书也将使用Tomcat作为Web服务器端的中间件软件。
6.XML
XML是计算机技术领域中的后起之秀,由World Wide Consortium在1996年开发,现在已经是用于数据交换和可扩展数据结构的一个广泛的、公认的标准了。JSP在其发展过程中也越来越强调XML的语言格式,XML在Java Web开发中扮演着越来越重要的角色。为什么要用XML的相容语言来架构JSP呢?因为作为XML文档的JSP将会得到很多好处,例如:
?一个标准的XML相容的JSP语法将有助于JSP的开发。
?JSP文件的XML语法使得JSP文件的内容很容易被组织和管理。
?可以使用XML的开发和分析工具来开发和分析JSP,仅仅需要更换DTD文件就可以升级到最新版本的JSP。
?XML格式统一的语法更容易学习和使用。
7.Java Servlet
Java Servlet是JSP技术的基础,而且大型的Web 应用程序的开发常使用Java Servlet和JSP结合来实现。
Java Servlet其实和传统的CGI程序和ISAPI、NSAPI等Web 程序开发工具的作用是相同的,在使用Java Servlet以后,用户不必再使用效率相对低下的CGI技术了,也不必使用只能在某个固定Web 服务器平台运行的API方式来动态生成Web 页面。许多Web 服务器都支持Servlet,即使不直接支持Servlet的Web 服务器也可以通过附加的应用服务器和模块来支持Servlet。得益于Java的跨平台的特性,Servlet也是平台无关的,实际上只要符合Java Servlet规范,Servlet是完全平台无关且是Web 服务器无关的。由于Java Servlet内部是以线程方式提供服务,不必对于每个请求都启动一个进程,并且利用多线程机制可以同时为多个请求服务,因此Java Servlet效率非常高。
但Java Servlet也不是没有缺点,和传统的CGI、ISAPI、NSAPI方式相同,Java Servlet是利用输出HTML语句来实现动态网页的,如果用Java Servlet来开发整个网站,动态部分和静态页面的整合过程会给程序员带来相当大的工作量,对程序员要掌握的知识水平和深度也要求比较高,这就是为什么SUN还要推出JSP的原因。JSP编写起来简单多了,但最终在执行时会先由Web容器先转换成Java Servlet,再由Web容器编译执行,所以一个JSP页和一个Java Servlet是一一对应的。
8.JavaBean和JSTL
在复杂的Web应用程序中,JSP页面只用于显示数据,而JavaBean和标签用来实现业务逻辑。
什么是JavaBean?JavaBean就是Java中的可重用组件。ASP.NET通过COM来扩充复杂的功能,如文件上载、发送email等业务处理功能或复杂的计算功能,可以将它们分离出来成为独立的可重复利用的模块。JSP通过JavaBean实现了同样的功能扩充。JSP为在Web 应用中集成JavaBean组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为JSP应用带来了更多的可伸缩性。JavaBean组件可以用来执行复杂的计算任务,负责与数据库的交互等。
和传统的ASP或PHP页面相比,JSP页面将会是非常简洁的,由于JavaBean开发起来简单,又可以利用Java语言的强大功能,许多动态页面处理的过程实际上被封装到了JavaBean中。
什么是JSTL呢?JSTL(JSP Standard Tag Libraries,JSP标准标签库)就是存储了可复用代码的标准标签库。为了提高应用程序的开发效率,就可以使用JSTL中已有的标签。此外,通过扩展程序员也可以编写自已的标签;一些框架技术也提供了一些用在JSP页面中的标签,如Struts提供的Struts HTML标签。
版权方授权希赛网发布,侵权必究
第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP概述
随着Internet的出现,整体应用架构被改变为多层次的“客户机/服务器”架构。Sun公司在1999年推出了JSP技术。此后,JSP很快引起了人们的关注,目前已经成为开发动态网页的主流技术之一。下面我们将对JSP技术进行一个全面、清晰的介绍。
版权方授权希赛网发布,侵权必究
第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Web开发技术的发展
1990年11月,Tim Berners-Lee在自己编写的图形化Web浏览器“WorldWideWeb”上看到了最早的Web页面。1991年,CERN(European Particle Physics Laboratory,欧洲粒子物理研究中心)正式发布了Web技术标准。目前,与Web相关的各种技术标准大多由著名的W3C组织(World Wide Web Consortium)进行管理和维护。
Web服务器端的开发技术是由静态向动态逐渐发展、完善起来的。最早的Web服务器简单地响应浏览器发来地HTTP请求,并将存储在服务器上的HTML文件返回给浏览器。当时只有一种名为SSI(Server Side Includes)的技术可以让Web服务器在返回HTML文件前,更新HTML文件的某些内容,但其功能非常有限。第一种真正使服务器可以动态生成HTML页面的技术是CGI(Common Gateway Interface,公共网关接口)。1993年,CGI1.0的标准草案由NCSA(National Center for Supercomputing Application)提出;1995年,NCSA又开始制定CGI1.1标准;1997年,NCSA又开始讨论CGI1.2标准。CGI技术允许服务器端的应用程序根据客户端的请求动态生成HTML页面,这使客户端和服务端的动态信息交换成为了可能。随着CGI技术的普及,聊天室、论坛、电子商务、信息查询、全文检索等Web应用蓬勃发展起来,人们终于可以享受到信息检索、信息交换、信息处理等更为便捷的信息服务了。
早期的CGI程序大多是编译后的可执行程序,其编程语言可以是C、C++、Pascal等任何通用的程序设计语言。为了简化CGI程序的修改、编译和发布过程,人们开始探寻用脚本语言实现CGI应用的可行方式。在此方面,不能不提的是Larry Wall于1987年发明的Perl语言。Perl语言结合了C语言的高效以及SH、AWK等脚本语言的便捷,似乎天生就适合于编写CGI程序。1995年,第一个用Perl语言编写的CGI程序问世。很快,Perl在CGI编程领域的风头就盖过了它的前辈C语言。随后,Python等著名的脚本语言也陆续加入了CGI编程语言的行列。
1994年,Rasmus Lerdorf发明了专用于Web服务器端编程的PHP(Personal Home Page Tools)语言。与以往的CGI程序不同,PHP语言将HTML代码和PHP指令合成为完整的服务端动态页面,Web应用的开发者可以用一种更加简便、快捷的方式实现动态Web功能。1996年,Microsoft借鉴PHP的思想,在其Web服务器IIS3.0中引入了ASP技术。ASP使用的脚本语言编程时使用的是我们熟悉的VBScript和JavaScript。借助Microsoft Visual Studio等开发工具在市场上的成功,ASP迅速成为Windows系统下Web服务端的主流开发技术。
当然,以Sun公司为首的Java阵营也不会示弱。1997年,Servlet技术问世,1999年,JSP技术诞生。Servlet、JavaBean技术和JSP的组合让Java开发者同时拥有了类似CGI程序的集中处理功能和类似PHP的HTML嵌入功能,此外,Java的运行时编译技术也大大提高了Servlet和JSP的执行效率,这正是Servlet和JSP被后来的J2EE平台吸纳为核心技术的原因之一。
版权方授权希赛网发布,侵权必究
第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP技术概述
作为一种动态网页表现层的开发技术,JSP提供了Java Servlet 的所有好处,并且,当与一个JavaBean类结合在一起时,提供了一种使内容和显示逻辑分开的简单方式。分开内容和显示逻辑的好处是,更新页面外观的人员不必懂得Java代码,而编写JavaBean类代码的人员也不必是设计网页的行家里手,就可以用带JavaBean类的JSP页面来定义Web 模板,以建立一个由具有相似的外观的页面组成的网站。JavaBean类完成数据处理逻辑,这样在页面模板中就可以只书写少量的Java代码,这意味着这些模板可以由一个HTML 编写人员来维护。当然,也可以利用Java Servlet来控制网站的逻辑,通过Java Servlet调用JSP文件的方式来将网站的逻辑和内容分离。
然而,Java Servlet最适用于不需要频繁修改的网页,而JSP页面则通过以显示为中心的描述性的方法将动态内容和逻辑结合在一起。通过JSP页面还可以使用定制标记或者Scriptlet,而不是使用JavaBean类来将内容与应用逻辑结合起来。定制标记被打包到一个标记库中,并被引入到一个JSP页面中。Scriptlet是直接嵌入在JSP页面中的Java代码段。
在JSP引擎中,JSP页面在执行时是编译式,而不是解释式的。解释式的动态网页开发工具如ASP、PHP等由于效率不高、编写不便等原因已经满足不了当前大型电子商务应用的需要了,传统的开发技术都在向编译执行的方式改变,如ASP→ASP.NET。JSP页面被编译为Servlet的Java源文件,再经过Java编译器编译为Servlet的class文件。在JSP文件转译为Servlet以后,每次客户机(通常是用户的Web 浏览器)向服务器请求这一个JSP文件的时候,服务器将检查自上次编译后JSP文件是否有改变,如果没有改变,就直接执行Servlet,而不用再重新编译,其效率是相当高的。一般地,Web服务器还可以作出设置,使JSP文件在第一个用户访问之前就预先编译好,这样执行的效率就更高了。
版权方授权希赛网发布,侵权必究
第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP的优势及与其他Web开发语言的比较
和传统的CGI相比较,JSP有相当的优势。首先,在速度上对于CGI来说,每一个访问就需要新增加一个进程来处理,进程不断地建立和销毁对于作为Web 服务器的计算机将是不小的负担。JSP可以用线程的方式来应对客户端的访问,这样需要消耗的系统资源更小。JSP是专门为Web开发而设计的,其目的是为了建立基于Web的应用程序,包含了一整套的规范和工具。
和ISAPI和NSAPI相比较,JSP的开发速度要快得多,开发难度也要小得多。而且ISAPI和NSAPI这种和Web 服务器过于紧密结合的技术在使用时的一旦出现错误,有可能导致Web 服务器崩溃,而JSP是线程安全的,且没有诸如C语言中的指针之类的操作内存的机制,因此编写出来的程序显得更加安全和可靠。
JSP的竞争对手是ASP.NET和PHP,在Web 技术方面ASP.NET、PHP和JSP的比较见表1-1。
表1-1 ASP.NET、JSP、PHP比较
1. Web 服务器和运行平台
ASP.NET主要应用于Windows平台,在添加组件后也可以用于Linux平台。尽管有第三方的插件号称可以在UNIX下使用ASP.NET,但ASP.NET经常需要使用COM组件封装已有的程序模块,而UNIX平台并不支持COM。
JSP得益于Java的跨平台性,它可以在许多平台下使用。
Apache Web Server是世界上占有率最高的Web 服务器产品,可以在包括SUN Solaris、IBM AIX、Linux和Windows在内的许多操作系统下运行。Apache Web Server下JSP的实现可以通过免费的Apache Jserv 和GNUJSP、Jakarta-Tomcat实现,也可以使用商业的JRUN (LiveSoftware)、WebLogic(BEA)、Websphere(IBM)来实现。
还可以使用应用服务器添加JSP支持的Netscape Enterprise Server及由之发展而来的可以直接支持JSP的iPlanet Web Server等等。
PHP本身就对各种操作系统和Web 服务器做了支持,PHP目前可以作为Apache的一个附加模块直接编译进入Apache中去,由于Apache支持多种操作系统,PHP相应地也就可以在各种操作系统上实现。PHP也可以CGI方式或ISAPI方式插入到IIS或PWS中去。
2. 组件技术
ASP.NET和JSP对组件技术的支持已经比较完善了,而PHP直到前不久才开始支持COM,但支持能力还不够强,如果PHP不能在将来完善对组件技术的支持,在大型Web 应用程序方面将很难与JSP和ASP竞争。但由于PHP技术本身的易学易用,加上众多的函数支持和开放源代码的特性,在中小型Web 站点的开发上,PHP还是会占有一席之地的。
JSP本身相对于ASP.NET和PHP并没有明显的优势,JSP的强大是因为其后面有强大的Java技术做支持。包括JavaBean和EJB技术在内的J2EE技术体系是JSP强大生命力的所在。
有理由认为,在将来的Web 开发中,中小型站点将出现JSP、ASP.NET和PHP三分天下的局面,但是对于大型的电子商务站点,JSP与ASP.NET技术将成为首选。
版权方授权希赛网发布,侵权必究
第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
用JSP开发Web应用程序的几种主要方式
JSP作为J2EE的一部分,既可以用于开发小型的Web 站点、也可以用于开发大型的、企业级的应用系统,本节将讲述对于不同规模的Web 系统,使用JSP进行开发的不同方式。
1.直接使用JSP
对于最小型的Web 站点,可以直接使用JSP来构建动态网页,这种站点最为简单,所需要的仅仅是简单的留言板、动态日期等基本的功能。对于这种开发模式,一般可以将所有的动态处理部分都放置在JSP的Scriptlet中,这有些类似于使用PHP或ASP开发动态网页。
2.JSP+JavaBean
中型站点面对的是数据库查询、用户管理和少量的商业业务逻辑。对于这种站点,不能将所有的程序都编写在JSP页面中。利用JavaBean,将很容易完成如数据库连接、用户登录与注销、购物车等商业业务逻辑封装的任务。如:将常用的数据库连接写为一个JavaBean,既方便了使用,又可以使JSP文件简单而清晰,通过封装,还可以防止一般的开发人员直接获得数据库的控制权。
3.JSP+JavaBean+Servlet
无论用ASP还是PHP开发动态网站,长期以来都有一个困扰着的问题,就是网站的逻辑关系和网站的显示页面不容易分开。常常可以看见一些夹杂着if......then......、case select或是if{......}和大量显示用的HTML代码的ASP、PHP页面,即使是有着良好的程序写作习惯的程序员,其作品也几乎无法阅读。另一方面,动态Web的开发人员也在抱怨,将网站美工设计的静态页面和动态程序合并的过程是一个异常痛苦的过程。
如何解决这个问题呢?有了JSP后,表现数据的任务由JSP完成,而Servlet不再担负动态页面生成的任务,却开始担负起决定整个网站逻辑流程的任务。在逻辑关系异常复杂的网站中,借助于Servlet和JSP良好的交互关系和JavaBean的协助,完全可以将网站的整个逻辑结构放在Servlet中,而将动态页面的输出放在JSP页面中来完成。在这种开发方式中,一个网站可以有一个或几个核心的Servlet来处理网站的逻辑,通过调用JSP页面来完成客户端(通常是Web浏览器)的请求。
版权方授权希赛网发布,侵权必究
第 1 章:JSP及其相关技术导航作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
小结
目前JSP技术已经成为了开发Web应用的主流技术,在国内外得到了广泛的应用。本章主要是对JSP的知识体系和技术特点作概括性的介绍,使读者对JSP有一个整体的了解。
JSP技术不是一项孤立的技术,如果仅仅掌握了JSP技术本身将难以满足实际开发的需要。想成为一名优秀的JSP开发人员,必须掌握与JSP技术密切联系的HTML、数据库开发、应用服务器的安装与配置、XML等知识。
JSP、ASP.NET和PHP是当今主流的Web开发技术。JSP与ASP.NET和PHP相比有许多优势,例如跨平台、可以利用J2EE分布式计算能力、使业务逻辑与页面分离。另外,JSP开发Web应用程序时主要有3种方式,分别是直接使用JSP、JSP+JavaBean、JSP+JavaBean+Servlet。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java开发工具
第2章 开发环境的安装与配置
【本章专家知识导学】
开发环境的安装与配置是学习jsp程序开发的第一步。本章将讲述目前比较流行开发环境的基础知识以及安装、配置方法,诸如JDK、Eclipse等。读者要融会贯通地掌握它,如果已经比较熟悉的读者可跳过本章的学习。Eclipse和Tomcat的安装与配置是本章的重点,希望读者能熟练掌握。
本章还将引入配置管理工具和中间件的概念。软件配置用来保证所有配置项的完整性和可跟踪性。配置管理是对工作成果的一种有效保护,对复杂、大型的软件项目开发具有很强的实用意义。
2.1 Java开发工具
本节主要介绍JDK和Eclipse。JDK是开发Java程序所需要的基本开发工具,Eclipse是目流程的Java集成开发工具。
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JDK
Sun公司在推出Java语言的同时,推出了一套开发工具JDK,JDK提供了Java开发常用的类库。JDK开发工具有Solaris、Windows NT、Windows 95等多种版本,本节介绍JDK1.5版,包括javac、ja-va、jdb、javah、javap、javadoc和appletview等工具,涵盖了对Java源文件的编译,执行Java字节码文件等工具。
读者可以从Sun公司的网站http://www.sun.com上免费下载得到JDK的安装文件,也可以从如下的网址下载得到JDK1.5:
http://jvm.cn/soft/jdk-1_5_0_08-windows-i586-p.exe
javac,即Java语言编译器,是JDK提供的重要工具之一,能够把由Java语言书写的程序编译成字节代码。
(1)javac使用的语法格式
javac [选项] 文件名.java
(2)javac的功能
javac命令把Java语言源码编译成字节码,字节码文件的扩展名为.class。Java源程序文件名后缀必须是java。javac编译器对每一个Java源文件中定义的类,生成一个保存编译结果字节码的文件,其后缀为class。如果程序中需要引用另一个类,则需要使用classpath环境变量指明存放路径。如果在源程序中引用了一个在该目录下其它文件中都没定义的类,则javac搜寻classpath指明的类路径。
【专家提示】如果没有指定-classpath参数,系统总是把系统变量CLASSPATH中设置的类路径附加到类路径中。
(3)语法中有关[选项]的说明
-classpath类路径:指定javac搜寻类的路径,覆盖CLASSPATH环境变量指定的类路径。目录名由冒号(:)分开,如:home/awh/classes:/usr/local/java/classes。
-d 目录:指定存放编译结果的类根目录。
-g :生成调试表。调试表包含调试工具使用的行号和局部变量信息。缺省时只有行号信息。
-nowarn:关闭警告错误。使用该选项后编译器不生成任何警告错误。
-O:通过嵌入静态、final、私用方法优化编译代码。注意,使用该选项后结果文件的大小会增加。
-verbose:使编译器和链接器显示出正被编译的文件名和正被装载的类名。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Eclipse
2001年11月IBM出资4千万美金开发的软件开放源码项目——Eclipse问世。Eclipse 是替代IBM Visual Age for Java(以下简称IVJ)的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境,还能通过开发插件,扩展到任何语言的开发。目前,Eclipse已经开始提供C语言开发的功能插件。Eclipse是一个开放源代码的项目,也就是说未来只要有人需要,就会有建立在Eclipse之上的COBOL、Perl、Python等语言的开发插件出现。
Eclipse是开放源代码的项目,读者可以到http://www.eclipse.org去免费下载Eclipse的最新版本,这个网站上提供了几个下载版本:Release,Stable Build,Integration Build和Nightly Build,建议下载Release或Stable版本。Eclipse本身是用Java语言编写,但下载的压缩包中并不包含Java运行环境,需要用户自己另行安装JRE。
图2-1 Eclipse显示的缺省界面
下面将分别对Eclipse的各种特性作简单介绍,包括:文件存放,开发环境,编译与运行,版本管理,使用插件。
(1)文件存放
Eclipse把所有的源代码都存储到一个reponsitory库文件中,想要得到文本格式的源代码必须用Export功能从reponsitory中导出以文本方式保存的源代码。安装Eclipse之后,在安装路径的下一层路径中会有一个叫workspace的文件夹。每当在Eclipse中新生成一个项目,缺省情况下都会在workspace中产生和项目同名的文件夹以存放该项目所用到的全部文件。可以用Windows资源管理器直接访问或维护这些文件。
将已有的文件加入到一个项目中目前有三种方式:第一种是用IDE的“File”菜单中的“Import”功能将文件导入到项目中。第二种是从Windows的资源管理器中直接拖动文件到项目中。第三种就是直接将文件拷贝到项目文件夹中,然后在Eclipse的资源浏览窗口中选择项目或文件夹并执行从本地刷新功能(Refresh from locate)。需要说明的一点是,项目文件夹可以放在计算机的任何位置,并且可以在Eclipse中用新建项目的方法将项目路径指定到已经存在的项目文件夹,然后在Eclipse中刷新即可。
(2)Eclipse开发环境
Eclipse的开发环境被称为Workbench,它主要由三个部分组成:视图(Perspective),编辑窗口(Editor)和观察窗口(View)。
图2-2 关系结构略图
文件的显示和编辑包含在编辑窗口里。缺省情况下打开的多个文件是以标签(TagTable)方式在同一个窗口中排列,可以用拖动方式将这些文件排列成各种布局。
文件被加入到项目中后,在资源浏览或Java包浏览窗口双击文件,Eclipse会试图打开这个文件:其中Eclipse内嵌的编辑器能缺省打开一些文件,如*.java,*.txt等等。如果是其它类型的文件,Eclipse会调用操作系统相应的缺省编辑器打开,如word文档。例如在Eclipse项目中双击HTML文件时,可能希望是用Notepad打开,而不是用系统缺省的IE浏览器打开。实现的方法是打开菜单栏中的“Windows”→“Preferences”对话框,之后在对话框中选择“WorkBench”→“File Associations”,然后添加文件类型,再为其指定编辑器即可。
浏览窗口和Java浏览窗口是观察窗口核心部分。后者用来浏览项目中的Java包,包中的类,类中的变量和方法等信息。类中的编译出错信息可以在任务窗口中查到,同时它也可以成为名符其实的任务窗口:向其中添加新的任务描述信息,来跟踪项目的进度。控制台则主要用来显示程序的输出信息。
一个视图包括一个或多个编辑窗口和观察窗口。视图是Eclipse的最灵活的部分,可以自定义每个视图中包含的观察窗口种类,也可以自定义一个新视图。这些功能都被包括在"Perspective" 菜单中。在Eclipse的Java开发环境中提供了几种缺省视图,如资源视图(Resource Perspective),Java视图(Java Perspective),调试视图(Debug Perspective),团队视图(Team Perspective)等等。每一种视图都对应不同种类的观察窗口。可以从菜单栏中的“Windows”→“Show View”看到该视图对应的观察窗口。
(3)编译与运行
在Java视图中,工具栏中有两个按钮如图2-3所示,分别用来进行调试和运行程序。由于安装的插件不同Eclipse可能会存在多种运行和调试程序的方式,为了确定当前项目用那一种方式运行,需要在“Run”菜单中设置“Run As…”或“Debug As…”选项。通常我们需要用的是“Java Applicantion”方式。在这种方式下,如果当前位置是包含main()方法的Java程序,点击调试或运行按钮就会立即开始执行调试或运行功能。如果当前位置是在包或项目上,Eclipse会搜索出当前位置所包含的所有可执行程序,然后由程序员自己选择运行哪一个。
图2-3 Eclipse的工具栏中的运行与调试按钮
(4)版本管理
Eclipse的版本管理分为个人(或称为本地)和团队两种。
Eclipse提供了强大的个人版本管理机制,每一次被保存的更改都可以得到恢复。而且可以精确到每一个方法的版本恢复。操作也十分方便,在任何一个能看到所要操作文件的观察窗口中,例如资源浏览窗口,选中该文件,点击右鼠标键,选择“Compare with”或“Replace with”,按照你的需求找到相应的版本就可以了。强大的个人版本管理功能为程序员提供了更多的安全保障。
Eclipse缺省为版本管理工具CVS提供了接口,可以非常方便的连接到CVS服务器上。CVS的指示我们后面还会遇到。通过CVS版本管理,Eclipse为团队开发提供良好的环境。要连接CVS服务器需要先打开团队视图(Team Perspective),然后在Reponsitories观察窗口中点击鼠标右键并选择新建(New),在打开的对话框中可以填入要连接的CVS库所需要的信息,如CVS服务器类型,还要填入用户名,主机名,密码,reponsitory地址等信息。
(5)使用插件
使用插件可以丰富Eclipse的功能。下面将介绍如何应用插件来嵌入Tomcat服务器。这个插件是一家叫sysdeo的公司开发的,非常小巧。读者可以到http://www.sysdeo.com/eclipse/tomcatPlugin.html去免费下载。另外,这个插件只支持Tomat4.0以上的版本,读者可以在www.apache.org得到Tomcat的最新版本。
只需将下载的zip文件解压缩,并将其中的plgins目录中的内容拷贝到Eclipse的安装路径的plugins目录下面,然后重新启动Eclipse。启动后在菜单栏上选择“Windows”?“Customize Perspective…”菜单,在打开的对话框中选中“Other Tomcat”。之后马上会发现Eclipse有了两处变化:菜单栏中多了一个Tomcat选项,工具栏中多了两个按钮,如图2-3所示。
图2-3 Eclipse 界面
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
配置管理工具
CVS是目前比较流行的一款优秀的版本管理与控制工具,是用来管理其它日常文档(如word工作文档之类)的一个强有力的工具。WinCVS是CVS的一个客户端软件,它运行在Windows上。企业内部可以采用Linux/Unix/Windows做服务器,用Windows做客户端,所以WinCVS与CVS服务器是目前应用最广泛的版本控制与管理的组合。下面主要介绍WinCVS的日常操作。
(1)第一步:安装Wincvs
执行setup.exe按提示完成安装。.安装完毕后运行wincvs。
(2)第二步:配置WinCVS参数
“Preferences”→“ General”:普通参数设置。
图2-4 Wincvs 配置界面
Authentication:验证方式,CVS默认采用pserver。
Path:CVS服务器的路径,就是Repository(仓库)。
Host address:CVS服务器的IP地址或者域名。
User name:用户名。
CVSROOT:CVSROOT,由上面4项生成的字符串,用于连接服务器。
“Preferences”→“Globals”:全局参数设置。
checkout read-only: 检出只读,wincvs默认导出文件为只读状态。去掉该选项。
Prune(remove)empty directories剪除(删除)空目录,去掉该选项。
“Preferences”→“WinCVS”:WinCVS参数设置。
图2-5 WinCVS参数设置
(3)第三步:登录。
图2-6 登陆界面
正常登录后即可开始使用CVS了。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java Web中间件
传统的HTML已经满足不了如今web系统的诸多的功能需求,建立一个交互式的Web,便诞生了各种Web开发语言,如ASP,JSP,PHP等,这些语言与传统的语言有着密切的联系,如JSP基于Java语言。 JSP是在普通的HTML代码中嵌入了特定的Java代码后形成的源代码文件。JSP源文件由JSP容器(如Tomcat)首先将其转化为Servlet,然后再调用Javac将Servlet编译为.class文件,最终,服务器执行的是class文件。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Tomcat
Tomcat是一个免费的开源的JSP容器,它是Apache基金会的一个核心项目,由Apache、Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总能在Tomcat中得到体现。
在Tomcat中,应用程序的部署很简单,只需将你的war文件(Java Web应用系统的包文件)放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。在浏览器中访问这个应用的JSP文件时,通常第一次会慢一点,因为Tomcat要将JSP转化为Servlet文件,然后编译。编译以后再次访问将会很快了,因为无需再行编译了。另外Tomcat也提供了一个应用—manager,访问这个应用需要用户名和密码,用户名和密码存储在一个xml文件中。通过manager这个应用,可以远程以Web方式部署和撤销应用。
Tomcat不仅仅只是一个JSP容器,也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态HTML的能力就不如Apache。可以将Tomcat和Apache集成到一块,让Apache处理静态HTML,而让Tomcat来处理JSP和Servlet。
Tomcat也提供其它的一些特征,如与SSL集成到一块,实现安全传输。还有Tomcat也提供JNDI支持。然而Tomcat只是一个轻量级的Web服务器,并不象诸如Weblogic之类的J2EE应用服务器功能那么强大。通常所说的J2EE应用服务器(如WebLogic)与Tomcat又有何区别呢?应用服务器提供更多的J2EE特性,如EJB,JMS,JAAS等,同时也支持JSP和Servlet,而Tomcat则功能没有那么强大,它不提供EJB等支持。但Tomcat如果与JBOSS(一个开源的应用服务器)集成到一块,也可以实现J2EE的许多功能。在很多中小型应用场合中不需要采用EJB等复杂的技术,JSP和Servlet的组合已经能够胜任,这时如果采用J2EE应用服务器就没有必要了。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
WebLogic
BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器,能将Java的动态功能和Java企业级标准的安全性引入大型网络应用的开发、集成、部署和管理之中。BEA WebLogic Server拥有处理关键Web应用系统问题所需的性能、可扩展性和高可用性。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
WebSphere
WebSphere是IBM的一套软件产品,包括WebSphere应用服务器,WebSphere Studio和 WebSphere Performance Pack。WebSphere可在30多种操作系统平台上运作,除计算机外,还可用于PDA、信息家电等产品,跨平台能力较强。WebSphere目前在全球已有超过35000家企业采用。近期,IBM力推的中间件(middleware)平台WebSphere将推出新版本,预计将进一步提升IBM在应用服务器市场上的份额,对市场龙头BEA Systems构成威胁。目前WebSphere在全球应用服务器产品中排名第二,仅次于BEA Systems的WebLogic,但在亚太区已排名第一。该产品包括一个基于 Java 的 Servlet 引擎,独立于 Web 服务器和它所基于的操作系统。WebSphere应用服务器提供了服务器插件的选项,与大多数流行的应用程序设计接口(API)兼容。
WebSphere由于面向专业人员,要掌握它的管理与使用有一定的难度。此外,WebSphere本身需要占用2G多的磁盘空间,需要256M以上内存支持,系统配置相对要求较高。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
本书开发环境的安装与配置
本书使用JDK1.5+Tomcat5.5来作为开发环境,下面来看这两个工具的安装与配置方法。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
安装JDK
(1)安装JDK
从http://www.sun.com或从如下地址可下载得到JDK1.5:
http://jvm.cn/soft/jdk-1_5_0_08-windows-i586-p.exe
双击jdk-1_5_0_08-windows-i586-p.exe即会开始安装,界面如图2-7所示。安装过程中,还会提示安装JRE1.5,这里单击安装JRE1.5界面中的“更改…”按钮,更改JRE1.5的安装目录,这里更改为“c:\jre15”,再单击“下一步”按钮会继续安装,直至安装完毕。JDK1.5的安装目录与JRE1.5的安装目录要设置一样,否则可能会互相冲突,而导致Web应用服务软件Tomcat5.5在启动时不能识别JDK的版本而无法启动。
图2-7 JDK安装界面
在Windows操作系统的桌面上使用鼠标右击“我的电脑”,打开“属性”对话框,在“高级”选项卡上单击“环境变量”,打开“环境变量”设置对话框,进行如下操作:
?系统变量->新建->变量名:JAVA_HOME(JDK的安装目录,如“c:\jre15” )。
?系统变量->新建->变量名:CLASSPATH(类的路径,如“.;%JAVA_HOME%\lib”)。
?系统变量->编辑->变量名:Path(寻找应用程序的目录,可以在最前面加入“%JAVA_HOME%\bin;”)。
【专家提示】CLASSPATH中有一个英文句号“.”后跟一个分号,表示当前路径的意。以上变量中,如果变量名已经存在则无需新建,编辑变量的值即可。
(2)测试JDK安装是否正确
进入命令窗口(在Windows桌面上单击“开始”?“运行”,输入cmd进入命令窗口(Windows95/98下输入command)。
执行如下的命令:
javac -version
窗口会回显如图2-8的信息:
图2-8 查看JDK的版本信息
如果能显示JDK的版本信息(不一定与以上文字完全相同),则说明JDK环境安装成功。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
安装与配置Tomcat
(1)安装Tomcat
从http://tomcat.apache.org上可以下载到Tomcat的安装程序、源代码及相关的文档,本书使用的Tomcat5.5。Tomcat不能单独使用,安装之前必须先行安装JDK。在如图2-9所示的网站,在左边的Download区中点击Tomcat版本的超链接可以下载相应版本的Tomcat。
图2-9 Tomcat的下载地址
得到Tomcat5.5的压缩文件后,将其用解压缩软件,如WinZip或WinRar,解压至指定的目录,这里我们解压至d:\tomcat55,实际应用可根据需要而定。
Tomcat5.5发布的程序版本有三种:zip版、tar.gz版和Windows Executable版。在Windows操作系统中,Windows Executable版本的安装可根据向导提示安装,不再叙述;zip版无须安装,直接拷贝解压缩目录下的所有文件至指定目录即可。这里推荐使用zip版,因为Windows Executable版虽然安装简单,但在安装过程中会修改系统的注册表,当经过多次安装Tomcat后,会出现一些不可预料的错误;而zip版无需设置,解压即可使用。
执行Tomcat安装目录bin子目录下的startup.bat程序就可启动Tomcat5.5服务器。结果如图2-10所示。
图2-10 运行Tomcat5.5
(2)测试是否安装成功
接下来,测试一下Tomcat服务器。打开浏览器,在地址栏中输入http://localhost:8080或http://127.0.0.1:8080,127.0.0.1与localhost均代表本机,会出现如图2-11所示的页面。
图2-11 测试Tomcat5.5
(3)配置Tomcat
Tomcat默认的Web服务端口号是8080,IE浏览器默认的HTTP服务端口号是80,如果将Tomcat的Web服务端口号改为80,则在访问服务器时不必再输入端口号了。如果是在系统自带了IIS(Windows 2000 server、Windows XP等操作系统自带的支持ASP技术的Web服务器软件),要注意IIS默认的HTTP服务端口号也是80,容易产生冲突。当然读者也可以把Tomcat的Web服务端口号改为你所要设置的数值。下面讲解怎么更改Tomcat的Web服务端口号。
在Tomcat的安装目录中有个叫config的子目录,进入后打开其中的server.xml文件,可以使用任一文本编辑器,一般使用记事本即可。在server.xml找到如下的一段文字。
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
如果觉得目视查找比较困难,可用记事本“编辑”菜单下的“查找”工具,查找“8080”,以进行定位查找,很快就可以找到上述的文字。将这段文字中的port=“8080”更改为port=“80”即可。重新启动Tomcat服务器,再次测试Tomcat服务器时将不需要输入端口号。
虚拟目录是针对提供Web服务的目录而言的。可以把硬盘中的一个目录映射成Web服务目录的一个子目录,但它事实上并不在Web服务目录中,这样用户访问这个目录时实际上访问的并非是Web服务目录中的文件,但给他的感觉就好象是Web服务目录中的文件,这个被映射成Web服务目录的子目录就称为虚拟目录。
使用虚拟目录可以提高Web服务器的安全,即便是Web服务器被攻破,黑客也无法得到程序的源代码;此外,当Web服务目录的磁盘空间不够时,可以用配备在其它磁盘上的虚拟目录来解决这个问题。
在Tomcat5.5中配置虚拟目录的方法是编写一个xml文件,内容如下:
<Context path="/jsp" docBase="e:/jsp" debug="0"
reloadable="true" crossContext="true">
</Context>
其中“path="/jsp"”表示配置的虚拟目录的名称,“docBase="e:/jsp"”是虚拟目录指向的事实目录。将此文件保存于Tomcat5.5安装目录的“conf/Catalina/localhost”文件夹下,文件名为jsp.xml。保存后,Tomcat5.5会自动更新配置。
【专家提示】配置虚拟目录的xml文件的命名规则是:虚拟目录的名称为xml文件的文件名,如此处,虚拟目录的名称为“/jsp”,则xml文件名称为jsp.xml。
版权方授权希赛网发布,侵权必究
第 2 章:开发环境的安装与配置作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
小结
在本章中,介绍了Java开发需要使用到的开发工具JDK,以及流行的IDE开发工具—Eclipse;初步领略了配置管理工具CVS,还介绍了现在应用较为广泛的三种JSP的服务器。Tomcat由于占用系统资源少,而被较多地应用于程序编写与调试,以及被小型Web信息系统作为Web服务器软件。接着还学习了本书的运行环境的安装与配置,包括JDK1.5和Tomcat5.5的安装与配置,讲解了Tomcat上HTTP服务端口号与虚拟目录的配置。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP程序的结构
第3章 JSP语法
【本章专家知识导学】
JSP是建立在Java语言基础上的一种Web程序设计语言,具有自己特有的用法和指令。本章首先介绍JSP页面的程序结构,然后讲述JSP程序中经常用到基本的面向对象Java语言程序基础知识,最后讲在JSP中特有的JSP指令和JSP动作指令。
通过本章的学习,应当深入了解JSP语法,并能灵活运用JSP语法编写简单的JSP页面和其中的Java程序。
3.1 JSP程序的结构
JSP页面的文件名以“.jsp”为后缀,在一个JSP页面中,除了基本的HTML语言元素外,主要还包含三种基本元素:JSP指令、JSP动作指令和JSP代码。JSP指令用于告诉JSP的Web引擎(如Tomcat)需要在编译时做什么动作,比如引入一个其它的类,设置JSP页面使用什么语言编码等。JSP动作指令则是在JSP页面被请求时动态执行的,比如可以根据某个条件动态跳转到另外一个页面。JSP代码指的就是嵌入在JSP页面中的Java代码,即Java程序片,它通常包含JSP表达式、变量和方法的声明以及Java语句。所有HTML文件可以在浏览器中直接打开查看运行效果,但是JSP文件必须先放到Web服务器中,然后通过HTTP的方式访问。
【例3-1】一个简单的JSP程序结构示例
3-1.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head><title>
一个简单的JSP程序结构示例
</title></head>
<body>
生成并显示一个从0~9的字符串:
<%! String str="0"; %>
<% for (int i=1; i <10; i++) {
str = str + i;
}
%>
<p> <%= str %>
</p>
</body>
</html>
这个简单JSP页面的基本结构程序包含了三部分:普通的HTML标记、JSP指令和JSP代码。通过一个for语句生成并显示一个从0~9的字符串,程序的执行结果如图3-1所示。
图3-1 一个简单的JSP程序结构示的运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java程序片
在JSP中,在“<%”和“%>”包含的程序代码称为Java程序片,它可以是JSP表达式、JSP的脚本代码以及JSP中变量和方法的声明。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP表达式
JSP表达式包含一个符合JSP语法的表达式,JSP表达式使用的方法如下:
<%=表达式%>
其中:“<%=”和“%>”之间为JSP表达式,一对表达式标志“<%=”和“%>”中只能有一个表达式。例如:
<%="Hello World!" %>
<%= 1+1 %>
表达式中的变量需要在脚本程序中事先声明,表达式运行后的结果会被自动地转化为字符串,然后插入到这个表达式在JSP文件中的位置,显示在网页上。因为这个表达式的值自动地转化为字符串,所以能在一行文本中插入这个表达式,Web引擎遇到“<%=”符号后,就会把“<%=”和“%>”中的内容作为表达式来解析。
【专家提示】JSP表达式标志不能用一个分号“;”来作为表达式的结束符,但是同样的表达式用在Java脚本代码中就需要以分号来结尾了。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java脚本代码
Java脚本代码(Java Scriptlet)是指在JSP页面中的“<%”和“%>”之间插入的Java程序代码。Java脚本代码使用的语法格式如下:
<% Java脚本代码%>
其中“<%”和“%>”之间为Java脚本代码。
“<%”和“%>”是Java脚本代码标志。Java脚本代码中可以包含多个JSP语句、方法、变量、表达式,它可以访问JSP对象、操作数据库、使用Java类库中的类等,利用这些可以在JSP页面内实现较复杂的逻辑功能。有了Java脚本代码,便能做以下的事:
(1)声明将要用到的变量或方法。
(2)编写JSP表达式。
(3)使用任何隐含的对象和任何用<jsp:useBean>声明过的对象。
(4)编写Java语句。
Java脚本代码由服务器负责把它转化成对应的Servlet的Service方法。当JSP服务器收到客户的请求时,Scriptlet就会被执行,如果Java脚本代码中有显示的内容(即向浏览器页面的输出),这些显示的内容就被输出到out对象流中,形成网页的动态部分。
【例3-2】JSP脚本代码示例
3-2.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<%@page language="java" %>
<html>
<head><title> JSP脚本代码示例</title>
</head>
<body>
<h3> Java Scriptlet</h3>
<%
for (int i =1;i <=5;i ++)
{
%>
<p>
i=<%= i %>
</p>
<%
}
%>
</body>
</html>
例3-2是使用循环语句在网页中显示i值(1 2 3 4 5)的JSP页面代码,其中的一个脚本代码段如:<% for (int i =1;i <=5;i ++) { %>。
它不是完整的Java代码语句,但是它和随后的其他脚本代码段一起构成完整的Java脚本代码语句。不同的脚本代码段之间可以按需要添加HTML文本。其运行结果如图3-2。
图3-2 JSP脚本代码示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
声明变量或方法
声明变量或方法的语法格式:
<%!声明变量或方法的代码%>
其中:“<%!”和“%>”之间为Java脚本程序声明的变量或方法。声明的代码不产生输出,而只声明了供访问的方法和变量,因此通常要将其和Java表达式、Java脚本程序结合使用。
声明的代码用于声明目标Servlet类的方法和变量(在处理HTTP请求的“service”方法之外)。在程序中也可以一句声明语句声明多个变量和方法,只要以“;”结尾就行。当然这些声明语句要合乎Java语法。
【专家提示】当声明方法或变量时,要注意以下的一些规则:
(1)声明必须以“;”结尾(Java脚本有同样的规则,但是表达式就不同了)。
(2)可以直接在<%@page%>语句中使用声明语句,包含已经声明了的变量和方法,不需要对它们重新声明。
(3)一个声明仅在一个页面中有效。如果想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@include%>或<jsp:include>语句包含进来。
【例3-3】Java程序片综合应用示例—一个简单的计数器
3-3.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<html>
<body>
<%!int counter=0;
synchronized void counterFunction()
{
counter++;
}
%>
<%counterFunction();%>
网站计数器<br>
您是第<%=counter%>位访问者
</body>
</html>
本例的代码是一个简单的计数器程序,它先后声明了一个计数器变量和计数的方法。计数器变量在客户间共享,直到服务器关闭;而计数方法只做简单的加1处理。Synchronized保留字表示串行化处理,即表示counterFunction()方法在某个时刻只能由一个语句调用。上述程序的其运行的结果如图3-3所示。
图3-3 Java程序片综合应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP程序注释
JSP页面中常用的程序注释主要有3种:JSP隐藏注释、HTML注释和Java语言中的注释。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP隐藏注释
JSP隐藏注释写在JSP程序中,但并不发送给客户端,因此在客户端浏览器中是看不到JSP隐藏注释的。JSP隐藏注释使用的语法格式如下:
<%--隐藏注释语句--%>
其中:“<%--”和“--%>”之间的内容为隐藏注释语句。该标志所包含的内容将被JSP编译器忽略。该注释在希望隐藏注释JSP程序时是很有用的,它不会对 “<%--”和“--%>”之间的语句进行编译的,也不会显示在客户的浏览器中,当然也不会在客户端源代码中看到,并方便了程序员调试程序。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
使用HTML注释
HTML注释是在客户端可以显示的注释。HTML注释语法格式如下:
<!-- HTML注释语句 -->
其中:“<!--”和“-->”之间的为HTML注释。该语句包含内容将被插到相应输出的HTML文本中。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java语言提供的三种类型注释
(1)单行注释:以“ // ”开始,并以换行符结束。
(2)单行或多行注释:以 “/* ”开始,并以“ */ ”结束。
(3)文档注释:以“ /** ”开始,并以“ */”结束,注释中的每一行都必须以 * 开始。使用JavaDoc工具可以从源代码和文档注释中将注释的文字信息取出,然后转换为HTML文件。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java的基本数据类型
Java语言包括简单数据类型和引用数据类型,如下图3-4所示。
图3-4 Java语言的数据类型
这一节我们主要介绍简单数据类型和数组,类和接口放在后面3.7和3.11节来具体讲解。
表3-1 简单数据类型表
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
标识符
Java语言标识符用来表示变量、方法或类等的名字。Java语言标识符的组成规则为:
(1)标识符必须以字母、下划线(_)或美元符($)开头,
(2)标识符第一个字符后面可以跟任意数目的字母、数字、下划线(_)或美元符($)。标识符的长度没有限制。
(3)在声明和使用标识符时需要注意,Java语言是大小写敏感的。
(4)标识符的命名应遵循Java编码惯例,并且应使标识符能从字面上反映出它所代表的变量或类型的用途,但不能是关键字。所有Java关键字都是小写的,true、false、null等都不是Java关键字;goto和const 虽然从未使用,但也作被为Java关键字保留;true、false、null虽用做专门用途,但不是Java关键字。
Java语言的关键字包括9大类:
(1)原始数据类型:byte、short、int、long、float、double、char、boolean。
(2)循环关键字:do、while、for、break、continue。
(3)分支关键字:if、else、switch、case、default、break。
(4)方法、变量和类修饰符:private、public、protected、final、static、abstract、synchronized、volatile、strictfp。
(5)异常处理:try、catch、finally、throw、throws。
(6)对象相关关键字:new、extends、implements、class、instanceof、this、super。
(7)字面值常量:false、true、null。
(8)方法相关关键字:return、void。
(9)包相关关键字:package、import。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
简单数据类型
(1)常量和变量
常量是指在程序运行过程中其值不变的量。常量有字面常量和符号常量两种。常量在表达式中用文字串表示,它区分不同类型,如整型常量123、-15,实型常量12.1f,字符常量‘ x ‘,布尔常量true,字符串类型常量"Test"。而符号常量声明的一般格式如下:
<final> <数据类型> <符号常量标识符>=<常量值>;
例如:final double PI=3.141593;
final int COUNT=1000;
变量是用来存放指定类型的数据,其值在程序运行过程中是可变的。按变量声明的位置Java的变量分为两种:类成员变量和局部变量。变量声明的一般格式如下:
<数据类型> <变量标识符>=<值>
例如 double x=1.2345;
(2)整型数据
Java整型数据多为十进制数形式,也可为八进制或十六进制形式。Java整型数都为带符号数。整型缺省为int型,若为长整型需在数据后加字母l或L。
按照长度分为:byte、short、int、long。int类型最为常用,可满足大多数场合应用的需要,如果需要更大的整数就可以使用long类型。byte类型范围很小,数据范围在-255到+255之间。short类型很少用,限制数据的存储为先高字节,后低字节,有时会引发错误,不提倡使用。
例如:byte b; short s;
int i; long l;
(3)实型数据
实型用十进制数形式表示,由数字和小数点组成,例如:3.25。也可以用科学计数法形式表示,例如,123E-3。数后加f或F为float,加d或D为double,没有后缀修饰的则缺省为double类型。
实型变量按长度分为:float和double。双精度浮点型double比单精度浮点型float的精度更高,表示数据的范围更大,详见表3-1。
例如,float c;
double d;
(4)字符型数据
字符型常量是用单引号括起来的一个字符,如:‘J‘、‘*‘。Java中的字符型数据是16位的Unicode字符,汉字和英文字母占的内存空间相同。如“JAVA你好”共12个字节。
变量的声明如下:
char ch=‘c‘;
Java中有以反斜杠(\)开头的字符,反斜杠将其后面的字符转变为另外的含义,称为转义字符。
表3-2 转义字符
【专家提示】字符串常量是使用双引号括起来的字符序列,注意,最后字符不是“\0”,这与C语言中不同。例如:"Let’s learn Java! "。Java中的字符串变量是作为对象来处理的,通过String和StringBuffer类的构造方法来声明,后续内容中还会有详细的介绍。
(5)布尔型数据
布尔型常量值只有2个:true和false。布尔型变量为boolean类型,取值为true或false。
例如:
boolean b=true;
(6)类型转换
整型、实型、字符型数据可以混合运算。运算过程中,不同类型的数据会自动转换为同一类型,然后进行运算。自动类型转换的规则是,低优先级的数据自动会转换为高优先级的数据。
而优先级高的数据类型要转换成优先级低的数据类型,需要用到强制类型转换。其一般形式为:
(类型名)表达式 或
类型名(表达式)
例如:double d=3.14159d;
int a=(int)d;
【例3-4】简单数据类型应用示例
3-4.jsp
<%@ page contentType="text/html;charset=gb2312"%><!--JSP指令标签-->
<%@ page import="java.util.*"%> <!--JSP指令标签-->
<html><!--HTML标记符-->
<body>
<%//以下为Java程序片
boolean booleanTemp=true;
byte byteTemp=100;
char charTemp=‘x‘;
int intTemp=234;
short shortTemp=456;
long longTemp=12345678;
int changlong=(int)longTemp;
float floatTemp=1.234F;
double changfloat=floatTemp;
double doubleTemp=1.23E-8;
out.println("布尔变量booleanTemp值为:"+booleanTemp+"<br>");
out.println("字符型变量charTemp值为:"+charTemp+"<br>");
out.println("整型变量intTemp值为:"+intTemp+"<br>");
out.println("短整型变量shortTemp值为:"+shortTemp+"<br>");
out.println("字节型变量byteTemp值为:"+byteTemp+"<br>");
out.println("长整型变量longTemp值为:"+longTemp+"<br>");
out.println("强制类型转化changlong 值为:"+changlong+"<br>");
out.println("单精度型变量floatTemp值为:"+floatTemp+"<br>");
out.println("自动类型changfloat值为:"+changfloat+"<br>");
out.println("双精度型变量doubleTemp值为:"+doubleTemp+"<br>");
%>
</body><!--HTML标记符-->
</html>
</body>
</html>
简单数据类型应用示例程序声明了几个简单数据类型,对其中的几个进行了自动转换和强制转化,并输出所有的值。其运行结果如图3-5所示。
图3-5 简单数据类型应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
数组
数组是相同类型的数据元素按顺序组成的一种复合数据类型,元素在数组中的相对位置由下标来指定。数组中的每个元素通过数组名加下标进行引用。
(1)一维数组
一维数组的声明格式如下:
数组类型 数组名[ ] ;
或
数组类型[ ] 数组名;
数组类型可以是Java中的任何数据类型。数组名必须符合标识符声明规则。“[]”指明该变量是一个数组类型的变量,可放到数组名后面,也可放到数组名前。
在说明数组时,如果不直接指出数组中元素的个数(即数组长度),则在数组说明之后尚不能立即被访问,还需要使用new操作来构造数组,为数组元素分配内存空间,同时对数组元素进行初始化。其格式如下:
数组名=new类型[数组长度];
如:
int student[ ];
student=new int[10];
或
int student[]=new int[10];
数组初始化就是为数组元素指定初始值。用new关键字为一个数组分配内存空间后,系统将为每个数组元素都赋予一个缺省的初值,所有数值型数组元素的初值为0,字符型数组元素的初值为一个不可见的ISO控制符(\u000),布尔型数组元素的初值为false,字符串数组和所有其他对象数组在构造时元素的初值为null。数组一旦创建之后,就不能再改变其长度。但在许多情况下,并不希望数组的初始值为默认值,此时,就需要用赋值语句来对数组的每个元素赋值进行初始化。
数组的初始化还有一种方式是像初始化简单类型一样自动初始化数组,即在声明数组的同时进行初始化,这个时候不需要使用new关键字。例如
int a[ ]={1,2,3,4,5};
【专家提示】注意数组的下标的取值范围从0开始,一直到“数组的长度减1”。例如
int a[]=new int[10];
int b=a[0]+a[9];
数组下标为从0到9。如果调用了a[10],程序运行时将提示越界错误:
java.lang.ArrayIndexOutOfBoundsException
(2)二维数组
在Java中并不直接支持多维数组,所以,多维数组的声明是通过对一维数组的嵌套形式声明来实现的,即用“数组的数组”来声明多维数组。例如,二维数组为一个特殊的一维数组,其每个元素又是一个一维数组。二维数组的声明、初始化和引用与一维数组基本相同,只是二维数组比一维数组多了一个下标。例如:
int a[][]=new int[3][2];
int b[][]={{1},{2,3},{4,5,6}};
数组a被声明为一个3行2列的二维整数数组,并分配存储空间,所有的数据元素都初始化为0;数组b声明了一个3行3列的二维整数数组,并同时给每个数据元素赋初值。
【例3-5】数组应用示例
3-5.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title>
数组应用示例
</title>
</head>
<body>
<%
int a[][]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int b[][]=new int[3][4];
int i,j‘
System.out.println("数组a各元素的值为:");
for (i=0;i<4;i++){
for(j=;j<3;j++)
System.out.print(a[i][j]+"\t");
System.out.println();
}
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[j][i]=a[i][j]; //矩阵转置
System.out.println("数组b各元素的值为:");
for(i=0;i<=3;i++){
for(j=0;j<4;j++)
System.out.print(b[i][j]+"\t");
System.out.println();
}
%>
<html>
<body>
上述代码声明了一个二维整数数组a,输出数组a的所有元素,然后把数组a转置成数组b,并输出数组b的所有元素。程序在浏览器中的运行结果如图3-6所示。
图3-6 数组应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
运算符与表达式
Java的运算符比较丰富,有算术运算符、关系运算符、布尔逻辑运算符、位运算符、赋值运算符、条件运算符等,一起运用时又有一定的优先顺序,下面来一一介绍Java的运算符。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
算术运算符
算术运算符用于对整型数和实型数的运算。如:+(加,取正值)、-(减,取负值)、++ (自加)、--(自减)以及+(加)、-(减)、*(乘)、/(除)、%(取余数或取模)。
【专家提示】其中运算符++、--可以位于操作数的前面,如++x 或--x,也可以位于操作数的后面,如x++、x--。无论运算符++、--位于操作数的前面或后面,操作数完成其运算并把结果赋于操作数变量。但是注意,如把++x或x++整体参加表达式运算时,表达式的运算结果可能不同。
后缀++:变量首先进行操作再自身进行加1运算。y= x++等价于:
y= x;
x=x+1;
例如:
int a=2;
int b=a++;
运算结果:a=3,b=2
前缀++:变量自身首先加然后再进行操作。y=++x等价于:
x=x+1;
y= x;
例如:
int a=2;
int b=++a;
运算结果:a=3,b=3
【例3-6】算术运算符应用示例
3-6.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head><title>算术运算符应用示例</title></head>
<body>
<%
int a=10;
out.println("a="+a+"<br>");
int b=++a;
out.println("a="+a+"<br>");
out.println("b="+b+"<br>");
int c=a++;
out.println("a="+a+"<br>");
out.println("c="+c+"<br>");
int d=--a;
out.println("a="+a+"<br>");
out.println("d="+d+"<br>");
int e=a--;
out.println("a="+a+"<br>");
out.println("e="+e+"<br>");
%>
</body>
</html>
上述程序代码对运算符++、--的前缀和后缀算术符的运算结果进行了比较,其运行结果如图3-7所示。
图3-7 算术运算符应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
关系运算符
关系运算符完成操作数的比较运算,结果为布尔类型值。关系运算符优先级低于算术运算符,同为关系运算符则优先执行顺序自左向右。
关系运算符有= =(等于)、!=(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)及instanceof (对象运算符)7种,在一个关系运算符两边的数据类型应一致,一个关系表达式的结果类型为布尔型,即关系式成立为true,不成立为false。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
布尔逻辑运算符
布尔逻辑运算符有六个,它们是:!(非)、&(与)、&&(简洁与)、|(或)、||(简洁或)、^(异或)。这些运算符要求的操作数和结果值都是布尔型。
【专家提示】注意区别简洁与&&(或||)和非简洁与&(或|):&&,如果其前面的表达式为假,则不再计算其后面的表达式,整个表达式为false;而&,不管其前面的表达式为什么,都计算其后面表达式。例如,
int a=6,b=8,c=10,d=12;
boolean x=++a>b++&&c++>d--;
(a=7,b=9,c=10,d=12,x=false)
boolean x=++a>b++&c++>d--;
(a=7,b=9,c=11,d=11,x=false)
两个表达式x都为false,但它们最后的c、d的值不一样。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
位运算符
Java位运算符用来对二进制的位进行运算。位运算符主要有按位取反~,按位与&,按位或|,按位异或^,左移<<,右移>>,无符号右移>>>等。在JSP应用程序设计中位运算符一般很少使用。
【专家提示】注意区分布尔逻辑运算符中的&、|与位运算中的&、|,如果运算符的两边为布尔值则为布尔逻辑运算符,否则为位运算符。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
赋值运算符
赋值运算符“=”用来把右边表达式的值赋给左边的变量,即将右边表达式的值存放在变量名所表示的存储单元中,这样的语句又叫赋值语句。赋值运算符使用的语法格式如下:
变量名=表达式;
【专家提示】赋值运算符“=”与数学的等号含义不同。
赋值运算符还包括很多变体,如+=,-=,*=,/=,%=等。
例如,int a=b=c=3;
a+=b;
等价于:
a=a+b;
条件运算符是“?:”,它是Java 中惟一的三目运算符。它要求三个操作数,其格式如下:
<布尔表达式> ? <表达式1> : <表达式2>
第一个操作数必须是布尔表达式,其他两个操作数可以是数值型或布尔型表达式。
条件运算符的含义是:当<布尔表达式>为真时,整个表达式值为<表达式1>的值,否则为<表达式2>的值。例如:
int x=20,y=30,max; max =x>y ? x : y;
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
表达式
表达式是由操作数和运算符按照一定的语法格式组成表达某种表达式或含义的符号序列。例如,以下都是合法的表达式。
(a+b)*(c-d) a=8-2*3<4&&5<2 a + b < c&&d= =e
每个表达式经过运算后都会产生一个确定的值,即表达式的值。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
运算符的优先级
表达式的运算次序取决于表达式中各种运算符的优先级。优先级高的先运算,优先级低的后运算,此外还可以使用括号“()”改变表达式的运算次序。
Java语言规定的运算符优先级如表3-3所示,表中排在上面的运算符有较高的优先级,同一行中的运算符的优先级相同。如果在表达式中有括号(表达式中只使用圆括号),又有函数,则优先计算括号中的内容,再进行函数运算。
表3-3 Java语言的运算符优先级
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
程序控制逻辑
控制逻辑用来控制程序中语句的执行顺序。Java程序设计语言提供了以下几种流程控制语句:选择控制、循环控制、跳转控制和异常处理。这里我们主要简单介绍选择控制和循环控制语句。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
选择控制语句
包括if-else和 switch两种形式。
(1)if-else 结构
If-else 结构的控制逻辑如图3-8。语句的执行过程是:首先计算布尔表达式,若布尔表达式的值为true,则程序执行语句1,否则执行语句2,然后执行if语句的后续语句。
图3-8 if-else语句的流程图
if-else 结构选择控制语句其格式为:
if (条件) {
语句1;
}else{
语句2;
}
【专家提示】在使用if-else 结构选择控制语句应该注意:
?else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
?语句1、语句2后一定要有“;”号。
?语句1和语句2可以是复合语句。
?if-else 结构选择控制语句可以嵌套使用,这时要注意花括号“{}”匹配问题,当分支较多时建议采用switch 结构,这样程序代码可读性更强一些。
(2)switch 结构
switch语句根据表达式的结果来执行多个可能操作中的一个,其控制逻辑如图3-9所示。语句的执行过程是:switch语句将表达式的值依次与每个case子句中的常量值相比较。如果匹配成功,则执行该case子句中常量值后的语句;如果没有找到,则执行default语句,直到遇到break语句为止退出switch语句。
图3-9 switch语句流程图
switch语句的语法形式如下:
switch (表达式){
case 常量1:
语句1
[break;]
case 常量2:
语句2
[break;]
…
case 常量n:
语句n
[break;]
[default: ]
缺省处理语句
[break;]
}
switch语句中的每个“case 常量n:”称为一个case子句,代表一个case分支的入口。
switch语句中表达式必须为byte,short,int或char类型,常量值必须是与表达式类型兼容的特定的一个常量,不允许有重复的case值。
通过if-else语句可以实现switch语句所有的功能。但通常使用switch语句更简练,且可读性强,程序的执行效率也高。
if-else语句可以基于一个范围内的值或一个条件来进行不同的操作,但switch语句中的每个case子句都必须对应一个单值。
【例3-7】选择控制应用示例
3-7.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head><title>
选择控制应用示例
</title></head>
<body>
2003年6月有多少天?
<%
int month = 6;
int year = 2003;
int numDays = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if((year%4 ==0)&&(year%100 ==0)||(year%400==0))
numDays = 29;
else
numDays = 28;
break;
}
out.print("<br/>");
out.println("答:2003年6月有 "+ numDays+"天。");
%>
</body>
</html>
上述程序代码通过switch语句根据给的年、月,输出该月的天数。其程序运行结果如图3-10所示。
图3-10 选择控制应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
循环控制语句
循环语句的作用是反复执行同一段代码直到满足结束条件。许多问题中需要用到循环控制。Java循环语句有while、do-while和for三种。
(1)while 循环
while语句形式如下:
while (布尔表达式) <语句>;
其中:
while是while语句的关键字;布尔表达式是循环条件;语句为循环体,当循环体为多个语句时构成复合语句。
while语句执行的过程为:首先判断布尔表达式的值,当布尔表达式的值为true,则执行循环体,然后再判断条件,直到布尔表达式的值为false,停止执行语句。
【专家提示】使用while语句应注意以下两点:
(1)该语句是先判断后执行,若一开始条件就不成立,则不执行循环体。
(2)在循环体内一定要有改变条件的语句,否则是死循环。
while语句的流程图如图3-11所示。
图3-11 while语句的流程图
(2)do-while循环
Java还提供了另一个与while语句类似的语句——do-while语句。do-while语句的语法形式如下:
do
语句;
while(布尔表达式);
do-while语句执行的过程为:先执行一次循环体中的语句,然后测试布尔表达式的值,如果布尔表达式的值为true,则继续执行循环体。do-while语句将不断地测试布尔表达式的值并执行循环体中的内容,直到布尔表达式的值为false为止。do-while语句的流程图如图3-12所示。
图3-12 do-while 语句的流程图
do-while语句和while语句的不同之处:do-while语句总是先进入循环,然后检测条件,再决定是否继续循环,而while语句是先测试条件,再判定是否进入循环。所以,用do-while语句时,循环体至少执行一次。
(3)for 循环
图3-13 for语句的流程图
for语句是循环的另一种表示形式。for语句的语法形式为:
for(变量初始化表达式1;条件表达式2;对变量的值作递增或递减处理) {
语句组;
}
for是for语句的关键字,语句组为for语句的循环体。
for语句中循环控制变量必须是有序类型,常用的有整型、字符型、布尔型。循环控制变量初值和终值通常是与控制变量类型相一致的一个常量,也可以是表达式。循环次数由初值和终值决定。
for语句的执行过程如图3-13:
(1)按表达式1将初值赋给循环控制变量。
(2)按表达式2判断循环是否成立,即判断控制变量的值是否越过终值(未越过终值为条件成立,越过终值为条件不成立),若条件不成立,则转步骤(6)。
(3)若条件成立,则执行循环体。
(4)按表达式3修改控制变量。对于递增型为原控制变量值的后续;对于递减型为原控制变量值的前导。
(5)返回步骤(2)。
(6)结束循环。
【例3-8】循环应用综合示例
3-8.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head><title>循环应用示例
</title></head>
<body>
<%
int sum,i;
i = 1;
sum = 0;
while (i<=2000) {
if(i%2!=0)
sum+=i;
i++;
}
out.println("用while循环求2000内的奇数和:" +sum);
out.print("<br/>");
i = 1;
sum = 0;
do{
sum+=i;
i+=2;
}while (i<=2000);
out.println("用do-while循环求2000内的奇数和:"+sum);
out.print("<br/>");
for(sum=0,i=1;i<=2000;i+=2)
sum+=i;
out.println("用for循环求2000内的奇数和:"+sum);
out.print("<br/>");
%>
</body>
</html>
上述程序代码用while、do-while和for语句分别求2000内的奇数的和。从代码上看while和do-while语句查不多,只是do-while至少会执行一次,而while却不一定。for语句使用简单明了,使用灵活,经常被程序员所使用。其程序运行结果如图3-14所示。
图3-14 选择控制应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
类
类是复杂的数据类型,是组成面向对象Java程序语言的核心要素。它描述了一类对象的属性和行为。进行Java程序设计时我们既可以使用Java系统类库中提供的许多标准的类,也可以自己根据应用需要定义满足应用需求的类。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
类的基本概念
类是一种复杂的数据类型,它描述了一类对象的属性和行为。类是对象的抽象,对象是类的实例化,要进行面向对象Java程序设计,先要定义类,然后创建对象,再使用对象。来看下面的代码示例。
Class MyDateClass {
private int day;
private int month;
private int year;
public MyDateClass(){
day = 1;
month = 1;
year = 1900;
}
public MyDateClass(int d,int m,int y){
day = d;
month = m;
year = y;
}
public void display(){
System.out.println(day + "-" + month + "-" + year);
}
public static void main(String args[]){
MyClass m1 = new MyDateClass();
MyClass m2 = new MyDateClass(25,12,2005);
m1.display();
System.out.println("m2 是 "+m2.year+"年");
m2.display();
}
}
类的定义要使用关键词class,类体包括数据和操作两部分。数据是类的成员变量,表示对象的属性;操作是类的成员方法,表示对象的行为。在上面的例子中定义了一个MyDateClass类,有day、month、year3个数据,以及MyDateClass()和display()方法,在main(String args[])方法中通过new声明和创建了两个实例对象m1、m2。在Java中所有的对象的内存空间都是动态分配的,所以要用new运算符声明和创建它们。对象的使用通过运算符“.”可以实现对象的成员变量和成员方法的使用,m1.display()和m2.display()是对成员方法的调用,而m2.year是对成员变量的访问。
从MyDateClass()、display()和main(String args[])方法,可以看出类的方法代码编写格式为:
返回的数据类型 方法名 ([参数列表]){
//方法体,实现对象的行为的代码
}
其中MyDateClass()和MyDateClass(int d,int m,int y)两个方法与类MyDateClass同名,称之为构造函数。构造函数名称与类名称相同,构造函数没有返回类型,其任务是在创建对象时初始化其内部状态。如果类中没有定义构造函数,则表示默认有一个无参数构造方法。MyDateClass()和MyDateClass(int d,int m,int y)两个方法同名,只是参数列表中参数个数和类型不同,这就是所谓的方法重载。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
this
this代表了当前对象的一个引用,当一个方法需要引用调用它的方法时,可以通过this顺利的访问对象、修改对象的数据成员和调用对象的方法。MyDateClass的构造函数可以修改如下:
public MyDateClass(){
this.day = 1;
this.month = 1;
this.year = 1900;
}
public MyDateClass(int d,int m,int y){
this.day = d;
this.month = m;
this.year = y;
}
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
类的继承
被继承的类称为父类,继承父类的类称为子类。执行继承时,子类将获得父类的属性,并具有自身特有的属性。extends关键字用于继承类,声明一个继承父类的类的通常形式如下:
class 子类名 extends 父类名 {
//子类程序代码
}
如果类的声明中在没有extends,则默认父类为Object。Java语言中子类只能有一个父类,具有单继承性,要用到多继承时可以通过后文中讲解的接口来实现。
class A{
int value = 3;
int getValue(){return value;}
}
class B extends A{
int value = 6;
int getValue() {return value;}
int getValue2(){return super.value;}
int getValue3(){return getValue();}
int getValue4(){return super.getValue();}
}
A类是父类,B类是子类,B类继承了A类的数据和方法,同时也增加了一个数据和四个方法。在B类中还用到了关键字super。super指这个对象的父类,关键字super可用于访问父类中定义的属性,调用父类中定义的成员方法,在子类构造方法中调用父类的构造方法。以上程序表示使用父类的构造方法生成实例,super必须是子类构造方法的第一条语句。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
抽象类和抽象方法
用abstract关键字来修饰一个类时,该类叫做抽象类;抽象类必须被继承。抽象类不能被直接实例化,它只能作为其它类的超类,这一点与最终类(final类)正好相反。
用abstract来修饰一个方法时,该方法叫做抽象方法。抽象方法只有声明,不能有实现。抽象方法必须被重写。定义了抽象方法的类必须是抽象类。下面是一个抽象类的例子。
abstract class Shape{
abstract float area( );
}
class Circle extends Shape{
public float r;
Circle(float r){
this.r = r; //this指“这个对象的”
}
public float area( ){
return 3.14*r*r;
}
}
抽象类Shape中声明了一个抽象方法area( ),该方法在子类中实现。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
Java的标准类库
Java提供了丰富的标准类来帮助程序员更方便快捷地编写程序,这些标准类组成了类包,主要有:
(1)java.lang
本类包中的类构成Java语言核心的类,任何java程序都将自动引入这个包。其中的类包括:
Object类:java中最原始、最重要的类,每个java类都是它的子类,它实现了每个类都必须具有的基本方法。
基本数据类型的包装类:Boolean、Character、Number、Double、Float、Integer、Long。
String类:字符串类。
Math类:数学函数的集合。
执行线程:Thread类、ThreadGroup类、Runable接口。
异常和错误:Exception类、Error类、Throwable接口。
运行环境相关类:还可以通过Runtime类和System类访问外部系统环境。System类的两个常用功能就是访问标准输入/输出流和错误流、退出程序。
其他类:接口Cloneable、运行时的类等。
(2)java.applet
java.applet类包提供了Applet的运行机制以及一些编写Applet非常有用的方法。
(3)java.awt
此本类包是各种窗口环境的统一界面AWT(Abstract Windows Toolkit,即抽象窗口工具包),其中的类使得程序员创建诸如窗口、菜单、滚动条、文本区、按钮以及复选框等图形用户界面(GUI)的元素变得非常容易。
(4)java.awt.image
该类包中的类能够以独立于设备的方式加载并过滤位图图象。
(5)java.awt.peer
java.awt.peer是全部awt组件的对等对象接口的集合法,awt使用这些方法来实现GUI,而不必关心是何种机器或操作系统。
(6)java.io
Java的输入/输出模式是完全建立在流的基础之上的。流是一种字节从一个地方到另一个地方的单向流动,可以把流附加于文件、管道和通信链路等。java.io类包中定义的许多种流类通过继承的方式进行组织,其中也包括一些用来访问本地文件系统上的文件的流类。
(7)java.net
java.net类包用来完成与网络相关的功能:URL、WWW连接以及更为通用的Socket网络通信。
(8)java.util
java.util类包包含了一些实用类和有用的数据结构,如字典(Dictionary)、散列表(Hashtable)、堆栈(Stack)、向量(Vectro)以及枚举类(Enumeration)等。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
包装类
所谓包装类,就是可以直接将简单类型的变量表示为一个类。Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就可以看出它们分别对应于简单数据类型中的 boolean、char、int、long、float和double。
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:
Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
在进行简单数据类型之间的转换(自动转换或强制转换)时,总是可以利用包装类进行中间过渡。一般情况下,首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换了。例如,当希望把float型转换为double型时:
float f1=100.00f;
Float F1=new Float(f1);
double d1=F1.doubleValue();
【例3-9】包装类示例
3-9.jsp
<%@ page contentType="text/html;charset=gb2312"%><!--JSP指令标签-->
<%@ page import="java.util.*"%> <!--JSP指令标签-->
<html><!--HTML标记符-->
<body>
<%//以下为Java程序片
boolean booleanTemp=true;
Boolean BooleanTemp=new Boolean(false);
byte byteTemp=80;
Byte ByteTemp=new Byte(byteTemp);
char charTemp=‘c‘;
Character CharacterTemp=new Character(charTemp);
int intTemp=234;
Integer IntegerTemp=new Integer(intTemp);
short shortTemp=235;
Short ShortTemp=new Short(shortTemp);
long longTemp=1234567;
Long LongTemp=new Long(longTemp);
float floatTemp=1.234F;
Float FloatTemp=new Float(floatTemp);
double doubleTemp=1.23E-8;
Double DoubleTemp=new Double(doubleTemp);
out.println("布尔型包装对象BooleanTemp值为:"+BooleanTemp.booleanValue()+"<br>");
out.println("字符型包装对象CharacterTemp值为:"+CharacterTemp.charValue()+"<br>");
out.println("整型变包装对象IntegerTemp值为:"+IntegerTemp.intValue()+"<br>");
out.println("短整型包装对象ShortTemp值为:"+ShortTemp.shortValue()+"<br>");
out.println("字节型包装对象ByteTemp值为:"+ByteTemp.byteValue()+"<br>");
out.println("长整型包装对象LongTemp值为:"+LongTemp.longValue()+"<br>");
out.println("单精度型包装对象FloatTemp值为:"+FloatTemp.floatValue()+"<br>");
out.println("双精度型包装对象doubleTemp值为:"+doubleTemp+"<br>");
%>
</body><!--HTML标记符-->
</html>
上述代码主要应用了包装类进行数据转换,其运行的结果如图3-15所示。
图3-15 包装类应用示例
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
字符串处理
字符串是字符的序列,它是组织字符的基本数据结构。在Java中,字符串被当作对象来处理。程序中需要用到的字符串可以分为两大类,一类是创建之后不会再做修改和变动的字符串常量String类;另一类是创建之后允许再做更改和变化的字符串变量StringBuffer类。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
String类字符串
String类用来表示字符串常量,用它创建的每个对象都是字符常量,一经建立就不能修改。创建String的一个对象并进行初始化,需要调用类String的构造方法,主要有以下创造方法:
String(String s):通过String对象或字符串常量传递给构造方法。
String(char value[]):将整个字符数组赋给String构造方法。
String(char value[],int offset,int count):将字符数组一部分赋给String构造方法,offset 为起始下标,count为字符数组从offset开始的字符个数。
String类的方法比较多,主要有以下几种:
(1)求字符串长度
public int length( ):返回字符串长度。
(2)字符串比较
public boolean equals(Object anObject):比较两个字符串对象,相等返回true,反之,返回false。
public int compareTo(String s):比较两个字符串的字典顺序,相等返回0,s大于当前串返回一个负值,s小于当前串返回一个正值。
public boolean startsWith(String prefix):从当前字符串的起始位置开始寻找字符串prefix。看当前字符串是否以prefix开头,如发现匹配,返回true,否则,返回false。
public boolean endsWith(String suffix):如当前字符串的结尾子串与suffix匹配,返回true,否则,返回false。
boolean regionMatches(int toffset,String other,int ooffset,int len):从当前字符串位置toffset开始寻找字符串other中起始位置为ooffset、长度为len的子串。如发现匹配,返回true,否则,返回false。
(3)字符串的检索和求子串
public char charAt(int index):返回当前字符串位置index处的字符。
public int indexOf(String str):在当前字符串中寻找与str匹配的子串,返回首次匹配的起始下标值,无匹配返回-1。
public String substring(int beginIndex,int endIndex):在当前字符串中,求从起始位置beginIndex到结束位置endIndex的子串。
【例3-10】String类字符串的检索和求子串应用示例
3-10.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title>String类字符串的检索和子串应用示例</title>
</head>
<body>
<%
String str="I like JSP programming!";
int il=str.indexOf(‘J‘);
String s1=str.substring(il);
String s2=str.substring(il,il+4);
int i2=str.lastIndexOf(‘J‘);
String s3=str.substring(i2-5);
out.println("s1="+s1);
out.print("<br/>");
out.println("s2="+s2);
out.print("<br/>");
out.println("s3="+s3);
%>
</body>
</html>
上述程序代码应用了String类的检索方法和求子串的方法,修改后的字符串存储在新的String类字符串对象中。该程序运行结果如图3-17所示。
图3-17 String类字符串的检索和求子串应用示例运行结果
(4)字符串的修改
public String toLowerCase():将当前字符串中的字符全部转换为小写形式。
public String toUpperCase():将当前字符串中的字符全部转换为大写形式。
public String replace(char oldChar,char newChar):将字符newChar替换当前字符串中所有的字符oldChar,并返回替换后的新字符串。
public String concat(String str):将当前字符串与str连接,返回连接后的字符串。
(5)字符串类与其他类型的转换
public Static String valueOf(type variable) 把variable转换为字符串。
public String toString():把一个对象转化为String类型。
【例3-11】String类字符串的综合应用示例
3-11.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title>
String类字符串的综合应用示例
</title>
</head>
<body>
<%
String s1="Hello Java!";
String s2="GOOD!";
out.println("字符串s1为:"+s1);
out.print("<br/>");
out.println("字符串s1的长度为:"+s1.length());
out.print("<br/>");
out.println("字符串s1的大写形式为:"+s1.toUpperCase());
out.print("<br/>");
out.println("字符串s2的小写形式为:"+s2.toLowerCase());
out.print("<br/>");
for(int i=0; i<s1.length(); i++){
out.println("s1中的第"+ i +"个字符是:"+s1.charAt(i));
out.print("<br/>");
}
out.println("s1+s2="+s1+s2);
out.print("<br/>");
if(s1.compareTo(s2)= =0)
out.println("字符串s1与s2相等");
else
out.println("字符串s1与s2不相等");
out.print("<br/>");
if(s1.indexOf(s2)!=-1){
out.println("字符串s2是s1的子串");
out.print("<br/>");
out.println("字符串s2在s1中的位置是:"+s1.indexOf(s2));
}
else
out.println("字符串s2不是s1的子串");
out.print("<br/>");
out.println("经过上述操作:");
out.print("<br/>");
out.println("字符串s1仍然为:"+s1);
out.print("<br/>");
out.println("字符串s2仍然为:"+s2);
%>
</body>
</html>
上述程序代码使用String类的修改方法对原有的字符串进行修改,修改后的字符串存储在新的String类字符串对象中,原有的字符串对象不变。其程序运行结果图3-18所示。
图3-18 String类字符串的综合应用示例
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
StringBuffer类字符串
String类的实例用于表示不能改变的静态字符串,StringBuffer类的实例却用来代表动态可变的字符串。StringBuffer类还可以用于创建String类,StringBuffer一旦建立,即可用toString()方法将其转换为String类。
StringBuffer类的构造函数有以下的形式:
(1)StringBuffer():创建默认的空字符串对象,缓冲区大小为16个字符。
(2)StringBuffer(int len):建立缓冲区大小为len的字符串对象。
(3)StringBuffer(String str):创建一个初始化为str的字符串对象。
StringBuffer类的主要方法有如下的几类:
(1)分配/获取字符串的长度
void setLength(int newLength):指定字符串的长度。
int length():返回缓冲区的字符个数,即字符串的长度。
(2)分配/获取字符串的容量
void ensureCapacity(int minCapacity):分配字符缓冲区的大小,分配的字符缓冲区的容量至少为指定的值minCapacity。如果当前的缓冲区容量小于minCapacity,则应该分配较大的缓冲区。
int capacity():返回缓冲区剩余空间。
【专家提示】长度length和容量capacity是两个不同的概念,长度是指StringBuffer类对象中包含字符的个数,而容量是只缓冲区的大小。
(3)字符串的检索和子串
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):将StringBuffer对象字符串中的字符复制到目标数组中去。
public String substring(int beginIndex,int endIndex):当前StringBuffer类字符串中,求从起始位置beginIndex到结束位置endIndex的子串。
(4)字符串的修改
public synchronized StringBuffer append(type variable):把variable转换为字符串,然后与当前字符串连接。
StringBuffer insert(int index,String str):将一个字符串str从当前字符串的index位置开始插入到当前StringBuffer类字符串对象中。
StringBuffer delete(int starts,int end):当前StringBuffer类字符串从starts开始到end-1位置删除子字符串,并返回当前StringBuffer类字符串。
StringBuffer deleteCharAt(int index):删除当前StringBuffer类字符串index处的字符。
StringBuffer reverse():对StringBuffer类字符串进行翻转。
StringBuffer replace(int starts,int end,String str):将字符串str替代当前缓冲字符串的starts开始到end-1位置的子字符串。
void setCharAt(int index,char ch)设置指定位置index处的字符为ch。
(5)字符串类型转换
toString():把StringBuffer转换为字符串String。
【例3-12】Stringbuffer类字符串的综合应用示例
3-12.jsp
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title>
Stringbuffer类字符串的综合应用示例
</title>
</head>
<body>
<%
StringBuffer s=new StringBuffer("Hello");
out.println("s:"+s);
out.print("<br/>");
out.println("字符串s的长度:" +s.length());
out.print("<br/>");
out.println("字符串s的容量:"+ s.capacity());
out.print("<br/>");
s.append("Stringbuffer");
out.println("向字符串s中加入了字符串Stringbuffer:"+s);
out.print("<br/>");
out.println("字符串s的位置4-5的子串:"+s.substring(3,5));
out.print("<br/>");
out.println("字符串s的第6个字符:"+s.charAt(5));
out.print("<br/>");
out.println("将字符串的位置6-15的子串替换为java:"+s.replace(5, 16, "java"));
%>
<html>
<body>
上述程序代码首先创建初始化了的StringBuffer对象s,然后显示这个字符串,求其容量和长度,然后在字符串s后追加一个字符串“lo”,并用一个新的字符串替代s的子字符串。其运行结果如图3-19所示。
图3-19 Stringbuffer类字符串的综合应用示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
日期型数据处理
在Java中日期型数据处理用Date类,即日期类。Date类构造函数的常用的有四种形式:
(1)Date()
(2)Date(int year, int month, int date):以int型表示年、月、日。
(3)Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、时、分。
(4)Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、时、分、秒。
在长整型和Date类之间有一个对应关系,就是将一个时间表示为距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。对于这种对应关系,Date类也有其相应的构造函数:Date(long date)。
获取Date类中的年、月、日、时、分、秒以及星期读者可以使用Date类的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法。
而Date类的getTime()方法可以得到前文中所说的一个时间对应的长整型数,与包装类一样。此外,Date类也有一个toString()方法可以将其转换为String类。
【例3-13】日期型数据处理示例
3-13.jsp
<%@ page import="java.util.*" %>
<%@ page contentType="text/html; charset=gb2312" %>
<HTML>
<head><title>日期型数据处理示例</title></head>
<BODY>
你好,今天是
<%
Date today=new Date();
%>
<%=today.getDate()%>号,
星期<%=today.getDay()%>
<h1>现在是北京时间: <%=today.toString() %>
</h1>
</BODY>
</HTML>
上述程序代码创建一个Date类的对象,用getDate()方法获取对象的时间,并getDay()求当天的日期。其程序运行结果如图3-20所示。
图3-20 日期型数据处理示例运行结果
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
接口
接口是面向对象的程序设计中的一个重要概念,利用接口可以使设计与实现相分离,使用接口的用户程序不受不同接口实现的影响,不受接口实现改变的影响。接口和类不同,一个接口可以是一个或多个其他接口的直接继承。同时,一个类也可以实现一个或多个接口,但在这个类中必须实现接口中的所有抽象方法。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
接口的声明
[修饰符] interface 接口名称{
[public] [static] [final] 变量名=初值; //静态常量
[public] [abstract] [native]返回值 方法名([参数表])throws [异常列表] //方法
}
由于接口中声明的方法是抽象、公有的,常量都是静态、公有的,所以修饰符可以省略。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
接口的实现
在类的声明中使用implements关键字来实现接口,一个类可以同时实现多个接口,各接口间用“,”隔开。
class classname implements interfacename{
//重写接口中的方法;
}
(1)若实现接口的类不是抽象类,则必须实现接口的所有方法,即为所有的抽象方法声明方法体。
(2)一个类在实现某接口的抽象方法时,必须使用完全相同的方法名和参数列表。
(3)接口的抽象方法的访问控制符已指定为public,所以类在实现时,必须显式的使用public修饰符,否则被警告缩小了接口中声明的方法的访问控制范围。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
JSP指令
“<%@”和“%>”之间为JSP指令,常用下列三种指令:
<%@ page import="java.util.*" language="java" session="true" %>
<%@include file="包含文件的URL"%>
<%@taglib uri="URIToTagLibrary" prefix="tagPrefix"%>
其中:JSP指令的关键词page、include、taglib赋予指令不同类型的语义。每个JSP指令的关键词后面是“KEY=VALUE”形式的值对,其中KEY是属性名,VALUE是字符串类型的属性值。这里我们介绍最为常用的page和nclude指令,taglib指令在后面的章节还会进行讲解。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
page指令
page指令用于定义JSP页面中的全局属性。<%@page%>指令作用于整个JSP页面,包括被静态包含的文件,但是<%@page%>指令不能作用于被动态包含的文件。page指令语法格式如下:
<%page [language="java"] [extends="package.class"]
[import="{package.class │package.*}, … …"] [session="true │false"]
[buffer="none│8kb│sizekb"] [isThreadSafe="true │false"]
[info="text"] [errorPage="relativeURL"]
[contentType="mimeType[;charset=characterSet]"│"text/html;charset=ISO-8859-1"]
[isErrouPage="true│false"]
%>
在一个页面中可以使用多个<%@page%>指令,除import属性以外的其它属性只能设置一次。页面中的import属性和Java中的import语句类似,可以多次设置。JSP页面指令是一种功能比较复杂的指令,这主要与它所要支持的繁多的属性有关。下面对page指令中可以包含的各个属性进行详细说明。
(1)language
language属性告诉服务器在文件中将采用哪种编程语言作为脚本语言,默认为Java。
(2)extends
extends 属性定义了由JSP 页面产生的servlet 的父类。一般来说,这个属性不会用到,只有需要实现一些特殊功能时才会用到。
(3)import
import属性用来声明输入引用的Java包(package)或(class) 。这是唯一可以在同一个JSP页面中重复出现的属性设置。
import属性的值是一系列用逗号分开的列表,指明想要引入的包和类。例如:
<%@ page import="java.util.*" %>
可以在程序中引入多个需要的包和类,包和类之间用逗号分隔。例如:
<%@ page import="java.util.*,java.io.*" %>
也可以将需要引入的多个包和类写在多个page指令中。例如,上面的语句等价于:
<%@ page import="java.util.*" %>
<%@ page import=" java.io.*" %>
当使用import引入了包和类后,就可以使用与这些包和类相关的方法和对象了。
【专家提示】java.lang.*、javax.servlet.*、javax.servlet.jsp.*和javax.servlet.http.*包已经作为缺省值被JSP引入,所以不需要在网页中再次引入。
(4)session
session 属性表示当前页面是否加入会话期间的管理,其缺省值为true, 表明内建对象session存在(如果没有session对象,则会新建一个),由session对象来管理会话。如果设session属性值为false,则内建对象session不存在,这样页面中任何使用到session 的语句都会产生编译错误。
(5)buffer
buffer决定输出流(out 对象)是否需要缓冲区,缺省值是8KB, 也可以设置为none(没有缓冲区)或所指定大小的缓冲区,例如:
<%@page buffer ="12kb" %>
上面的语句指定输出流缓冲区为12KB。
buffer 属性通常与autoFlush属性配合使用。
(6)autoFlush
autoFlush属性用于指定是否自动刷新输出缓冲,如果设成true,则当输出缓冲区满的时候,自动刷新缓冲区而不是抛出一个异常,缺省值为true。
【专家提示】同时设置autoFlush为false和buffer为none是不合法的,编译时将会出错。
(7)isThreadSafe
isThreadSafe属性指示JSP 引擎,网页在处理对象存取时是否要引入ThreadSafe( 线程保护)机制,缺省值为true,此时如果多个客户向JSP 引擎发送请求,就可以同时被处理。这时JSP 程序员要处理同步时的共享状态,以保证同步确实是安全的。如果isThreadSafe 被设成false,则采用单线程模式控制客户端访问该页面。
(8)info
info属性用于设置页面的说明信息文字,可以通过页面的Servlet.getServletInfo() 方法访问该信息。例如:
<%@page info="JSP 教程" %>
(9)ErrorPage
ErrorPage 属性用于指示一个JSP 文件的相对路径,以便在页面出错时,转到这个JSP 文件来进行处理。相应的,需要将这个JSP 文件的isErrorPage 属性设为true。
当ErrorPage 属性被设置后,JSP 网页中的异常仍然会产生,只不过此时捕捉到的异常将不由当前网页进行处理,而是由 ErrorPage 属性所指定的网页去进行处理。
(10)isErrorPage
isErrorPage 属性指示一个页面是否为错误处理页面。设置为true 时,在这个JSP 页面中的内建对象exception 将被定义,其值将被设定为呼叫此页面的JSP 页面的错误对象,以处理该页面所产生的错误。isErrorPage 属性缺省值为false,此时将不能使用内建对象exception来处理异常,否则将产生编译错误。
(11)contentType
contentType属性用于设置JSP 文件和最终文件的MIME 类型和字符集的类型。这一项必须在文件的顶部。可用的MIME类型有text/plain、text/html、text/html 和image/gif、image/jpeg等。contentType属性缺省值为“text/html;charset = ISO8859_1”,为了让JSP页面可以正常地显示中文需要设置为“text/html;charset = GBK”或“text/html;charset =gb2312”。
版权方授权希赛网发布,侵权必究
第 3 章:JSP语法作者:邓子云,赫斌等 来源:希赛网 2014年02月28日
include指令
include指令指定在JSP文件中包含的一个静态的文件,即在JSP文件被编译时需要插入的文本或代码。include指令语法格式如下:
<%@include file="relativeURL"% >
如果这个路径以“/”开头,那么这个路径主要参照JSP应用的上下文关系路径,如果路径是以文件名或目录名开头,那么这个路径就是正在使用JSP文件的当前路径。
<%@include %>指令将会在JSP编译时输入一个包含文本或代码的文件,当使用 <%@include %> 指令时,包含的过程是静态的。静态的包含就是指这个被包含的文件将会被导入到JSP文件中去,这个被包含的文件可以是JSP文件、HTML 文件、文本文件。如果被包含的是JSP文件,这个被包含JSP的文件的代码将会被执行。
【专家提示】包含文件可以是html文件、jsp文件、文本文件、或者只是一段Java代码,但是注意在这个包含文件中不能使用<html>、</html>、<body>、</body>标志,因为这将会影响在原 JSP文件中同样的标志,这样做有时会导致错误。
在JSP页面中,包含指令最常见的用途就要数网页导航条了,由于一个网站的主导航条栏往往是统一的,所以主导航栏一般被写成一张单独的网页,然后通过框架结构与其他网页拼接。由于框架可能带来的诸多的不便。如用户难以对框架内网页做书签等,包含指令就成了实现导航栏的最佳机制。
【例3-14】include指令应用示例
3-14.jsp
<%@page contentType="text/html;charset=GB2312"%>
<html>
<head>
<title>JSP指令示例</title>
</head>
<body>
<h1>**金字塔**</h1>
<%@ include file="Ta.jsp" %>
</body>
</html>
Ta.jsp源程序如下,功能是输出一个数字构成的金字塔。
<% out.print("<pre>");
int i=7,j,k;
for(j=1;j<i;j++){
for(k=0;k<2*(i-j-1);k++)
out.print(" ");
for(k=0;k<j;k++)
out.print(j+" ");
%>
<P></P>
<%
}
out.print("</pre>");
%>
这里将两个程序放在同一目录下面,3-14.jsp包含Ta.jsp,实现了静态文件的插入。include指令应用示例运行结果如图3-21所示。
图3-21 include指令应用示例
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日
隐含对象概述
第4章 隐含对象解析
【本章专家知识导学】
JSP提供了一些隐含对象,以方便在JSP页面中快速方便地编写程序,这些对象不必再用类来声明建立类的实例,可以直接使用。本章旨在引导读者学习运用request、response、session、application、pageContext、out、page和pageContext等这些隐含的对象来进行JSP编程。
4.1 隐含对象概述
JSP隐含对象是Web容器加载的一组类的实例,它不同于一般的Java类的实例那样要用“new”关键字去获取实例,而是可以直接在JSP页面使用的对象。
JSP提供的9个隐含对象分为4个主要类别,如图7-1所示:
?与“I/O”(input/output,输入/输出)有关的隐含对象:用于控制页面的输入和输出,包含request、response、out。
?JSP执行时,提供有关上下文(Context)有关的隐含对象:用于控制JSP页面之间的信息传递,包含session、application、pageContext。
?与Servlet有关的隐含对象:提供有关页面环境的信息,包含page、config。
?与Error有关的隐含对象:处理页面中的错误的exception。
图 7-1 JSP隐含对象
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日
与I/O有关的隐含对象
本节中将介绍和I/O有关的隐含对象——request、response和out对象。request对象表示客户端请求的内容;response对象表示响应客户端的结果;而out对象负责把数据的结果显示到客户端的浏览器。
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日
request对象:取得请求参数值
request对象包含所有请求信息,如请求的来源、请求头信息、cookies和请求相关的参数值等等。在JSP网页中,request对象是实现了javax.servlet.http.HttpServletRequest接口的实例。
request对象主要用于取得客户在表单中提交的数据信息。request对象常用的取得客户表单中提交的数据信息的方法有:
String getParameter(String name):根据页面表单域的名称取得请求页面提交到服务端的数据。例如,在requestDemo.jsp页面中有一个输入用户名称的文本框,它的名称是“name”,页面提交请求到页面requestDemo1.jsp,那么在requestDemo1.jsp中可以利用语句request.getParameter("name")来获取用户输入的用户名。
String[] getParameterValues(String name):获取页面请求中一个表单域对应多个值的用户请求数据。例如,在requestDemo.jsp页面中有一个兴趣爱好选择的复选框,用户可以选择多项内容,复选框的名称都是“interest”,它提交请求到页面requestDemo1.jsp,那么在requestDemo1.jsp中可以利用语句request.getParameterValues("interest")来获取用户选择的多个兴趣爱好。
public void setCharacterEncoding(java.lang.String env):设置请求对象的字符集编码,此方法必须在取得request对象参数的值前调用。
【例4-1】取得请求中的参数值
requestDemo.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
请求参数输入页面
</title>
</head>
<body bgcolor="#ffffff">
<h1>
请求参数输入页面
</h1>
<form action="requestDemo1.jsp" method="POST">
<table border="1">
<tr>
<td>用户名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女
</td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<input type="checkbox" name="interest" value="上网"/>上网
<input type="checkbox" name="interest" value="旅游"/>旅游
<input type="checkbox" name="interest" value="阅读"/>阅读
</td>
</tr>
</table>
<input type="submit" name="submit" value="提交"/>
</form>
</body>
</html>
requestDemo1.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>
接收请求参数
</title>
</head>
<body bgcolor="#ffffff">
<h1>
接收客户端请求数据
</h1>
<%
request.setCharacterEncoding("GBK");
String name=request.getParameter("name");
String sex=request.getParameter("sex");
String[] interest=request.getParameterValues("interest");
%>
<table border="1">
<tr>
<td>用户名:</td>
<td><%=name%></td>
</tr>
<tr>
<td>性别:</td>
<td><%=sex%></td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<%
for (int i = 0; i < interest.length; i++) {
out.print(interest[i]);
out.print(",");
}
%>
</td>
</tr>
</table>
</body>
</html>
requestDemo.jsp运行结果如下图所示。
图4-1 requestDemo.jsp显示结果
输入用户名、性别和兴趣爱好等信息后,点击“提交”按钮后将数据信息提交到requestDemo1.jsp页面,运行结果如下图所示。
图4-2 requestDemo1.jsp显示结果
【专家提示】requestDemo1.jsp在接收处理中文信息时,采用了方法request.setCharacterEncoding("GBK")进行编码转换,但这种方式只是当requestDemo.jsp表单提交方式为method="post"方式才有效。如果表单的提交方式为method="get"方式requestDemo1.jsp代码应该改写为如下所示。
requestDemo1.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>
接收请求参数
</title>
</head>
<body bgcolor="#ffffff">
<h1>
接收客户端请求数据
</h1>
<%
//request.setCharacterEncoding("GBK");
String name=request.getParameter("name");
String sex=request.getParameter("sex");
String[] interest=request.getParameterValues("interest");
//对GET请求的额外处理
name=new String(name.getBytes("ISO-8859-1"),"GBK");
sex=new String(sex.getBytes("ISO-8859-1"),"GBK");
for (int i = 0; i < interest.length; i++) {
interest[i]=new String(interest[i].getBytes("ISO-8859-1"),"GBK");
}
%>
<table border="1">
<tr>
<td>用户名:</td>
<td><%=name%></td>
</tr>
<tr>
<td>性别:</td>
<td><%=sex%></td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<%
for (int i = 0; i < interest.length; i++) {
out.print(interest[i]);
out.print(",");
}
%>
</td>
</tr>
</table>
</body>
</html>
参见代码中的如下语句:
String name=request.getParameter("name");
name=new String(name.getBytes("ISO-8859-1"),"GBK");
这两句就将字符的编码方式作了转换,这样中文字符就可以正确地显示了。
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日
request对象:请求转送
有时需要访问一组网络资源(如其他Servlet和JSP页面)以满足客户端请求,JSP可以通过请求URL对Web服务器上的活动资源作出请求。Servlet API规范支持在服务器中运行的Servlet直接访问服务器的资源。JSP和Servlet可以将请求转发到其他资源,或包括资源在其响应中创建的响应。属于同一个Web应用程序的JSP或Servlet可以使用javax.servlet.RequestDispatcher接口的forward和include方法来共享数据
有时需要访问一组网络资源(如其他Servlet和JSP页面)以满足客户端请求,JSP可以通过请求URL对Web服务器上的活动资源作出请求。Servlet API规范支持在服务器中运行的Servlet直接访问服务器的资源。JSP和Servlet可以将请求转发到其他资源,或包括资源在其响应中创建的响应。属于同一个Web应用程序的JSP或Servlet可以使用javax.servlet.RequestDispatcher接口的forward和include方法来共享数据。
?RequestDispatcher getRequestDispatcher(String path):取得一个相对于当前路径的请求转发器,以便于请求转发。
?void forward(SerletRequest request,ServletResponse response):用于将请求从一个JSP或Servlet转发到同一服务器上的另一个JSP或Servlet。
?void include(SerletRequest request,ServletResponse response):用于包括另一个Servlet的内容。
【例4-2】利用forward()方法作转移控制
接下来介绍使用forward()在JSP或Servlet间转移控制的方法。将例4-1的requestDemo.jsp更改代码为requestDemo2.jsp。将requestDemo1.jsp修改代码保存为requestDemo3.jsp,新生成一个dispatcherDemo.jsp。代码分别如下:
requestDemo2.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
请求参数输入页面
</title>
</head>
<body bgcolor="#ffffff">
<h1>
请求参数输入页面
</h1>
<form action="requestDemo3.jsp" method="POST">
<table border="1">
<tr>
<td>用户名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="sex" value="男"/>男
<input type="radio" name="sex" value="女"/>女
</td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<input type="checkbox" name="interest" value="上网"/>上网
<input type="checkbox" name="interest" value="旅游"/>旅游
<input type="checkbox" name="interest" value="阅读"/>阅读
</td>
</tr>
</table>
<input type="submit" name="submit" value="提交"/>
</form>
</body>
</html>
requestDemo3.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.servlet.*" %>
<html>
<head>
<title>
接收请求参数
</title>
</head>
<body bgcolor="#ffffff">
<h1>
接收客户端请求数据
</h1>
<%
request.setCharacterEncoding("GBK");
String name=request.getParameter("name");
String sex=request.getParameter("sex");
String[] interest=request.getParameterValues("interest");
%>
<table border="1">
<tr>
<td>用户名:</td>
<td><%=name%></td>
</tr>
<tr>
<td>性别:</td>
<td><%=sex%></td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<%
for (int i = 0; i < interest.length; i++) {
out.print(interest[i]);
out.print(",");
}
%>
</td>
</tr>
</table>
<%
//转发之前不能使用out.flush()或out.close()向客户端提交响应
//forward转发
RequestDispatcher rd=request.getRequestDispatcher("dispatcherDemo.jsp");
rd.forward(request,response);
%>
</body>
</html>
requestDemo3.jsp页面在接收requestDemo2.jsp页面的请求参数后进行forward转发至dispatcherDemo.jsp页面。
dispatcherDemo.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
dispatcher转发结果显示页面
</title>
</head>
<body bgcolor="#ffffff">
<h1>
dispatcher转发结果显示页面
</h1>
name参数的值是:<%=request.getParameter("name")%>
</body>
</html>
dispatcherDemo.jsp继续从request对象中取得客户端请求参数“name”。requestDemo2.jsp运行显示结果如图4-3所示。
图4-3 requestDemo2运行显示结果
填写数据点击“提交”按钮后,requestDemo3.jsp运行显示结果如图4-4所示。
图4-4 requestDemo3.jsp运行显示结果
requestDemo3.jsp并没有显示我们代码编写显示请求数据的表格,仅仅只显示dispactherDemo.jsp页面的内容。读者可以注意到IE地址栏URL并没有发生改变用户虽然请求的网络资源是requestDemo3.jsp,但实际上给客户端的响应是由dispatcherDemo.jsp呈现的,说明页面响应控制权已经完全移交给dispactherDemo.jsp。
【专家提示】调用forward()方法时必须注意下列两点:
1.调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除,在此之前requestDemo3.jsp再多的输出也不会在页面显示输出。
2.在HTTP回应被“确认”(committed)以前才能调用forward()方法(这里的“确认”是指将HTTP回应的内容主体送回用户端),如果在代码注释处所说明的使用out.flush()或out.close()方法,否则将拋出IllegalStateException异常。
【例4-3】用include()在一个JSP包含另一个JSP或Servlet的响应输出
将例4-2中的requestDemo3.jsp改写成如下的代码。
requestDemo3.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.servlet.*"%>
<html>
<head>
<title>接收请求参数</title>
</head>
<body bgcolor="#ffffff">
<h1>接收客户端请求数据</h1>
<%
request.setCharacterEncoding("GBK");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String[] interest = request.getParameterValues("interest");
%>
<table border="1">
<tr>
<td>用户名:</td>
<td><%=name%></td>
</tr>
<tr>
<td>性别:</td>
<td><%=sex%></td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<%
for (int i = 0; i < interest.length; i++) {
out.print(interest[i]);
out.print(",");
}
%>
</td>
</tr>
</table>
<%
//forward转发
//RequestDispatcher rd=request.getRequestDispatcher("dispatcherDemo.jsp");
//rd.forward(request,response);
//include转发
out.flush();
RequestDispatcher rd = request
.getRequestDispatcher("dispatcherDemo.jsp");
rd.include(request, response);
%>
<h2>转发后的页面输出:我还是有主权的</h2>
</body>
</html>
图4-5 requestDemo2运行显示结果
填写数据点击“提交”按钮后,requestDemo3.jsp运行显示结果如图所示。
图4-6 requestDemo3运行显示结果
RequestDispatcher接口的include()方法与forward()方法非常类似,惟一的不同在于:利用include()方法将HTTP请求转送给其他JSP页面后,被调用的JSP页面虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的JSP页面,如requestDemo3.jsp输出处理requestDemo2.jsp请求数据信息结果后,显示dispatcherDemo.jsp页面要求输出的内容,最后仍然由requestDemo3.jsp掌握主动输出权。换言之,被调用的JSP页面如果产生任何HTTP回应,将会并入原来的HttpResponse对象。
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日
request对象:请求头信息
request对象还有其他一些的常用方法来取得客户端请求头中的一些详细信息,如:
String getRemoteAddr() 取得客户端访问IP。
String getRequestURL() 取得客户端请求的URL串。
Enumeration getHeaderNames() 取得所有的请求头名。
String getHeader(String head) 取得指定的请求头信息的值。
其它更多方法使用详情请查看API帮助。
【例4-4】得到请求头信息
接下一起来编写一个例子演示request对象取得请求头信息的几个方法的使用,为了简单起见我们直接修改requestDemo3.jsp的代码。
requestDemo3.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.servlet.*"%>
<html>
<head>
<title>接收请求参数</title>
</head>
<body bgcolor="#ffffff">
<h1>接收客户端请求数据</h1>
<%
request.setCharacterEncoding("GBK");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String[] interest = request.getParameterValues("interest");
%>
<table border="1">
<tr>
<td>用户名:</td>
<td><%=name%></td>
</tr>
<tr>
<td>性别:</td>
<td><%=sex%></td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<%
for (int i = 0; i < interest.length; i++) {
out.print(interest[i]);
out.print(",");
}
%>
</td>
</tr>
</table>
<%
//forward转发
//RequestDispatcher rd=request.getRequestDispatcher("dispatcherDemo.jsp");
//rd.forward(request,response);
//include转发
out.flush();
RequestDispatcher rd = request
.getRequestDispatcher("dispatcherDemo.jsp");
rd.include(request, response);
%>
<h2>转发后的页面输出:我还是有主权的</h2>
<b>HTTP请求方式:</b><%=request.getMethod()%><br>
<b>客户端IP:</b><%=request.getRemoteAddr()%><br>
<b>请求的URL是:</b><%=request.getRequestURL()%><br>
<b>更多关于请求对象的信息:<br>
<%
Enumeration em=request.getHeaderNames();
while(em.hasMoreElements()){
String header=(String)em.nextElement();
out.print("<b>");
out.print(header);
out.print(":<b>");
out.print(request.getHeader(header)+"<br>");
}
%>
</body>
</html>
运行显示结果如图所示。
图4-7 requestDemo3.jsp运行显示结果
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日
response对象:设置响应类型
response对象主要将JSP处理数据后的结果传回到客户端。response对象是实现javax.servlet.http.HttpServletResponse接口。response的方法有很多,下面列出几个常用的方法。
?void setContentType (String name) 设置作为响应生成的内容的类型和字符编码。
?void sendRedirect (String name) 发送一个响应给浏览器,指示其应请求另一个URL。
?void setHeader(String name,String value) 设置HTTP响应的参数使客户自动产生相应的动作。
设定response对象的contentType属性可以指定JSP页面生成响应MIME的类型和JSP文件的字符编码方式,它们都是最先传送给客户端。图4-7中的accept描述指明当前客户端浏览器所能支持的MIME类型。
【专家提示】MIME的含义是“多用途的网际邮件扩充协议”。它不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为一般程序员,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。例如:text/plain表示输出内容是未格式化的文本文档(txt)格式的, 当MIME的包头是text/plain时,浏览器将直接显示而不关心它的什么字体,颜色之类的参数;image/gif或image/jpeg内容将以图片的形式显示。
【例4-5】将JSP页面显示成Excel表单
一起来看看如何通过设置response对象的contentType属性将一个JSP页面显示成为一个EXCEL表单的形式。
responseExcel.jsp
<html>
<head>
<title>显示成为EXCEL报表</title>
</head>
<body>
<h1>
将HTML表格数据,显示成为EXCEL表格
</h1>
<%
response.setContentType("application/vnd.ms-excel");
%>
<table border="1">
<tr>
<td>用户名</td>
<td>李四</td>
</tr>
<tr>
<td>性别</td>
<td>女</td>
</tr>
<tr>
<td>兴趣</td>
<td>
上网,阅读,旅游
</td>
</tr>
</table>
</body>
</html>
responseExcel.jsp运行结果如图4-8所示。
图4-8 IE浏览器的提示框
点击“打开”按钮,运行结果如图4-9所示。
图4-9 页面显示结果
【例4-6】生成图形验证码
本例通过设置response对象的contentType属性为“image/jpeg”以图片的形式显示一个随机验证码。login.jsp和verifycode.jsp代码分别如下。
login.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html><head>
<title>用户登录页面</title>
</head>
<body bgcolor="#ffffff">
<h1>
请输入用户登录信息
</h1>
<form name="userinfo" action="checklogin.jsp"
method="POST" onsubmit="return(checkinfo())">
<table border="1">
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
<td><a href="register.jsp">用户注册</a></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"/></td>
<td><a href="forgetpassword.jsp">忘记密码了</a></td>
</tr>
<tr>
<td>验证码:</td>
<td><input type="text" name="verifycode"/></td>
<td><img src="verifycode.jsp" /></td>
</tr>
<tr>
<td><input type="submit" value="登录"/></td>
<td><input type="reset" value="重置"/></td>
<td></td>
</tr>
</table>
</form>
<script >
function checkinfo(){
var oObject = document.all.item("userinfo");
for (i = 0; i < oObject.length; i++){
if (oObject(i).value.length==0) {
alert("必填项的值不能为空");
oObject(i).focus();
return false;
}
}
return true;
}
</script>
</body>
</html>
verifycode.jsp
<%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%@ page import="java.io.OutputStream" %>
<%
response.setContentType("image/jpeg");
response.addHeader("Content-Disposition","attachment;filename=verifycode.jpg" );
//定义一个整型变量用于存放生成的随机数
int icode=0;
//在内存中生成一个图片以及宽、高、类型
BufferedImage image=new BufferedImage(50,16,BufferedImage.TYPE_INT_RGB);
//生成一个2D的图形
Graphics g =image.getGraphics();
//设置图形为白色
g.setColor(Color.white);
//填充图象
g.fillRect(0,0,50,16);
//新建一个随机对象
Random random=new Random();
//取出4位整数
while(icode<=1000){
icode=random.nextInt(10000);
};
//把随机整数转换成字符串
String scode=icode+"";
//将生成随机校验码存入session中
session.setAttribute("verifycode",scode);
//设置图形的颜色为黑色
g.setColor(Color.BLACK);
//把生成的随机数做为字符串写到图形中
g.drawString(scode,12,12);
//从response.getOutputStream()得到一个输出流对象
ServletOutputStream os=response.getOutputStream();
//输出到页面(不知道我的理解是否正确)
ImageIO.write(image,"JPEG",os);
//关闭输出流对象
os.flush();
os.close();%>
login.jsp和verifycode.jsp的运行结果如图所示。
图4-10 login.jsp运行显示结果
版权方授权希赛网发布,侵权必究
第 4 章:隐含对象解析作者:邓子云,赫斌等 来源:希赛网 2014年03月03日