




免费预览已结束,剩余130页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
j2ee架构与程序设计,主讲:xxx 西北工业大学软件与微电子学院,第六章 jsp(上),主要内容,jsp基本语法 jsp运行机制 jsp寿命周期管理 jsp属性,概述,jsp最终以servlet方式在容器中运行 容器将jsp文件翻译成servlet类的源文件(.java),然后将其编译成servlet class 以和手工编写servlet同样的方式运行servlet,概述,例子 jsp:basiccounter.jsp 工具类:counter.java,java代码片断,概述,部署方法 tomcat 访问,若将包目录和类文件放在web-inf/classes目录下,则web应用的所有部分都能访问到它,http:/localhost:8080/testjsp1/basiccounter.jsp,jsp基本语法,指令(directive) 一个jsp元素,用来给jsp容器一个说明,在翻译的时候被解释。有三种jsp指令:page, include, taglib page指令 定义与页面相关的属性,jsp2.0定义了13种属性 import 定义将在生成的servlet类中添加的java import语句。缺省情况下自动加入:java.lang, javax.servlet, javax.servlet.http, javax.servlet.jsp isthreadsafe 定义生成的servlet是否实现singlethreadmodel。缺省值为“true”,表示web应用是线程安全的,不需要实现singlethreadmodel。若值为“false”,表示生成的servlet实现singlethreadmodel contenttype 定义jsp响应的mime类型 iselignored 定义当jsp页面翻译的时候,是否el表达式被忽略,jsp基本语法,iserrorpage 定义当前的页面是否为另一个jsp页面的错误页面。缺省值为“false”。如果值为“true”,页面可以访问隐含的exception对象;否则不能访问 errorpage 定义一个url资源,未捕获的异常将发送到该资源。如果该资源为jsp页面,则该页面有一个iserrorpage=“true”的page指令 language 定义在脚本、表达式和声明中使用的脚本语言,现在其值只能为“java” extends 定义本jsp页面将被容器编译成的servlet类的超类 session 定义该jsp页面是否有一个隐含的session对象,缺省为“true”,jsp基本语法,buffer 定义隐含的out对象如何处理缓冲,参考jspwriter autoflush 定义缓冲了的输出是否自动提交(flush),缺省值为“true” info 定义一个字符串,它可以放进转换后的jsp页面,并可以通过servlet的getservletinfo()方法获得 pageencoding 定义jsp页面的字符编码。缺省值为:“iso-8859-1”,jsp基本语法,例子:使用import属性导入外部的包 导入一个包 导入多个包,注意符号,用逗号分隔,jsp基本语法,include指令 定义一段文字或代码,它可以在当前页面被解析时加入其中 增强了代码的复用性 例如: taglib指令 定义jsp可以使用的标签库 例如:,jsp基本语法,表达式(expression) 表达式在运行时转化成out.print()的参数 不能将返回值为void的方法作为表达式,注意 “=” 符号,jsp基本语法,声明(declaration) 在java代码片断(scriptlet)中定义的变量,所有的java代码片断和表达式代码都在一个service方法中,所以在java代码片断中声明的变量总是本地变量!,生成的servlet代码在:yourtomcathomedir/work/catalina/yourservername/yourwebappname/org/apache/jsp,jsp基本语法,如何定义静态变量? jsp声明 用于声明生成的servlet类的成员,即变量和方法 间的部分将被添加到service方法之外 可以定义静态变量和方法 变量定义,注意 “!” 符号,jsp基本语法,方法定义,jsp运行机制,容器如何处理jsp 查找指令,获取解析jsp所需的信息 创建httpservlet子类 对于tomcat5而言,生成的servlet扩展 如果有一个具有import属性的page指令,将import声明写在类前面的包声明之后 对于tomcat5而言,包声明为: 如果有声明(declarations),就将它们写入类文件,通常在类声明之后,service方法之前 创建service方法,方法名为_jspservice()。它将被servlet超类的重载service()方法调用,并接收httpservletrequest和httpservletresponse。容器声明并初始化所有隐含对象 将html文本、java代码片断、表达式整理到service方法中,格式化并写入printwriter响应输出,jsp运行机制,一个例子,jsp运行机制,隐含对象,封装了其它隐含对象。通过它可以获得其他隐含对象和属性的引用,在error page中使用,jsp寿命周期管理,jsp寿命周期,容器实例化servlet并运行jspinit()方法,对象现在成为一个servlet,准备接收客户请求,容器创建一个新的线程来处理客户请求,servlet的_jspservice()方法运行,以后与传统servlet处理方式无异,转换和编译工作仅进行一次,jsp寿命周期管理,生成的servlet 容器从jsp生成一个类,它实现httpjsppage接口 jspinit()方法 从init()方法调用,可重载 jspdestroy()方法 从destroy()方法调用,可重载 _jspservice()方法 从service()方法调用,不能重载。完全由容器开发商从jsp代码生成,jsp寿命周期管理,初始化jsp 可以在jsp中进行生成的servlet初始化 配置servlet初始化参数 jsp声明,重载jspinit()方法,jsp属性,使用四种隐含对象get/set属性 对应四种不同的作用域 除了标准的servlet request, session和context作用域外,增加了page作用域对应pagecontext对象,jsp属性,在jsp中,可以只通过pagecontext隐含对象,get/set任何作用域中的属性 pagecontext,思考与讨论题,jsp指令有哪些,怎样表示 jsp表达式的本质 jsp声明怎样转换成java代码 jsp运行机制 jsp隐含对象有哪些,与标准servlet api对象如何对应? jsp的寿命周期 怎样自定义地初始化一个jsp jsp的四种作用域,思考与讨论题,jsp指令有哪些,怎样表示 jsp表达式的本质 jsp声明怎样转换成java代码 jsp运行机制 jsp隐含对象有哪些,与标准servlet api对象如何对应? jsp的寿命周期 怎样自定义地初始化一个jsp jsp的四种作用域,主要内容 jsp(下),javabean标准动作(standard action) jsp表达式语言(el) 其他jsp标准动作 include forward,概述,将所有的java代码写在jsp页面中是一种坏习惯 web页面设计师可能不懂java 在jsp中写java代码使其难于更改和维护 解决方案 action 是一种jsp元素,它可以作用于隐含对象和其他服务器端对象,或定义新的脚本变量 遵从xml element语法规范:start tag, body, end tag;tag必须使用前缀 分为标准action和自定义action el 提供了一种调用java代码的简单方法 可以部分地取代jsp中的java代码片断和表达式 使用el,不需要在jsp中写方法的代码,可以写在jsp外部,用el调用 el对非java程序员来说更简单,对java程序员来说更容易维护,javabean标准动作,javabean标准动作 目标:消除jsp中的脚本(java代码片断、声明、表达式) 例子: servlet jsp,javabean标准动作,用声明和初始化一个bean属性 用获取bean对象型属性的属性值 用创建一个bean 如果找不到一个名为“person”的属性对象,它就创建一个 生成的servlet根据id和scope的值检查bean,如果不存在相应bean对象,它就用class中的值实例化一个对象,并把它赋予id,然后将它设置成scope中的一个属性,标识一个javabean标准动作,声明bean对象的标识符,声明bean对象的类,声明bean对象的属性范围,标识标准动作,标识实际的bean对象。与标签中的“id”值匹配,标识属性名(在bean类中用get/set方法读取和设置),缺省为“page”,不能是抽象的,且必须有一个无参数的构造方法,javabean标准动作,容器生成的servlet的_jspservice()方法,根据id的值定义一个变量。这个变量可以被jsp的其它部分引用,试图在tag中定义的作用域中获取属性,并将结果赋予id变量,如果在定义的作用域中没有一个具有这样名字的属性,最后,在定义的作用域中将这个新对象设置为一个属性,javabean标准动作, 设置bean属性值 作为元素体的,当usebean有元素体时,才加入代码; 利用反射机制的通用的设置属性方法,等价于person.setname(“fred”);,元素体中的代码运行是有条件的。只有当找不到bean型属性,并且创建了一个新的bean时才运行,javabean标准动作,多态bean引用 标签的type属性 生成的servlet类,引用类型是抽象类person,bean对象类型是具体类employee,type可以是:类、抽象类或接口,type用于定义bean(可以是抽象的);class用于实例化bean(必须是具体的),有:type x = new class(),javabean标准动作,标签中使用type属性,不使用class属性 如果在给定作用域中存在名为id的bean对象属性,该bean对象满足type定义,则可以运行 else,则抛出异常: 判断题 servlet jsp,javabean标准动作,在标签中使用param属性 例子:直接将请求发送到jsp,不经过servlet html testbean.jsp 使用param属性,与请求参数名相同,进一步改进,javabean标准动作,使用与bean property同名的请求参数 html testbean.jsp,如果请求参数与bean property名匹配,则不需在标签中为该属性赋值,遍历并找到与请求参数匹配的bean property名,并将其值设为相应的请求参数值,bean标签可以从请求参数自动转换到string和原数据类型的property,javabean标准动作,bean property的类型不是string或原类型 打印person的dog的名字 servlet,javabean标准动作,result.jsp,只能访问bean型属性的properties,不能访问嵌套的properties,dogs name is: spike,dogs name is: foo.dog799338,实际是调用了tostring()方法,jsp表达式语言(el),el提供了一种调用java代码的简单方法 用el获取嵌套的bean类型属性的property相当简单 使用非java语法 解构el 通常写在大括号中,前面加$符号 第一个变量是隐含对象或属性,jsp表达式语言(el),都是map对象,是对pagecontext对象的引用(pagecontext是一个javabean),除了pagecontext外,el隐含对象与jsp脚本中使用的隐含对象不同,jsp表达式语言(el),使用“.”操作符 可以访问property和map的值 左边只能是map或bean 右边必须是一个map的key或一个bean的property名 右边必须遵循java命名规则 必须以字母、下划线或$符号开始 不能用java保留关键字 ,jsp表达式语言(el),使用 操作符 左边还可以是list或数组 右边还可以是数字、能转换成数字的其他类型、其他不符合java命名规则的标志符 对于bean和map,“.”和“ ”操作符可以互换 如果 中不是字符串,将被求值(看作属性或隐含对象),优先,jsp表达式语言(el),例子 servlet jsp 结果,jsp表达式语言(el),在括号中使用嵌套表达式 servlet jsp 结果,jsp表达式语言(el),el隐含对象,作用域属性的map,请求参数的map,请求的header的map,cookie的map,上下文初始化参数的map,不是map,是对pagecontext对象的引用,相当于bean,jsp表达式语言(el),scope隐含对象 使用scope隐含对象获取各个作用域中的属性,不是属性对象的properties 为了获得各个作用域的properties,需要使用pagecontext 意思是:pagecontext有一个request property,request有一个method property 请求参数 对于特定参数名只有一个参数值时用param隐含对象 对于特定参数名有多个参数值时用paramvalues隐含对象,jsp表达式语言(el),例子: html jsp,jsp表达式语言(el),获得服务器主机信息 使用httpservletrequest对象的getheader(string)方法 使用隐含对象header/headervalues 获得cookie 获得上下文初始化参数 dd,没有getcookie(cookiename)方法!,jsp表达式语言(el),在el中使用其它操作符 算术操作符 +,-,*,/(div),%(mod) 逻辑操作符 &(and), |(or), !(not) 关系操作符 =(eq), !=(ne), (gt), =(ge) 例子,jsp表达式语言(el),servlet代码 jsp代码,false,true,false,true,false,true,false,infinity,“num”属性自动转换成int,integer自动转换成它的原类型,优先级:从左到右,在标签中可以使用el,include标准动作,重用代码段的两种方法 include指令 include标准动作 例子 需复用的jsp文件header.jsp 使用两种方法复用header.jsp的contact.jsp 二者效果完全相同,但是底层实现却不同,include标准动作,生成的servlet代码(取自_jspservice()方法) header.jsp 使用include指令的jsp 使用include标准动作的jsp,include标准动作,异同点 include指令在转换jsp页面时将header.jsp源码插入,客户端请求contact.jsp页面,容器读取contact.jsp并开始一个转换过程,容器看到include指令,将header.jsp和contact.jsp的源代码组合在一起,并把它转换成servlet的java源文件,容器将转换而来的源文件编译成servlet类。此后与其他servlet运行过程相同。以前的步骤不会再进行。,include标准动作,include标准动作在运行时将header.jsp的响应插入,客户端请求contact.jsp页面,容器读取contact.jsp并开始一个转换过程,容器看到include标准动作,并使用它在生成的servlet代码中插入一个方法调用,该方法调用可以在运行时动态地将header.jsp的响应加入contact.jsp的响应中。容器为两个jsp都生成servlet,容器将转换而来的源文件编译成servlet类。生成的servlet类文件加载到容器的虚拟机中并初始化。然后,容器为请求分配一个线程并调用jsp的_jspservice()方法,contact servlet调用执行动态include的方法,依不同产品实现的方法不同。,include标准动作,使用定制嵌入的页面的内容 在源页面和嵌入的页面之间传递请求参数 标签可以有内容,在其中添加嵌入的页面可用的请求参数 主页面 嵌入的文件,只能用于include标准动作,不能用于include指令,forward标准动作, 作用相当于requestdispatcher buffer在forward发生之前就被清空了 例子 使用forward标准动作的页面hello.jsp 请求转发至的页面handleit.jsp,思考与讨论题,javabean标准动作的使用方法 javabean标准动作中使用多态bean el的语法 “.”和“ ”的区别 el的隐含对象 include指令和标准动作的异同,主要内容jstl,核心tag 变量相关tag 流控制tag url管理tag 其它tag,概述,需求 创建自己的动作 尽量避免在jsp中编码脚本 将页面设计与java编码工作分离 方案 标准的定制化标签库:jsp standard tag library 直接使用j2ee提供的jstl标签 避免编写定制化标签处理器 完全自定义的标签库 需要自己编写定制化标签处理器 部署自己编写的标签 使用自己编写的标签,标签,格式化输出 处理特异化字符,实际得到,想得到,显示效果,显示效果,pagecontent是一个bean类型的属性,它有一个名为currenttip的property,值为“tags make things bold”,标签,显式地声明特异字符的转换方式:使用c:out的escapexml属性 设置值为true表示上表中的字符转换成对应的实体码 设置值为false表示把字符以html方式解析并显示 缺省值为true c:out的安全价值:输出所有用户字符串时使用c:out标签,设定escapexml=true,避免不良脚本运行的机会,显示效果,标签,为null值提供缺省的输出 null值渲染成空字符 为c:out标签使用default属性定义缺省输出 还可以这样表示:,显示成,如果value属性为null,则使用缺省值作为输出,标签,在一个集合上迭代,每次对应一个集合元素 把集合中的每个元素赋予用var属性定义的变量,每轮迭代变量的值会改变,保存集合中的每个元素,其作用域为标签内部,集合,可以是:数组、collection、map、用逗号分割的字符串等,标签,使用varstatus属性 varstatus属性创建了一个新变量,它是一个javax.servlet.jsp.jstl.core.looptagstatus对象 looptagstatus类有一个count成员变量,作用是给出当前迭代记数值,标签,标签的begin, end属性用于选择集合的一个子集作为迭代集 标签的step属性用于跳过特定元素,标签,设定条件 按照test属性的值是否为true有条件地执行标签体 jsp inputcomments.jsp,标签,和一起组成ifelse ifelse结构,标签,设置bean property、map、属性变量的值 有var属性的标签 没有标签体 有标签体,可选属性,设定变量的范围,如果在指定的作用域中没有指定的属性,则创建一个(假设value属性不为空),按照value属性计算结果的类型,自动设定var属性的类型,计算标签体的值,并把它设置成var变量的值,如果value计算结果为null,变量将被移除,标签,有target属性的标签 没有标签体 有标签体,如果target是一个map,设置键值为“dogname”的元素值,target必须不为空,如果target是一个bean,设置property “dogname”的值,可以是字符串或表达式,必须是对象,不能是属性的“id”名,标签,注意事项 不能同时使用“var”和“target”属性 scope是可选的,缺省值为page作用域 如果“value”为空,则“var”命名的属性将被移除 如果“var”命名的属性不存在,它就被创建,但前提是“value”不为空 如果“target”表达式为空,容器抛出异常 “target”不能设置成属性名,而是实际的属性对象 如果“target”表达式不是map或bean,容器抛出异常 如果“target”表达式是一个bean,但是bean不具有“property”定义的成员变量,容器抛出异常。,标签,用于移除一个属性,var属性必须是字符串!不能是一个表达式,可选的,但是如果不写,则移除所有作用域中的属性,结果:,userstatus已经移除,所以此后的el表达式不会打印任何东西,标签,三种添加外部资源的方法 include指令 静态的:在jsp转换成java代码的时候,从file属性指定的文件中向当前页面添加内容 include标准动作 动态的:在请求的时候,从page属性指定的页面中向当前页面添加内容 jstl标签 动态的:在请求的时候,从url属性指定的资源向当前页面添加内容。与相似,但是更加强大和灵活,url可以来自容器外部,标签,定制添加的内容 jsp header.jsp,标签,复习:servlet url重写,获取session,在url后面附加session id信息,在value中设置的url后添加jsessionid,在jsp中进行url重写,标签,使用处理参数 用http请求的get方法传递参数 处理url编码问题 url中应避免不安全的或保留的字符,如空格用“+”替换 在标签体中使用,结果是:,标签,使用var属性 可选属性,将url值赋予一个变量,以后使用,标签,jsp错误处理 使用page指令的iserrorpage和errorpage属性 errorpage.jsp badpage.jsp,标签,在dd中为整个web应用配置错误页面 使用 使用 在错误页中使用隐含对象exception处理异常,可以在特定jsp中使用page指令的errorpage属性重载以上定义,可以是具体的异常类型,必须是绝对地址,对应web应用的根,标签,使用标签捕获和处理异常,抛出的异常被捕获,不会触发错误页,结果:,标签,使用的var属性 只有的页面才可以使用exception隐含对象 如何在引起错误的页面中处理异常?,创建了一个页面范围内的属性,并将exception对象赋予它,“myexception”属性是一个exception对象,实现了throwable接口,所以可以调用它的getmessage()方法,jsp tag家族,jsp tag家族,the “formatting” library internationalization formatting ,jsp tag家族,the “sql” library database access ,jsp tag家族,the “xml” library core xml actions xml flow control transform actions ,jsp tag家族,the “function” library collection length length string manipulation touppercase, tolowercase substring, substringafter,substringbefore trim replace indexof, startswith, endswith, contains, containsignorecase split, join escapexml,主要内容 自定义tag开发,tag files 如何使用自定义tag tag处理器 simple tag处理器 classic tag处理器 tag的嵌套访问,概述,什么是定制的标签(custom tag) 是一种用户自定义的jsp语言元素 容器将jsp转化成servlet时,tag被转化成对tag处理器的操作 运行时,容器调用这些操作 也称为自定义标签 自定义标签的特点 可以通过调用它的页面传递来的属性进行定制化 可以向调用它的页面传回变量 可以访问jsp页面可用的所有对象 可以互相通信 可以嵌套,并通过私有变量通信,概述,创建tag处理器的方法 tag files 用于开发展现为中心的自定义tag 可利用已经存在的标签库 可供不懂java的页面编辑人员使用 被容器转化成simple tag处理器 simple tags 只能用于在属性值或tag体中不使用脚本的tag中 classic tags 只能用于在属性值或tag体中需要使用脚本的tag中,tag files,复习:向jsp中动态添加可复用的内容 通过和创建嵌入的文件可以使用的请求参数,这样可以定制嵌入的文件的行为 问题 只是为了给嵌入的文件一些客户化信息,就创建新的请求参数? 请求参数能否将客户发送的表单中的数据作为请求的一部分? 应用会经常添加或变更请求参数,用它们给嵌入的文件传值是否清晰? 怎样使嵌入的内容容易理解?,tag files,使用tag file 将需嵌入的文件扩展名改为.tag header.tag 将以上tag文件放到一个目录下,如web-inf/tags 在源jsp中使用taglib指令,并调用tag,tag文件存放的位置,tag的名字就是tag文件的文件名,tag files,给tag flie传递数据 使用tag的属性 在jsp中调用tag 在tag文件header.tag中使用属性 问题 使用tag时,如何快速知晓属性名? 属性是可选的还是必需的? 属性只能是一个字符串文本吗?能不能用表达式?,tag属性的作用域限制在tag内部,tag files,属性指令 header.tag 使用tag的jsp页面,属性是必需的,属性可以是字符串文本或表达式,tag files,使用tag体传递大段文本 在jsp中调用tag tag file:header.tag,被替换成tag body中的内容,tag files,使用tag指令的body-content属性声明tag体的内容 属性值 scriptless: 缺省值,表示不能有脚本元素。脚本元素是java代码片断();表达式();和声明() empty: tag体中不能有内容 tagdependent: 将tag体看作纯文本,el, tags和脚本将不被求值,例子: 在jsp中调用tag tag file:header.tag,tag files,tag files,容器查找tag文件的方法 web-inf/tags目录 web-inf/tags的子目录 web-inf/lib目录的jar文件中的meta-inf/tags目录 web-inf/lib目录的jar文件中的meta-inf/tags的子目录 如果tag文件部署在jar文件中,则对应该tag文件必须有一个tld 为什么不统一使用tld声明tag?,必须有一个tld与之对应,如何使用自定义tag,认识tag library descriptor (tld) tld描述了 el函数(el functions) 自定义tag 用el函数扩展el的功能 通过el表达式调用一个pojo上的静态方法 通过四个步骤完成 写一个具有公共静态方法的java类 写tld文件,它实现了定义函数功能的java类到调用函数的jsp页面间的映射 在jsp中使用taglib指令 使用el调用该函数,如何使用自定义tag,功能方法必须是公共静态的,函数名rollit()来自于tld中的name,而不是实际java类中的方法名,uri属性将tld的名字告诉容器,以便容器知道jsp调用el函数时应调用哪个java方法,如何使用自定义tag,部署el函数 提供函数方法的java类必须能被web应用的各部分访问到,所以应该部署到web-inf/classes目录中 tld文件放在web-inf目录或其子目录中,并保证jsp中的taglib指令的uri属性与tld的元素匹配,调用el函数的jsp页面,声明了函数类,方法签名和函数名的tld,定义了函数功能的java类,说明“user”属性是一个运行时表达式属性(即不能是字符串文本)。如果值为“false”或不定义该元素,则只能使用字符串文本作为属性值,如何使用自定义tag,用tld描述自定义tag,该tag(不是值)是强制性的,指明tag库的版本,强制性的,主要为工具使用,在taglib指令中使用的唯一名字,必需的,在tag中使用,如,可选的,必需的,当jsp中使用tag时,容器调用该类,必需的,说明tag体为空,如果tag有属性,则每个tag属性必须有一个元素,如何使用自定义tag,使用自定义tag 使用simple tag的jsp,与tld中的元素值匹配,此处可以使用el,因为的值为“true”(假定“username”属性已经存在)。 属性值可以是三种表达式: el表达式; 脚本表达式,如 / 标准动作,如 $username tld定义为空时,仍可以使用,tld定义了tag不能有体,所以使用空标签,如何使用自定义tag,自定义tag处理器 simple tag处理器扩展了simpletagsupport 实现了两个关键方法 dotag(): 执行实际工作 setuser(): 接收属性值的方法,当jsp使用tld中定义的名字调用tag时,容器调用dotag()方法,容器调用该方法,从tag属性中设置值。使用javabean property命名规则:“user”属性应该传递给setuser()方法,如何使用自定义tag,tag体中的内容 tld中元素的定义 empty tag不能有tag体 scriptless tag不能有脚本元素(代码片断、脚本表达式、声明),但是可以是文字、el和自定义或标准动作 tagdependent tag体被看作纯文本,所以el, tags和动作将不被求值 jsp tag体可以是jsp中能使用任何东西,如何使用自定义tag,容器怎样找到tld 建立uri到tld实际位置的映射 jsp2.0以前,在dd中配置 jsp2.0,web应用部署时,容器自动在tld文件和名字间建立映射,在dd中可以没有条目 容器首先查找dd中是否有,如果有则使用它创建map 如果没有,则在特定位置查找tld,并为tag库建立map,如何使用自定义tag,容器在四个地方寻找tld文件 直接在web-inf中找 在web-inf的子目录中找 在web-inf/lib中的jar文件的meta-inf目录中找 在web-inf/lib中的jar文件的meta-inf的子目录中找,tag处理器,tag处理器是执行tag工作的java类 比el函数更强大和灵活 tag处理器类可以访问 tag属性 tag体 page context,因此可以获得各个作用域中的属性及请求和响应 自定义tag处理器分为 classic tag处理器 jsp2.0以前的tag处理器 simple tag处理器 jsp2.0引入的简单模型,结合jstl和tag file,几乎可以满足所有可能遇到的需求,simple tag处理器,创建一个simple tag处理器 写一个扩展simpletagsupport的类 重载dotag()方法,simple tag处理器,为tag创建tld: simple.tld,simple tag处理器,部署tag处理器和tld 将tld放到web-inf中 将tag处理器类按照包结构放到web-inf/classes中 编写使用tag的jsp: usetag.jsp,simple tag处理器,simple tag api simple tag处理器必须实现simpletag接口 最简单的方法是扩展simpletagsupport类 一般只需重载dotag()方法,有一些寿命周期方法。当tag被调用时,容器调用这些方法,一般只需要扩展该类,需要重载,工具方法,simple tag处理器,simple tag的寿命周期,自己编写相关代码,重载该方法,处理器获得到pagecontext的一个引用(pagecontext是jspcontext的子类),嵌套的tag可以父子之间进行通信,如果tag有属性,则调用每个属性的setter方法(这里将处理一个特殊的异常),如果tag有tag体,则将它封装成jspfragment的实例传到此方法中,真正执行tag的业务逻辑,simple tag处理器,在tag体中使用el 调用tag的jsp页面 tag处理器的dotag()方法,先设置属性然后调用tag体,处理tag体,将它打印到响应。null参数意思是输出到response对象上,还可以传进其它writer对象,tag被调用时,“message”还不是一个属性,simple tag处理器,tag体的迭代处理 调用tag的jsp页面 tag处理器的dotag()方法,将属性值设置成数组中的下一个元素值,tag被调用时,“movie”属性还不存在,tag处理器迭代调用,并设置它的值,simple tag处理器,处理有属性的tag 需要在tld中设置属性 在tag处理器中为每个属性提供一个bean类型的setter方法 例子,simple tag处理器,为属性写一个setter方法。该方法名必须与tld中的属性名匹配,在tld中定义属性,simple tag处理器,jspfragment类 代表了jsp代码 能运行并产生输出 容器将tag体封装成jspfragment,并传回tag处理器的setjspbody()方法 jspfragment不能包含任何脚本元素 可以包含文本、标准和自定义动作、el表达式 可以将jspfragment对象传给其它对象,而这些对象可以调用jspfragment的getjspcontext()方法 getjspcontext()方法是tag体向其它对象传递信息的媒介 如果想获得tag体的内容,可以用invoke(java.io.writer)方法将内容传给writer,然后从writer中获得内容进一步处理,simple tag处理器,使用javax.servlet.jsp.skippageexception中止处理页面 让tag抛出skippageexception异常,不会输出出来,simple tag处理器,只能中止直接调用tag的页面,pagea.jsp包含了pageb.jsp,pageb.jsp调用tag,tag处理器的dotag()方法,中止了pageb,但是pagea依然运行,不会输出出来,pagea依然运行!,classic tag处理器,tag处理器api,classic tag处理器,简单的classic tag处理器 调用classic tag的jsp tld,classic tag处理器,classic tag处理器,扩展tagsupport,表示是一个classic tag处理器,重载dostarttag()方法,没有声明ioexception!,从tagsupport继承了pagecontext成员变量,而simpletag中使用getjspcontext()方法,必须使用try/catch,必须返回一个int告诉容器下一步该怎么办。skip_body表示忽略tag体,classic tag处理器,处理tag体 simple tag处理器在调用jspfragment的invoke()方法是处理tag体 classic tag处理器在dostarttag()和doendtag()方法之间处理tag体 使用tag的jsp 方法一:simple tag处理器,classic tag处理器,方法二:classic tag处理器,处理tag体,simple tag处理器 可以方便迭代处理 tag体,但classic tag处理器行吗?,classic tag处理器,classic tag的寿命周期,嵌套的tag可以父子之间进行通信,如果tag有属性,则调用每个属
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 4491-3:2025 EN Metallic powders - Determination of oxygen content by reduction methods - Part 3: Hydrogen-reducible oxygen
- 西藏支教活动方案
- 河南焊工考试题及答案
- 国企金融考试题及答案
- 关于林果考试题及答案
- 股票期权考试题及答案
- 高考日语考试题及答案
- 幼儿园教学教案设计:安全用书包
- (正式版)DB15∕T 3643-2024 《气象灾害风险评估技术规范 暴雨》
- (正式版)DB15∕T 3393-2024 《绿色勘查技术规程》
- 风电居间协议合同协议
- 2025-2030中国偏头痛药行业市场发展趋势与前景展望战略研究报告
- 2025年新会计法培训课件
- 小米生态链企业的协同发展与供应链优化
- 2025年大学生信息素养大赛(省赛)考试题库(附答案)
- 2025年度汽车报废回收企业股权转让与资源利用合同
- 劳动合同范本合同模板
- 2025年公务员遴选结构化面试万能修订稿
- 氢气安全知识培训课件
- DBJ51-T 184-2021 四川省预成孔植桩技术标准
- 电商行业农产品电商运营与推广策略方案
评论
0/150
提交评论