目录
前言
本章内容主要为JSP页面一些常用的语法结构
2.1、JSP页面的基本结构
2.1.1、在传统的HTML页面文件中加入Java程序片和JSP标记就构成了一个JSP页面。一个JSP页面可由5种元素组合而成:普通的HTML 标记和JavaScript标记、JSP标记、变量和方法的声明、Java程序片、Java表达式。
2.1.2、当Tomcat服务器上的JSP页面被第一次请求执行时,Tomcat服务器首先将JSP页面文件转译成一个Java文件,再将这个Java文件编译生成字节码文件,然后通过执行字节码文件响应用户的请求。当多个用户请求一个JSP页面时,Tomcat服务器为每一个用户启动一个线程,该线程负责执行常驻内存的字节码文件来响应相应用户的请求。这些线程由Tomcat服务器来管理,将CPU的使用权在各个线程之间快速切换,以保证每个线程都有机会执行字节码文件。
2.1.3、例:下面例子中包含了5中元素,其中使用HTML的img标记显示一副图像(需要将一幅图像time.jpg保存在Web服务目录ch2的image目录中)。客户端浏览器访问该JSP页面,可以发现客户端浏览时间和Tomcat服务器端的时间差。
<%@ 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页面内都有效,与书写位置无关,声明的变量知道Tomcat服务器关闭才释放。
下面举一个简单计数器的例子:
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body bgcolor=yellow>
<%! int i=0;
%>
<% i++;
%>
<p style="font-family:宋体;font-size:36">
您是第<%= i %>个访问本站的用户。
</p>
</body></HTML>
2.2.2、定义方法和类
可以在“<%!”和“%>”标记符号之间定义方法,可以在Java程序片中调用该方法。方法内声明的变量只在该方法内有效,当方法被调用时,方法内声明的变量被分配内存,方法被调用完毕即可释放这些变量所占的内存。
2.3、Java程序片
标记符:
<% %>
可以在“<%”和“%>”之间插入Java程序片。一个JSP页面可以有许多程序片,这些程序片将Tomcat服务器按顺序执行。在程序片中声明的变量称作JSP页面的局部变量。局部变量的有效范围与其声明的位置有关,即局部变量在JSP页面后继的所有程序片以及表达式部分内都有效。Tomcat服务器将JSP页面转译成Java文件时,将各个程序片的这些变量作为类中某个方法的变量,即局部变量。
2.4、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中的注释
注释可以增强JSP页面可读性,使其易于维护。JSP页面中注释可分为:
2.5.1HTML注释
<!-- 注释内容 -->
2.5.2JSP注释:
<% -- 注释内容 --%>
2.6、JSP指令标记
2.6.1 page指令标记
<% @ page 属性1 = "属性1的值" %>
例如:每个JSP页面都会有的内容
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
也可合成一个page指令:
<%@ page contentType = "text/html" pageEncoding = "utf-8" %>
注意;page指令的作用对整个JSP页面都有效,与书写位置无关,但习惯性写在最前面
page指令标记可以为 contentType、improt、language、session、buffer、autoFlush、isThreadSafe、pageEncoding、inform等属性指定值。
(1)contentType属性
contentType属性值确定JSP页面响应的MIME(Multipurpose Internet Mail Extention)类型和JSP页面字符的编码。属性值的一般形式是MIME类型;charset=编码(显示在网页上的格式)。例如;
<%@ page contentType="text/html;charset="GB2312”%>
如果不使用page指令为contentType制定一个值,那么contentType属性的默认值是text/html
当用户请求一个JSP页面时,Tomcat服务器负责解释执行JSP页面,并将某些信息发送到用户的浏览器,以便用户浏览这些信息。Tomcat服务器同时负责用户的浏览器使用怎样的方式来处理所接收到的信息,这就要求JSP页面必须设置响应的MIME类型和JSP页面字符的编码。例如,如果希望用户的浏览器启用HTML解析器来解析执行所接收到的信息(即所谓的网页形式),就可以如下设置contentType属性的值:<%@ pagecontentType="application/msword"%>
JSP页面使用page指令只能为contentType指定一个值,不允许两次使用page指令给contentType属性指定不用的属性值,下列用法是错误的:
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page contentType="application/msword" %>
(2) pageEncoding属性
默认属性值是UTF-8。例如:
<%@ page pageEncoding = "utf-8" %>
保存JSP页面应当将“编码”选择为“UTF-8”,另外,JSP页面使用page指令只能为pageEncoding指定一个值,不允许两次使用page指令给pageEncoding指定不同或相同的属性值。
(3) language 属性
定义JSP页面使用的脚本语言,目前只能取“java”,格式为:
<% @ page language = "java" %>
注意:若无指定,也默认为有上述指令。
(4)import 属性
为JSP页面引入java运行环境提供的包中的类,例如:
<% @ page import = "java.io.*","java.time.LocalDate" %>
JSP页面默认已有如下值:
" java.lang.* " "javax.servlet.* " "javax.servlet.jsp.*" "javax.servlet.http.*"
(5)session属性
用于设置是否需要内置的session对象,默认值为true
(6)buffer 属性
内置输出流对象out负责将服务器的某些信息或运行结果发送到用户端显示。buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。例如:
<% @ page buffer = "24kb" %>
(7)autoFlush属性
指定out缓冲区被填满时,缓冲区是否自动刷新。
(8)isThreadSafe属性
设置访问JSP页面是否是线程安全的。
(9)info 属性
目的是为JSP页面准备一个常用但可能要经常改的字符串,例如:
<% @ page info = "we are students" %>
可以使用getServletInfo()方法获取info属性的属性值。
2.6.2 include 指令标记
可以使用 include 指令标记在JSP页面内某处整体嵌入一个文件,格式为:
< % @ include file = "文件的URL" %>
2.7、JSP动作标记(重点)
2.7.1include动作标记,其语法格式为:
<jsp:include page = "文件的URL"/>
或
<jsp:include page = "文件的URL"/>
param 子标记
</jsp:include>
注意:不需要param子标记时,必须使用第一种形式。
include动作标记告诉JSP页面动态包含一个文件,即JSP页面运行时才将文件加入。
2.7.2 param动作标记
param标记以“名字-值”对的形式为其他标记提供附加信息,不能独立使用,必须作为jsp:include、jsp:forward标记的子标来使用。语法格式为:
<jsp:param name = "参数" value="参数的值" />
2.7.3 forward动作标记
<jsp:forward page = "要转向的页面"/>
或
<jsp:forward page = "要转向的页面"/>
param 子标记
</jsp:forward>
该指令的作用是:从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。若forward动作标记不需要param子标记时,必须使用第一种形式。
<%@ 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>
<%@ 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>
<%@ 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 动作标记
将在后续文章进行讨论,本文不做过多解释。