1、第3章 JSP基础,Java Web程序设计,3.1 JSP技术概述,JSP技术,3.1 JSP技术概述,JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。该技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。 JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。 在传统的网页HTML文件(*htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.js
2、p)。 Web服务器在遇到访问JSP网页的首次请求时,先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。 所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求可以达到最低。,第一个JSP程序示例,JSP页面元素,JSP页面元素示例,JSP页面元素示例欢迎你,你是第位访问者,伪指令,声明,脚本,表达式,3.2 JSP页面的生命周期,JSP技术,3.2.1 JSP的Servlet本质,JSP是嵌入了Java代码的HTML代码,而Servlet则是嵌入了HTML
3、代码的Java代码。 尽管JSP从结构上来说不同于Servlet,但实际运行时,JSP是转换为Servlet来运行的。 JSP容器将JSP页面解析为一个对应的Servlet类,然后编译、装载、执行该Servlet类。 此Servlet类的输出流发送至客户端。,3.2.2 JSP页面的生命周期阶段,JSP生命周期阶段,3.3 JSP指令,JSP技术,JSP指令概述,JSP指令用来向JSP容器(或称JSP引擎)提供编译信息。 JSP中有三种伪指令: page指令:用于指定整体JSP页面的属性。 include指令:用于通知JSP容器将当前JSP页面中内嵌的,在指定位置上的资源内容。 taglib指
4、令:允许JSP页面开发者自定义标签。通过使用标签库,在当前页面中启用定制行为。(将在第6章中详细介绍),指令通用格式, 指令必须放在标签内。 指令名、属性名以及属性值对大小写敏感。 属性值必须放置在一对单引号或双引号内。 属性-值对之间可以放置一个或多个空格,但是=与属性值之间不允许有空格。,3.2.1 page指令,page指令的基本语法格式如下:,page_directive_attr_list :=language=“scriptingLanguage“ 脚本语言,只能是java import=“importList“ 导入的包或类名列表,用逗号分隔 session=“true|fals
5、e“ 是否使用Session对象,默认true errorPage=“error_url“ 发生异常时指向的页面URL isErrorPage=“true|false“ 是否为处理异常的页面,默认false contentType=“ctinfo“ 指定MIME类型和页面的编码方式 pageEncoding=“characterSet” 指定页面的编码方式 info=“ info_text“ 页面描述,可以通过servlet.getServletInfo()获得 buffer=“none|sizekb“ 指定输出流是否有缓冲区,默认8KB autoFlush=“true|false“ 指定缓冲
6、区满足时是否自动清除,默认true isELIgnored=“true|false“ 是否忽略EL表达式,默认false isThreadSafe=“true|false“ 指定JSP文件是否能够多线程使用,默认true extends=“className“ 生成的Servlet的父类,极少使用,import属性,import属性是page指令中唯一可以多次指定的属性。 如果存在重复导入并不会产生错误,只是重复的项目会自动被忽略。 import属性可以使用以下两种形式进行设置:默认的导入的包有四个: java.lang javax.servlet javax.servlet.http jav
7、ax.servlet.jsp,contentType属性与pageEncoding属性,contentType属性指定页面响应的MIME类型和JSP字符编码。pageEncoding属性指定字符集。默认情况下是:可以通过设置contentType属性改变JSP输出的MIME类型,从而实现一些特殊功能。例如:,errorPage属性和isErrorPage属性, ., . 处理请求时出错:.,hasError.jsp,errorHandler.jsp,注意:错误处理页面并非必须是一个jsp页面,使用静态html页面也可以。只是静态页面中不能使用脚本元素或表达式元素产生动态信息。,session属
8、性,session属性用于指定页面是否需要一个HTTP会话。 默认为true,即表示需要使用会话。 如果设置session属性为false,则只是不能在当前页面访问session或创建新的session,并不能影响其他页面使用session,也不会删除已有的session。 如果JSP页面不需要会话,设置session属性值为false可以避免创建不必要的会话,从而可以防止内存消耗和占用CPU时间,因此从性能角度上来说是有意义的。,buffer属性和autoFlush属性,buffer属性指定输出缓冲区的大小,取值为none或xKB。该缓冲区存储响应内容,直到发送给客户端为止。 缓冲区默认的大
9、小取决于具体的JSP引擎,但JSP规范中强制要求缓冲区大小不能小于8KB。 若指定缓冲区大小为none,则直接将数据发送给客户端。 autoFlush属性用于指定当缓冲区满时,是否自动将数据发送到客户端,默认为true。 如果autoFlush属性取值为false,而缓冲区已满,若此时试图添加更多数据到缓冲区中则会抛出异常。 以下设置是无效的:,3.2.2 include指令,include指令格式如下:file是include指唯一且必须的属性。 include指令将在JSP编译时插入其他文件。 被包含的文件可以是JSP文件、HTML文件、文本文件等。 可以把一个复杂的JSP页面分成几部分,
10、使用include指令进行整合,从页提高开发效率,增强页面的可维护性。,Header,side,Body,Footer,include指令实现静态包含,静态包含是指在JSP源码被转换成Servlet源码和被编译之前将文件复制到其中。 由于静态包含是生成一个合并后的整体文件,因此其各个组成文件是在同一个作用域范围内,在各个文件中定义的变量、方法均是共享的 即在各个文件中定义的变量、方法均是全局的。 使用include指令需要注意的问题: 由于静态包含是在转换阶段发生的,因此file属性值不能是一个动态的表达式。 由于请求参数是请求阶段的属性,而在静态转换阶段无效,因此file属性值中不能向被包含
11、文件传递参数。 由于被包含文件之间可以共享变量,因此要尽可能降低各文件之间的耦合度。,3.4 声明、表达式、脚本和注释,JSP技术,3.3.1 声明,JSP声明用于产生类文件中类的属性和方法。声明后的变量和方法可以在JSP页面中的任意位置使用,但仅限于当前页面。,3.3.2 表达式,JSP表达式用于将Java表达式的运行结果输出在页面上。格式为:表达式在JSP请求处理阶段计算其值,再把所得到的结果转换成字符串并与HTML标签中的数据组合在一起。 注意: 表达式不是语句,后面不能加分号。 表达式开始标签%=中的%和=之间不能有空格。,表达式示例, 正确的JSP表达式示例 整数值: 双精度变量:
12、算术表达式1+2*3: 布尔值: 布尔表达式: 由方法返回的字符串: 封装类对象实例: 错误的JSP表达式示例 不能有分号: 不能进行表达式的嵌套: 不能调用返回类型声明为void的方法: %和=之间不能有空格:,3.3.3 脚本,JSP脚本即嵌入在JSP页面中的Java代码。格式为:一个JSP页面中可以包含任意数量的脚本。如果存在多个脚本,则多个脚本按其在JSP页面中的顺序合并成一个大的脚本。 提示:尽量不要将脚本任意分隔,散布在JSP页面的各个角落,因为这会造成代码难以维护,可读性差。 脚本中的代码应该完全遵循Java语言的代码编写规范。, 输出循环次数: “);out.print(i+“
13、); %,public final class index2_jsp extends HttpJspBase int count = 10;public void _jspService(.) response.setContentType(“text/html; charset=UTF-8“);out = pageContext.getOut();out.write(“输出循环次数:“);out.print(count);out.write(“rn“);int i;for(i=0;i“);out.print(i+“); ,声明中的变量转换成类的属性,表达式等价于out.print()语句,脚
14、本中声明的变量是方法中的局部变量,JSP页面,JSP转换成的类,3.3.4 注释,注释的作用是增加代码的可读性。JSP页面中的注释主要有三种方式: JSP注释(隐藏注释) 格式: 只在JSP页面中可见,不会在类文件中看到,不发送到客户端 JSP注释不能嵌套 HTML注释 格式: 由页面生的html中包含,会在客户端显示,通过客户端浏览器的查看源代码可以看到。 与普通HTML注释不同的是,这种注释可以使用JSP表达式。 脚本中的Java注释:遵循Java注释语法规定 单行注释格式:/ 注释 多行注释格式:/* 注释 */ 会出现在转换后的类文件中。,. out.write(“); out.write(“); out.write(“); /脚本中的Java注释 out.write(“); .,JSP页面源代码,在客户端查看源代码,转换后的类文件,