目录
前言
本章主要学习JSP页面的基本结构、声明变量和定义方法、Java程序片、Java表达式、JSP指令标记和JSP动作标记。
2.1、JSP页面的基本结构
在传统的HTML页面文件中加入Java程序片和JSP标记就构成了一个JSP页面。一个JSP页面可有5种元素组成:
- 普通的HTML标记和JavaScript标记。
- JSP标记,如指令标记、动作标记。
- 变量和方法的声明。
- Java程序片
- Java表达式
本文章默认读者初步了解HTML语言,但不要求掌握JavaScript。
在下面的例子中页面包含了5种元素,其中
★使用HTML的img标记显示一幅图像(需要将一幅图像xxx.jpg保存在Web服务目录ch2的image目录中)。
★使用JavaScript显示客户端浏览器的时间
★使用Java程序片显示Tomcat服务器端的时间
★使用Java表达式显示一些变量的值
代码如下
<%@ page contentType="text/html" %> <!-- jsp指令标记 -->
<%@ page pageEncoding = "utf-8" %> <!-- jsp指令标记 -->
<%@ page import="java.time.LocalTime" %> <!-- jsp指令标记 -->
<%! public int continueSum(int start,int end){ // 定义方法
int sum =0;
for(int i=start;i<=end;i++)
sum=sum+i;
return sum;
}
%>
<HTML><body bgcolor = pink>
<script> <!--JavaScript(JS)标记 -->
var userTime = new Date();
var hour = userTime.getHours();
var minute =userTime.getMinutes();
var second = userTime.getSeconds();
var millisecond = userTime.getMilliseconds();
document.write("<h2>浏览器时间:"+
hour+":"+minute+":"+second+":"+millisecond+"<br></h2>");
</script>
<img src="image/time.jpg" width=180 height=120 /> <!--html标记 -->
<p style="font-family:黑体;font-size:36;color:red"> <!--html标记 -->
<% //Java程序片:
LocalTime timeServer = LocalTime.now();
int hour = timeServer.getHour();
int minute =timeServer.getMinute();
int second = timeServer.getSecond();
int nano = timeServer.getNano() ;//纳秒。
int millisecond = nano/1000000;
out.print("服务器时间:<br>"+
hour+":"+minute+":"+second+":"+millisecond);
int start=1;
int end=100;
int sum=continueSum(start,end);
%>
</p>
<p style="font-family:宋体;font-size:33;color:blue">
从
<%= start %> <!-- Java表达式 -->
至
<%= end %> <!-- Java表达式 -->
的<br>连续和是:
<%= sum %> <!-- Java表达式 -->
</p>
<script> <!--JavaScript(JS)标记 -->
document.write("<h2>服务器时间:"+
<%=hour%>+":"+<%=minute%>+":"+<%=second%>+":"+<%=millisecond%>+"</h2>");
</script>
</body></HTML>
2.2、声明变量和定义方法
在"<%!“和”%>"标记符号之间声明变量和定义方法。
2.2.1.声明变量
"<%!“和”%>“之间声明的变量在整个JSP页面内都有效,与”<%!“和”%>“标记符在JSP页面中所在的书写位置无关,但习惯上把”<%!“和”%>"标记符写在JSP页面的前面。
"<%!“和”%>"标记符之间声明的变量为类的成员变量,这些变量占有内存空间知道Tomcat服务器关闭才释放。
2.2.2.定义方法
★可以在"<%!“和”%>“标记符之间定义方法,可以在Java程序片中调用该方法。方法内声明的变量只在该方法内有效。
★可以在”<%!“和”%>"标记符号之间定义类,可以在Java程序片中使用该类创建对象。
下面例子中在"<%!“和”%>“之间定义了两个方法multi(int x,int y)和div(int x,int y),在程序片中调用这两个方法。在”<%!“和”%>"之间定义了一个Circle类,然后在程序片中使用该类创建对象计算圆面积。
代码如下
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor = #ffccff>
<p style="font-family:宋体;font-size:36;color:blue">
<%! double multi(double x,double y){ //定义方法
return x*y;
}
double div(double x,double y) { //定义方法
return x/y;
}
class Circle { //定义类
double r;
double getArea(){
return 3.1415926*r*r;
}
}
%>
<% double x=8.79;
double y=20.8;
out.print("调用multi方法计算"+x+"与"+y+"之积:<br>");
out.print(multi(x,y));
out.print("<br>调用div方法计算"+y+"除以"+x+"的商:<br>");
String s =String.format("小数点保留3位:%10.3f",div(y,x));
out.println(s);
Circle circle = new Circle(); //用Circle类创建对象。
circle.r = 3.6;
out.print("<br>半径是"+circle.r+"的圆面积"+circle.getArea());
%>
</p></body></HTML>
2.3、Java程序片
★可以在"<%“和”%>"之间插入Java程序片。一个JSP页面可以有许多程序片,这些程序片将被Tomcat服务器按顺序执行。
★在程序片中声明的变量称作JSP页面的局部变量,在JSP页面后继的所有程序片以及表达式部分内都有效。
下面的例子中获得一个7~19的随机数,如果获得的数小于或等于13就显示一幅篮球的图像,否则显示一幅打篮球的帅气男孩图像。显示图像需要在程序片之间插入用于显示图像的
< imagesrc = 图像的URL > 文字说明 < /image >
HTML标记。
代码如下
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=cyan>
<% //Math.random()是 [0,1)之间的随机数
int number = 7+(int)(Math.random()*13);
if(number<=13) {
%>
<center> <h2>显示篮球图片</h2> <!-- 插入其他标记 -->
<image src ='image/xiao.jpg' width=180 height=178>篮球</image>
<% }
else {
%>
<center> <h2>显示打篮球的帅气男孩图片</h2>
<image src ='image/zhong.jpg' width=180 height=178>打篮球的帅气男孩</image>
<% }
%>
</body></HTML>
2.4、Java表达式
可以在"<%=“和”%>“之间插入一个可求值的表达式(注意:”<%=是一个完整的符号)。在JSP页面中,表达式的值被表示成一个字符串的形式,因此,在编写JSP页面时,要把Java表达式按普通的文本来使用。
例
代码如下
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=pink>
<% int x=12,y=9;
%>
<p style="font-family:宋体;font-size:36">
计算表达式x+y+x%y,即<%= x %>+<%= y %>+<%= x %>%<%= y %>的值:
<%= x+y+x%y %>
<br>计算表达式x>y即<%= x %> > <%= y %>的值:
<%= x>y %>
<br>计算表达式sin(<%= Math.PI %>/2)的值:
<%= Math.sin(Math.PI/2) %>
<br>
<% if(x-y>=0) {
%>
如果<%= x %>大于<%= y %>,计算<%= x %> - <%= y %>即
<%= x-y %>的平方根:
<%=Math.sqrt(x-y)%>
<% }
%>
</p></body></HTML>
2.5、JSP中的注释
- HTML注释:在标记符号"<! --“和”–>"之间加入注释内容。
- JSP注释:在标记符号"<%–“和”–%>"之间加入注释内容。
Tomcat服务器忽略JSP注释,即在编译JSP页面时忽略JSP注释。
代码如下
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body>
<%-- 下面是Java程序片 --%>
<% String str = "C:\\jspfile\\example2_7.jsp";
int index = str.lastIndexOf("\\");
str = str.substring(index+1);
%>
<!-- 以下字体的颜色为蓝色 -->
<p style="font-family:黑体;font-size:20;color:blue">
抽取字符串<%= str %>中的JSP文件名字.
<!-- 以下字体的颜色为红色 -->
<font size="6" color="red"><br>
<%-- 下面是Java表达式 --%>
<%= str %>
</font>
</p>
</body></HTML>
2.6、JSP指令标记
2.6.1、page指令标记
page指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。page指令的作用对整个JSP页面有效。
<%@ page属性 n = “属性n的值”%>
<%@ page 属性1 = "属性1的值"属性2 = “属性2的值”…%>
page指令标记可以为以下9种:
- contentType属性
如果我们希望用户的浏览器启用HTML解析器来解析执行所接收到的信息(即所谓的网页形式),就可以如下设置:
<%@ page contentType = “text/html” %>
★ 如果不使用page指令为contentTypezhiding一个值,那么默认值是"text/html"。
★不允许两次使用page指令给contentType属性指定不同的属性值。
★用page指令为contentType指定一个值的同时,也可以为contentType的附加属性charset指定一个值(默认值是iso-8859-1)。
- pageEncoding属性
该属性的作用是告诉Tomcat服务器的解析器用怎样的编码解析JSP页面中的字符。如:
<%@ page pageEncoding = “utf-8” %>
★pageEncoding属性的默认值是UTF-8。
★不允许两次使用page指令给pageEncoding属性指定不同的或相同的属性值。
- language属性
language属性定义JSP页面使用的脚本语言,该属性的值目前只能取"java",默认值为"java"。指定格式如下:
<%@ page language = “java” %>
- import属性
该属性的作用是为JSP页面引入Java运行环境提供的包中的类,这样就可以在JSP页面的程序片、变量及定义方法中等使用包中的类。指定格式如下:
<%@ page import = "java. io. * ", “java. time. LocalDate” %>
JSP页面默认import属性已经有如下值:
"java. lang. * " "javax. servlet. * " "javax. servlet. jsp. * " "javax. servlet. http. * "
- session属性
session属性用于设置是否需要使用内置的session对象。session的属性值为true或false。默认值为ture。
- buffer属性
内置输出流对象out负责将服务器的某些信息或运行结果发送到用户端显示。buffer属性用来指定out设置的缓冲区的大小或不适用缓冲区。例:
<%@ page buffer = “24kb” %>
- autoFlush属性
autoFlush属性指定out的缓冲区被填满时,缓冲区是否自动刷新。取值为true或false,默认为true。当buffer的值是“none”时,autoFlush的值就不能设置成flase。
- isThreadSafe属性
isThreadSafe属性用来设置访问JSP页面是否线程安全的。取值为true或false。
★当值为true时,JSP页面能同时响应多个用户的请求;
★当职位false时,JSP页面同一时刻只能响应一个用户的请求,其他用户需等待。
★默认值为true。
- info属性
info属性的属性值是一个字符串,目的是为JSP页面准备一个常用但可能经常修改的字符串。例:
<%@ page info = “we are student” %>
可以在JSP页面中使用getServletInfo();方法获取info属性的属性值。
2.6.2、include指令标记
在JSP页面内某处整体嵌入一个文件,就可以使用include指令标记,语法格式如下:
<%@ include file = “文件的URL” %>
JSP页面该指令处将会静态嵌入一个文件。
★该文件的编码必须和当前JSP页面一致。
★被嵌入的文件必须是可以访问或可以使用的。
★若文件与JSP页面在同一Web服务目录中,那么“文件的URL”就是文件的名字。如果在JSP页面的Web服务目录的子目录,例如a子目录中那么“文件的URL”为a/文件名。
下面例子中两个页面使用include指令标记嵌入一个文本文件:ok.txt。
代码如下:
ok.txt
<%@ page contentType="text/html" %>
<center>
<A href="example2_10_a.jsp">北京大学</A>
<A href="example2_10_b.jsp">清华大学</A>
example2_10_a.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ include file="myfile/ok.txt" %>
<HTML><center><body background="image/beida.jpg">
<bgsound src="sound/beida.mp3" loop=1>
<h1>这里是北京大学 </h1>
</body></HTML>
example2_10_b.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%@ include file="myfile/ok.txt" %>
<HTML><center><body background="image/tsinghua.jpg">
<bgsound src="sound/tsinghua.mp3" loop="-1">
<h1>这里是清华大学 </h1>
</body></HTML>
2.7、JSP动作标记
动作标记是一种特殊的标记,影响JSP运行时的功能。
2.7.1、include动作标记
include动作标记语法格式为:
< jsp:include page = “文件的URL” />
或
< jsp:include page = “文件的URL”>
param子标记
</jsp:include >
(注: “jsp” “:” “include”三者之间不要有空格。)
当不需要子标记时,必须使用第一种形式。
include动作标记告诉JSP页面动态包含一个文件,即JSP文件运行时才将文件加入。
include动作标记与include指令标记的不同:
★include指令标记在编译阶段就处理所需要的文件,被处理的文件在逻辑和语法上依赖于当前的JSP页面,优点是执行速度快。
★include动作标记在JSP页面运行时才处理文件,被处理的文件在逻辑和语法上独立与当前的JSP页面,优点是可以使用param子标记更灵活地处理文件,缺点是执行速度慢一些。
2.7.2、param动作标记
param标记以“名字-值”对的形式为其他标记提供附加信息,param标记不能单独使用,须作为jsp:include、jsp:forward标记的子标记来使用。语法格式是:
< jsp:param name = “参数” value = “参数的值” />
下面例子中使用include动作标记加载JSP文件并保存在当前Web服务目录ch2的子目录myfile中。
代码如下
example2_11
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=cyan >
<% double a=6.12,b=7.08,c=9.22;
%>
<p style="font-family:宋体;font-size:36">
<br>加载triangle.jsp计算三边为<%=a%>,<%=b%>,<%=c%>的三角形面积.
<jsp:include page="myfile/triangle.jsp">
<jsp:param name="sideA" value="<%=a%>"/>
<jsp:param name="sideB" value="<%=b%>"/>
<jsp:param name="sideC" value="<%=c%>"/>
</jsp:include>
</p></body></HTML>
triangle.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<%! public String getArea(double a,double b,double c) {
if(a+b>c&&a+c>b&&c+b>a) {
double p=(a+b+c)/2.0;
double area=Math.sqrt(p*(p-a)*(p-b)*(p-c)) ;
String result = String.format("%.2f",area);//保留两位小数
return result;
}
else {
return(""+a+","+b+","+c+"不能构成一个三角形,无法计算面积");
}
}
%>
<% 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);
%>
<p style="font-family:黑体;font-size:36;color:blue">
<br><b>我是被加载的文件,负责计算三角形的面积<br>
给我传递的三边是:<%=sideA%>,<%=sideB%>,<%=sideC%></b>
<br><b><i>三角形的面积(保留2位小数):<%= getArea(a,b,c)%></i></b></i>
</p>
2.7.3、forward动作标记
语法格式为:
< jsp:forward page = “要转向的页面” />
或
< jsp:forward page = “要转向的页面” >
param 子标记
</ jsp;forward >
该指令作用是:从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。
★需要注意的是,当前页面使用forward动作标记转向后,尽管用户看到了转向后的页面的效果,但浏览器地址栏中显示的仍然是转向前的JSP页面的URL地址,因此,如果刷新浏览器的显示,将再次执行当前测览器地址栏中显示的JSP页面。
下面例子中
在example2_12.jsp页面随机产生一个1~10之间的随机数,若该数大于5就转向页面example2_12_a.jsp,否则转向页面examplez2_12_b.jsp。example2_12.jsp使用param子标记将随机数传递给要转向的页面。
代码如下
example2_12.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body>
<h1> 产生一个1-10之间的随机数
<% double i=(int)(Math.random()*10)+1;
if(i<=5) {
%> <jsp:forward page="example2_12_a.jsp" >
<jsp:param name="number" value="<%= i %>" />
</jsp:forward>
<% }
else {
%> <jsp:forward page="example2_12_b.jsp" >
<jsp:param name="number" value="<%= i %>" />
</jsp:forward>
<% }
%>
</body></HTML>
example2_12_a.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=cyan>
<p style="font-family:宋体;font-size:36">
<% String s=request.getParameter("number");
out.println("传递过来的值是"+s);
%>
<br><img src=image/pic_a.jpg width=300 height=280/>
</p></body></HTML>
example2_12_b.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=yellow>
<p style="font-family:宋体;font-size:36">
<% String s=request.getParameter("number");
out.println("传递过来的值是"+s);
%>
<br><img src=image/pic_b.jpg width=300 height=280 />
</p></body></HTML>
2.7.4、useBean标记
用来创建并使用一个JavaBean,该标记在后面会详细讨论。
总结
以上就是本次所介绍的内容,包含了Java程序片、Java表达式、JSP指令标记还有JSP动作标记。通过这次的学习,我们可以学习到JSP页面的基本结构和JSP语法,可以让我们在看代码时更加的便捷。