




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(优选)语言程序设计程序设计目前一页\总数一百零三页\编于四点2目录12.1JSP简介12.2JSP与JavaBean12.3JSP标签库12.4JSP与Servlet12.5本章小结目前二页\总数一百零三页\编于四点312.1JSP简介servlet和JSP(JavaServerPage)已成为开发电子商务等动态网站的首选技术,它们都是运行在服务器上的Java程序servletHTML的编写和维护都比较困难,使用print语句生成HTML并不容易,非Java开发人员很难处理这些HTMLJSP静态内容的输出都采用标准的HTML,只用java语言编写页面中生成动态内容的代码提供了对Java编程语言以及针对动态部分的servlet技术的完全访问目前三页\总数一百零三页\编于四点412.1.1什么是JSP程序JSP简单的说,就是嵌入了Java代码的HTML,由静态HTML、专用的JSP标签和Java代码组成服务器端的技术。在后台被自动转换成servlet仅在修改后的第一次被访问时,才会被转换成servlet并进行编译,创建JSP唯一的一个一实例,并调用_jspInit完成初始化,之后每个用户请求都会创建一个调用JSP实例的_jspService方法的线程。因而多个并发请求会导致多个线程同时调用_jspServiceTomcat中,默认目录下的JSP文件被转换生成的servlet文件及编译后生成的class文件被放在install_dir/work/Catalina/localhost/_/org/apache/jsp目录下JSP简介目前四页\总数一百零三页\编于四点512.1.1什么是JSP程序
——JSP页面被请求后的操作JSP简介将JSP页面转换为servlet编译servlet将servlet载入到服务器内存中调用jspInit调用_jspService页面初次创建请求1有有有有有请求2无无无无有服务器重启后请求3无无有有有请求4无无无无有页面修改后请求5有有有有有请求6无无无无有目前五页\总数一百零三页\编于四点6JSP文件在服务器的部署可以和常规的HTML页面放在相同的目录中,并使用和常规HTML相同的URL访问它们除了不允许将WEB-INF和META-INF作目录名之外,可以使用任何喜欢的目录名Tomcat中JSP的默认目录是install_dir/webapps/ROOT,我们只要把编写好的JSP文件直接放在此目录下即可例如install_dir/webapps/ROOT/SomeDirectory/SomeFile.jsp则对应的URL为http://host:port/SomeDirectory/SomeFile.jsp12.1.1什么是JSP程序
——JSP文件在服务器的部署JSP简介目前六页\总数一百零三页\编于四点712.1.2JSP语法概述除了标准的HTML以外,JSP主要包括三类组件脚本元素(scriptingelements)使你可以向JSP文件产生的servlet文件中插入代码指令标签(directives)将影响由JSP页产生的servlet的总体结构动作标签(actions)影响JSP运行时的功能JSP简介目前七页\总数一百零三页\编于四点8脚本元素——向JSP文件产生的servlet文件中插入代码,主要有三种形式表达式<%=expression%><%和=之间不能有空格。expression必须能求值,服务器计算出值后以字符串形式发送到客户端显示程序片<%code%>一个JSP页面可以有许多,它们将被插入到生成的servlet文件的_jspService方法中每次客户端请求都会新开一个线程,调用servlet的service方法,service方法再调用_jspService方法JSP简介12.1.2JSP语法概述
——脚本元素目前八页\总数一百零三页\编于四点9声明语句<%!Declaration%>声明的内容包括变量和方法,将被插入到生成servlet的类体中,在_jspService方法之外,成为类变量和类方法,直到服务器关闭才被释放当多个客户请求一个JSP页面时,多个线程将共享这些变量和方法,因而任何一个用户对这些变量操作的结果,都会影响到其他用户12.1.2JSP语法概述
——脚本元素JSP简介目前九页\总数一百零三页\编于四点10指令标签将影响由JSP页产生的servlet的总体结构其格式为<%@directive
attribute1="value1",attribute2="value2",┄%>directive代表指令名称attribute代表该指令中可选的属性名称value代表属性值并且总是用单引号或双引号括起来,要想在属性值value中输出引号,可在该引号前用一个反斜杠“\”在JSP中,有三种类型的指令pageincludetaglibJSP简介12.1.2JSP语法概述
——指令标签目前十页\总数一百零三页\编于四点11page指令可放在文档内的任何位置,该指令对整个页面有效可以定义一个或多个大小写敏感的属性,包括import、contentType、isThreadSafe、Session、buffer等import属性为JSP页面引入Java核心包中的类,这样就可以在脚本部分使用这些类,如:<%@pageimport="java.io.*"%>可以为import属性指定多个值,这些值用逗号分割,这样就可以引入若干个包或类,如:
<%@pageimport="java.io.*","java.awt.*","java.util.Date"%>JSP页面默认import属性已经有如下的值:"java.lang.*","javax.servlet.*","javax.servlet.jsp.*","javax.servlet.http.*“除import属性外,Page指令的其它属性只能指定一个值JSP简介12.1.2JSP语法概述
——指令标签/page指令目前十一页\总数一百零三页\编于四点12contentType属性定义JSP页面相应的MIME(MultipurposeInternetMailExtension,多用途Internet邮件扩展)类型和JSP页面字符编码其属性使用以下两种格式之一<%@pagecontentType="MIME-Type;charset=Character-Set"%>或者<%@pagecontentType="MIME-Type"%>例如<%@pagecontentType="application/vnd.ms-excel;charset=GB2312"%>其属性默认值为<%@pagecontentType="text/html;charset=ISO-8859-1"%>JSP简介12.1.2JSP语法概述
——指令标签/page指令目前十二页\总数一百零三页\编于四点13isThreadSafe属性用来设置JSP页面是否可多线程访问设为true时,JSP页面能同时响应多个客户的请求设为false时,同一时刻只能处理一个客户的请求,其它客户须等待其默认值为truesession属性表示当前的JSP页面是否参与HTTP会话设为true时,可以使用内置的javax.Servlet.HttpSession类型的一个名为session的对象设为false时,则该对象不被创建默认值为trueJSP简介12.1.2JSP语法概述
——指令标签/page指令目前十三页\总数一百零三页\编于四点14buffer属性指定jsp内置输出流out变量使用的缓冲区的尺寸,如果设置为none,则不使用缓冲区默认值是8kbout变量是JspWriter类型的,JspWriter是java.io.Writer类的子类。累计输出内容超过了这里设定的大小、完成了此页、或者输出被明确清除(如使用response.flushBuffer),文档才被发送给客户显示例如<%@pagebuffer="16kb"%>autoflush属性控制out的缓冲区在装满时的处理,默认为true设为true时,装满时则自动清除缓冲区设为false时,装满后则会出现异常buffer的值是none时将autoflush设为false是不合法的JSP简介12.1.2JSP语法概述
——指令标签/page指令目前十四页\总数一百零三页\编于四点15info属性定义了一个通过getServletInfo方法可从servlet中检索到的串格式为<%@pageinfo="someMessage"%>isErrorPage属性指明当前页是否能充当其它JSP页面的错误页。采用以下两种格式之一<%@pageisErrorPage="true"%>或者<%@pageisErrorPage="false"%><%--Default--%>。errorPage属性指定一个处理当前页未被捕获的任何异常的页面格式为<%@pageerrorPage="RelativeURL"%>这个URL指定的错误页的isErrorPage属性必须被设为true方可使用JSP简介12.1.2JSP语法概述
——指令标签/page指令目前十五页\总数一百零三页\编于四点16include指令与page指令不同,该指令应该放在你想要将外部文件插入的位置,它可以将文件整体插入到该处其格式为<%@includefile="fileName"%>Jsp文件被转换成servlet文件时,外部文件就被插入了,然后统一进行编译当外部文件发生改变时,当前页面无法得到通知,要想得知外部文件的任何改变,当前页面必须重新编译,由上一节jsp的操作过程可知,必须重新保存该jsp文件12.1.2JSP语法概述
——指令标签/include指令JSP简介目前十六页\总数一百零三页\编于四点17taglib指令JSP1.1规范中新增的指定一个标记库,用于扩充标准的JSP标记集完成三个任务首先,它通知JSP服务器,页面使用一个标记库其次,它指定包含标记库标志符的特殊jar文件的位置最后,它指定一个用于唯一区分这些新标记的标记前缀格式为:<%@tagliburi="someuri"prefix="somename"%>uri属性:一个引用标记库描述符文件(后缀名为TLD:TagLibraryDescriptor)的绝对或相对URLprefix属性:指定一个将要在TLD文件定义的标记名前面使用的前缀如果TLD文件定义了一个名为tag1的标记,并且prefix属性的值设为test,那么实际的标记名将为test:tag112.1.2JSP语法概述
——指令标签/taglib指令JSP简介目前十七页\总数一百零三页\编于四点18动作标签一种特殊的标签,影响JSP运行时的功能格式为<jsp:action_name
attribute1="value1",attribute2="value2"┄/>action_name代表动作名称attribute代表属性名称value代表属性值分为两类Resource动作JavaBean动作JSP简介12.1.2JSP语法概述
——动作标签目前十八页\总数一百零三页\编于四点19
Resource动作include动作标签告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入,例如:<jsp:includepage="someFile.html"/>如果包含的是普通的文本文件,就将文件的内容发送到客户端,由客户端负责显示如果包含的是JSP文件,JSP引擎就执行这个文件,然后将执行的结果发送到客户端显示如果修改了被包含的文件,那么运行时将看到修改后的结果,这一点和include指令不同可结合param指令,向要包含的文件传送信息,被包含的文件通过JSP的内置对象request调用getParameter方法获得参数值。格式为:<jsp:includepage="someFile.jsp"><jsp:paramname="someName"value="someValue"/></jsp:include>JSP简介12.1.2JSP语法概述
——动作标签/Resource动作目前十九页\总数一百零三页\编于四点20forward动作标签告诉JSP页面从该指令处停止当前页面的继续执行,而转向其他的一个页面,当前页面后边的内容将不被执行,例如:<jsp:forwardpage="somefile.jsp"/>该标签也可结合param指令,向要转到的页面传送信息,格式同include标签JSP简介12.1.2JSP语法概述
——动作标签/Resource动作目前二十页\总数一百零三页\编于四点21plugin动作标签用于插入Applet或JavaBean到JSP页面,组件必须被下载到浏览器并且在客户端执行param元素可以用于发送参数到Applet或JavaBean(一个可重复使用的软件组件,实际上就是一个Java类)如:
<jsp:plugin
type="applet"code="A.class"width="120"height="120"><jsp:paramname="someName"value="someValue"/>
<jsp:fallback>promptmessage
</jsp:fallback>
</jsp:plugin>当客户访问含该段代码的JSP文件时,如果客户端不支持applet,将导致下载Javaplug插件,出现客户选择是否下载插件的界面。用户下载安装后,就可以使用Java虚拟机加载执行Javaapplet小应用程序A.class了fallback元素可用于指定组件失败时发送到客户端的错误信息字符串12.1.2JSP语法概述
——动作标签/Resource动作JSP简介目前二十一页\总数一百零三页\编于四点22JavaBean动作useBean动作标签格式为<jsp:useBeanid="bean的名字"class="创建bean的类"scope="有效范围"/>或者<jsp:useBeanid="bean的名字"class="创建bean的类"scope="有效范围"/></jsp:useBean>服务器将加载该bean类的一个对象setProperty动作标签设置bean的属性getProperty动作标签获取bean属性的值并输出12.1.2JSP语法概述
——动作标签/JavaBean动作JSP简介目前二十二页\总数一百零三页\编于四点2312.1.3JSP内置对象JSP的内置对象在JSP页面的脚本元素中,有些不用声明就可以使用的对象包括out、request、response、session、application等out对象是javax.servlet.jsp.JspWriter类的实例,JspWriter包含的方法大多数与java.io.PrintWriter类一样这个输出流对象用来向客户端输出数据,其可调用的方法如下表JSP简介目前二十三页\总数一百零三页\编于四点2412.1.3JSP内置对象(续)
——out对象可使用的方法名称解释print(Booleanb)输出一个布尔值print(charc)输出一个字符print(doubled)输出一个双精度的浮点数print(floatf)输出一个单精度的浮点数print(longl)输出一个长整型数据print(Strings)输出一个字符串newLine()输出一个换行符flush()输出缓冲区里的内容close()关闭流JSP简介目前二十四页\总数一百零三页\编于四点25request对象是javax.servlet.http.HttpServletRequest的实例客户每次请求页面时,JSP引擎创建一个request对象代表该请求封装了用户提交的信息,这些信息包括HTTP请求的请求行HTTP头信息体调用相应的方法可以获取封装的信息,最常用的方法是request.getParameter(param_name)12.1.3JSP内置对象(续)
——request对象JSP简介目前二十五页\总数一百零三页\编于四点2612.1.3JSP内置对象(续)
——request对象的常用方法名称解释getProtocal()获取客户向服务器提交信息使用的通讯协议getServletPath()获取JSP文件的目录getContentLength()获取提交信息的长度getMethod()获取客户提交信息的方式,例如post或getgetHeaderNames()获取头名字的一个枚举getHeader(Strings)获取HTTP头文件中由s指定的属性的值,例如“content-type”,“cookie”等getRemoteHost()获取客户机的名称getRemoteAddr()获取客户机的IP地址getServerName()获取服务器的名称getServerPort()获取服务器的端口号getParameterNames()获取客户提交的信息体部分中所有参数的名字getParameter(String_name)获取指定参数名字的参数值JSP简介目前二十六页\总数一百零三页\编于四点27
response对象javax.servlet.http.httpServletResponse的实例与request对象相对应,我们可以用response对象对客户的请求做出动态响应,向客户端发送数据。类似于HTTP请求,HTTP响应也由三个基本部分组成状态行:包括使用的协议以及状态代码,表示请求是否成功头:包含关于服务器和返回的文档的消息,例如服务器名称和文档类型等信息体使用这个对象的一些方法可以完成如下任务动态设置contentType属性页面重定向设置返回状态码等JSP简介12.1.3JSP内置对象(续)
——response对象目前二十七页\总数一百零三页\编于四点28JSP简介12.1.3JSP内置对象(续)
——resnponse对象的常用方法名称解释setStatus(intsc)设置返回状态码setContentType(Stringtype)设置被发送文档的MIME类型setHeader(Stringname,Stringvalue)设置头中指定属性name为指定值valuesetRedirect(Stringlocation)重定向到指定URL目前二十八页\总数一百零三页\编于四点29会话的概念从一个客户打开浏览器连接到服务器的某个服务目录,到客户关闭浏览器离开该服务目录称为一个会话每个会话只对应于一个客户,并且可以跨多个页面session对象javax.servlet.http.HttpSession的实例,对应于会话的概念用于在使用无状态连接协议(如HTTP)的情况下跟踪关于某个客户的信息,对识别客户是非常重要的在客户首次访问某服务目录中的任何一个JSP页面时创立,并且具有一个独一无二的Id号,直到客户关闭浏览器或这个session对象达到了最大生存时间,服务器端该客户的session对象才被取消调用相应的方法可以存储客户在访问各个页面期间提交的各种信息,比如姓名、编号等JSP简介12.1.3JSP内置对象(续)
——session对象目前二十九页\总数一百零三页\编于四点30JSP简介12.1.3JSP内置对象(续)
——session对象的常用方法名称解释intgetMaxInactiveInterval()返回会话过期前需要经过的秒数voidsetMaxInactiveInterval(intinterval)设置某个会话的生命期longgetCreationTime()返回创建会话的时间longgetLastAccessedTime()返回上次使用此会话的时间voidinvalidate()使得session对象无效booleanisNew()判断是否是个新会话StringgetId()返回识别客户的独一无二的字符串EnumerationgetIds()返回一个包含当前所有会话Id的枚举值voidsetAttribute(Stringkey,Objectvalue)在session对象中添加obj,并指定索引关键字为keyObjectgetAttribute(Stringname)从session对象获取关键字为key的对象voidremoveAttribute(Stringname)从session中删除指定索引关键字的对象EnumerationgetAttributeName()获取session对象存储的所有键名目前三十页\总数一百零三页\编于四点31application对象javax.servlet.ServletContext的实例。比session对象的生存时期更长。服务器启动后,就产生了这个application对象,直到服务器关闭,该对象才被取消所有客户共享这个内置的application对象,所以任何客户对该对象中存储的数据的改变都会影响到其他客户,因此,在某些情况下,对该对象的操作需要同步处理12.1.3JSP内置对象(续)
——application对象JSP简介目前三十一页\总数一百零三页\编于四点3212.1.3JSP内置对象(续)
——application对象的常用方法名称解释voidsetAttribute(Stringkey,Objectobj)将obj对象添加到application对象中,并为obj指定一个索引关键字key。ObjectgetAttribute(Stringkey)获取application对象中指定关键字的对象EnumerationgetAttributeNames()返回application对象的所有索引关键字voidremoveAttribute(Stringkey)删除指定索引的对象JSP简介目前三十二页\总数一百零三页\编于四点3312.1.4一个简单的JSP程序在表单中输入一个自然数,计算从1到该数的累加和<%--page指令标签,指定MIME类型和页面的字符编码--%><%@pagecontentType="text/html;charset=gb2312"%><%--声明一个类方法,该方法在整个JSP页面有效--%><%!intcontinuousSum(intn){ intsum=0; for(inti=1;i<=n;i++){sum=sum+i;} returnsum;}%><%--JSP中的Java程序片,将被JSP引擎按顺序执行--%><%Stringstr=request.getParameter("number");if(str==null)str="10";intr=Integer.parseInt(str);%>JSP简介目前三十三页\总数一百零三页\编于四点3412.1.4一个简单的JSP程序(续)<html><head><title>计算连续和</title></head><body><h1>请输入一个自然数</h1><!--HTML表单--><formname="form1"method="post"action=""><inputtype="text"name="number"value=<%=str%>><inputtype="submit"name="Submit"value="计算"></form> <%--JSP表达式,其值由服务器负责计算,并将结果发回客户端显示--%><%=r%>的连续和是<%=continuousSum(r)%></body></html>JSP简介目前三十四页\总数一百零三页\编于四点3512.1.4一个简单的JSP程序(续)
——例12_1运行结果JSP简介目前三十五页\总数一百零三页\编于四点3612.2JSP与JavaBean指令标签<%@includefile=“fileName”%>和动作标签<jsp:includepage=“someFile.html”/>都可以嵌入代码。前者实际上是将代码插入行内,后者是将另一个页面的输出插入原来的页面这些方法无助于分离表示逻辑和业务逻辑,它们都造成了显著的可伸缩性问题,不利于开发人员分工合作JavaBean解决了这个问题,它将一系列相关的属性和方法组合在一个Java类中,构成了一个组件在JSP程序中,只要使用JavaBean动作标签调用该组件就可以了目前三十六页\总数一百零三页\编于四点3712.2.1JavaBean简介JavaBean其实就是Java类必须使用一组相当简单而又标准的设计和命名约定,因而调用它们的应用程序无须理解其内部工作原理,就可以很容易的使用JavaBean的方法JavaBean类的一个实例叫做一个bean通常我们将JavaBean文件取名为XxxBeanJSP与JavaBean目前三十七页\总数一百零三页\编于四点3812.2.1JavaBean简介(续)
——JavaBean的设计要求对于JSP中使用的JavaBean,有三个设计要求必须拥有一个默认(无参数)的构造函数如果未声明任何构造函数,默认的构造函数会被自动创建JSP元素创建bean时,会调用默认构造函数类中不应该有公开的属性对于类内的属性,通常应该提供设置和获取其值的方法publicvoidsetXxx(Objec_typevalue)方法进行设置publicObject_typegetXxx()方法进行获取,如果该属性是布尔类型的,允许使用publicbooleanisXxx()获取属性值如果某个属性只有getXxx或isXxx方法,叫做只读属性JSP与JavaBean目前三十八页\总数一百零三页\编于四点39可以使用JSP脚本元素访问类的任意方法访问bean的标准JSP动作只能使用那些遵循getXxx/setXxx或isXxx/setXxx命名约定的方法12.2.1JavaBean简介(续)
——JSP对JavaBean的访问JSP与JavaBean目前三十九页\总数一百零三页\编于四点40设计一个描述员工信息的JavaBean类。包括编号、姓名、性别、工资、职务属性packagemyBeans;publicclassEmployeeBean{ privateintid=0,salary=0; privateStringname="none",occupation="none"; privatebooleanmale=true;
publicintgetId(){returnid;} publicvoidsetId(intid){this.id=id;} publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;}
publicbooleanisMale(){returnmale; } publicvoidsetMale(booleanmale){this.male=male;}
publicintgetSalary(){returnsalary;} publicvoidsetSalary(intsalary){this.salary=salary;}
publicStringgetOccupation(){returnoccupation;} publicvoidsetOccupation(Stringoccupation){this.occupation=occupation;}}JSP与JavaBean12.2.1JavaBean简介(续)
——例12_2目前四十页\总数一百零三页\编于四点41EmployeeBean类满足成为JavaBean的条件没有公开的实例变量没有声明任何显式的构造函数,从而也就拥有了一个默认的无参数的构造函数它的属性的设置和获得都使用了标准的形式JSP与JavaBean12.2.1JavaBean简介(续)
——例12_2说明目前四十一页\总数一百零三页\编于四点4212.2.2在JSP程序中使用JavaBeanJavaBean类在Web应用中的部署不能放在含有JSP文件的目录中,而应该放在安装servlet的目录中,且一定要使用包单个JavaBean类的字节码文件的正确位置是webAppDir/WEB-INF/classes/PackageName/含有bean类的JAR文件应该放在webAppDir/WEB-INF/lib/目录中在JSP页面中,可以使用三种JavaBean动作标签构建和操作JavaBean组件useBean动作标签setProperty动作标签getProperty动作标签JSP与JavaBean目前四十二页\总数一百零三页\编于四点43
<jsp:useBeanid="beanName"
class="package.class"
scope="someScope"/>表示建立一个bean类的对象class指定的bean类的类名id指定该实例的名字scope属性表示bean的有效范围,有4个可选值PageRequestSessionApplication如果已经存在scope和id相同的实例,则访问现存的实例JSP与JavaBean12.2.2在JSP程序中使用JavaBean(续)
——建立JavaBean目前四十三页\总数一百零三页\编于四点44Page默认值,有效范围是当前请求访问的JSP页面表示每次请求访问JSP页面时都会创建新的bean,并将其放在PageContext对象中servlet可以通过预定义变量pageContext的getAttribute方法访问它Request有效范围是当前的请求将bean放在HttpServletRequest对象中,如果已经存在,则调用之,可通过getAttribute方法访问在使用jsp:include,jsp:forward,或者RequestDispatcher的include或forward方法时,两个JSP页面,或JSP页面和servlet将会共享该bean12.2.2在JSP程序中使用JavaBean(续)
——建立JavaBeanJSP与JavaBean目前四十四页\总数一百零三页\编于四点45Session有效范围是客户的会话期间表示要将bean实例存储到与当前请求相关的HttpSession对象中如果这个客户在多个页面中相互链接,每个页面都包含有一个useBean标签,这些useBean标签中id的值相同,并且scope的值都是session,那么该客户在这些页面得到的bean是相同的一个Application表示要将bean实例存储在ServletContext中,ServletContext由Web应用中多个servlet和JSP页面共享所有客户共享这个bean,如果一个客户改变这个bean的某个属性的值,那么所有客户的这个bean的属性值都发生了变化这个bean直到服务器关闭才被取消JSP与JavaBean12.2.2在JSP程序中使用JavaBean(续)
——建立JavaBean目前四十五页\总数一百零三页\编于四点46<jsp:getPropertyname="beanName"
property="propertyName"/>表示读取bean属性的值bean的名称由name项指定,与useBean标签的id项对应property项指定属性名称该语法只能读取在JavaBean类文件中有getXxx方法的属性也可用JSP脚本元素<%=beaName.getXxx()%>得到相同的结果JSP与JavaBean12.2.2在JSP程序中使用JavaBean(续)
——取得Bean的属性值目前四十六页\总数一百零三页\编于四点47<jsp:setPropertyname="beanName"
property="propertyName"
value="propertyValue"/>表示设置bean的属性值name项指定bean的名称,与useBean标签的id相对应property项指定属性名称value项指定属性的值该语法只能设置JavaBean类文件中有setXxx方法的属性也可以用JSP脚本元素<%=beanName.setXxx("propertyValue")%>得到相同的结果JSP与JavaBean12.2.2在JSP程序中使用JavaBean(续)
——设置Bean的属性值目前四十七页\总数一百零三页\编于四点48建立JSP文件Ex12_3.jsp使用上节建立的EmployeeBean<%@pagecontentType="text/html;charset=gb2312"%><html><head><title>使用JavaBean</title></head><body><jsp:useBeanid="employee"class="myBeans.EmployeeBean"/>
<H2>初始值:</h2><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>编号是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工资是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>职务是:<jsp:getPropertyname="employee"property="occupation"/></p>
<H2>修改后:</h2><jsp:setPropertyname="employee"property="name"value="超杰"/><jsp:setPropertyname="employee"property="id"value="1"/><jsp:setPropertyname="employee"property="male"value="true"/><jsp:setPropertyname="employee"property="salary"value="6000"/><jsp:setPropertyname="employee"property="occupation"value="Manager"/><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>编号是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工资是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>职务是:<jsp:getPropertyname="employee"property="occupation"/></p></body></html>12.2.2在JSP程序中使用JavaBean(续)
——例12_3JSP与JavaBean目前四十八页\总数一百零三页\编于四点49
首先显示初始值,修改后,显示新值JSP与JavaBean12.2.2在JSP程序中使用JavaBean(续)
——例12_3运行结果目前四十九页\总数一百零三页\编于四点50通过表单使用上节建立的EmployeeBean。<%@pagecontentType="text/html;charset=gb2312"%><%@pagecontentType="text/html;charset=gb2312"%><html><head><title>使用JavaBean</title></head><body><formname="form1"method="post"action=""><br>姓名:<inputtype="text"name="name"> <br>性别:<inputtype="radio"name="male"value="true">男
<inputtype=“radio”name=“male”value=“false”>女
<br>编号:<inputtype="text"name="id"><br>职务:<inputtype="text"name="occupation"><br>工资:<inputtype="text"name="salary"><br><inputtype="submit"name="Submit"value="提交"></form>
<jsp:useBeanid="employee"class="myBeans.EmployeeBean"/><jsp:setPropertyname="employee"property="name"param="name"/><jsp:setPropertyname="employee"property="id"param="id"/><jsp:setPropertyname="employee"property="male"param="male"/><jsp:setPropertyname="employee"property="salary"param="salary"/><jsp:setPropertyname="employee"property="occupation"param="occupation"/><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>编号是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工资是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>职务是:<jsp:getPropertyname="employee"property="occupation"/></p></body></html>12.2.2在JSP程序中使用JavaBean(续)
——例12_4JSP与JavaBean目前五十页\总数一百零三页\编于四点5112.2.2在JSP程序中使用JavaBean(续)
——例12_4运行结果在表单中填入信息后,将显示填入的信息JSP与JavaBean目前五十一页\总数一百零三页\编于四点5212.3JSP标签库JSP标签库除了使用JavaBean,JSP还可以使用定制的标记,便于Web开发人员实现内容和功能的分离相对于使用JavaBean,用户自定义的标签库有如下优点beans不可以操纵JSP的内容,但标签库可以使用标签比bean可以用更加简单的形式完成复杂的功能,JSP通过指令标签中的taglib指令使用标签库目前五十二页\总数一百零三页\编于四点5312.3JSP标签库(续)使用自定义标签比使用bean要复杂一些,它需要3个部分实现标签行为的标签处理类将XML元素名称映射到标签实现上的标签库描述文件(后缀名为tld)使用标签的JSP程序JSP标签库目前五十三页\总数一百零三页\编于四点5412.3.1标签处理类标签处理类是一个Java类,用来告诉系统在JSP程序中遇到标签后应该做些什么必须实现javax.servlet.jsp.tagext.Tag接口通常通过扩展如下两类来实现javax.servlet.jsp.tagext.TagSupportjavax.servlet.jsp.tagext.BodyTagSupportJSP标签库目前五十四页\总数一百零三页\编于四点5512.3.1标签处理类(续)TagSupport类及其doStartTag方法如果在taglib指令标签中没有属性或标签体,即标签的引用形式为<prefix:tagname/>,这样的标签类应该扩展TagSupport类该类实现Tag接口并包含基本标签所需的大量标准功能。只须重载改该类的doStartTag方法,这个方法中的代码将在页面请求时期遇到标签头时执行为了产生输出,doStartTag方法应该调用pageContext类变量的getOut方法获得JspWriter对象除此之外,调用pageContext的别的一些方法,还可以获得和请求相关的别的数据结构:例如getRequest、getResponse、getServletContext、getSession如果标签没有体,doStartTag方法应该返回SKIP_BODY常量,这将告诉系统忽略标签起始和结束之间的内容JSP标签库目前五十五页\总数一百零三页\编于四点56实现一个标签处理类,当JSP程序遇到相应标签,可插入一个100以内的随机整数和一行文本packagetags;importjavax.servlet.jsp.*;importjavax.servlet.jsp.tagext.*;importjava.io.*;publicclassExampleTagextendsTagSupport{ publicintdoStartTag(){ try{ JspWriterout=pageContext.getOut(); out.print((int)(Math.random()*100)); out.print("Myfirsttagtest!"); } catch(IOExceptionioe){ System.out.println("ErrorinExampleTag:"+ioe); } return(SKIP_BODY); }}12.3.1标签处理类(续)
——例12_5JSP标签库目前五十六页\总数一百零三页\编于四点5712.3.2标签库描述文件标签库描述文件定义了标签处理类后,接下来就是在服务器上为这个类命名,并将其和一个专门的XML标签名关联起来。通过标签库描述文件可以完成这个任务该文件包括一个XML版本声明、一个DOCTYPE声明、以及一个taglib容器元素重点是taglib容器元素中的tag元素,对于没有属性的标签,tag元素又应该包括以下四个子元素name:该元素定义了将在JSP文件中使用的tagname;tag-class:该元素给出了标签处理类的完整类名,包括包名;body-content:对于没有体的标签应该取值为EMPTY;description:一个简短的说明JSP标签库目前五十七页\总数一百零三页\编于四点58
建立一个标签库描述文件,将上例建立的标签处理类和example名关联。将其存储在Chapter12\web\WEB-INF\tlds\example.tld<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><short-name>example</short-name><uri>/WEB-INF/tlds/example</uri><tag><name>example</name><tag-class>tags.ExampleTag</tag-class><body-content>empty</body-content><description>Insert
arandominteger</description></tag></taglib>12.3.2标签库描述文件(续)
——例12_6JSP标签库目前五十八页\总数一百零三页\编于四点5912.3.3在JSP文件中使用标签已经有了标签处理类和标签库描述文件,接下来就可以在JSP文件中使用自定义的标签了在首次使用标签之前,需要使用taglib指令标签<%@tagliburi=“someuri”prefix=“somename”%>uri属性是一个引用标签库描述符文件的绝对或相对URLprefix属性指定一个将要在标签库描述符文件定义的标签名前面使用的前缀接下来就可以使用<prefix:tagname/>引用标签了JSP标签库目前五十九页\总数一百零三页\编于四点60建立一个JSP文件,使用刚刚建立的标签处理类和标签库描述文件<%@pagecontentType="text/html;charset=gb2312"%><html><head><%@tagliburi="/WEB-INF/tlds/example"prefix="testTag"%><title>使用标签<testTag:example/></title></head><body><H1><testTag:example/></H1></body></html>12.3.3在JSP文件中使用标签(续)
——例12_7JSP标签库目前六十页\总数一百零三页\编于四点61每次按刷新后结果都是随机的12.3.3在JSP文件中使用标签(续)
——例12_7运行结果JSP标签库目前六十一页\总数一百零三页\编于四点6212.3.4自定义标签库有时我们需要在JSP文件中指定标签的一些属性例如我们希望能输出1000以内,而不是100以内的随机整数这时的引用形式应该是<prefix:tagnameattribute1="value1"attribute2="value2"┅/>相应的需要修改标签处理类和标签库描述文件JSP标签库目前六十二页\总数一百零三页\编于四点6312.3.4自定义标签库(续)
——修改标签处理类NewExampleTag.java使用attribute1将导致调用标签处理类的setAttribute1方法。所以为了在Ex12_7中能够指定随机整数的范围,我们为属性取名为range,并修改标签处理类ExampleTag.java为NewExampleTag.java如下publicclassNewExampleTagextendsTagSupport{protectedintrange=100;publicintdoStartTag(){try{JspWriterout=pageContext.getOut();out.print((int)(Math.random()*range));out.print("Tagtestwithattribute!");}catch(IOExceptionioe){System.out.println("ErrorinExampleTag:"+ioe);}return(SKIP_BODY);}publicvoidsetRange(Stringrange){try{this.range=Integer.parseInt(range);}catch(NumberFormatExceptionnfe){this.range=100;}}}JSP标签库目前六十三页\总数一百零三页\编于四点64此外还需要修改标签库描述文件,在12.3.2节中介绍的tag元素中再增加attribute子元素,这个子元素又包括三个孙元素name::定义了属性名称,这个例子中,属性名为rangerequired:指出是否必须提供该属性,true是必须提供,false是可以不提供,这个例子中,range属性是可选的,如果不选,则默认为100,所以我们将其设定为falsertexprvalue:是一个可选孙元素,表示属性值是否可以是JSP表达式,以便在请求时期动态确定,默认状态下是false,表示只能是一个静态字符串12.3.4自定义标签库(续)
——修改标签库描述文件NewExample.tldJSP标签库目前六十四页\总数一百零三页\编于四点65将刚刚建立的标签处理类和newexample名关联。将其存储在Chapter12\web\WEB-INF\tlds\NewExample.tld<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><short-name>newexample</short-name><uri>/WEB-INF/tlds/NewExample</uri>
<tag>
<name>newexample</name>
<tag-class>tags.NewExampleTag</tag-class>
<body-content>empty</body-content>
<description>Insertarandomintegerwithinsomerange</description>
<attribute>
<name>range</name><required>false</required>
</attribute></tag></taglib>12.3.4自定义标签库(续)
——修改标签库描述文件newexample.tldJSP标签库目前六十五页\总数一百零三页\编于四点66最后,我们修改例12_7的Jsp文件如下:<%@pagecontentType="text/html;charset=gb2312"%><html><head><%@tagliburi="/WEB-INF/tlds/NewExample"prefix="testTag"%><title>使用标签<testTag:newexample/></title></head><body><UL><Br>使用默认范围:<testTag:newexample/><Br>1000以内:<testTag:newexamplerange="1000"/><Br>10000以内:<testTag:newexamplerange="10000"/></UL></body></html>12.3.4自定义标签库(续)
——修改JSP文件Ex12_7_new.jspJSP标签库目前六十六页\总数一百零三页\编于四点67将会出现三个不同范围内的随机数,每次刷新后结果都将不同12.3.4自定义标签库(续)
——Ex12_7_new.jsp运行结果JSP标签库目前六十七页\总数一百零三页\编于四点6812.3.4自定义标签库(续)此外我们还可以在标签中使用标签体其形式为<prefix:tagname>body</prefix:tagname>,body里的内容可以是JSP脚本元素、指令标签、动作标签这时需要修改标签处理类doStartTag方法不能再返回SKIP_BODY,而应该返回EVAL_BODY_INCLUDE如果需要在读取body内容后进行一些处理,还需要重载doEndTag方法如果在标签内容显示完之后还想继续处理后面的页面内容,doEndTag方法应该返回EVAL_PAGES,否则应该返回SKIP_PAGEJSP标签库还可以实现嵌套标签。有兴趣的读者可以查找介绍JSP高级应用的教材JSP标签库目前六十八页\总数一百零三页\编于四点6912.4JSP与ServletJSP与ServletJSP不过是编写Servlet的另一种不同的方式而已,JSP归根到底也要转化为Servlet二者各有所长Servlet擅长数据处理,如读取并检查数据、与数据库通信JSP擅长表示,即构建HTML来表示请求的结果通常一个大型的项目需要综合使用JSP与Servlet目前六十九页\总数一百零三页\编于四点70通常,我们可以将一个Web应用程序的结构分为三个部分显示层(Presentationlayer):包括前端的HTML、XML和Applet,主要用作用户的操作接口,负责让用户输入数据以及显示数据处理后的结果商业逻辑层(Businesslogiclayer):负责数据处理、连接数据库、产生数据等控制层(Controllayer):控制整个网站的流程这三个部分分别对应模型-视图-控制器(ModelViewController,MVC)构架的视图、模型、控制器12.4.1Web应用程序的一般结构JSP与Servlet目前七十页\总数一百零三页\编于四点71SUN在JSP出现早期制定了两种规范,称为Model1和Model212.4.1Web应用程序的一般结构(续)
——两种规范目前七十一页\总数一百零三页\编于四点72Model1设计模块:开发快速,适合于小型系统,其处理方式还可分为两种完全使用JSP来开发用户发出一个请求到服务器端,就是由JSP页面来接收处理,接着将执行结果响应到客户端由于JSP页面包括了大量的Java语法,程序可读性降低,不易维护,而且不利于重复利用使用JSP+JavaBean将可重用的组件抽出来写成JavaBean,通过JSP调用JavaBean来存取数据和进行逻辑运算依然缺乏流程控制,每个JSP文件都要完成验证参数正确性、确认用户的身份权限、异常处理等任务,因此对将来的维护造成了困难12.4.1Web应用程序的一般结构(续)
——Model1设计模块JSP与Servlet目前七十二页\总数一百零三页\编于四点73Model2MVC架构对于大型系统的开发,大多采取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆健康职业学院《运动处方》2023-2024学年第二学期期末试卷
- 昆明冶金高等专科学校《商务英语》2023-2024学年第二学期期末试卷
- 湿地景观生态设计-洞察及研究
- 区域人口承载力研究-洞察及研究
- 创伤后心理修复-洞察及研究
- 环内暗物质探测-洞察及研究
- 仿生农药设计合成-洞察及研究
- 物流分拨流程管理制度
- 物流疫区配送管理制度
- 物流设施设备管理制度
- GA/T 974.33-2011消防信息代码第33部分:起火原因分类与代码
- GA 44-2015消防头盔
- 《科学护眼爱眼共享光明未来》近视防控宣传教育课件
- 面向对象分析和设计讲座面向对象方法学PPT资料
- 铸铁闸门及启闭机安装说明及操作手册
- 《财政学》教学大纲中文版
- 高危新生儿急诊服务流程图
- CLSI EP25-A 稳定性考察研究
- “文化引导型”城市更新思想思考与实践课件
- 卷心菜中过氧化物酶热稳定性的初步研究
- 涡轮增压器系统及常见故障案例
评论
0/150
提交评论