第3章JSP基本语法
JSP页面可以嵌入HTML标签、指令、动作、脚本、扩展标签等,这些内容可以分成元素和模板数据。元素是在JSP基本语法中定义的内容,JSP容器在转换阶段将元素翻译成相应的Java代码。JSP页面中其他的所有内容都是模板数据。JSP容器对模板数据不做处理。
JSP定义的元素有4种类型: ①指令,用于设置整个页面属性; ②脚本,JSP中嵌入的Java代码; ③动作,利用XML语法格式的标记来控制JSP容器的行为; ④表达式语言(EL),$(表达式),计算表达式括号内的表达式的值,将其转换为String类型并显示。


在线视频


 3.1JSP页面的基本结构
在传统的HTML页面文件中加入Java程序片段和JSP标记就构成了一个JSP页面。一个JSP页面可由以下5种元素组合而成。
(1) 普通的HTML标记符。
(2) JSP标记,如指令标记、动作标记。
(3) 变量和方法的声明。
(4) Java程序片段。
(5)Java表达式。


<%--JSP指令标记--%>

<%@ page import="java.util.Date" %>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%--普通HTML标记--%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>JSP元素组成</title>

</head>

<body>



<p>用户信息</p>

<%--Java程序片段--%>

<%

String userid = (String) session.getAttribute("userID");

UserDao userDao = new UserDao();

Users users = userDao.getUsersByName(userid);

%><%--变量和方法声明--%>

<%!

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:ss:mm");

String start_time = "2020-09-17 00:00:00";

String end_time = "2022-06-31 00:00:00"

Date d_start_time = df.parse(start_time);

Date d_end_time = df.parse(end_time);

public void sub(Date d_start_time, Date d_end_time) {

System.out.println(d_end_time.getTime() - d_start_time.getTime());

}

%>

<%--Java表达式--%>

<ul class="reg_ul">

<li>

<span>姓名:</span>

<span><%=users.getUsername()%></span>

</li>

<li>

<span style="margin-right: 20px;">邮箱:</span>

<span><%=users.getEmail()%></span>

</li>

</ul>

</body>

</html>






当多个用户请求一个JSP页面时,JSP引擎为每个用户启动一个线程,该线程负责执行常驻内存的字节码文件来响应相应用户的请求。这些线程由Tomcat服务器来管理,将CPU的使用权在各个线程之间快速切换,以保证每个线程都有机会执行字节码文件。
字节码文件的任务如下。
(1) JSP页面中普通的HTML标记符号,交给客户的浏览器执行显示。
(2) JSP标记、变量和方法声明、Java程序片段由Tomcat服务器负责执行,将需要显示的结果发送给客户的浏览器。
(3) Java表达式由Tomcat服务器负责计算,将结果转换为字符串,交给客户的浏览器负责显示。
  3.2变量和方法的声明
3.2.1变量声明
在“<%!”和“%>”标记符之间声明变量,变量的类型可以是Java语言允许的任何数据结构类型,这些变量称为JSP页面的成员变量。


<%!

Date date = new Date();

String username = "Jack";

%>



图31共享变量的概念



“<%!”和“%>”之间声明的变量在整个JSP页面内都有效,与“<%!”“%>” 标记符在JSP页面中所在的书写位置无关。当多个用户请求一个JSP页面时,JSP引擎为每个用户启动一个线程,这些线程由JSP引擎来管理,这些线程共享JSP页面的成员变量,因此任何一个用户对JSP页面成员变量操作的结果,都会影响到其他用户。共享变量的概念如图31所示。
Example3_1_accumulative_counter.jsp中通过具体事例对成员变量这一特性做详细的介绍,实现一个简单的累计计数器,比较成员变量和局部变量的区别。


Example3_1_accumulative_counter.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>累计计数器</title>

</head>

<body>

欢迎使用累计计数器,带你了解成员变量的概念!<br>

<%! int i_member=0;%>

<% int i_local=0;%>

<%

out.print("刷新之后,成员变量的值为"+this.i_member+++",成员变量i_member的值发生改变<br>");

out.print("刷新之后,局部变量的值为"+i_local+++",局部变量的i_local的值不变");

%>

</body>

</html>

第一次加载该案例时,成员变量和局部变量均为初始值0,实现效果如图32所示。



图32初次加载效果


每次刷新当前页面,成员变量的值将发生改变,执行+1操作,而局部变量的值保持不变,刷新3次后实现效果如图33所示。


图33累计计数器刷新3次实现效果


3.2.2方法声明
在“<%!”和“%>”标记符号之间定义方法,所定义的方法在整个JSP页面有效,可以在Java程序片段中被调用。


<%!

public long getDate() throws ParseException {

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:ss:mm");

String time = "2020-09-17 00:00:00";

Date d_time = df.parse(time);

return d_time.getTime();

}

%>



图34变量存储概念


方法内声明的变量只在该方法内有效,当方法被调用时,方法内声明的变量被分配内存,方法被调用完毕即可释放这些变量所占的内存。变量存储概念解释如图34所示。


Example3_2_method_statement.jsp中通过具体事例对方法声明做了详细的介绍和了解,在“<%!”和“%>”之间定义了add()和sub()两个方法,分别为自增和自减,然后在程序片段中调用这两个方法。


Example3_2_method_statement.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>方法声明之自增自减</title>

</head>

<body>

<%!

int add(int i) {

return ++i;

}



int sub(int i) {

return --i;

}

%>

<%  int i=0;

out.print("变量"+i+"的原值为:"+i+",调用自增方法计算变量" + i + "的之后值为:" + add(i)+"<br>");

out.print("变量"+i+"的原值为:"+i+",调用自减方法计算变量" + i + "的之后值为:" + sub(i));

%>

</body>

</html>

在案例中分别调用了自增和自减两种方法,在调用前后比较变量的变化,效果显示如图35所示。


图35页面效果


  3.3Java程序片段
3.3.1程序片段定义
(1) 在“<%”和“%>”之间插入Java程序片段。一个JSP页面可以有许多程序片段,这些程序片段将被JSP引擎按顺序执行。
(2) 在Web容器处理JSP页面时执行,Java程序片段通常会产生输出,并将输出发送到客户的输出流里。
(3) 当多个客户请求一个JSP页面时,Java程序片段将被执行多次,分别在不同的线程中执行,互不干扰。
3.3.2程序片段的变量
(1) 因为JSP页面实际上是被编译成Servlet类执行的,所以声明中定义的变量是Servlet类的成员变量,各个用户共享成员变量,必须同步。
(2) 程序片段中定义的变量是局部变量,用户之间没有联系,每次调用页面,局部变量都被重新初始化。
程序片段定义的逻辑图如图36所示。


图36程序片段定义的逻辑图


Example3_3_share_member.jsp中,使用一段简易计数器的代码来模拟Java程序片段中的各个用户共享成员变量,其中需要注意同步。


Example3_3_share_member.jsp



<%@ page import="java.util.Date" %>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>用户共享成员变量</title>

</head>

<body>

带你了解多个用户共享成员变量的概念!

<%!

int i_shareMember = 0;



synchronized void add() {



i_shareMember++;


}

%>


<%

Date date = new Date();

add();

out.print(date + "当前时间段用户访问<br>");

out.print("刷新之后,共享变量的值为" + this.i_shareMember + ".多个用户访问时其结果不同<br>");

%>

</body>

</html>

实现的效果为多个用户在访问该变量时,保持各个用户之间的共享,即在第一个用户对成员变量进行有关操作后,影响后面用户对其调用的结果,通过时间的变化和共享变量的变化可以看出其区别。其页面显示效果如图37所示。


图37多用户共享成员变量案例页面显示


3.3.3程序片段执行
一个JSP页面中的Java程序片段会按其在页面中的顺序被执行,而且


某个Java程序片段中声


图38程序片段执行过程


明的局部变量在其后继的所有Java程序片段以及表达式内都有效。

可以将一个Java程序片段分割成几个Java程序片段,然后在这些Java程序片段之间再插入其他标记元素。程序片段的执行过程如图38所示。
通过Example3_4_forward_code.jsp了解分割的Java程序片段如何使用。案例使用switch选择语句对该模块进行介绍。


Example3_4_forward_code.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>



<html>


<head>

<title>Java程序片段分割</title>

</head>

<body>

<%  //Math.random()是(0,1)的随机数

int grade = (int) (Math.random() * 100);

switch (grade/10){

case 10:

case 9:

%>

<jsp:forward page="Example16_2_forward_excellent.jsp">

<jsp:param name="number" value="<%=grade%>"/>

</jsp:forward>

<%break;

case 8:

case 7:

case 6:

%>

<jsp:forward page="Example16_3_forward_qualified.jsp">

<jsp:param name="number" value="<%=grade%>"/>

</ jsp:forward>

<%break;

default:

%>

<jsp:forward page=" Example16_4_forward_fail.jsp">

<jsp:param name="number" value="<%=grade%>"/>

</ jsp:forward>

<% }

%>

</body>

</html>

实现效果为产生一个0~100的随机数,通过switch选择语句判断该随机数的范围,效果如图39所示。


图39分割的Java程序片段案例页面展示


 3.4Java表达式
在“<%=”和“%>”之间插入一个表达式,这个表达式必须能求值。表达式的值由服务器负责计算,并将计算结果用字符串形式发送到用户端显示。
例如,获取时间的表达式

<%=getDate()%>

其中需要注意“<%=”是一个完整的符号,“<%”和“=”之间不要有空格。
Example3_5_java_expression.jsp运用表达式实现关于时间的类的运用手法。


Example3_5_java_expression.jsp



<%@ page import="java.util.Calendar" %>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Java表达式</title>

</head>

<body>

<%

Calendar calendar = Calendar.getInstance();

%>

现在是<%= calendar.get(Calendar.YEAR) %>年

<%= calendar.get(Calendar.MONTH) +1 %>月

<br>当前时间为<%= calendar.get(Calendar.HOUR_OF_DAY) %>:<%= calendar.get(Calendar.MINUTE) %>

</body>

</html>

页面的实现效果如图310所示。


图310Java表达式案例页面显示


 3.5JSP注释
(1) HTML注释格式:

<!--  注释内容  -->

(2) JSP注释格式:

<%--注释内容 --%>

JSP注释写在JSP程序中,但不发送给客户。
(3) Scriptlets中的注释。由于Scriptlets包含的是Java代码,所以Java中的注释规则在Scriptlets中也适用,常用的Java注释使用//表示单行注释,使用/**/表示多行注释。


在线视频


  3.6JSP指令标记
3.6.1标记的种类
JSP中主要有两种指令标记: page指令标记和include指令标记。
3.6.2page指令标记
1. page标记

(1) page指令与其书写的位置无关,习惯上把page指令写在JSP页面的最前面。
(2) 可以用一个page指令指定多个属性的值,也可以使用多个page指令分别为每个属性指定值。

<%@ page 属性1="属性1的值" 属性2="属性2的   值"  ……%>

或

<%@ page 属性1="属性1的值"  %>

<%@ page 属性2="属性2的值"  %>

2. page指令标记: contentType属性
(1) contentType 属性值确定JSP页面响应的MIME类型和JSP页面字符的编码。属性值的一般形式是“MIME类型”或“MIME类型;charset=编码”。
例如: 

<%@ page contentType="application/msword" %>

(2) 如果不使用page指令为contentType指定一个值,那么contentType默认值是“text/html;charset=ISO88591”。
注意: 不允许两次使用page 指令给contentType属性指定不同的属性值。
3. page指令标记: language属性
language属性定义JSP页面使用的脚本语言,该属性的值目前只能取“java”。
例如: 

<%@ page language="java" %>

4. page指令标记: import属性
目的是为JSP页面引入Java运行环境提供的包中的类,这样就可以在JSP页面的程序片段部分、变量及函数声明部分、表达式部分使用包中的类。

<%@ page import="java.io.*", "java.util.Date" %>

注意: JSP页面默认import属性已经有 java.lang.*、javax.Servlet.*、javax.Servlet.jsp.*、javax.Servlet.http.*等值。
5. page指令标记: session属性
session 属性用于设置是否需要使用内置的session对象。
session的属性值可以是true或false。session属性默认的属性值是true。
6. page指令标记: buffer属性
内置输出流对象out负责将服务器的某些信息或运行结果发送到用户端显示。buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。
例如: 

<%@ page buffer= "24kb" %>

注意: buffer属性的默认值是8kb。buffer属性可以取值“none”,即设置out不使用缓冲区。
7. page指令标记: autoFlush属性
(1) autoFlush 属性指定out的缓冲区被填满时,缓冲区是否自动刷新。
(2) autoFlush属性的默认值是true。
(3) 当autoFlush属性取值false时,如果out的缓冲区填满,就会出现缓存溢出异常。当buffer的值是“none”时,autoFlush的值就不能设置成false。
8. page指令标记: isThreadSafe属性
(1) isThreadSafe属性用来设置JSP页面是否可多线程访问。
(2) 当isThreadSafe属性值设置为true时,JSP页面能同时响应多个用户的请求; 当isThreadSafe属性值设置成false时,JSP页面同一时刻只能响应一个用户的请求,其他用户须排队等待。
注意: isThreadSafe属性的默认值是true。
9. page指令标记: info属性
info属性的属性值是一个字符串,其目的是为JSP页面准备一个常用且可能要经常修改的字符串。
例如: 

<%@ page info= "we are students" %>

注意: 
(1) 可以在JSP页面中使用方法getServletInfo();获取info属性的属性值。
(2) 当JSP页面被转译成Java文件时,转译成的类是Servlet的一个子类,所以在JSP页面中可以使用Servlet类的方法getServletInfo()。
图311为page标记各个属性的详细介绍。


图311page标记各属性介绍


3.6.3include指令标记
(1) include指令标记的作用是在JSP页面出现该指令的位置处静态插入一个文件,实现代码的复用。
例如:

<%@ include file= "文件相对地址" %>

(2) 一个 JSP 页面中的 include 指令的数量不受限制。
(3) 静态插入,就是当前JSP页面和插入的文件合并成一个新的JSP页面,然后JSP引擎再将这个新的JSP页面转译成Java文件。
下面通过Example3_6_include_code.jsp了解其使用方法。


Example3_6_include_code.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>include动作案例</title>

</head>

<body>

使用include引入同级目录下的文件Java表达式,即引入Example3_5_java_expression.jsp!<br>

<%! int i_shareMember=0;   //共享变量%>

<%




out.print("刷新之后,成员变量的值为"+this.i_shareMember+++",其结果发生改变<br>");

%>


<p>以下是引入include命令后的页面内容</p>

<%@ include file=" Example3_5_java_expression.jsp"%>


</body>

</html>

实现效果如图312所示,引入同级目录下的文件Example3_5_java_expression.jsp。

使用include指令可以把一个复杂的JSP页面分成若干简单的部分,如要更改页面时,只需更改对应的部分就行了,页面布局如图313所示。


图312include动作标记案例页面显示




图313页面布局



  3.7JSP动作标记
3.7.1标记的种类
JSP动作标记类型如图314所示,具体的动作标记的作用和定义在后面的内容有具体介绍。


图314JSP动作标记


3.7.2include动作标记
(1) include动作标记告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。

<jsp:include page= "文件的URL"/>

或

<jsp:include page= "文件的URL">

param子标记

</jsp:include>

(2) 如果是普通的文本文件,就将文件的内容发送到用户端,由浏览器负责显示; 如果是JSP文件,JSP引擎就执行这个文件,然后将执行的结果发送到用户端浏览器显示。
3.7.3param动作标记
(1) param标记以“名字值”对的形式为其他标记提供附加信息。
(2) param 动作标记语法格式为

<jsp:param  name= "名字"  value= "指定给param的值">

注意: param标记不能独立使用,需作为jsp:include、jsp:forward、jsp:plugin标记的子标记来使用。
(3) 当该标记与jsp:include动作标记一起使用时,可以将param标记中的值传递到include动作标记要加载的文件中去,被加载的JSP文件可以使用Tomcat服务器提供的request内置对象获取include动作标记的param子标记中name属性所提供的值。
param标记的逻辑图如图315所示。


图315逻辑图


Example3_7_a_param.jsp和Example3_7_b_param_pythagorean.jsp代码如下。


Example3_7_a_param.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>判断勾股定理</title>

</head>



<body>

<% double a=4,b=4,c=5;


%>

<br>判断三边为<%=a%>,<%=b%>,<%=c%>的三角形是否满足勾股定理。

<jsp:include page="Example3_7_b_param_pythagorean.jsp">

< jsp:param name="sideA" value="<%=a%>"/>

< jsp:param name="sideB" value="<%=b%>"/>

< jsp:param name="sideC" value="<%=c%>"/>

</ jsp:include>

</body>

</html>



Example3_7_b_param_pythagorean.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" %>

<!DOCTYPE html>

<html>

<head>

</head>

<body>

<%! public boolean getArea(double a, double b, double c) {

if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {

return true;

} else {

return false;

}

}

%>

<%

String sideA = request.getParameter("sideA");

String sideB = request.getParameter("sideB");

String sideC = request.getParameter("sideC");


double a = Double.parseDouble(sideA);

double b = Double.parseDouble(sideB);

double c = Double.parseDouble(sideC);

%>

<br><b>我是被加载的文件,负责计算三角形是否满足勾股定理<br>

三角形:<% if(getArea(a,b,c)){

%>

<h4>满足勾股定理</h4>

<% } else {

%><h4>不满足勾股定理</h4>

<% }

%>

</body>

</html>

param动作标记案例的页面显示效果如图316所示。


图316param动作标记案例页面展示


3.7.4forward动作标记

<jsp:forward page="要转向的页面" />

或

<jsp:forward page="要转向的页面">

param子标记

</jsp:forward>

该指令的作用是: 从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。
也可以使用param动作标记作为子标记传送信息,要转向的JSP页面用request内置对象获取param子标记中name属性所提供的值。
注意: 
(1) 当forward动作标记不需要param子标记时,必须使用第一种形式。
(2) 当前页面使用forward动作标记转向后,尽管用户看到了转向后的页面的效果,但浏览器地址栏中显示的仍然是转向前的JSP页面的URL地址。因此,如果刷新浏览器的显示,将再次执行当前浏览器地址栏中显示的JSP页面。
Example3_8_a_forward_code.jsp等代码如下。


Example3_8_a_forward_code.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<html>

<head>

<title>Java程序片段分割</title>

</head>

<body>

<%  //Math.random()是(0,1)的随机数

int grade = (int) (Math.random() * 100);

switch (grade/10){

case 10:

case 9:

%>


<jsp:forward page="Example3_8_b_forward_excellent.jsp">

<jsp:param name="number" value="<%=grade%>"/>



</jsp:forward>

<%break;

case 8:

case 7:

case 6:

%>

< jsp:forward page="Example3_8_c_forward_qualified.jsp">

< jsp:param name="number" value="<%=grade%>"/>

</ jsp:forward>

<%break;

default:

%>

< jsp:forward page="Example3_8_d_forward_fail.jsp">

< jsp:param name="number" value="<%=grade%>"/>

</ jsp:forward>

<% }

%>

</body>

</html>



Example3_8_b_forward_excellent.jsp



<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<title>成绩优秀等次</title>

</head>

<body>

<%

String appraise = request.getParameter("number");

%>

<h4>你的成绩为:<%=appraise%></h4>

<h4>你真优秀,希望你继续保持哦!</h4>

</body>

</html>



Example3_8_c_forward_qualified.jsp



<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<title>成绩合格等次</title>

</head>

<body>

<%

String appraise = request.getParameter("number");

%>


<h4>你的成绩为:<%=appraise%></h4>

<h4>你真棒,希望你继续努力哦!加油~</h4>




</body>

</html>



Example3_8_d_forward_fail.jsp



<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<title>成绩不合格等次</title>

</head>

<body>

<%

String appraise = request.getParameter("number");

%>

<h4>你的成绩为:<%=appraise%></h4>

<h4>不要灰心,相信自己,继续加油!</h4>

</body>

</html>

forward动作标记案例的页面显示如图317所示。


图317forward动作标记案例页面展示


3.7.5useBean动作标记
该标签用于设置JSP使用的JavaBean的属性,此操作与useBean协作,用来设置Bean的简单属性和索引属性。

<jsp:useBean id="id" scope="page|request|session|application" typeSpec/>

其中,id表示实例,scope表示此对象可以使用的范围。
3.7.6setProperty动作标记
此操作与useBean协作,用来设置Bean的简单属性和索引属性。
<jsp:setProperty>标签使用Bean给定的setXXX()方法,在Bean中设置一个或多个属性值。利用<jsp:setProperty>设置属性值有多种方法。


<jsp:setProperty name="Bean的变量名" property="Bean的属性名" value="Bean的属性值" />

<!--或者将setProperty放在useBean的标签体中-->


<jsp:useBean id="user" class="model.User">

<jsp:setProperty name="user"  property="name" value="Bob"/>

</jsp:useBean>

3.7.7getProperty动作标记
jsp:getProperty的操作是对jsp:setProperty操作的补充,它用来访问一个Bean的属性。

<jsp:getProperty name="userSession" property="name"/>

 3.8上机案例
本章的知识点已全部结束,读者在学习本章内容时是否遇到了难以解决的问题呢?本节通过结合上机案例对本章知识点做针对性复习和补充,在课余时间也不要忘了回顾本章内容,在项目开发过程中本章内容也是至关重要的。
在本章上机案例中使用JSP动作标记完成一个网站主界面的部分展示,只需了解其大致结构即可。当我们访问一个网站的时候,大致可以将页面分为三个部分,分别为上中下部分,上部分为网站会员登录、注册和网站logo等信息,中部分为网站的主要信息,其中包含网站的介绍、产品展示等信息,下部分为网站的版权等信息。了解了其大致的结构之后可以使用JSP动作标记来简单模仿该功能。参考代码如下。


Example3_9_a_exam.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>上机案例</title>

</head>

<body>

<p>欢迎访问本网站!</p>

<h3>这是主界面内容,其中包含该网站的主要信息</h3>

<jsp:include page="Example3_9_b_exam.jsp"></jsp:include>

</body>

</html>



Example3_9_b_exam.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>


<html>

<head>

<meta charset="UTF-8">

<title>上机案例</title>

</head>


<body>

<p>--------------------------------------</p>

<p>此处为网站底部的版权等信息</p>





<b>版权?2018-2020</b>

</body>

</html>


 小结
(1) JSP页面: 包括普通的HTML标记(客户端浏览器执行)、JSP标记、成员变量和方法声明、Java程序片段、Java表达式(JSP引擎处理并将结果发送给用户浏览器)。
(2) 成员变量为所有用户共享,任何用户对成员变量的操作都会影响其他用户,synchronized关键字保证一次只有一个线程执行。
(3) 多用户访问JSP页面,其程序片段会被执行多次,分别在不同线程中,其局部变量互不干扰。
(4) page指令标记用来定义整个JSP页面的一些属性,常用的有contentType和import。
(5) include指令标记在编译阶段就处理所需要的文件,被处理的文件在逻辑与语法上依赖于当前JSP页面,优点是速度快; include动作标记是在JSP页面运行时才处理文件,在逻辑与语法上独立于当前JSP页面,更加灵活。
本章小结可参考图318。


图318第3章小结


 习题
1. 对于JSP中的HTML注释叙述正确的是()。

A. 发布网页时看不到,在源文件中也看不到
B. 发布网页时看不到,在源代码中看得到
C. 发布网页时能看到,在源文件中看不到
D. 发布网页时能看到,在源文件中也能看到
2. 用户获取Bean属性的动作是()。
A. <jsp:userBean> B. <jsp:getProperty> 
C. <jsp:setProperty> D. <jsp:param>
3. JSP程序中的注释有: 、和。
4. JSP的编译指令标记通常是指()。
A. Page指令、Include指令和Taglib指令
B. Page指令、Include指令和Plugin指令
C. Param指令、Include指令和Plugin指令
D. Page指令、Forward指令和Taglib指令
5. 指令标记、JSP动作标记统称为。
6. 在“<%!”和“%>”之间声明的变量称为,在其之间声明的方法称为。
7. JSP页面的基本结构由哪几部分组成?
8. 简述include指令和<jsp:include>动作的异同。
9. 简述page指令、include指令的作用。
10. 模仿案例3_4设计JSP代码实现Java程序片段。