加载头像

第二章 JSP 语法

2.1 JSP 页面的基本结构

在传统的 HTML 页面文件中加入 Java 程序片和 JSP 标记就构成了一个 JSP 页面。一个 JSP 页面可由 5 种元素组合而成:

  1. 普通的 HTML 标记和 JavaScript 标记;
  2. JSP 标记,如指令标记、动作标记;
  3. 变量和方法的声明;
  4. Java 程序片;
  5. Java 表达式。

当 Tomcat 服务器上的一个 JSP 页面被第一次请求执行时,Tomcat 服务器首先将 JSP 页面文件转译成一个 Java 文件,再将这个 Java 文件编译生成字节码文件,然后通过执行字节码文件响应用户的请求。当多个用户请求一个 JSP 页面时,Tomcat 服务器为每个用户启动一个线程,该线程负责执行常驻内存的字节码文件来响应相应用户的请求。这些线程由 Tomcat 服务器来管理,将 CPU 的使用权在各个线程之间快速切换,以保证每个线程都有机会执行字节码文件。这个字节码文件的任务就是:

  • 把 JSP 页面中普通的 HTML 标记和 JavaScript 标记交给用户端浏览器执行显示。
  • JSP 标记、方法的定义、Java 程序片由服务器负责处理和执行,将需要显示的结果发送给用户端浏览器。
  • Java 表达式由服务器负责计算,并将结果转化为字符串,然后交给用户端浏览器负责显示。

2.2 声明变量和定义方法

<%!%> 标记符号之间声明变量和定义方法。<%!%> 标记符号的内容习惯上放在 JSP 页面指令之后,<html> 之前,也可以写在 <html></html> 之间。

声明变量

<%!%> 之间声明的变量在整个 JSP 页面内都有效,与 <%!%> 标记符在 JSP 页面种所在的书写位置无关,但习惯上把 <%!%> 标记符写在 JSP 页面的前面。Tomcat 服务器将 JSP 页面转译成 Java 文件时,将 <%!%> 标记符之间声明的变量作为类的成员变量,这些变量占有的内存空间直到 Tomcat 服务器关闭才释放。当多个用户请求一个 JSP 页面时,Tomcat 服务器为每个用户启动一个线程,这些线程由 Tomcat 服务器来管理,这些线程共享 JSP 页面的成员变量,因此任何一个用户对 JSP 页面成员变量操作的结果,都会影响到其他用户。

下面代码,利用成员变量被所有用户共享这一性质,实现了一个简单的计数器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page contentType="text/html" %>
<%@ page pageEncoding="utf-8" %>
<html>
<body>
<%!
int i = 0;
%>
<%
i++;
%>
<p>
您是第<%=i%>个访问本页面的用户。
</p>
</body>
</html>

定义方法和类

可以在 <%!%> 标记符号之间定义方法,可以在 Java 程序片中调用该方法。方法内声明的变量只在该方法内有效,当方法被调用时,方法内声明的变量被分配内存,方法被调用完毕即可释放这些变量所占的内存。

可以在 <%!%> 标记符号之间定义类,可以在 Java 程序片中使用该类创建对象。

2.3 Java 程序片

可以在 <%!%> 标记符号之间插入 Java 程序片。一个 JSP 页面可以有许多程序片,这些程序片将被 Tomcat 按顺序执行。在程序片中声明的变量称作 JSP 页面的局部变量。局部变量的有效范围与其声明的位置有关,即局部变量在 JSP 页面后继的所有程序片以及表达式部分内都有效。Tomcat 服务器将 JSP 页面转译成 Java 文件时,将各个程序片的这些变量作为类中某个方法的变量,即局部变量。

Java 程序片可以写在 <html> 之前,也可以写在 <html></html> 之间或 </html> 之后。

当多个用户请求一个 JSP 页面时,Tomcat 服务器为每个用户启动一个线程,该线程负责执行字节码文件响应用户的请求。Tomcat 服务器使用多线程来处理程序片,特点如下:

  • 操作 JSP 页面的成员变量。Java 程序片中操作的成员变量是各个线程(用户)共享的变量,任何一个线程对 JSP 页面成员变量操作的结果,都会影响到其他线程。
  • 调用 JSP 页面的方法。Java 程序片中可以出现方法调用语句,所调用的方法必须是 JSP 页面曾定义的方法。
  • 操作局部变量。当一个线程享用 CPU 资源时,Tomcat 服务器让该线程执行 Java 程序片,这时,Java 程序片中的局部变量被分配内存空间,当轮到另一个线程享用 CPU 资源时,Tomcat 服务器让该线程再次执行 Java 程序片,那么,Java 程序片中的局部变量会再次分配内存空间。也就是说,Java 程序片已经被执行了两次,分别运行在不同的线程中,即运行在不同的时间片内。运行在不同线程中的 Java 程序片的局部变量互不干扰,即一个用户改变 Java 程序片中的局部变量的值不会影响其他用户的 Java 程序片中的局部变量。当一个线程将 Java 程序片执行完毕,运行在该线程中的 Java 程序片的局部变量释放所占的内存。

Java 程序片执行特点如下图所示:

2-1 程序片的执行

根据 Java 程序片的上述特点,对于某些特殊情形必须给予特别注意。比如,如果一个用户在执行 Java 程序片时调用 JSP 页面的方法操作成员变量,可能不希望其他用户也调用该方法操作成员变量,以免对其产生不利的影响(成员变量被所有的用户共享),那么就应该将操作成员变量的方法用 synchronized 关键字修饰。当一个线程在执行 Java 程序片期间调用 synchronized 方法时,其他线程在其 Java 程序片中调用这个 synchronized 方法时就必须等待,直到正在调用 synchronized 方法的线程调用执行完该方法。

在下面的代码中,通过 synchronized 方法操作一个成员变量来实现一个简单的计数器。
synchronizedCount.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page contentType="text/html" %>
<%@ page pageEncoding="utf-8" %>
<html>
<body>
<p style="font-family:宋体;font-size:36;color:blue">
<%!
int count = 0; //被用户共享的 count
//synchronized 修饰的方法
synchronized void setCount() {
count++;
}
%>
<%
setCount();
out.println("您是第" + count + "个访问本站的用户");
%>
</p>
</body>
</html>

一个 JSP 页面中的 Java 程序片会按其在页面中的顺序被执行,而且某个 Java 程序片中声明的局部变量在其后继的所有 Java 程序片以及表达式部分内都有效。利用 Java 程序片的这个性质,有时候可以将一个 Java 程序片分割成几个 Java 程序片,然后在这些 Java 程序片之间再插入其他标记元素。在程序片中插入 HTML 中的标记的技巧对于灵活显示数据是非常重要的。通常的格式是:

1
2
3
4
5
6
7
8
9
HTML 中的标记
<%
Java 程序片
%>
HTML 中的标记
<%
Java 程序片
%>
HTML 中的标记

2.4 Java 表达式

可以在 <%=%> 标记符号之间插入一个可求值的表达式(注意:不可插入语句,<%= 是一个完整的符号,<%= 之间不要有空格)。表达式的值由服务器负责计算,并将计算结果用字符串形式发送到用户端显示。

Java 表达式可以写在 <html> 之前,也可以写在 <html></html> 之间或 </html> 之后。

需要注意的是,在 JSP 页面中,表达式的值被表示成一个字符串的形式,即 Tomcat 服务器将表达式的结果转换成字符串,然后发送给用户的浏览器。因此,在编写 JSP 页面时,要把 Java 表达式按普通的文本来使用。

2.5 JSP 中的注释

注释可以增强 JSP 页面的可读性,使 JSP 页面易于维护。JSP 页面中的注释可分以下几种。

HTML 注释

在标记符号 <!----> 之间加入注释内容:

1
<!-- 注释内容 -->

JSP 引擎把 HTML 注释交给用户,因此用户通过浏览器查看 JSP 页面源文件时,能够看到 HTML 注释。

JSP 注释

在标记符号 <%----%> 之间加入注释内容:

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

Tomcat 服务器忽略 JSP 注释,即在编译 JSP 页面时忽略 JSP 注释。

Java 注释

在 Java 程序片、Java 表达式等 Java 代码中,在 // 后加入注释内容。

1
2
3
<%
int i = 0; // 注释内容
%>

2.6 JSP 指令标记

page 指令标记

page 指令用来定义整个 JSP 页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。

可以使用多个 page 指令分别为每个属性指定值,如:

1
2
3
4
<%@ page 属性1="属性1的值" %>
<%@ page 属性2="属性2的值" %>
...
<%@ page 属性n="属性n的值" %>

也可以用一个 page 指令指定多个属性的值,如:

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

page 指令的作用对整个 JSP 页面有效,与其书写的位置无关。习惯上把 page 指令写在 JSP 页面的最前面。

page 指令标记可以为 contentTypeimportlanguagesessionbufferautoFlushisThreadSafepageEncodinginfo 等属性指定值:

contentType 属性

当用户请求一个 JSP 页面时,Tomcat 服务器负责解释执行 JSP 页面,并将某些信息发送到用户的浏览器,以便用户浏览这些信息。Tomcat 服务器同时负责通知用户的浏览器使用怎样的方法来处理所接收到的信息。这就要求 JSP 页面必须设置响应的 MIME(Multipurpose Internet Mail Extention)类型,即设置 contentType 属性的值。contentType 属性值确定 JSP 页面响应的 MIME 类型。属性值的一般形式是:

1
"MIME 类型"

比如,如果我们希望用户的浏览器启用 HTML 解析器来解析执行所接收到的信息(即所谓的网页形式),就可以如下设置 contentType 属性的值:

1
<%@ page contentType="text/html" %>

如果希望用户的浏览器启用本地的 MS-Word 应用程序来解析执行收到的信息,就可以如下设置 contentType 属性的值:

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

如果不使用 page 指令为 contentType 指定一个值,那么 contentType 属性的默认值是"text/html"。JSP 页面使用 page 指令只能为 contentType 指定一个值,不允许两次使用 page 指令给 contentType 属性指定不同的属性值,下列用法是错误的:

page 指令为 contentType 指定一个值的同时,也可以为 contentType 的附加属性 charset 指定一个值(默认值是 iso-8859-1),例如:

1
<%@ page contentType="text/html;charset=gb2312" %>

contentType 的附加属性 charset 的值是通知用户浏览器用怎样的编码解析收到的字符,当 JSP 页面用 page 指令指定设置 charset 的值是 GB2312 时,浏览器会将编码切换成 GB2312。但是,如果 JSP 页面用 page 指定了 JSP 的页面本身的编码,例如:<%@ page pageEncoding ="UTF-8" %>,那么 charset 的值和 JSP 的页面编码保持一致,即 UTF-8(目前的浏览器都支持 UTF-8 编码,所以一般不需要再指定 charset 的值,使其和 JSP 的页面编码保持一致即可)。

可以使用 page 指令为 contentType 属性指定的值有:

  • text/html
  • text/plain
  • image/gif
  • image/x-xbitmap
  • image/jpeg
  • image/pjpeg
  • application/x-shockwave-flash
  • application/vnd
  • ms-powerpoint
  • application/vnd
  • ms-excel
  • application/msword

如果用户的浏览器不支持某种 MIME 类型,那么用户的浏览器就无法用相应的手段处理所接收到的信息。比如,使用 page 指令设置 contentType 属性的值是"application/msword ",如果用户浏览器所驻留的计算机没有安装 MS-Word 应用程序,那么浏览器就无法处理所接收到的信息。

pageEncoding 属性

pageEncoding 属性的默认值是 UTF-8。需要注意的是,和 contentType 的附加属性 charset 的值的意义不同,pageEncoding 属性值是定义 JSP 页面使用的编码,即是告诉 Tomcat 服务器的解析器用怎样的编码解析 JSP 页面中的字符,比如当 JSP 页面指定的编码是 UTF-8 时:

1
<%@ page pageEncoding="utf-8" %>

保存 JSP 页面应当将“编码”选择为"UTF-8",原因是,Tomcat 服务器根据 JSP 页面产生成 Java 文件时,Tomcat 服务器的解析器是按照 UTF-8 编码来解析 JSP 页面中的字符数据(JSP 页面本质上是一个 XML 文档)产生对应 Java 文件。如果保存 JSP 页面时,不小心将编码选择为其他编码(不是 UTF-8),那么 Tomcat 服务器的解析器产生的对应 Java 文件中的某些字符串就可能有乱码现象,而这些字符串又发送到了客户端浏览器,所以用户浏览器显示信息就出现了乱码现象(比如需要客户浏览器显示的非 ASCII 字符就可能呈现乱码状态)。

另外, JSP 页面使用 page 指令只能为 pageEncoding 指定一个值,不允许两次使用 page 指令给 pageEncoding 属性指定不同的或相同的属性值。

language 属性

language 属性定义 JSP 页面使用的脚本语言,该属性的值目前只能取 java。

language 属性指定值的格式是:

1
<%@ page language="java" %>

language 属性的默认值是 java,即如果在 JSP 页面中没有使用 page 指令指定该属性的值的,那么,JSP 页面默认有如下的 page 指令:

1
<%@ page language="java" %>

import 属性

该属性的作用是为 JSP 页面引入 Java 运行环境提供的包中的类,这样就可以在 JSP 页面的程序片部分、变量及方法定义部分以及表达式部分使用包中的类。可以为该属性指定多个值,该属性的值可以是某包中的所有类或一个具体的类,例如:

1
<%@ page import="java.io.*","java.time.LocalDate" %>

这样 JSP 引擎把 JSP 页面转译成的 Java 文件中会有如下的 import 语句:

1
2
import java.io.*;
import java.time.LocalDate;

session 属性

session 属性用于设置是否需要使用内置的 session 对象。session 的属性值可以是 true 或 false。session 属性默认的属性值是 true。

buffer 属性

内置输出流对象 out 负责将服务器的某些信息或运行结果发送到用户端显示。buffer 属性用来指定 out 设置的缓冲区的大小或不使用缓冲区。

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

buffer 属性的默认值是 8kb。buffer 属性可以取值"none",即设置 out 不使用缓冲区。

autoFlush 属性

autoFlush 属性指定 out 的缓冲区被填满时,缓冲区是否自动刷新。

autoFlush 的属性值可以是 true 或 false。autoFlush 属性默认的属性值是 true。

autoFlush 属性取值 false 时,如果 out 的缓冲区填满,就会出现缓存溢出异常。

buffer 的值是"none"时,autoFlush 的值就不能设置成 false。

isThreadSafe 属性

isThreadSafe 属性用来设置访问 JSP 页面是否是线程安全的。isThreadSafe 的属性值可取 true 或 false。当 isThreadSafe 属性值设置为 true 时,JSP 页面能同时响应多个用户的请求;当 isThreadSafe 属性值设置成 false 时,JSP 页面同一时刻只能响应一个用户的请求,其他用户须排队等待。isThreadSafe 属性的默认值是 true。

isThreadSafe 属性值为 true 时,CPU 的使用权在各个线程间快速切换。也就是说,即使一个用户的线程没有执行完毕,CPU 的使用权也可能要切换给其他的线程,如此轮流,直到各个线程执行完毕;当 JSP 使用 page 指令将 isThreadSafe 属性值设置成 false 时,该 JSP 页面同一时刻只能响应一个用户的请求,其他用户须排队等待。也就是说,CPU 要保证一个线程将 JSP 页面执行完毕才会把 CPU 使用权切换给其他线程。

info 属性

info 属性的属性值是一个字符串,其目的是为 JSP 页面准备一个常用但可能要经常修改的字符串。例如:

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

可以在 JSP 页面中使用方法:

1
getServletInfo();

获取 info 属性的属性值。

当 JSP 页面被转译成 Java 文件时,转译成的类是 Servlet 的一个子类,所以在 JSP 页面中可以使用 Servlet 类的方法:getServletInfo()

include 指令标记

如果需要在 JSP 页面内某处整体嵌入一个文件,就可以考虑使用 include 指令标记,其语法格式如下:

1
<%@ include file="文件的 URL" %>

include 指令标记的作用是在 JSP 页面出现该指令的位置处,静态嵌入一个文件,该文件的编码必须和当前 JSP 页面一致,比如二者都是 UTF-8编码。被嵌入的文件必须是可以访问或可以使用的。

使用 include 指令可以实现代码的复用。比如,每个 JSP 页面上都可能都需要一个导航条,以便用户在各个 JSP 页面之间方便地切换,那么每个 JSP 页面都可以使用 include 指令在页面的适当位置整体嵌入一个相同的文件。

需要特别注意的是,允许被嵌入的文件使用 page 指令指定 contentType 属性的值,但指定的值必须和嵌入该文件的 JSP 页面中的 page 指令指定的 contentType 属性的值相同。

2.7 JSP 动作标记

动作标记是一种特殊的标记,它影响 JSP 运行时的功能。

include 动作标记

include 动作标记语法格式是:

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

1
2
3
<jsp:include page="文件的 URL">
param 子标记
</jsp:include>

需要注意的是,当 include 动作标记不需要 param 子标记时,必须使用第一种形式。

include 动作标记告诉 JSP 页面动态包含一个文件,即 JSP 页面运行时才将文件加入。与静态嵌入文件的 include 指令标记不同,当 Tomcat 服务器根据 JSP 页面生成 Java 文件时,不把 JSP 页面中动作指令 include 所包含的文件与原 JSP 页面合并为一个新的 JSP 页面,而是告诉 Java 解释器,这个文件在 JSP 运行时才包含进来。如果包含的文件是普通的文本文件,就将文件的内容发送到用户端,由用户端的浏览器负责显示;如果包含的文件是 JSP 文件,Tomcat 服务器就执行这个文件,然后将执行的结果发送到用户端,并由用户端的浏览器负责显示这些结果。

param 动作标记

param 标记以“名字—值”对的形式为其他标记提供附加信息,param 标记不能独立使用,须作为 jsp:includejsp:forward 标记的子标记来使用。

param 动作标记语法格式是:

1
<jsp:param name="参数名" value="参数值"/>

当该标记与 jsp:include 动作标记一起使用时,可以将 param 标记中参数的值传递到 include 动作标记要加载的文件中去,被加载的 JSP 文件可以使用 Tomcat 服务器提供的 request 内置对象获取 include 动作标记的 param 子标记中 name 给出的参数的值。因此 include 动作标记通过使用 param 子标记来处理加载的文件,比 include 指令标记更为灵活。

forward 动作标记

forward 动作标记语法格式是:

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

1
2
3
<jsp:forward page="要转向的页面">
param 子标记
</jsp:forward>

该指令的作用是:从该指令处停止当前页面的执行,而转向执行 page 属性指定的 JSP 页面。

需要注意的是,当 forward 动作标记不需要 param 子标记时,必须使用第一种形式。

useBean 动作标记

useBean 标记用来创建并使用一个 JavaBean,是非常重要的一个动作标记。

Sun 公司倡导使用 JavaBean 存储数据,JSP 页面显示 JavaBean 中的数据,而 servlet 负责管理 JavaBean 中的数据。

习题 2

  1. <%!%> 之间声明的变量与 <%%> 之间声明的变量有何不同?

    答:在 <%! %> 之间声明的变量是 JSP 页面的成员变量,在整个 JSP 页面内都有效,与书写位置无关,因为 JSP 引擎将 JSP 页面转译成 Java 文件时,将这些变量作为类的成员变量,这些变量的内存空间直到服务器关闭才释放。因此,多个用户共享页面的成员变量。任何用户对 JSP 页面成员变量操作的结果,都会影响其它用户。

    而在 <%%> 里面的变量是局部变量,每个客户都有自己的一个。

  2. 如果有两个用户访问一个 JSP 页面,该页面中的 Java 程序片将被执行几次?

    答:一个 JSP 页面同时被两个用户访问时,其 Java 程序片被执行两次,运行在不同的线程中。

  3. 是否允许 JSP 页面同时含有如下两条 page 指令?

    1
    2
    <%@ page contentType="text/html;charset=gb2312" %>
    <%@ page contentType="application/msword" %>

    答:不允许。在 page 指令中 contentType 属性只能设置一个值。

  4. 是否允许 JSP 页面同时含有如下两条 page 指令?

    1
    2
    <%@ page import="java.util.*" %>
    <%@ page import="java.sql.*" %>

    答:允许。在 page 指令中 import 属性可以设置多个值,表示导入多个包。

  5. 假设有两个用户访问下列 JSP 页面 hello.jsp,请问第一个访问和第二个访问 hello.jsp 页面的用户看到的页面效果有何不同?

    hello.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <%@ page contentType="text/html" %>
    <%@ page pageEncoding="utf-8" %>
    <%@ page isThreadSafe="false" %>
    <html>
    <body>
    <%!
    int sum = 1;
    void add(int m) {
    sum = sum + m;
    }
    %>
    <%
    int n = 100;
    add(n);
    %>
    <%=sum%>
    </body>
    </html>

    答:第一个访问的用户会看到页面输出数字为:101;第二个访问的用户会看到页面输出数字为:201。

  6. 请编写一个简单的 JSP 页面,显示希腊字母表。

    答:代码如下:

    letter.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <%@ page contentType="text/html" %>
    <%@ page pageEncoding="utf-8" %>
    <html>
    <body background="image/java.jpg">
    <p style="font-family:黑体;font-size:36">
    <br>希腊字母表:<br/>
    </p>
    <p style="font-family:宋体;font-size:25">
    <%
    for (char i = 'α'; i <= 'ψ'; i++) {
    out.print(i + " ");
    if (i == 'μ') {
    out.print("<br>");
    }
    }
    %>
    </p>
    </body>
    </html>

    运行截图:

    2-2 输出希腊字母表

  7. 请简单叙述 include 指令标记和 include 动作标记的不同。

    答:不同点如下:

    • include 指令标记:把被包含的文件的内容放于包含文件中组成一个文件后编译运行。
    • include 动作标记:把被包含的文件的运行结果放于包含文件运行产生的结果中,这 2 个文件各自编译运行。
  8. 编写三个 JSP 页面:main.jspcircle.jspladder.jsp,将三个 JSP 页面保存在同一 Web 服务目录中。main.jsp 使用 include 动作标记加载 circle.jspladder.jsp 页面。circle.jsp 页面可以计算并显示圆的面积,ladder.jsp 页面可以计算并显示梯形的面积。当 circle.jspladder.jsp 被加载时获取 main.jsp 页面 include 动作标记的 param 子标记提供的圆的半径以及梯形的上底、下底和高的值。

    答:代码如下:

    main.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>main.jsp</title>
    </head>
    <body>
    <jsp:include page="circle.jsp">
    <jsp:param name="r" value="2"/>
    </jsp:include>
    <jsp:include page="ladder.jsp">
    <jsp:param name="a" value="1"/>
    <jsp:param name="b" value="2"/>
    <jsp:param name="c" value="2"/>
    </jsp:include>
    </body>
    </html>

    circle.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>circle.jsp</title>
    </head>
    <body>
    <%
    double r = Double.valueOf(request.getParameter("r"));
    %>
    圆的半径为:<%=r%>
    <br>
    圆的面积为:<%=Math.PI*r*r%>
    <br/>
    </body>
    </html>

    ladder.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>ladder.jsp</title>
    </head>
    <body>
    <%
    double a = Double.valueOf(request.getParameter("a"));
    double b = Double.valueOf(request.getParameter("b"));
    double c = Double.valueOf(request.getParameter("c"));
    double area = (a + b) * c / 2;
    %>
    梯形的上底为:<%=a%>下底为:<%=b%>高为:<%=c %>
    <br>
    面积为:<%=area%>
    <br/>
    </body>
    </html>

    运行截图:

    2-3 圆和梯形


返回目录 上一章 下一章
博客快捷键
shift K
关闭快捷键功能
shift A
打开/关闭中控台
shift M
播放/暂停音乐
shift D
深色/浅色显示模式
shift S
站内搜索
shift R
随机访问
shift H
返回首页
shift L
友链页面
shift P
关于本站
shift I
原版/本站右键菜单
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體