JSP页面就是带有JSP元素的一个常规Web页面,它由模版文本和JSP元素组成。在JSP页面中,所有非JSP元素的内容为模版文本。模版文本可以是任何文本,如HTML、XML。甚至可以是纯文本。
JSP有3种类型的元素,它们分别为:脚本元素,指令元素和动作元素。具体各种元素包含的内容如下图16-9所示:
1 脚本元素
脚本元素允许用户将小段的代码添加到JSP页面中,例如,可以在加入一个条件判断语句,用来根据具体情况产生不同的HTML代码。脚本元素在页面被请求时执行。JSP脚本包括脚本、表达式、声明和注释。
1.1 JSP脚本
所谓脚本代码,就是JSP中的脚本小程序,在这个部分中几乎可以使用任何的Java语法。所以,JSP脚本又可称为Java程序片。一个JSP页面上可以拥有一个或多个程序片,这些程序片将被JSP引擎按顺序执行。在程序片中声明的变量称作JSP页面的局部变量。局部变量的有效范围与其声明的位置有关,即局部变量在JSP页面后继的所有程序片以及表达式部分内都有效。
【语法】
<% JSP脚本 %>,即在“<%”和“%>”的内部使用。
【示例】条件判断语句
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>使用脚本小程序</title>
</head>
<body>
<%
int a = 10; //定义局部变量
int b = 5; //定义局部变量
if (a > b) { //使用if条件语句判断大小
out.println(a);
} else {
out.println(b);
}
%>
</body>
</html>
1.2 表达式
JSP中的表达式可以看成一种简单的输出形式,但有一点需要注意的是,表达式一定是一个可以输出的值。
【语法】
<%= 表达式 %>
【示例】表达式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP表达式</title>
</head>
<body>
<%
String name = "张三"; //定义局部变量
int age = 25; //定义局部变量
%>
<h3>name=<%=name %></h3> <%--使用表达式输出变量,并用<h3>标签设置字体格式 --%>
<h3>age=<%=age %></h3> <%--使用表达式输出变量,并用<h3>标签设置字体格式--%>
<h3>sex=<%="男" %></h3> <%--使用表达式输出变量,并用<h3>标签设置字体格式--%>
</body>
</html>
1.3 JSP声明
使用此声明语法可以在内部定义全局变量、方法、类
【语法】
<%! %>
【示例】JSP声明
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>定义全局变量</title>
</head>
<body>
<%!public String name = "张三";//定义全局变量%>
<%!public int add(int x, int y) {//定义方法
return x + y;
}%>
<%!class Student {//定义实体类Student
private int id;
private String name;
private int age;
public Student(int id, String name, int age) {//有参构造
this.id = id;
this.name = name;
this.age = age;
}
public String toString() {//重写toString()方法
return "id=" + this.id + ",name=" + this.name + ",age=" + this.age;
}
}%>
<%
out.println("<h3>name=" + name + "<h3>");//输出全局变量name
out.println("<h3>3+5=" + add(3, 5) + "<h3>");//调用方法add(int x,int y)
out.println("<h3>" + new Student(1, "李四", 30) + "<h3>");//生成Student对象
%>
</body>
</html>
本程序分别在<%!%>中定义了全局变量、方法和类,但是因为在<%!%>中不能出现任何其他语句,所以又编写了一个普通的<%%>用于输出变量、调用方法和输出对象等操作。
值得注意的是,虽然可以在<%!%>中定义类或者方法,但是从开发的角度讲,这是不恰当的,当JSP需要类或者方法的时候,往往会通过JavaBean的形式调用。
1.4 JSP注释
在JSP中有两种注释的语法操作,一种是显式注释,这种注释客户端通过在网页中查看源代码是可以查看到的。一种是隐式注释,这种注释客户端无法看到。
【语法】
(1)显式注释
<!—注释内容-->
(2)隐式注释
//格式一:注释单行
/*格式二:注释多行*/
<%--格式三: JSP注释--%>
【示例】注释页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>注释</title>
</head>
<body>
<!—显示注释,客户端通过查看源码可以看到-->
<%--JSP注释--%>
<%
//java中提供的单行注释客户端无法看见
/*
Java中提供的多行注释,客户端无法看见
*/
%>
</body>
</html>
2 指令元素
2.1 page指令
page指令在JSP编程中尤为重要,使用此属性可以定义一个JSP页面的相关属性,在一个JSP页面中可以给出多个page指令,下面是page的几种常用的属性配置
(1)import属性:等同于java中的import语句,作用是导入操作包在一个JSP页面中可以设置多个import属性。
(2)pageEncoding属性:指定当前页面的编码,如果pageEncoding没有指定,那么默认为contentType的值;如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1。
(3)contentType:等同与调用response.setContentType("text/html;charset=xxx"); 如果没有指定contentType属性,那么默认为pageEncoding的值;如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1。
(4)errorPage:如果当前页面出现异常,那么跳转到errorPage指定的jsp页面。
2.2 include指令
include指令的作用是包含指定的页面。在jsp被编译成java文件之前会把两个jsp文件合并,然后再编译成一个java文件。这种特性有助于创建可重用的导航栏、联系人部分、页面计数等公共页面的显示部分。比如说,可能有多个页面都需要用到某个标题页面,这时就可以把这个公共的标题页面使用include指令包含进来就可以使用了。
【语法】
<%@include file="页面"%>
【示例】include指令
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>include指令</title>
</head>
<body>
<%@include file="top.jsp"%><!-- 使用include指令包含top.jsp页面 -->
<hr><!-- hr标签可以输出一条水平分割线 -->
<h3>我是主界面的内容</h3>
</body>
</html>
top.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>我是被包含的部分</h3>
</body>
</html>
程序运行结果如下图所示
2.3 taglib指令
【语法】
<%@ taglib prefix="" uri=" " %>
【示例】
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
taglib指令是用来在当前jsp页面中导入第三方的标签库。JSP标准标签库(JSP Standard Tag Library)是一个开放源代码的标签组件,是由Apache公司开发的,使用标签库可以避免过多的JAVA程序嵌套在JSP中而导致的代码混乱不易维护。在指令中prefix用来指定标签前缀,可以根据需要进行起名,uri是指定第三方标签库的uri(唯一标识)。使用第三方标签库的前提是,需要把第三方标签库所需要的jar包导入到所在的项目中。
3 动作元素
3.1 include动作
此动作标记在用户请求时包含文件(动态包含),程序运行过程是包含与被包含的文件各自编译,当用户请求页面时,才动态的包含其他文件。
【语法】
<jsp:include page=”被包含的页面名字” flush="false"></jsp:include>
【示例】include动作标记
include.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<%
out.print("我是被包含的内容");
%>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>include动作标记</title>
</head>
<body>
<h1>包含页面</h1>
<jsp:include page="include.jsp" flush="true"></jsp:include>
</body>
</html>
此时读者会发现这个功能与之前讲的include指令元素很相似,两者的区别如下:
(1)include指令执行速度相对较快,灵活性较差(只编译一个文件,但是一旦有一个文件发生变化,两个文件都要重新编译);
(2)include动作执行速度相对较慢,灵活性较高。
3.2 forward动作标记
forward动作标记主要用作跳转页面,但是地址栏不会发生改变,这种跳转称为服务器端跳转,用来转发带请求的数据。
【语法】
<jsp:forward page="要跳转的页面名称"></jsp:forward>
【示例】forward动作标记
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>服务器跳转</title>
</head>
<body>
<jsp:forward page="forward.jsp"></jsp:forward>
</body>
</html>
forward.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>跳转后的页面</title>
</head>
<body>
<h3>我是跳转后的界面</h3>
</body>
</html>
程序运行后会发现页面转发到了forward.jsp页面,但是地址栏并没有发生改变。
3.3 param动作标记
此动作标记主要是传递参数,一般和include和forward动作标记联合使用,需要注意的是,当和include动作联合使用时, 主页面不能访问被包含页面的参数,但被包含的页面可以访问主页面的参数。
【语法】
<jsp:param name="参数名" value="参数值"></jsp:param>
【示例】param动作标记
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>param传递参数</title>
</head>
<body>
<h1>包含页面</h1>
<jsp:include page="include.jsp" flush="true">
<jsp:param value="zhangsan" name="username" />
</jsp:include>
</body>
</html>
include.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<%
String name = request.getParameter("username");//获取主页面传来的值
out.print("我是被包含的内容,并从包含我的页面中传来个了值:" + name);
%>
</body>
</html>
以上两段代码与include动作标记的例子相似,只不过这里通过param标签传了一个值给被包含的页面,程序运行结果如图所示:
3.4 useBean动作标记
useBean主要是创建一个Bean实例并指定它的名字和作用范围,对于一个JavaBean,简单的说,它是一个Java类,这个类可以重复地使用。它必须是一个public类,具有公有的不带参数的构造方法,每个属性必须定义一组getXXX()和setXXX()方法, 以便读取和存储其属性值。
【语法】
<jsp:useBean id=" Bean唯一标识" class=" Bean所在位置" scope="范围"></jsp:useBean>