第四章 JSP_01
JSP概述
什么是JSP
JSP(Java Server Pages)是由Sun公司倡导、许多公司参与而建立的动态网页技术标准。它在 HTML 代码中嵌入 Java 代码片段(Scriptlet)和 Jsp 标签,构成了JSP网页。在接收到用户的请求时,服务器会处理 Java 代码片段,然后生成处理结果的HTML网页返回给客户端,客户端的浏览器将呈现出最终页面效果。
JSP技术特征
JSP技术所开发的Web应用程序是基于Java的,它拥有Java语言跨平台的特性,以及 业务代码分离、组件重用、基础Java Servlet 功能和预编译等特征。
1.跨平台。既然JSP是基于Java语言的,那么它就可以使用Java API,所以它也是跨平台的,可以应用在不同的系统中,如Windows、Linux、Mac和Solaris等。这同时也拓宽了JSP可以使用的Web服务器的范围。另外,应用于不同的操作系统的数据库也可以为JSP服务,JSP使用JDBC技术操作数据库,从而避免了代码移植导致更换数据库时的代码修改问题。
2.业务代码分离。采用JSP技术开发的项目,通常使用HTML语言来设计和格式化静态页面的内容,而使用JSP标签和Java代码片段来实现动态部分。程序开发人员可以将业务处理代码全部放到JavaBean中,或者把业务处理代码交给Servlet、Struts等其他业务控制层来处理,从而实现业务代码从视图层分离。这样JSP页面只负责显示数据即可,当需要修改业务代码时,不会影响JSP页面的代码。
3.组件重用。JSP中可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型,在JSP页面甚至整个项目中都可以重复使用这个JavaBean。JavaBean也可以应用到其他Java应用程序中,包括桌面应用程序。
4.继承Java Servlet 功能。Servlet 是JSP出现之前的主要Java Web处理技术。它接受用户请求,在Servlet类中编写所有Java和HTML代码,然后通过输出流把结果页面返回给浏览器。其缺点是:在类中编写HTML代码非常不方便,也不利于阅读。使用JSP技术之后,开发Web应用便变得相对简单快捷多了,并且JSP最终要编译成Servlet才能处理用户请求,因此我们说JSP拥有Servlet的所有功能和特性。
5.预编译。预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,在用户下一次访问时,直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大大提高了客户端的访问速度。
JSP的基本构成
1.指令标签。通常位于文件的首位。
2.HTML标记语言。定义网页内容的显示格式。
3.注释。可以使用HTML语言的注释格式,JSP的注释格式和嵌入Java代码的注释格式。
4.嵌入Java代码。在JSP页面中可以嵌入Java程序代码片段,这些Java代码被包含在<% %>标签之中,可以看作是一个Java类的部分代码。
5.JSP动作标签。JSP动作标签时JSP中标签的一种,它们都使用“JSP:”开头,例如,"<jsp:forward>"标签可以将用户请求转发给另一个JSP页面或Servlet处理。
指令标签
指令标签不会产生任何内容输出到网页中,主要用于定义整个JSP页面的相关信息,例如,使用的语言、导入的类包、指定错误处理页面等。其语法格式如下:
<%@ directive attribute="value" attributeN="value"...%>
(1) directive:指令名称。
(2) attribute:属性名称,不同的指令包含不同的属性。
(3) value:属性值,为指定属性赋值的内容。
注意:"<%@" 和 "%>" 是完整的标记,中间不可有空格。
1.page指令
这是JSP页面最常用的指令,用于定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成 Servlet 时会转换为相应的 Java 程序代码。page指令的语法格式如下:
<%@ page attr1="value" attr2="value"……%>
page指令包含的属性有15个,下面介绍一些常用属性。
(1) language 属性
该属性用于设置JSP页面使用的语言,目前只支持Java语言,以后可能会支持其他语言,如C++、C# 等。该属性的默认值是Java。例如:
<%@ page language="java" %>
(2) extends 属性
该属性用于设置JSP页面继承的Java类,所有JSP页面在执行之前都会被服务器解析成Servlet,而 Servlet 是由 Java 类定义的,所以JSP 和 Servlet 都可以继承指定的父类。该属性并不常用,因为可能会影响服务器的性能优化。
(3) import 属性
该属性用于设置JSP导入的类包。JSP页面可以嵌入Java代码片段,这些Java代码在调用API时需要导入相应的类包。例如:
<%@ page import="java.util.*" %>
(4) pageEncoding 属性
该属性用于定义JSP页面的编码格式,也就是指定文件编码。JSP页面中的所有代码都使用该属性指定的字符集,如果该属性值设置为ISO-8859-1,那么这个JSP页面就不支持中文字符。通常我们设置为GBK或UTF-8。例如:
<%@ page pageEncoding="UTF-8" %>
(5) contentType 属性
该属性用于设置JSP页面的MIME类型和字符编码,浏览器会根据此显示网页内容。例如:
<%@ page contentType="text/html; charset=UTF-8" %>
注意:pageEncoding属性与contentType属性都能设定编码格式,但是两者的作用域不同。
pageEncoding: 设定服务器按照哪种编码格式读取JSP文件。
contentType:设定JSP按照哪种编码格式输出网页内容。
2.include 指令
include 指令用于文件包含。该指令可以在JSP页面中包含另一个文件的内容。但是它仅支持静态包含,也就是说被包含文件中的所有内容都被原样包含到该JSP页面中;如果被包含文件中有代码,将不被执行。被包含的文件可以是一段Java代码、HTML代码或者另一个JSP页面。例如:
<%@ include file="validate.jsp" %>
上述代码将当前JSP文件中相同位置的validate.jsp文件包含进来。其中,file属性用于指定被包含的文件,其值是当前JSP页面文件的相对URL路径。
下面举例演示include指令的应用。在当前JSP页面中包含date.jsp文件,而这个被包含的文件中定义了获取当前日期的Java代码,从而组成了当前页面显示日期的功能。这个实例主要用于演示include指令。
(1)首先编辑date.jsp文件,其代码如下:
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Date now = new Date();
String dateStr;
dateStr = String.format("%tY年%tm月%td日",now,now,now);
%>
<%=dateStr %>
(2)编辑index.jsp文件,它是本实例的首页文件,其中使用了include指令包含了date.jsp文件到当前页面。被包含的date.jsp文件中Java代码以静态方式导入到index.jsp文件,然后才被服务器编译执行。程序代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
当前的日期是:<%@ include file = "date.jsp" %>
</body>
</html>
运行效果:
注意:被include指令包含的JSP页面中不要使用<html>和<body>标签,它们是HTML语言的结构标签,被包含进其他JSP页面会破坏页面格式。另外还要注意源文件和被包含文件中的变量和方法的名称不要冲突,应为它们最终会生成一个文件,重名将导致错误发生。
3 taglib 指令
该指令用于加载用户自定义标签,自定义标签将在后面的章节进行讲解。使用该指令加载后的标签可以直接在JSP页面中使用。其语法格式如下:
<%@ taglib prefix="fix" uri="tagUriorDir" %>
(1) prefix 属性:用于设置加载自定义标签的前缀。
(2) uri 属性:用于指定自定义标签的描述符文件位置。
例如:
<%@ taglib prefix="view" uri="/WEB-INF/tags/view.tld" %>
嵌入Java代码
在JSP页面中可以嵌入Java的代码片段来完成业务处理,如之前的实例在页面中输出当前日期,就是通过嵌入Java代码片段实现的。
1.代码片段
所谓代码片段,就是在JSP页面中嵌入的Java代码,也有称为脚本段或脚本代码的。代码片段将在页面请求的处理期间被执行,可以通过JSP内置对象在页面输出内容、访问session会话、编写流程控制语句等。其语法格式如下:
<% 编写Java代码 %>
Java代码片段被包含在” <% "和" %> "标记之间。可以编写单行或多行的Java代码,语句以” ;"结尾,其编写格式与Java类代码格式相同。例如:
<%
Date now = new Date();
String dateStr;
dateStr = String.format("%tY年%tm月%td日", now, now, now);
%>
上述代码在代码片段中创建Date对象,并生成格式化的日期字符串。
<!-- 打印九九乘法表,并计算耗时 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP的代码片段</title>
</head>
<body>
<%
long startTime = System.nanoTime(); //记录开始时间,单位纳秒
%>
输出九九乘法表
<br>
<%
for(int i=0; i<=9; i++){
for(int j=0; j<=i; j++){
String str = j + "*" + i + "=" + j*i;
out.print(str + " "); //使用空格格式化输出
}
out.println("<br>"); //HTML换行
}
long time = System.nanoTime() - startTime;
%>
生成九九乘法表用时
<%
out.println(time/1000); //输出用时多少毫秒
%>
毫秒。
</body>
</html>
运行效果:
测试Java 的 if 语句:
<!-- 测试if语句 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
太阳是圆的么?
<%
boolean flag = true;
if(flag){
out.println("太阳是圆的。");
} else {
out.println("太阳不是圆的。");
}
%>
<br>
世上有不劳而获吗?
<%
boolean flag2 = false;
if(flag2){
out.println("世上有不劳而获。");
} else {
out.println("世上没有不劳而获");
}
%>
</body>
</html>
运行效果:
2.声明
声明脚本用于在JSP页面中定义全局的(即整个JSP页面都需要引用的)成员变量或方法,它们可以被整个JSP页面访问,服务器执行时会将JSP页面转换为Servlet类,在该类中会把JSP声明脚本定义的变量和方法定义为类的成员。
标签 " <%! " 和" %> "。
(1) 定义全局变量
例如:
<%! long startTime=System.nanoTime(); %>
上述代码在JSP页面定义了全局变量startTime,该全局变量可以在整个JSP页面使用。
(2) 定义全局方法
例如:
<%!
int getMax(int a, int b) {
int max = a > b ? a : b;
return max;
}
%>
JSP表达式
JSP 表达式可以直接把 Java 的表达式结果输出到 JSP 页面中。表达式的最终运算结果将被转换为字符串类型,因为在网页中现实的文字都是字符串。JSP表达式的语法格式如下:
<%= 表达式 %>
其中,表达式可以是任何 Java 语言的完整表达式。
例如,圆周率是 :
<%= Math.PI %>
测试代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
圆周率是:
<%=Math.PI %>
</body>
</html>
运行效果:
注释
由于JSP页面由HTML、JSP、Java脚本等组成,所以在其中可以使用多种注释格式,本节将对这些注释的语法进行讲解。
HTML注释