您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第六章JSP脚本和指令的使用
《JAVAWeb应用程序》教案第六章JSP脚本和指令的使用目标★理解JSP脚本元素的组成★使用表达式,Scriptlet和声明进行JSP编程★使用JSP指令的page指令,include指令和taglib指令进行jsp编程重点★讲授如何使用JSP脚本和指令编写JSP难点★利用taglib指令使用标签1回顾:2知识点讲解2.1JSP脚本元素2.1.1表达式:利用属性或方法在页面上输出信息案例讲解bodyh1JSP表达式/h1bPI的值:/b%=Math.PI%br/b100,99中最大的值:/b%=Math.max(100,99)%br/b100,99中最小的值:/b%=Math.min(100,99)%br/b3+2-5的值:/b%=3+2-5%br/b(3+2)==5的值:/b%=(3+2)==5%br/b(3+2)!=5的值:/b%=(3+2)!=5%br//body注意:不能用分号来作为表达式的结束符2.1.2Scriptlet案例讲解注意:脚本段将被插入的到servlet的service方法中。脚本段可以使用任何隐含对象和任何jsp:UseBean声明过的对象;脚本段如果由显示内容,这些内容将被存在out对象中2.1.3声明在文档中定义方法和属性%!Declaration;%注意:一个声明只在一个页面中有效不能在在%和!之间有空格%=Expression%案例讲解%for(inti=1;i10;i++){for(intj=1;j=i;j++){out.println(j);}out.println(br);}%%!//申明一个常量finalStringSEPARATOR=.;//声明一个方法publicStringcovertAmountWithSeparator(Stringmoney){intindex=money.indexOf(SEPARATOR);Stringstr=money;if(index==-1)str=money+.00;returnstr;}%2.2指令:提供整个JSP页面相关的信息,并且用来设定JSP页面的相关属性2.2.1page指令:定义全局属性,这些属性将被用于和JSP容器通信。%@page[language=java]脚本语言的种类,目前只支持(JSP2。0规范)java[extends=package.class]定义JSP页面产生的Servlet是继承自那个父类,属性值是完整的限定类名必须为HttpJspPage接口的类,通常不要使用这个属性,JSP容器会提供转换后的Servlet类的父类[import={package.class|package.*},...]定义可以使用那些java的API,可以是逗号分割的列表。[session=true|false]是否需要会话,默认为true[buffer=none|8kb|sizekb]指明out对象使用的输出流缓存的大小,默认为8K,在设置为none时,所有的输出直接通过ServletResponse和PrintWriter对象写出。[autoFlush=true|false]该属性用于指定当缓冲区满的时候,缓存的输出是否应该自动刷新默认为true[isThreadSafe=true|false]是否能处理来自多个线程的同步请求,如果设置为true,则向JSP容器表明这个页面可以同时被多个客户访问。[info=text][errorPage=relativeURL]发生错误后,网页被定位在那个URL[contentType=mimeType[;charset=characterSet]|text/html;charset=ISO-8859-1]JSP页面和MIME类型的编码方式[isErrorPage=true|false]是否为处理异常错误的网页注意:*%@page%对整个JSP页面起作用,也包括静态的包含文件。不论把他放在页面的那个位置,推荐放在页面的顶部*%@page%可以在JSP页面中出现多次,但其中的属性只能设置一次(import除外)*Import默认导入的是java.lang.*,javax.servlet.*;javax.servlet.jsp.*和javax.servlet.http.*2.2.2include指令%@includefile=””%可以包含jsp页面,html页面,文本和java代码案例讲解注意:被包含的文件中最好不要使用htmlbody等标签,这样可能会和原来页面中的标签重复,有可能导致错误原文件和被包含文件可以互相访问彼此定义的变量和方法,同时注意两个文件中的变量重名。2.2.3taglib指令%@tagliburi=”标签库表述符文件”prefix=”前缀名”%Uri必须是/WEB-INF/tags/开始3.本章总结[10分钟]4.考核点考核点1:考核点2:%@includefile=”date.jsp”%Date.jsp%Out.println(newjava.util.Date().ToLocaleString())%%@tagliburi=/mytaglib.tldprefix=mytags%5.扩展部分扩展部分1:一、JSP工作原理在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet。而这个引擎本身也是一个servlet,在WEBLOGIC中,它就是JspServlet。JSP引擎先把该JSP文件转换成一个Java源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功,JSP引擎用javac把该Java源文件编译成相应的class文件。然后创建一个该SERVLET的实例,该SERVLET的jspInit()方法被执行,jspInit()方法在servlet的生命周期中只被执行一次。然后jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的。如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet从内存中移去。当这种情况发生时jspDestroy()方法首先被调用,然后servlet实例便被标记加入“垃圾收集”处理。jspInit()及jspDestory()格式如下:可在jspInit()中进行一些初始化工作,如建立与数据库的连接,或建立网络连接,从配置文件中取一些参数等,在jspDestory()中释放相应的资源。%!publicvoidjspInit(){System.out.println(jspinit);}%%!publicvoidjspDestory(){System.out.println(jspDestory);}%二、服务端的输出缓冲区缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下,才会把该缓冲区的内容输出到客户端上:1.该JSP网页已完成信息的输出2.输出缓冲区已满3.JSP中调用了out.flush()或response.flushbuffer()输出缓冲区的大小可以用:%@pagebuffer=none|nkb%或response.setBufferSize()设置,如下:1、设置输出缓冲区的大小为1KB。%@pagebuffer=1kb%或response.setBufferSize(1);2、设置输出缓冲区的大小为0,即不缓冲。%@pagebuffer=none%或response.setBufferSize(0);用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节.用response.isCommitted()可检查看服务端是否已将数据输出到客户端.如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有。三、服务端输出重定向有以下3种方法可以做到输出重定向:(1)RESPONSE.SETREDERECT(URL)该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,使浏览器显示重定向网页的内容.response.sendRedirect();(2)下面的方法也能改变HTTPHEADER属性,它的原理和(1)是一样的.%response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);StringnewLocn=/index.html;response.setHeader(Location,newLocn);%(3)采用JSP:FORWORD该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在JSP:FORWORD之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.如下面的例子中(1)会输出index.html的内容,(2)不会输出index.html的内容,而是输出out.println(@@@@@@@@@@@@@@@@@);中的内容,并且在服务端会抛出:java.lang.IllegalStateException:Responsealreadycommitted异常,但客户端没有任何错误输出。(1)%@pagebuffer=1kb%%longi=0;for(i=0;i10;i++){out.println(@@@@@@@@@@@@@@@@@);}%jsp:forwardpage=./index.html/(2)%@pagebuffer=1kb%%longi=0;for(i=0;i600;i++){out.println(@@@@@@@@@@@@@@@@@);}%说明:1.方法(1),(2)可以使用变量表示重定向的地址;方法(3)不能使用变量表示重定向的地址。Stringadd=./index.html;jsp:forwardpage=add/无法重定向到index.html中去Stringadd=(add);可以重定向到中去。2.采用方法(1),(2)request中的变量(通过request.setAttribute()保存到request中的值)不能在新的页面中采用,采用方法(3)能.综上,我们应该采用(1),(2)重定向比较好。四、JSP中正确应用类应该把类当成JAVABEAN来用,不要在%%中直接使用.如下的代码(1)经过JSP引擎转化后会变为代码(2):从中可看出如果把一个类在JSP当成JAVABEAN使用,JSP会根据它的作用范围把它保存到相应的内部对象中.如作用范围为request,则把它保存到request对象中.并且只在第一次调用(对象的值为null)它时进行实例化.而如果在%%中直接
本文标题:第六章JSP脚本和指令的使用
链接地址:https://www.777doc.com/doc-2157887 .html