第六章.服务器端开发技术----JSP及JavaBean对外经济贸易大学信息学院第六章.服务器端开发技术----JSP及JavaBean第一节.JSP第二节.JavaBean第三节.JSP、JavaBean及Servlet组合开发第四节.开发框架、模式介绍第一节JSP1.JSP概述JSP是SUN公司推出的一种新型的Web开发语言,和其他开发语言相比,JSP有以下显著的优点:运行效率较高且功能强JSP页面在第一次被访问时,JSP容器会将其转换成一个等价的Servlet类,并且放置在工作目录中,以后所有对该JSP页面的访问都会由该Servlet类来处理,不再需要对JSP的解析。因此,在某种意义上可以说,在“运行时”JSP在效率上和功能上都等同于一个Servlet,这也使得JSP具有Servlet所提供的效率和功能等所有好处。动态内容和静态内容的分离典型的JSP文件的内容看上去就像一个HTML页面,事实上甚至可以把一个HTML格式的文件简单的改名为后缀为JSP的文件(JSP文件的扩展名为JSP),就可以直接在JSP容器中运行了。所不同的是,JSP页面通常还会包括其他的一些由JSP规范定义的称为元素的部分,用于表达逻辑和显示动态内容。这些元素和纯HTML代码自由的融合在一起,但是又能在外观上截然分开。这种做法使得JSP页面的结构相对较为清晰,能同时为开发人员和网页设计人员理解。组件重用软件设计时的重用性是非常重要的,JSP特别考虑到已有组件的重用,在JSP中的组件重用主要是通过JavaBean组件、EnterpriseJavaBean组件和定制化标签来实现的。这些组件可以由第三方开发,并且可以和开发工具结合起来实现快速开发。2.JSP元素开发基础(1)JSP元素的基本概念元素就是由JSP规范定义的,JSP容器能够理解并处理的部分,除了元素之外所有其他的内容,即JSP容器不能理解的则统称为模板。元素有不同的类型,类型的定义描述了元素语法和语义。例如,如果元素拥有属性,类型定义就需要描述属性的名字、属性值的类型和属性的意义等等。(2)JSP元素的类型JSP规范定义了三大类元素:脚本元素、指令和动作。使用脚本元素完成网页的各种功能,脚本元素最终会转换为Servlet的代码,指令可以控制Servlet的整体结构,而动作支持重用已有组件。为了简化书写和快速开发,JSP也定义了一些预定义的变量以方便使用,如request变量使得开发者可以得到客户端(一般是浏览器)请求传递过来的参数等。JSP脚本JSP脚本提供了JSP动作和模板内容之间的粘合剂。JSP脚本实际上几乎可以使用Java语言提供的全部功能和开发包。因此能够给开发者提供非常灵活的功能来控制页面的显示和逻辑。JSP脚本也分为三类:声明,代码片断和表达式。声明的语法是%!..%,代码片断的语法是%..%,表达式的语法式%=..%。后面可以看到,这些不同类型的JSP脚本在JSP页面中起不同的作用。JSP指令JSP指令为JSP容器解释并执行JSP页面提供需要的信息。指令的作用是和每个单独的HTTP请求无关的。比如我们可以使用指令来引入一些JAVA包,进而使用其中定义的类等。每个HTTP请求都可能会用到这些类。指令的语法是%@directive{attr=value}%。JSP动作JSP动作支持在JSP脚本中动态地插入一个文件、重用JavaBeans组件、前进到另一个页面,或为Java插件生成一个HTML。JSP动作通常遵循XML中元素的语法,一般来说都有一个包含有元素名称的起始标志,可能还包含有属性设置、一些可选项和一个结束标志。有的元素也仅仅有一个包含属性设置的标志,例如:mytagattr1=”attributevalue”...body/mytagmytagattr1=”attributevalue”.../mytagattr1=”attributevalue”.../mytagJSP注释如果想在一个JSP文件中加入注释说明一些逻辑等信息,可以使用如下格式:%--注释--%JSP的注释部分和HTML的注释相似,当在执行的时候JSP引擎将去掉对注释的解释。这就意味着JSP注释并不返回到用户的浏览器中。不象HTML注释被定义在!-和--标签之间,JSP注释被定义在%--和--%之间。(3)实例分析下面给出一个JSP(Welcome.jsp)网页的简单例子,该例使用了前面介绍的一些元素。在这个JSP网页中包含了静态HTML内容和从JavaBean生成的动态数据。当用户访问这个网页的时候,它可以显示当前的日期,并根据当前的时间增加相应的问候语(例如“早上好”和“下午好”)。这里只关注和示意了JSP的结构和包含的各种元素,具体含义和语法暂时不用关注。该例子不能正常运转,因为里面用到了一个JavaBean,但是没有提供JavaBean的类。HTML%@pagelanguage=javacontentType=text/html;charset=GBKimport=java.util.*%H1Welcome/H1PTodayis/Pjsp:useBeanid=clockclass=jspCalendar/ULLIDay:%=clock.getDayOfMonth()%LIYear:%=clock.getYear()%/UL%--检测时是上午还是下午--%%!inttime=Calendar.getInstance().get(Calendar.AM_PM);%%if(time==Calendar.AM){%早上好%}else{%下午好%}%%@includefile=copyright.html%/HTML在上面的例子中,HTML中嵌入了JSP脚本。其中jsp:useBean动作初始化了一个JavaBean,JavaBean将在网页的后面部分被用到:jsp:useBeanid==clockclass==jspCalendar/当网页被编译成一个servlet的时候,指令将被JSP引擎处理。在上面的例子中,有如下两个指令:分别为;%@pagelanguage=“java”contentType=“text/html;charset=GBK”import=“java.util.*”%定义了页面所使用的语言(Java)和所引入的Java包%@includefile==copyright.html%指定一个将要插入页面底部的HTML文件内容“int”声明并给出了一个当前时间的相应值(AM或PM):%!inttime=Calendar.getInstance().get(Calendar.AM_PM);%另外,在上面的例子中,表达式将调用JavaBean组件并在页面中插入结果数据:%=clock.getDayOfMonth()%%=clock.getYear()%Scriptlet将作为一个Java代码块植入JSP页面中。Scriptlet代码被一一插入由页面所产生的servlet中,它被定义在%和%之间。上面例子中的scriptlet可以根据当前用户产生相应的时间和问候语:%if(time==Calendar.AM){%早上好%}else{%下午好%}%最后:%--检测时上午还是下午--%是注释。后面的章节将详细介绍JSP指令、JSP动作、JSP脚本和一些预定义变量的语法和用法。3.JSP脚本在JSP中,主要的程序部分就是脚本元素,其中包括三个部分:声明(Declaration)、表达式(Expression)和代码(Scriptlet)。从功能上讲,声明用于声明一个或多个变量,表达式将是一个完整的语言表达式,而代码部分将是一些程序片断。三个脚本元素的基本语法都是以一个“%”开头,而以一个“%”结尾的。下面分别给出三种脚本的简单示例。声明JSP中的声明用于声明一个或多个变量和方法,并不输出任何的文本到out输出流去。在声明元素中声明的变量和方法将在JSP页面初始化时加以初始化。声明的语法为:%!declaration(s)%举例如下:%!inti=0;%%!inta,b,c;%%!publicStringf(inti){if(i3)return(...);...}%%!Circlea=newCircle(2.0);%实际上,声明变量和方法的语句完全可以放在后面的脚本代码中,两者有什么不一样呢?放在%!......%中的声明语句在JSP编译为Servlet的时候将作为类的属性而存在,而放在脚本代码中的声明将在类的方法内部被声明。表达式表达式元素表示的是一个在脚本语言中被定义的表达式,JSP中的表达式可以被看作一种简单的输出形式,在运行后被自动转化为字符串,然后插入到这个表达式在JSP文件的位置处而被显示。表达式语法为:%=expression%举例如下:%=(newJava.util.Date()).toLocaleString()%脚本代码JSP脚本代码包含一个有效的程序段,脚本代码也被称做scriptlet。它能够包含多个JSP语句、方法、变量和表达式。可以使用脚本完成下列工作:声明将要用到的变量或方法编写JSP表达式使用任何隐含的对象和任何用jsp:useBean声明过的对象编写JSP语句,一般语句要遵从Java语法规定任何文本、HTML标记、JSP元素都必须在脚本之外。当JSP收到客户的请求时,脚本就会被执行,如果脚本有显示的内容,这些显示的内容就被存在out对象(参见JSP预定义变量章节)中,进而输出给用户。脚本的语法为:%scriptlet%4.JSP预定义变量JSP提供了8种预定义的变量.它们是request,response,out,session,application,config,pageContext和page.这里主要介绍前5个,因为相对来说它们更重要些。(1)outout对象主要用来向浏览器(客户端)输出各种格式的数据,并且管理应用服务器上的输出缓冲区,out.println(DataType)和out.print(DataType)是两个主要的输出方法,它们的区别在于println输出后换行,print输出后不换行。下例简单地使用out对象把系统时间输入到浏览器上。%@pagelanguage=javacontentType=text/html;charset=gb2312import=java.util.*%HTMLHEADTITLEout对象使用实例/TITLE/HEADBODY%out.println(newDate().toLocaleString());out.print(hr);out.print(out输出成功);%/BODY/HTML(2)requestrequest类似于Servlet中的HttpServletRequest类,通过它得到request的参数(通过getParameter方法)、request的类型(GET,POST,HEAD,等等),以及引入的HTTP头(cookies,Referer,等等)。它们的主要方法如下:setAttribute/getAttribute根据名字设置/获得属性getParameter根据名字得到参数的值getParameterName获取所有参数的名字列表getRemoteAddr得到客户端(浏览器)的IP地址getAttributeName获取所有属性的名字列表setAttribute与getAttribute方法实例下面的mainreq.jsp包含了import.jsp文件,先执行import.jsp,在import.jsp中设置了属性friend的值为Tom,在这之后mainreq.jsp的%=request.get