1.JSP页面的基本构成
JSP页面是指拓展名为.jsp
的文件。
在一个JSP页面中,可以包括指令标识、HTML代码、JavaScript代码、嵌入的Java代码、注释和JSP动作标识等内容。但这些内容并不是一个JSP页面所必需的。下面将通过一个简单的JSP页面说明JSP页面的构成。
2.指令标识
指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何输出到网页中的内容,也就是说指令标识对客户端浏览器是不可见的。 JSP指令标识的语法格式如下:
代码语言:javascript复制<%@ 指令名 属性1="属性值" 树形2="属性值"......%>
- 指令名:用于指定指令名称,在JSP中包含page,include和taglib3条指令。
- 属性:用于指定属性名称,不同的指令包含不同的属性。一个指令可以设置多个属性,各属性之间用分号隔离。
- 属性值:用于指定属性值。
1.page指令
这是JSP页面最常用的指令,用于定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成Servlet时会转换为相应的Java程序代码。page
指令的语法格式如下:
<%@ page 属性1="属性值1" 属性2="属性值2"...%>
page指令提供了language、contentType、import、autoFlush、buffer、errorPage、extends、info、isELIgnored、isErrorSafe和session共13个属性。 下面对常用的属性进行介绍:
属性 | 作用 |
---|---|
language | 设置JSP页面使用的语言 |
extends | 设置JSP页面继承的Java类,所有JSP页面在执行之前都会被服务器解析成Servlet,而Servlet是由Java类定义的,所以JSP和Servlet都可以继承制定的父类。 |
import | 设置JSP导入的类包。JSP页面可以嵌入Java代码片段,这些Java代码在调用API时需要导入相应的类包。 |
pageEncoding | 用于定义JSP页面的编码格式,也就是指定文件编码。JSP页面中的所有代码都使用该属性指定的字符集。 |
contentType | 设置JSP页面的MIME类型和字符编码,浏览器会据此显示页面内容。 |
session | 指定JSP页面是否使用HTTP的session会话对象。其属性值是boolean类型,可选值为true和false。 |
buffer | 设置JSP的out输出对象使用的缓冲区大小,默认大小是8KB,且单位只能使用KB。 |
autoFlush | 用于指定当缓冲区已满时,自动将缓冲区中的内容输出到客户端。该属性的默认值为true。如果设置成false,则当缓冲区已满时抛出"JSP Buffer overflow"异常。 |
isErrorPage | 该属性可以将当前JSP页面设置成错误处理页面来处理另一个JSP页面的错误,也就是异常处理,这意味着当前JSP页面业务的改变。 |
errorPage | 指定处理当前JSP页面异常错误的另一个JSP页面,指定的JSP错误处理页面必须设置isErrorPage属性为true。errorPage属性的属性值是一个url字符串。 |
2.include指令
通过include指令可以在JSP页面中包含另一个JSP页面,不过该指令是静态包含指令,也就是说被被包含文件中的所有内容会被原样包含到该JSP页面中,即使被包含文件中有JSP代码,在包含时不会被编译执行。使用include指令最终将生成一个文件,所以在被包含和包含的文件中不能有相同名称的变量。 include指令的语法格式如下:
代码语言:javascript复制<%@ include file="path"%>
该指令只有一个file属性,用于指定要包含文件的路径。该路径是相对路径,也可以是绝对路径,但不可以是通过<%=%>表达式所代表的文件。
3.taglib指令
在JSP文件中,可以通过taglib指令标识声明该页面中所使用的标签库,同时引用标签库,并指定标签的前缀。在页面中引用标签库后,就可以通过前缀来引用标签库中的标签。taglib指令的语法格式如下:
代码语言:javascript复制<%@ taglib prefix="tagPrefix" uri="tagURI"%>
- prefix属性:用于指定标签的前缀。该前缀不能命名为jsp、jspx、java、javax、sun、servlet和sunw。
- uri属性:用于指定标签库文件的存放位置。 例:在页面中引用JSTL中的核心代码库,实例代码如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3.脚本标识
JSP中的脚本标识包括JSP表达式(Expression)、声明标识(Declaration)和脚本程序(Scriptlet)。通过这些标识,在JSP页面中可以像编写Java程序一样来声明变量、定义函数或进行各种表达式的运算。
1.JSP表达式
JSP表达式用于向页面中输出信息,其语法格式如下:
代码语言:javascript复制<% = 表达式%>
- 表达式:可以是任何Java语言的完整表达式。该表达式的最终运算结果将转换为字符串。 例:使用JSP表达式在页面中输出信息,示例代码如下:
<%String manager="mr"; %> <!--定义保存管理员名的变量-->
管理员:<%=manager %> <!--输出结果为:管理员: mr-->
<%="管理员:" manager %> <!--输出结果为:管理员: mr -->
<%= 7 6 %> <!--输出结果为:13 -->
<%String url="head01.jpg";%><!--定义保存文件名称的变量-->
<img src="images/<%url %>"> <!--输出结果为:<img src="images/head01.jpg">-->
2.声明标识
声明表示用于在JSP页面中定义全局的变量或方法。通过声明表示定义的变量和方法可以被整个JSP页面访问,所以通常使用该标识定义整个JSP页面都需要引用的变量或方法。 声明标识的语法格式如下:
代码语言:javascript复制<%! 声明变量或方法的代码 %>
例:通过声明标识声明一个全局变量和全局方法:
代码语言:javascript复制<%!
int number = 0;//声明全局变量
int count(){//声明全局方法
number ;//累加number
return number;//返回number的值
}
%>
3.代码片段
所谓代码片段就是在JSP页面中嵌入的Java代码或脚本代码。代码片段将在页面请求的处理期间被执行,通过Java代码可以定义变量或流程控制语句等;而通过脚本代码可以应用JSP的内置对象在页面输出内容、请求处理和响应、访问session会话等。代码片段的语法格式如下:
代码语言:javascript复制<% Java代码或脚本代码 %>
代码片段的使用比较灵活,他所实现的功能是JSP表达式无法实现的。 例:通过代码片段和JSP表达式在JSP页面上输出九九乘法表。
代码语言:javascript复制<body>
<%
String str="";
for(int i=0;i<=9;i ){
for(int j=0;j<=9;j )
{
str =j "x" i "=" j*i;
str =" ";
}
str =<"br">;
}
%>
<div>
<ul>
<li id="title">九九乘法表</li>
<li><%=str%><!--输出九九乘法表--></li>
<ul>
</div>
</body>
4.注释
1.HTML中的注释
HTML中的注释不会被显示在网页中,但是在浏览器中选择查看网页源代码时还能够看到注释信息的。 HTML中注释的语法格式如下:
代码语言:javascript复制<!--注释文本-->
2.隐藏注释
在文档中添加的HTML注释虽然在浏览器中不显示,但是用户可以通过查看源代码看到这些注释信息,所以严格来说,这种注视是不安全的。不过JSP还提供了一种隐藏注释,这种注释不仅在浏览器中看不到,而且在查看HTML源代码时也看不到,所以这种注释的安全性比较高。 隐藏注释的语法格式如下:
代码语言:javascript复制<%-- 注释内容 --%>
3.动态注释
由于HTML注释对JSP嵌入的代码不起作用,因此可以利用他们的组合构成动态的HTML注释文本。 例如:在JSP页面中添加动态注释,代码如下:
代码语言:javascript复制<!--<%=new Date()%>-->
4.代码片段中的注释
代码语言:javascript复制// 注释内容 //1.单行注释
/* 注释内容*/ //2.多行注释
/** 提示信息 */ //3.提示文档注释
动作标识
JSP动作标识是在请求处理阶段按照在页面中出现的顺序被执行的,用于实现某些特殊用途(如操作JavaBean、包含其他文件、执行请求转发等)的标识。
1.操作JavaBean的动作标识
操作JavaBean实例并设置JavaBean各属性值,有以下两种语法格式。
- 不存在Body的语法格式
<jsp::useBean id="实例名" scope="范围" class="完整类名" beanName="完整类名" type="数据类型"/>
<jsp::setProperty name="JavaBean实例名" property="属性名" value="属性值" param="请求参数"/>
...<!--多个字动作标识<jsp::setProperty>-->
- 存在Body的语法格式
<jsp::useBean id="实例名" scope="范围" class="完整类名" beanName="完整类名" type="数据类型"/>
<jsp::setProperty name="JavaBean实例名" property="属性名" value="属性值" param="请求参数"/>
...<!--多个字动作标识<jsp::setProperty>-->
</jsp::useBean>
这两种语法格式的区别是:在页面中应用<jsp::useBean>
标识创建一个JavaBean实例时,如果该JavaBean是第一次被实例化,那么对于第二种语法格式,标识体内的内容会被执行,若已经存在指定的JavaBean实例,则标识体内的内容就不再被执行了。而对于第一种语法格式,无论在指定的范围内是否已经存在一个指定的JavaBean实例,<jsp::useBean>
标识后边的<jsp::setProperty>
子标识都会被执行。
<jsp::useBean>
标识的属性如下表:
属性名称 | 功能描述 |
---|---|
id | 用于指定创建的JavaBean实例的实例名,其属性值为合法的Java标识符 |
scope | 用于指定JavaBean实例的有效范围,其值可以是page(当前页面)、request(当前请求)、session(当前会话)和application(当前应用)4个,默认值是page。 |
class | 可选属性,用于指定一个完整的类名,包括该类所存在的路径。 |
type | 用于指定所创建的JavaBean实例的类型,可以与class属性或beanName属性的值完全相同 |
beanName | 可选属性,用于指定一个完整的类名,该类名中包括完整的包名。该属性与type属性一起使用。 |
- scope属性的可选值 |值| 说明 | |–|--| | page | 指定所创建的JavaBean实例只能在当前的JSP文件中使用,包括通过include指令静态包含的页面 | |request|指定所创建的JavaBean实例可以在请求范围内进行存取。一个请求的生命周期是从客户端向服务器发出一个请求到服务端响应这个请求给用户结束,所以请求结束后,存储在其中的JavaBean实例也就失效了| |session|指定所创建的JavaBean实例的有效范围为session。session是当前用户访问web应用时,服务器为用户创建的一个对象服务器通过session的ID值来区分用户。针对某一个用户而言,该范围的对象可被多个页面共享。| |qpplication|指定所创建的JavaBean实例的有效范围从服务器启动开始到服务器关闭结束。application对象是在服务器启动时创建,被多个用户所共享,所以该application对象的所有用户都可以访问该JavaBean实例。|
<jsp::setProperty>
子标识的常用属性
属性名称 | 功能描述 |
---|---|
name | 必要属性,用于指定一个JSP范围内的JavaBean实例名,该属性的值常与<jsp::useBean>的id属性相同。指定实例化后,<jsp::setProperty>标识将会按照page、request、session和application的顺序来查找这个JavaBean实例,直到第一个实例被找到。若任何范围不存在这个JavaBean实例,则会抛异常 |
property | 必要属性,用于指定JavaBean中的属性,其值可以是" * “或指定JavaBean中的属性。当取值为” * "时,则request请求中的所有参数的值将被一一赋给JavaBean中与参数具有相同名字的属性;若取值为JavaBean中的属性,则会将request请求终于该属性同名的一个参数的值赋给这个JavaBean属性,若此时指定了param属性,那么请求中参数的名称和JavaBean属性名可以不同 |
value | 用于指定具体的属性值,通常与property属性一起使用,但是该属性不能与param属性一起使用 |
parma | 用于指定一个request请求中的参数。通过该参数,可以允许将请求中的参数赋值与JavaBean属性不同名的属性。 |
2.获取JavaBean实例各属性的值
获取JavaBean实例各属性的值可以通过jsp::getProperty标识实现。其语法格式如下:
代码语言:javascript复制<jsp:getProperty name="JavaBean实例名" property="属性名"/>
- name属性:必要属性,用于指定一个JSP范围内的JavaBean实例名,该属性的值通常与
<jsp:useBean>
的id属性相同。指定实例后,<jsp:getProperty>
标识将按照page、request、session和application的顺序来查找这个JavaBean实例,直到第一个实例被找到。若任何范围内都不存在这个JavaBean实例,将会抛出异常。 - property属性:必要属性,用于指定要获取其属性值的JavaBean的属性。如果指定的属性为name,那么在JavaBean中必须存在一个getName()方法,否则会抛出下边的异常。
Cannot find any information on property 'name' in a bean of type 'com.wgh.UserInfo'
2.包含外部文件的动作标识<jsp:include>
通过JSP动作标识jsp:include,可以向当前页面中包含其他的文件。被包含的文件可以是动态文件,也可以是静态文件。
jsp:include动作标识的语法格式如下:
代码语言:javascript复制<jsp:include page="url" flush="false/true"/>
或
<jsp:include page="url" flush="false/true">
子动作标识<jsp:param>
</jsp:include>
- page属性:用于指定被包含文件的相对路径。
- flush属性:可选属性,用于设置是否刷新缓冲区,默认值为false。如果设置为true,则在当前页面输出使用了缓冲区的情况下先刷新缓冲区,然后再执行包含文件。
- 子动作标识jsp:param:用于向被包含的动态页面中传递参数。
3.执行请求转发的动作标识<jsp:forward>
通过jsp:forward动作标识可以将请求转发到其他的Web资源,例如另一个JSP页面,HTML页面、Servlet等。执行请求转发后,当前页面将不再执行,而是去执行该标识指定的目标页面。
<jsp:forward>
动作标识的语法格式如下:
<jsp:forward page="url"/>
或
<jsp:forward page="url">
子动作标识<jsp:param>
</jsp:forward>
- page属性:用于指定请求转发的目标页面。该属性可以是一个指定文件路径的字符串,也可以是表示文件路径的JSP表达式,但是请求被转向的目标文件必须是内部的资源,即当前应用中的资源。
- 子动作标识jsp:param:用于向转向的目标文件中传递参数。
设置参数的子动作标识<jsp:param>
JSP的动作标识jsp:param可以作为其他标识的子标识,用于为其他标识传递参数。语法格式如下:
代码语言:javascript复制<jsp:param name="参数名" value="参数值"/>
- name属性:用于指定参数名称。
- value属性:用于设置对应的参数值。
例如:通过jsp:param标识为jsp:forward标识指定参数,可以使用下面的代码:
代码语言:javascript复制<jsp:forward page="modify.jsp">
<jsp:param name="userId" value="7"/>
</jsp:forward>
上边的代码实现了将请求转到modify.jsp
页面的同时传递了参数userId,其参数为7.