课件J2EE架构与程序设计_第1页
课件J2EE架构与程序设计_第2页
课件J2EE架构与程序设计_第3页
课件J2EE架构与程序设计_第4页
课件J2EE架构与程序设计_第5页
已阅读5页,还剩265页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

J2EE架构与程序设计主讲:XXX西北工业大学软件与微电子学院J2EE架构与程序设计主讲:XXX第六章JSP(上)第六章JSP(上)主要内容JSP基本语法JSP运行机制JSP寿命周期管理JSP属性主要内容JSP基本语法概述JSP最终以servlet方式在容器中运行容器将JSP文件翻译成servlet类的源文件(.java),然后将其编译成servletclass以和手工编写servlet同样的方式运行servlet概述JSP最终以servlet方式在容器中运行概述例子JSP:BasicCounter.jsp工具类:Counter.javaJava代码片断概述例子Java代码片断概述部署方法

Tomcat访问若将包目录和类文件放在WEB-INF/classes目录下,则web应用的所有部分都能访问到它http://localhost:8080/testJSP1/BasicCounter.jsp概述部署方法若将包目录和类文件放在WEB-INF/classJSP基本语法指令(directive)一个JSP元素,用来给JSP容器一个说明,在翻译的时候被解释。有三种JSP指令:page,include,taglibpage指令定义与页面相关的属性,JSP2.0定义了13种属性import定义将在生成的servlet类中添加的Javaimport语句。缺省情况下自动加入:java.lang,javax.servlet,javax.servlet.http,javax.servlet.jspisThreadSafe定义生成的servlet是否实现SingleThreadModel。缺省值为“true”,表示web应用是线程安全的,不需要实现SingleThreadModel。若值为“false”,表示生成的servlet实现SingleThreadModelcontentType定义JSP响应的MIME类型isELIgnored定义当JSP页面翻译的时候,是否EL表达式被忽略JSP基本语法指令(directive)JSP基本语法isErrorPage定义当前的页面是否为另一个JSP页面的错误页面。缺省值为“false”。如果值为“true”,页面可以访问隐含的exception对象;否则不能访问errorPage定义一个URL资源,未捕获的异常将发送到该资源。如果该资源为JSP页面,则该页面有一个isErrorPage=“true”的page指令language定义在脚本、表达式和声明中使用的脚本语言,现在其值只能为“java”extends定义本JSP页面将被容器编译成的servlet类的超类session定义该JSP页面是否有一个隐含的session对象,缺省为“true”JSP基本语法isErrorPageJSP基本语法buffer定义隐含的out对象如何处理缓冲,参考JspWriterautoFlush定义缓冲了的输出是否自动提交(flush),缺省值为“true”info定义一个字符串,它可以放进转换后的JSP页面,并可以通过servlet的getServletInfo()方法获得pageEncoding定义JSP页面的字符编码。缺省值为:“ISO-8859-1”JSP基本语法bufferJSP基本语法例子:使用import属性导入外部的包导入一个包导入多个包注意@符号用逗号分隔JSP基本语法例子:使用import属性导入外部的包注意@符JSP基本语法include指令定义一段文字或代码,它可以在当前页面被解析时加入其中增强了代码的复用性例如:<%@includefile=”wickedHeader.html”%>taglib指令定义JSP可以使用的标签库例如:<%@taglibtagdir=”/WEB-INF/tags/cool”prefix=”cool”%>JSP基本语法include指令JSP基本语法表达式(expression)表达式在运行时转化成out.print()的参数不能将返回值为void的方法作为表达式注意“=”符号JSP基本语法表达式(expression)注意“=”符JSP基本语法声明(declaration)在java代码片断(scriptlet)中定义的变量所有的java代码片断和表达式代码都在一个service方法中,所以在java代码片断中声明的变量总是本地变量!生成的servlet代码在:yourTomcatHomeDir/work/Catalina/yourServerName/yourWebAppName/org/apache/jspJSP基本语法声明(declaration)所有的java代JSP基本语法如何定义静态变量?JSP声明用于声明生成的servlet类的成员,即变量和方法<%!和%>间的部分将被添加到service方法之外可以定义静态变量和方法变量定义注意“!”符号JSP基本语法如何定义静态变量?注意“!”符号JSP基本语法方法定义JSP基本语法方法定义JSP运行机制容器如何处理JSP查找指令,获取解析JSP所需的信息创建HttpServlet子类对于Tomcat5而言,生成的servlet扩展如果有一个具有import属性的page指令,将import声明写在类前面的包声明之后对于Tomcat5而言,包声明为:如果有声明(declarations),就将它们写入类文件,通常在类声明之后,service方法之前创建service方法,方法名为_jspService()。它将被servlet超类的重载service()方法调用,并接收HttpServletRequest和HttpServletResponse。容器声明并初始化所有隐含对象将HTML文本、java代码片断、表达式整理到service方法中,格式化并写入PrintWriter响应输出JSP运行机制容器如何处理JSPJSP运行机制一个例子JSP运行机制一个例子JSP运行机制隐含对象封装了其它隐含对象。通过它可以获得其他隐含对象和属性的引用在errorpage中使用JSP运行机制隐含对象封装了其它隐含对象。通过它可以获得其他JSP寿命周期管理JSP寿命周期容器实例化servlet并运行jspInit()方法对象现在成为一个servlet,准备接收客户请求容器创建一个新的线程来处理客户请求,servlet的_jspService()方法运行以后与传统servlet处理方式无异转换和编译工作仅进行一次JSP寿命周期管理JSP寿命周期容器实例化servlet并运JSP寿命周期管理生成的servlet容器从JSP生成一个类,它实现HttpJspPage接口jspInit()方法从init()方法调用,可重载jspDestroy()方法从destroy()方法调用,可重载_jspService()方法从service()方法调用,不能重载。完全由容器开发商从JSP代码生成JSP寿命周期管理生成的servletJSP寿命周期管理初始化JSP可以在JSP中进行生成的servlet初始化配置servlet初始化参数JSP声明重载jspInit()方法JSP寿命周期管理初始化JSP重载jspInit()方法JSP属性使用四种隐含对象get/set属性对应四种不同的作用域除了标准的servletrequest,session和context作用域外,增加了page作用域对应pageContext对象JSP属性使用四种隐含对象get/set属性JSP属性在JSP中,可以只通过pageContext隐含对象,get/set任何作用域中的属性pageContextJSP属性在JSP中,可以只通过pageContext隐含对思考与讨论题JSP指令有哪些,怎样表示JSP表达式的本质JSP声明怎样转换成Java代码JSP运行机制JSP隐含对象有哪些,与标准servletAPI对象如何对应?JSP的寿命周期怎样自定义地初始化一个JSPJSP的四种作用域思考与讨论题JSP指令有哪些,怎样表示思考与讨论题JSP指令有哪些,怎样表示JSP表达式的本质JSP声明怎样转换成Java代码JSP运行机制JSP隐含对象有哪些,与标准servletAPI对象如何对应?JSP的寿命周期怎样自定义地初始化一个JSPJSP的四种作用域思考与讨论题JSP指令有哪些,怎样表示主要内容JSP(下)JavaBean标准动作(StandardAction)JSP表达式语言(EL)其他JSP标准动作IncludeForward主要内容JSP(下)JavaBean标准动作(Standa概述将所有的Java代码写在JSP页面中是一种坏习惯Web页面设计师可能不懂Java在JSP中写Java代码使其难于更改和维护解决方案Action是一种JSP元素,它可以作用于隐含对象和其他服务器端对象,或定义新的脚本变量遵从XMLelement语法规范:starttag,body,endtag;tag必须使用前缀分为标准Action和自定义ActionEL提供了一种调用Java代码的简单方法可以部分地取代JSP中的Java代码片断和表达式使用EL,不需要在JSP中写方法的代码,可以写在JSP外部,用EL调用EL对非Java程序员来说更简单,对Java程序员来说更容易维护概述将所有的Java代码写在JSP页面中是一种坏习惯JavaBean标准动作JavaBean标准动作目标:消除JSP中的脚本(Java代码片断、声明、表达式)例子:ServletJSPJavaBean标准动作JavaBean标准动作JavaBean标准动作用<jsp:useBean>声明和初始化一个bean属性用<jsp:getProperty>获取bean对象型属性的属性值用<jsp:useBean>创建一个bean如果<jsp:useBean>找不到一个名为“person”的属性对象,它就创建一个生成的servlet根据id和scope的值检查bean,如果不存在相应bean对象,它就用class中的值实例化一个对象,并把它赋予id,然后将它设置成scope中的一个属性标识一个JavaBean标准动作声明bean对象的标识符声明bean对象的类声明bean对象的属性范围标识标准动作标识实际的bean对象。与<jsp:useBean>标签中的“id”值匹配标识属性名(在bean类中用get/set方法读取和设置)缺省为“page”不能是抽象的,且必须有一个无参数的构造方法JavaBean标准动作用<jsp:useBean>声明和初JavaBean标准动作容器生成的servlet的_jspService()方法根据id的值定义一个变量。这个变量可以被JSP的其它部分引用试图在tag中定义的作用域中获取属性,并将结果赋予id变量如果在定义的作用域中没有一个具有这样名字的属性最后,在定义的作用域中将这个新对象设置为一个属性JavaBean标准动作容器生成的servlet的_jspSJavaBean标准动作<jsp:setProperty>设置bean属性值作为<jsp:useBean>元素体的<jsp:setProperty>当useBean有元素体时,才加入代码;利用反射机制的通用的设置属性方法,等价于person.setName(“Fred”);AttributePropertyPropertyvalue<jsp:useBean>元素体中的代码运行是有条件的。只有当找不到bean型属性,并且创建了一个新的bean时才运行JavaBean标准动作<jsp:setProperty>当JavaBean标准动作多态bean引用<jsp:useBean>标签的type属性生成的servlet类引用类型是抽象类PersonBean对象类型是具体类Employeetype可以是:类、抽象类或接口type用于定义bean(可以是抽象的);class用于实例化bean(必须是具体的),有:typex=newclass()JavaBean标准动作多态bean引用引用类型是抽象类PeJavaBean标准动作<jsp:useBean>标签中使用type属性,不使用class属性如果在给定作用域中存在名为id的bean对象属性,该bean对象满足type定义,则可以运行Else,则抛出异常:判断题servletJSPJavaBean标准动作<jsp:useBean>标签中使用JavaBean标准动作在<jsp:setProperty>标签中使用param属性例子:直接将请求发送到JSP,不经过servletHTMLTestBean.jsp使用param属性与请求参数名相同JavaBean标准动作在<jsp:setProperty>进一步改进JavaBean标准动作使用与Beanproperty同名的请求参数HTMLTestBean.jsp如果请求参数与beanproperty名匹配,则不需在<jsp:setProperty>标签中为该属性赋值遍历并找到与请求参数匹配的beanproperty名,并将其值设为相应的请求参数值Bean标签可以从请求参数自动转换到String和原数据类型的propertyJavaBean标准动作使用与Beanproperty同名JavaBean标准动作Beanproperty的类型不是String或原类型打印person的dog的名字ServletJavaBean标准动作Beanproperty的类型不是JavaBean标准动作result.jsp<jsp:getProperty>只能访问bean型属性的properties,不能访问嵌套的propertiesDog’snameis:SpikeDog’snameis:foo.Dog@799338实际是调用了toString()方法JavaBean标准动作result.jsp<jsp:getJSP表达式语言(EL)EL提供了一种调用Java代码的简单方法用EL获取嵌套的bean类型属性的property相当简单使用非Java语法解构EL通常写在大括号中,前面加$符号第一个变量是隐含对象或属性JSP表达式语言(EL)EL提供了一种调用Java代码的简单JSP表达式语言(EL)都是Map对象是对pageContext对象的引用(pageContext是一个JavaBean)除了pageContext外,EL隐含对象与JSP脚本中使用的隐含对象不同JSP表达式语言(EL)都是Map对象是对pageConteJSP表达式语言(EL)使用“.”操作符可以访问property和Map的值左边只能是Map或Bean右边必须是一个Map的key或一个bean的property名右边必须遵循Java命名规则必须以字母、下划线或$符号开始不能用Java保留关键字……JSP表达式语言(EL)使用“.”操作符JSP表达式语言(EL)使用[]操作符左边还可以是List或数组右边还可以是数字、能转换成数字的其他类型、其他不符合Java命名规则的标志符对于Bean和Map,“.”和“[]”操作符可以互换如果[]中不是字符串,将被求值(看作属性或隐含对象)优先JSP表达式语言(EL)使用[]操作符优先JSP表达式语言(EL)例子ServletJSP结果JSP表达式语言(EL)例子JSP表达式语言(EL)在括号中使用嵌套表达式ServletJSP结果JSP表达式语言(EL)在括号中使用嵌套表达式JSP表达式语言(EL)EL隐含对象作用域属性的Map请求参数的Map请求的header的MapCookie的Map上下文初始化参数的Map不是Map,是对pageContext对象的引用,相当于BeanJSP表达式语言(EL)EL隐含对象作用域属性的Map请求参JSP表达式语言(EL)Scope隐含对象使用Scope隐含对象获取各个作用域中的属性,不是属性对象的properties为了获得各个作用域的properties,需要使用pageContext意思是:pageContext有一个requestproperty,request有一个methodproperty请求参数对于特定参数名只有一个参数值时用param隐含对象对于特定参数名有多个参数值时用paramValues隐含对象JSP表达式语言(EL)Scope隐含对象JSP表达式语言(EL)例子:HTMLJSPJSP表达式语言(EL)例子:JSP表达式语言(EL)获得服务器主机信息使用HttpServletRequest对象的getHeader(String)方法使用隐含对象header/headerValues获得cookie获得上下文初始化参数DD没有getCookie(cookieName)方法!JSP表达式语言(EL)获得服务器主机信息没有getCookJSP表达式语言(EL)在EL中使用其它操作符算术操作符+,-,*,/(div),%(mod)逻辑操作符&&(and),||(or),!(not)关系操作符==(eq),!=(ne),<(lt),>(gt),<=(le),>=(ge)例子JSP表达式语言(EL)在EL中使用其它操作符JSP表达式语言(EL)Servlet代码JSP代码falsetruefalsetruefalsetruefalseInfinity“num”属性自动转换成intInteger自动转换成它的原类型优先级:从左到右在标签中可以使用ELJSP表达式语言(EL)Servlet代码falsetrueinclude标准动作重用代码段的两种方法Include指令Include标准动作例子需复用的JSP文件Header.jsp使用两种方法复用Header.jsp的Contact.jsp二者效果完全相同,但是底层实现却不同include标准动作重用代码段的两种方法include标准动作生成的servlet代码(取自_jspService()方法)Header.jsp使用include指令的JSP使用include标准动作的JSPinclude标准动作生成的servlet代码(取自_jspinclude标准动作异同点Include指令在转换JSP页面时将Header.jsp源码插入客户端请求Contact.jsp页面,容器读取Contact.jsp并开始一个转换过程容器看到include指令,将Header.jsp和Contact.jsp的源代码组合在一起,并把它转换成servlet的Java源文件容器将转换而来的源文件编译成servlet类。此后与其他servlet运行过程相同。以前的步骤不会再进行。include标准动作异同点客户端请求Contact.jspinclude标准动作Include标准动作在运行时将Header.jsp的响应插入客户端请求Contact.jsp页面,容器读取Contact.jsp并开始一个转换过程容器看到include标准动作,并使用它在生成的servlet代码中插入一个方法调用,该方法调用可以在运行时动态地将Header.jsp的响应加入Contact.jsp的响应中。容器为两个JSP都生成servlet容器将转换而来的源文件编译成servlet类。生成的servlet类文件加载到容器的虚拟机中并初始化。然后,容器为请求分配一个线程并调用JSP的_jspService()方法Contactservlet调用执行动态include的方法,依不同产品实现的方法不同。include标准动作Include标准动作在运行时将Heainclude标准动作使用<jsp:param>定制嵌入的页面的内容在源页面和嵌入的页面之间传递请求参数<jsp:include>标签可以有内容,在其中添加嵌入的页面可用的请求参数主页面嵌入的文件只能用于include标准动作,不能用于include指令include标准动作使用<jsp:param>定制嵌入的页forward标准动作<jsp:forwardpage=“target.jsp”/>作用相当于RequestDispatcherBuffer在forward发生之前就被清空了例子使用forward标准动作的页面Hello.jsp请求转发至的页面HandleIt.jspforward标准动作<jsp:forwardpage=“思考与讨论题JavaBean标准动作的使用方法JavaBean标准动作中使用多态BeanEL的语法“.”和“[]”的区别EL的隐含对象Include指令和标准动作的异同思考与讨论题JavaBean标准动作的使用方法主要内容JSTL核心tag变量相关tag流控制tagURL管理tag其它tag主要内容JSTL核心tag概述需求创建自己的动作尽量避免在JSP中编码脚本将页面设计与Java编码工作分离方案标准的定制化标签库:JSPStandardTagLibrary直接使用J2EE提供的JSTL标签避免编写定制化标签处理器完全自定义的标签库需要自己编写定制化标签处理器部署自己编写的标签使用自己编写的标签概述需求<c:out>标签格式化输出处理特异化字符实际得到想得到显示效果显示效果pageContent是一个Bean类型的属性,它有一个名为currentTip的property,值为“<b></b>tagsmakethingsbold”<c:out>标签格式化输出实际得到想得到显示效果显示效果p<c:out>标签显式地声明特异字符的转换方式:使用c:out的escapeXml属性设置值为true表示上表中的字符转换成对应的实体码设置值为false表示把字符以HTML方式解析并显示缺省值为truec:out的安全价值:输出所有用户字符串时使用c:out标签,设定escapeXml=true,避免不良脚本运行的机会显示效果<c:out>标签显式地声明特异字符的转换方式:使用c:ou<c:out>标签为Null值提供缺省的输出Null值渲染成空字符为c:out标签使用default属性定义缺省输出还可以这样表示:显示成如果value属性为null,则使用缺省值作为输出<c:out>标签为Null值提供缺省的输出显示成如果val<c:forEach>标签在一个集合上迭代,每次对应一个集合元素把集合中的每个元素赋予用var属性定义的变量每轮迭代变量的值会改变,保存集合中的每个元素,其作用域为标签内部集合,可以是:数组、Collection、Map、用逗号分割的字符串等<c:forEach>标签在一个集合上迭代,每次对应一个集合<c:forEach>标签使用varStatus属性varStatus属性创建了一个新变量,它是一个javax.servlet.jsp.jstl.core.LoopTagStatus对象LoopTagStatus类有一个count成员变量,作用是给出当前迭代记数值<c:forEach>标签使用varStatus属性<c:forEach>标签<c:forEach>标签的begin,end属性用于选择集合的一个子集作为迭代集<c:forEach>标签的step属性用于跳过特定元素<c:forEach>标签<c:forEach>标签的beg<c:if>标签设定条件按照test属性的值是否为true有条件地执行标签体JSPinputComments.jsp<c:if>标签设定条件<c:choose>标签<c:choose>和<c:when><c:otherwise>一起组成if…elseif…else结构<c:choose>标签<c:choose>和<c:when<c:set>标签设置beanproperty、Map、属性变量的值有var属性的<c:set>标签没有标签体有标签体可选属性,设定变量的范围如果在指定的作用域中没有指定的属性,则创建一个(假设value属性不为空)按照value属性计算结果的类型,自动设定var属性的类型计算标签体的值,并把它设置成var变量的值如果value计算结果为null,变量将被移除<c:set>标签设置beanproperty、Map、属<c:set>标签有target属性的<c:set>标签没有标签体有标签体如果target是一个Map,设置键值为“dogName”的元素值target必须不为空如果target是一个bean,设置property“dogName”的值可以是字符串或表达式必须是对象,不能是属性的“id”名<c:set>标签有target属性的<c:set>标签如果<c:set>标签注意事项不能同时使用“var”和“target”属性Scope是可选的,缺省值为page作用域如果“value”为空,则“var”命名的属性将被移除如果“var”命名的属性不存在,它就被创建,但前提是“value”不为空如果“target”表达式为空,容器抛出异常“target”不能设置成属性名,而是实际的属性对象如果“target”表达式不是Map或Bean,容器抛出异常如果“target”表达式是一个bean,但是bean不具有“property”定义的成员变量,容器抛出异常。<c:set>标签注意事项<c:remove>标签用于移除一个属性Var属性必须是字符串!不能是一个表达式可选的,但是如果不写,则移除所有作用域中的属性结果:userStatus已经移除,所以此后的EL表达式不会打印任何东西<c:remove>标签用于移除一个属性Var属性必须是字符<c:import>标签三种添加外部资源的方法Include指令静态的:在JSP转换成Java代码的时候,从file属性指定的文件中向当前页面添加内容Include标准动作动态的:在请求的时候,从page属性指定的页面中向当前页面添加内容<c:import>JSTL标签动态的:在请求的时候,从URL属性指定的资源向当前页面添加内容。与<jsp:include>相似,但是更加强大和灵活,URL可以来自容器外部<c:import>标签三种添加外部资源的方法<c:import>标签定制添加的内容JSPHeader.jsp<c:import>标签定制添加的内容<c:url>标签复习:servletURL重写获取session在URL后面附加sessionID信息在value中设置的URL后添加JSESSIONID在JSP中进行URL重写<c:url>标签复习:servletURL重写获取ses<c:url>标签使用<c:url>处理参数用HTTP请求的get方法传递参数处理url编码问题url中应避免不安全的或保留的字符,如空格用“+”替换在<c:url>标签体中使用<c:param>结果是:<c:url>标签使用<c:url>处理参数结果是:<c:url>标签使用var属性可选属性,将URL值赋予一个变量,以后使用<c:url>标签使用var属性<c:catch>标签JSP错误处理使用page指令的isErrorPage和errorPage属性errorPage.jspbadPage.jsp<c:catch>标签JSP错误处理<c:catch>标签在DD中为整个web应用配置错误页面使用<exception-type>使用<error-code>在错误页中使用隐含对象exception处理异常可以在特定JSP中使用page指令的errorPage属性重载以上定义可以是具体的异常类型必须是绝对地址,对应web应用的根<c:catch>标签在DD中为整个web应用配置错误页面可<c:catch>标签使用<c:catch>标签捕获和处理异常抛出的异常被捕获,不会触发错误页结果:<c:catch>标签使用<c:catch>标签捕获和处理异<c:catch>标签使用<c:catch>的var属性只有<%@pageisErrorPage=“true”%>的页面才可以使用exception隐含对象如何在引起错误的页面中处理异常?创建了一个页面范围内的属性,并将exception对象赋予它“myException”属性是一个exception对象,实现了Throwable接口,所以可以调用它的getMessage()方法<c:catch>标签使用<c:catch>的var属性创建JSPTag家族JSPTag家族JSPTag家族The“Formatting”libraryInternationalization<fmt:message><fmt:setLocale><fmt:bundle><fmt:setBundle><fmt:param><fmt:requestEncoding>Formatting<fmt:timeZone><fmt:setTimeZone><fmt:formatNumber><fmt:parseNumber><fmt:parseDate>JSPTag家族The“Formatting”librJSPTag家族The“SQL”libraryDatabaseaccess<sql:query><sql:update><sql:setDataSource><sql:param><sql:dateParam>JSPTag家族The“SQL”libraryJSPTag家族The“XML”libraryCoreXMLactions<x:parse><x:out><x:set>XMLflowcontrol<x:if><x:choose><x:when><x:otherwise><x:forEach>Transformactions<x:transform><x:param>JSPTag家族The“XML”libraryJSPTag家族The“function”libraryCollectionlengthlengthStringmanipulationtoUpperCase,toLowerCasesubstring,substringAfter,substringBeforetrimreplaceindexOf,startsWith,endsWith,contains,containsIgnoreCasesplit,joinescapeXmlJSPTag家族The“function”librar主要内容自定义Tag开发TagFiles如何使用自定义TagTag处理器SimpleTag处理器ClassicTag处理器Tag的嵌套访问主要内容自定义Tag开发TagFiles概述什么是定制的标签(CustomTag)是一种用户自定义的JSP语言元素容器将JSP转化成servlet时,Tag被转化成对Tag处理器的操作运行时,容器调用这些操作也称为自定义标签自定义标签的特点可以通过调用它的页面传递来的属性进行定制化可以向调用它的页面传回变量可以访问JSP页面可用的所有对象可以互相通信可以嵌套,并通过私有变量通信概述什么是定制的标签(CustomTag)概述创建tag处理器的方法TagFiles用于开发展现为中心的自定义Tag可利用已经存在的标签库可供不懂Java的页面编辑人员使用被容器转化成simpletag处理器SimpleTags只能用于在属性值或tag体中不使用脚本的tag中ClassicTags只能用于在属性值或tag体中需要使用脚本的tag中概述创建tag处理器的方法TagFiles复习:向JSP中动态添加可复用的内容<jsp:include><c:import>通过<jsp:param>和<c:param>创建嵌入的文件可以使用的请求参数,这样可以定制嵌入的文件的行为问题只是为了给嵌入的文件一些客户化信息,就创建新的请求参数?请求参数能否将客户发送的表单中的数据作为请求的一部分?应用会经常添加或变更请求参数,用它们给嵌入的文件传值是否清晰?怎样使嵌入的内容容易理解?TagFiles复习:向JSP中动态添加可复用的内容TagFiles使用TagFile将需嵌入的文件扩展名改为.tagHeader.tag将以上tag文件放到一个目录下,如WEB-INF/tags在源JSP中使用taglib指令,并调用tagTag文件存放的位置Tag的名字就是tag文件的文件名TagFiles使用TagFileTag文件存放的位置TTagFiles给tagflie传递数据使用tag的属性在JSP中调用tag在Tag文件Header.tag中使用属性问题使用tag时,如何快速知晓属性名?属性是可选的还是必需的?属性只能是一个字符串文本吗?能不能用表达式?Tag属性的作用域限制在Tag内部TagFiles给tagflie传递数据Tag属性的作用TagFiles属性指令Header.tag使用tag的JSP页面属性是必需的属性可以是字符串文本或表达式TagFiles属性指令属性是必需的属性可以是字符串文本或TagFiles使用tag体传递大段文本在JSP中调用tagTagFile:Header.tag被替换成tagbody中的内容TagFiles使用tag体传递大段文本被替换成tagbTagFiles使用tag指令的body-content属性声明tag体的内容属性值scriptless:缺省值,表示不能有脚本元素。脚本元素是Java代码片断(<%...%>);表达式(<%=…%>);和声明(<%!...%>)empty:tag体中不能有内容tagdependent:将tag体看作纯文本,EL,tags和脚本将不被求值TagFiles使用tag指令的body-content属例子:在JSP中调用tagTagFile:Header.tagTagFiles例子:TagFilesTagFiles容器查找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与之对应TagFiles容器查找Tag文件的方法必须有一个TLD与如何使用自定义Tag认识TagLibraryDescriptor(TLD)TLD描述了EL函数(ELfunctions)自定义Tag用EL函数扩展EL的功能通过EL表达式调用一个POJO上的静态方法通过四个步骤完成写一个具有公共静态方法的Java类写TLD文件,它实现了定义函数功能的Java类到调用函数的JSP页面间的映射在JSP中使用taglib指令使用EL调用该函数如何使用自定义Tag认识TagLibraryDescri如何使用自定义Tag功能方法必须是公共静态的函数名rollIt()来自于TLD中的name,而不是实际Java类中的方法名uri属性将TLD的名字告诉容器,以便容器知道JSP调用EL函数时应调用哪个Java方法如何使用自定义Tag功能方法必须是公共静态的函数名rollI如何使用自定义Tag部署EL函数提供函数方法的Java类必须能被Web应用的各部分访问到,所以应该部署到WEB-INF/classes目录中TLD文件放在WEB-INF目录或其子目录中,并保证JSP中的taglib指令的uri属性与TLD的<rui>元素匹配调用EL函数的JSP页面声明了函数类,方法签名和函数名的TLD定义了函数功能的Java类如何使用自定义Tag部署EL函数调用EL函数的JSP页面声明说明“user”属性是一个运行时表达式属性(即不能是字符串文本)。如果值为“false”或不定义该元素,则只能使用字符串文本作为属性值如何使用自定义Tag用TLD描述自定义Tag该tag(不是值)是强制性的,指明tag库的版本强制性的,主要为工具使用在taglib指令中使用的唯一名字必需的,在tag中使用,如<my:advice>可选的必需的,当JSP中使用tag时,容器调用该类必需的,说明tag体为空如果tag有属性,则每个tag属性必须有一个<attribute>元素说明“user”属性是一个运行时表达式属性(即不能是字符串文如何使用自定义Tag使用自定义tag使用SimpleTag的JSP与TLD中的<uri>元素值匹配此处可以使用EL,因为<rtexprevalue>的值为“true”(假定“userName”属性已经存在)。属性值可以是三种表达式:①EL表达式;②脚本表达式,如<mine:adviceuser=‘<%=request.getAttribute(“username”)%>’/>③<jsp:attribute>标准动作,如<mine:advice><jsp:attributename=“user”>${userName}</jsp:attribute></mine:advice>TLD定义<body-content>为空时,仍可以使用<jsp:attribute>TLD定义了tag不能有体,所以使用空标签如何使用自定义Tag使用自定义tag与TLD中的<uri>元如何使用自定义Tag自定义tag处理器Simpletag处理器扩展了SimpleTagSupport实现了两个关键方法doTag():执行实际工作setUser():接收属性值的方法当JSP使用TLD中定义的名字调用tag时,容器调用doTag()方法容器调用该方法,从tag属性中设置值。使用JavaBeanproperty命名规则:“user”属性应该传递给setUser()方法如何使用自定义Tag自定义tag处理器当JSP使用TLD中定如何使用自定义TagTag体中的内容TLD中<body-content>元素的定义<body-content>empty</body-content>Tag不能有tag体<body-content>scriptless</body-content>tag不能有脚本元素(代码片断、脚本表达式、声明),但是可以是文字、EL和自定义或标准动作<body-content>tagdependent</body-content>tag体被看作纯文本,所以EL,tags和动作将不被求值<body-content>JSP</body-content>tag体可以是JSP中能使用任何东西如何使用自定义TagTag体中的内容如何使用自定义Tag容器怎样找到TLD建立uri到TLD实际位置的映射JSP2.0以前,在DD中配置JSP2.0,Web应用部署时,容器自动在TLD文件和<uri>名字间建立映射,在DD中可以没有<taglib>条目容器首先查找DD中是否有<taglib>,如果有则使用它创建map如果没有,则在特定位置查找TLD,并为tag库建立map如何使用自定义Tag容器怎样找到TLD如何使用自定义Tag容器在四个地方寻找TLD文件直接在WEB-INF中找在WEB-INF的子目录中找在WEB-INF/lib中的JAR文件的META-INF目录中找在WEB-INF/lib中的JAR文件的META-INF的子目录中找如何使用自定义Tag容器在四个地方寻找TLD文件Tag处理器Tag处理器是执行tag工作的Java类比EL函数更强大和灵活Tag处理器类可以访问tag属性tag体pagecontext,因此可以获得各个作用域中的属性及请求和响应自定义tag处理器分为Classictag处理器JSP2.0以前的tag处理器Simpletag处理器JSP2.0引入的简单模型,结合JSTL和TagFile,几乎可以满足所有可能遇到的需求Tag处理器Tag处理器是执行tag工作的Java类SimpleTag处理器创建一个SimpleTag处理器写一个扩展SimpleTagSupport的类重载doTag()方法SimpleTag处理器创建一个SimpleTag处理器SimpleTag处理器为Tag创建TLD:simple.tldSimpleTag处理器为Tag创建TLD:simpleSimpleTag处理器部署tag处理器和TLD将TLD放到WEB-INF中将tag处理器类按照包结构放到WEB-INF/classes中编写使用tag的JSP:useTag.jspSimpleTag处理器部署tag处理器和TLDSimpleTag处理器SimpletagAPISimpletag处理器必须实现SimpleTag接口最简单的方法是扩展SimpleTagSupport类一般只需重载doTag()方法有一些寿命周期方法。当tag被调用时,容器调用这些方法一般只需要扩展该类需要重载工具方法SimpleTag处理器SimpletagAPI有一些SimpleTag处理器Simpletag的寿命周期自己编写相关代码重载该方法处理器获得到PageContext的一个引用(PageContext是JspContext的子类)嵌套的tag可以父子之间进行通信如果tag有属性,则调用每个属性的setter方法(这里将处理一个特殊的异常)如果tag有tag体,则将它封装成JspFragment的实例传到此方法中真正执行tag的业务逻辑SimpleTag处理器Simpletag的寿命周期自己SimpleTag处理器在tag体中使用EL调用tag的JSP页面tag处理器的doTag()方法先设置属性然后调用tag体处理tag体,将它打印到响应。null参数意思是输出到response对象上,还可以传进其它writer对象tag被调用时,“message”还不是一个属性SimpleTag处理器在tag体中使用EL先设置属性然后SimpleTag处理器tag体的迭代处理调用tag的JSP页面tag处理器的doTag()方法将属性值设置成数组中的下一个元素值tag被调用时,“movie”属性还不存在,tag处理器迭代调用,并设置它的值SimpleTag处理器tag体的迭代处理将属性值设置成数SimpleTag处理器处理有属性的tag需要在TLD中设置属性在tag处理器中为每个属性提供一个Bean类型的setter方法例子SimpleTag处理器处理有属性的tagSimpleTag处理器为属性写一个setter方法。该方法名必须与TLD中的属性名匹配在TLD中定义属性SimpleTag处理器为属性写一个setter方法。该方SimpleTag处理器JspFragment类代表了JSP代码能运行并产生输出容器将tag体封装成JspFragment,并传回tag处理器的setJspBody()方法JspFragment不能包含任何脚本元素可以包含文本、标准和自定义动作、EL表达式可以将JspFragment对象传给其它对象,而这些对象可以调用JspFragment的getJspContext()方法getJspContext()方法是tag体向其它对象传递信息的媒介如果想获得tag体的内容,可以用invoke(java.io.Writer)方法将内容传给Writer,然后从Writer中获得内容进一步处理SimpleTag处理器JspFragment类SimpleTag处理器使用javax.servlet.jsp.SkipPageException中止处理页面让tag抛出SkipPageException异常不会输出出来SimpleTag处理器使用javax.servlet.jSimpleTag处理器只能中止直接调用tag的页面PageA.jsp包含了PageB.jspPageB.jsp调用tagtag处理器的doTag()方法中止了PageB,但是PageA依然运行不会输出出来PageA依然运行!SimpleTag处理器只能中止直接调用tag的页面PagClassicTag处理器Tag处理器APIClassicTag处理器Tag处理器APIClassicTag处理器简单的Classictag处理器调用classictag的JSPTLDClassicTag处理器简单的Classictag处理ClassicTag处理器Classictag处理器扩展TagSupport,表示是一个Classictag处理器重载doStartTag()方法没有声明IOException!从TagSupport继承了pageContext成员变量,而SimpleTag中使用getJspContext()方法必须使用try/catch必须返回一个int告诉容器下一步该怎么办。SKIP_BODY表示忽略tag体ClassicTag处理器Classictag处理器扩展ClassicTag处理器处理tag体Simpletag处理器在调用JspFragment的invoke()方法是处理tag体Classictag处理器在doStartTag()和doEndTag()方法之间处理tag体使用tag的JSP方法一:Simpletag处理器ClassicTag处理器处理tag体ClassicTag处理器方法二:Classictag处理器处理tag体Simpletag处理器可以方便迭代处理tag体,但Classictag处理器行吗?ClassicTag处理器方法二:Classictag处ClassicTag处理器Classictag的寿命周期嵌套的tag可以父子之间进行通信如果tag有属性,则调用每个属性的setter方法doAfterBody()使得可以在tag体运行之后做一些工作,不像其它方法,它可以被多次调用通常在doStartTag()或doAfterBody()之后被调用一次在tag被第一次调用时实例化,以后容器可以复用它给处理器一个到PageContext的引用在doStartTag()和doEndTag()之间处理tag体ClassicTag处理器Classictag的寿命周期ClassicTag处理器寿命周期取决于返回值根据doStartTag()的返回值,容器判断是否处理tag体(假设有)根据doEndTag()的返回值,容器判断是否继续处理调用tag的页面返回值是int型,在Tag和IterationTag接口中定义扩展TagSupport时可能的返回值doStartTag()doAfterBody()doEndTag()SKIP_BODYEVAL_BODY_INCLUDESKIP_BODYEVAL_BODY_AGAINSKIP_PAGEEVAL_PAGE只有它在IterationTag接口中定义,其他都在Tag中定义象在Simpletag中抛出SkipPageException异常一样ClassicTag处理器寿命周期取决于返回值SKIP_BClassicTag处理器关系图ClassicTag处理器关系图ClassicTag处理器IterationTag接口用于迭代处理tag体doAfterBody()方法的返回值为EVAL_BODY_AGAIN,则容器再次处理tag体doAfterBody()方法的返回值为SKIP_BODY,则容器调用doEndTag()方法用Classictag处理器处理Simpletag器迭代处理tag体的例子ClassicTag处理器IterationTag接口用于ClassicTag处理器迭代处理tag体的Classictag处理器代码doAfterBody()是在tag被处理后调用的,所以为了避免第一轮“movie”属性轮空,加入这两行代码ClassicTag处理器迭代处理tag体的ClassicClassicTag处理器注意doStartTag()和doEndTag()只运行一次如果想让tag体被处理,必需重载doStartTag()方法Simpletag处理器不被容器复用,而Classictag处理器可以被容器池化并复用,所以必须小心实例变量的值,最好在doStartTag()中重置如果TLD中声明tag体为空,则doStartTag()方法必须返回SKIP_BODY!ClassicTag处理器注意ClassicTag处理器访问tag体内容通过继承BodyTagSupport,可以获得两个寿命周期方法setBodyContent(BodyContent)doInitBody()还得到了doStartTag()方法的一个新的返回值:EVAL_BODY_BUFFERED,它还是缺省值BodyContent实际是一个java.io.Writer,所以可以将它转换成其它IO流ClassicTag处理器访问tag体内容ClassicTag处理器实现BodyTag接口的tag的寿命周期ClassicTag处理器实现BodyTag接口的tag的Tag的嵌套访问嵌套tag可以访问它的父tag一个嵌套tag用Classictag处理器获得父tag用Simpletag处理器获得父tagTag的嵌套访问嵌套tag可以访问它的父tag用ClassiTag的嵌套访问使用getParent()方法,Classictag可以访问父ClassictagSimpletag既可以访问父Simpletag,也可以访问父Classictag例子:子tag访问父tag的属性JSPTag的嵌套访问使用getParent()方法,Tag的嵌套访问SimpleInnertag处理器ClassicParenttag处理器Tag的嵌套访问SimpleInnertag处理器Tag的嵌套访问获得任意祖先tag使用TagSupport和SimpleTagSupport的findAncestorWithClass()方法起始tag需要定位的tag的类型找到第一个是指定的类的实例的tagTag的嵌套访问获得任意祖先tag起始tag需要定位的tag思考与讨论题TagFile的开发方法SimpleTag处理器的开发方法ClassicTag处理器的开发方法SimpleTag和ClassicTag的寿命周期比较Simpletag处理器与Classictag处理器开发的异同点如何访问tag的父及祖先tag思考与讨论题TagFile的开发方法J2EE架构与程序设计主讲:XXX西北工业大学软件与微电子学院J2EE架构与程序设计主讲:XXX第六章JSP(上)第六章JSP(上)主要内容JSP基本语法JSP运行机制JSP寿命周期管理JSP属性主要内容JSP基本语法概述JSP最终以servlet方式在容器中运行容器将JSP文件翻译成servlet类的源文件(.java),然后将其编译成servletclass以和手工编写servlet同样的方式运行servlet概述JSP最终以servlet方式在容器中运行概述例子JSP:BasicCounter.jsp工具类:Counter.javaJava代码片断概述例子Java代码片断概述部署方法

Tomcat访问若将包目录和类文件放在WEB-INF/classes目录下,则web应用的所有部分都能访问到它http://localhost:8080/testJSP1/BasicCounter.jsp概述部署方法若将包目录和类文件放在WEB-INF/classJSP基本语法指令(directive)一个JSP元素,用来给JSP容器一个说明,在翻译的时候被解释。有三种JSP指令:page,include,taglibpage指令定义与页面相关的属性,JSP2.0定义了13种属性import定义将在生成的servlet类中添加的Javaimport语句。缺省情况下自动加入:java.lang,javax.servlet,javax.servlet.http,javax.servlet.jspisThreadSafe定义生成的servlet是否实现SingleThreadModel。缺省值为“true”,表示web应用是线程安全的,不需要实现SingleThreadModel。若值为“false”,表示生成的servlet实现SingleThreadModelcontentType定义JSP响应的MIME类型isELIgnored定义当JSP页面翻译的时候,是否EL表达式被忽略JSP基本语法指令(directive)JSP基本语法isErrorPage定义当前的页面是否为另一个JSP页面的错误页面。缺省值为“false”。如果值为“true”,页面可以访问隐含的exception对象;否则不能访问errorPage定义一个URL资源,未捕获的异常将发送到该资源。如果该资源为JSP页面,则该页面有一个isErrorPage=“true”的page指令language定义在脚本、表达式和声明中使用的脚本语言,现在其值只能为“java”extends定义本JSP页面将被容器编译成的servlet类的超类session定义该JSP页面是否有一个隐含的session对象,缺省为“true”JSP基本语法isErrorPageJSP基本语法buffer定义隐含的out对象如何处理缓冲,参考JspWriterautoFlush定义缓冲了的输出是否自动提交(flush),缺省值为“true”info定义一个字符串,它可以放进转换后的JSP页面,并可以通过servlet的getServletInfo()方法获得pageEncoding定义JSP页面的字符编码。缺省值为:“ISO-8859-1”JSP基本语法bufferJSP基本语法例子:使用import属性导入外部的包导入一个包导入多个包注意@符号用逗号分隔JSP基本语法例子:使用import属性导入外部的包注意@符JSP基本语法include指令定义一段文字或代码,它可以在当前页面被解析时加入其中增强了代码的复用性例如:<%@includefile=”wickedHeader.html”%>taglib指令定义JSP可以使用的标签库例如:<%@taglibtagdir=”/WEB-INF/tags/cool”prefix=”cool”%>JSP基本语法include指令JSP基本语法表达式(expression)表达式在运行时转化成out.print()的参数不能将返回值为void的方法作为表达式注意“=”符号JSP基本语法表达式(expression)注意“=”符JSP基本语法声明(declaration)在java代码片断(scriptlet)中定义的变量所有的java代码片断和表达式代码都在一个service方法中,所以在java代码片断中声明的变量总是本地变量!生成的servlet代码在:yourTomcatHomeDir/work/Catalina/yourServerName/yourWebAppName/org/apache/jspJSP基本语法声明(declaration)所有的java代JSP基本语法如何定义静态变量?JSP声明用于声明生成的servlet类的成员,即变量和方法<%!和%>间的部分将被添加到service方法之外可以定义静态变量和方法变量定义注意“!”符号JSP基本语法如何定义静态变量?注意“!”符号JSP基本语法方法定义JSP基本语法方法定义JSP运行机制容器如何处理JSP查找指令,获取解析JSP所需的信息创建HttpServlet子类对于Tomcat5而言,生成的servlet扩展如果有一个具有import属性的page指令,将import声明写在类前面的包声明之后对于Tomcat5而言,包声明为:如果有声明(declarations),就将它们写入类文件,通常在类声明之后,service方法之前创建service方法,方法名为_jspService()。它将被servlet超类的重载service()方法调用,并接收HttpServletRequest和HttpServletResponse。容器声明并初始化所有隐含对象将HTML文本、java代码片断、表达式整理到service方法中,格式化并写入PrintWriter响应输出JSP运行机制容器如何处理JSPJSP运行机制一个例子JSP运行机制一个例子JSP运行机制隐含对象封装了其它隐含对象。通过它可以获得其他隐含对象和属性的引用在errorpage中使用JSP运行机制隐含对象封装了其它隐含对象。通过它可以获得其他JSP寿命周期管理JSP寿命周期容器实例化servlet并运行jspInit()方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论