第四章 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的基本构成

第四章 JSP_01

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>

运行效果:

第四章 JSP_01

注意:被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 + "&nbsp"); //使用空格格式化输出
			}
			out.println("<br>"); //HTML换行
		}
		long time = System.nanoTime() - startTime;
	%>
	生成九九乘法表用时
	<%
		out.println(time/1000); //输出用时多少毫秒
	%>
	毫秒。
</body>
</html>

运行效果:

第四章 JSP_01

测试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>

运行效果:

第四章 JSP_01

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_01

注释

由于JSP页面由HTML、JSP、Java脚本等组成,所以在其中可以使用多种注释格式,本节将对这些注释的语法进行讲解。

HTML注释