第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"; %> 图31共享变量的概念 “<%!”和“%>”之间声明的变量在整个JSP页面内都有效,与“<%!”“%>” 标记符在JSP页面中所在的书写位置无关。当多个用户请求一个JSP页面时,JSP引擎为每个用户启动一个线程,这些线程由JSP引擎来管理,这些线程共享JSP页面的成员变量,因此任何一个用户对JSP页面成员变量操作的结果,都会影响到其他用户。共享变量的概念如图31所示。 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,实现效果如图32所示。 图32初次加载效果 每次刷新当前页面,成员变量的值将发生改变,执行+1操作,而局部变量的值保持不变,刷新3次后实现效果如图33所示。 图33累计计数器刷新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(); } %> 图34变量存储概念 方法内声明的变量只在该方法内有效,当方法被调用时,方法内声明的变量被分配内存,方法被调用完毕即可释放这些变量所占的内存。变量存储概念解释如图34所示。 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> 在案例中分别调用了自增和自减两种方法,在调用前后比较变量的变化,效果显示如图35所示。 图35页面效果 3.3Java程序片段 3.3.1程序片段定义 (1) 在“<%”和“%>”之间插入Java程序片段。一个JSP页面可以有许多程序片段,这些程序片段将被JSP引擎按顺序执行。 (2) 在Web容器处理JSP页面时执行,Java程序片段通常会产生输出,并将输出发送到客户的输出流里。 (3) 当多个客户请求一个JSP页面时,Java程序片段将被执行多次,分别在不同的线程中执行,互不干扰。 3.3.2程序片段的变量 (1) 因为JSP页面实际上是被编译成Servlet类执行的,所以声明中定义的变量是Servlet类的成员变量,各个用户共享成员变量,必须同步。 (2) 程序片段中定义的变量是局部变量,用户之间没有联系,每次调用页面,局部变量都被重新初始化。 程序片段定义的逻辑图如图36所示。 图36程序片段定义的逻辑图 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> 实现的效果为多个用户在访问该变量时,保持各个用户之间的共享,即在第一个用户对成员变量进行有关操作后,影响后面用户对其调用的结果,通过时间的变化和共享变量的变化可以看出其区别。其页面显示效果如图37所示。 图37多用户共享成员变量案例页面显示 3.3.3程序片段执行 一个JSP页面中的Java程序片段会按其在页面中的顺序被执行,而且 某个Java程序片段中声 图38程序片段执行过程 明的局部变量在其后继的所有Java程序片段以及表达式内都有效。 可以将一个Java程序片段分割成几个Java程序片段,然后在这些Java程序片段之间再插入其他标记元素。程序片段的执行过程如图38所示。 通过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选择语句判断该随机数的范围,效果如图39所示。 图39分割的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> 页面的实现效果如图310所示。 图310Java表达式案例页面显示 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=ISO88591”。 注意: 不允许两次使用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()。 图311为page标记各个属性的详细介绍。 图311page标记各属性介绍 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> 实现效果如图312所示,引入同级目录下的文件Example3_5_java_expression.jsp。 使用include指令可以把一个复杂的JSP页面分成若干简单的部分,如要更改页面时,只需更改对应的部分就行了,页面布局如图313所示。 图312include动作标记案例页面显示 图313页面布局 3.7JSP动作标记 3.7.1标记的种类 JSP动作标记类型如图314所示,具体的动作标记的作用和定义在后面的内容有具体介绍。 图314JSP动作标记 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标记的逻辑图如图315所示。 图315逻辑图 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动作标记案例的页面显示效果如图316所示。 图316param动作标记案例页面展示 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动作标记案例的页面显示如图317所示。 图317forward动作标记案例页面展示 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页面,更加灵活。 本章小结可参考图318。 图318第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程序片段。