目录
2.1 JSP页面的基本结构
一个JSP页面可由5种元素组合而成:
- 普通的HTML标记和JavaScript标记
- JSP标记,如指令标记、动作标记
- 变量和方法的声明
- Java程序片
- 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 声明变量和定义方法
在“<%!”和“% >”标记符号之间声明变量和定义方法。“<%!”和“% >”标记符号的内容习惯上放在JSP页面指令之后,<HTML>之前,也可以写在<HTML>与</HTML>之间。
1. 声明变量 例子如下:
<%@ 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.定义方法 例子如下:
<%@ 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 JSP页面的基本结构
可以在“<%”和“%>”之间插入Java程序片。一个Java页面可以有许多程序片,这些程序片将被tomca服务器按顺序执行。在程序片中声明的变量称作JSP页面的局部变量。局部变量的有效范围与其声明的位置有关,即局部变量在Jsp页面后继所有程序片以及表达式部分内容有效。Tomact服务器将Jsp页面转译成java文件时,将各个程序片的这些变量作为某个方法的变量,既局部变量。
Java程序片可以写在<HTML>之前,也可以写在<HTML>和</HTML>之间或</HTML>之后。
当多个用户请求一个jsp页面时。tomact服务器为每个用户启动一个线程,该线程负责执行字节码文件响应用户的请求。tomact服务器为每个用户启动一个线程,该线程负责执行字节码文件响应用户的请求,Tomact服务器使用多线程来处理程序片,其特点如下:
1 操作jsp页面的成员变量。
2 调用jsp页面的方法。
3 操作局部变量。运行在不同线程中的Java程序片的局部变量互不干扰,如果一个用户在执行Java程序片时调用JSP页面的方法操作成员变量,可能不希望其他用户也调用该方法操作成员变量,那么就应该将操作成员变量的方法用synchronized 关键字修饰。
例子如下:
<%@ page contentType = "text/html" %>
<%@ page pageEncoding = "utf-8" %>
<HTML><body>
<p style="font-family:宋体;font-size:36;color:blue">
<%! int count=0; //被用户共享的count。
synchronized void setCount() { //synchronized修饰的方法。
count++;
}
%>
<% setCount();
out.println("您是第"+count+"个访问本站的客户");
%>
</p></body></HTML>
显示图像需要在程序片之间插入用于显示图像的HTML标记:
< imagesrc=图像的URL>文字说明</ image>
例如:想要显示小学生图片:<image src ='image/xiao.jpg' width=180 height=178>小学生</image>
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注释分为俩种:
(1) HTMI注释:在标记符号“<! -”和“->”之间加入注释内容:<! -- 注释内容 -->
(2)JSP注释:在标记符号“<%-”和“-%>”之间加人注释内容: <%--注释内容--%>
2.6 JSP指令标记
2.6.1 page指令标记
page指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。可以使用多个page指令分别为每个属性指定值,如:
<%@ page 属性1="属性1的值"%>
<%@ page 属性2="属性2的值"%>
...
<%@ page 属性n="属性n的值"%>
也可以用一个page指令指定多个属性的值,如:
<%@ page 属性1="属性1的值"属性2="属性2的值"...%>
page指令的作用对整个JSP页面有效,与其书写的位置无关。习惯上把page指令写在JSP页面的最前面。page指令标记可以为pagecontentType,import,language,session,buff,autoFlush,isThreadSafe,pageEncoding,inform,等属性指定值。以下分别讲述这些属性的设置与作用。
1.contentType属性
要求JSP页面必须设置相应的MIME类型,及设置contentType属性的值。contentType属性值确定JSP页面响应的MIME类型。属性值的一般形式时:
"MIME类型"
注意:JSP页面使用page指令只能为contentType指定一个值,不允许两次使用page指令给contentTpe属性指定不同的属性值。
2. pageEncoding属性
pageEncoding属性的默认值时UTF-8.
格式为:<%@ page pageEncoding= "utf - 8" %>
3.language属性
该属性的值目前只能取“java”。
language属性指定值的格式是:<%@ page language="java">
4.import属性
该属性的作用是为JSP页面引入Java运行环境提供的包的类,例如:
<%@ page import="java.io*","java.time.LocalDate"%>
5.session属性
session属性用于设置是否需要使用内置的session对象。session的属性值可以是ture或false。session属性默认值的属性值是true。
6. buffer属性
buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。例如:
<%@ page buffer="24kb"%>
buffer属性的默认值是8kb.buffer属性可以取值none。即设置out不使用缓冲区。
7.autoFlush属性
autoFlash属性指定out的缓冲区被填满时、缓冲区是否自动刷新。autoFlush可以取值true或false. autoFlush 属性的默认值是true。当autoFlush属性取值false时,如果out的缓冲区填满,就会出现缓存溢出异常。
8.isTreadSafe属性
isThreadSafe属性用来设置访问JSP页面是否是线程安全的。
9.info属性
info属性是一个字符串,其目的是为JSP页面准备一个常用但可能要经常修改的字符串。
例如:<%@ page info= "we are students"%>
可以在jsp页面中使用方法:
getServletInfo();
获取info的属性值。
2.6.2 include指令标记
如果需要在JSP页面内某处静态嵌入一个文件,就可以考虑使用include指令标记,
其语法格式如下:<%@ include file = "文件的URL"%>
使用inlude指令可以实现代码的复用。比如,每个 JSP页面上都可能都需要一个导航条,以便用户在各个JSP页面之间方便地切换,那么每个JSP页面都可以使用include指令在页面的适当位置整体嵌人--个相同的文件。
2.7JSP动作标记
2.7.1include动作标记
include动作语法标记语法格式为:
<jsp:include page="文件的URL"/>
或<jsp:include page="文件的URL">
param子标记
</jsp:include>
注:当include动作标记不需要param子标记时,必须使用第一种形式。
2.7.2param动作标记
param标记以“名字-值”对的形式为其他标记提供附加信息,param标记不能独立使用,必须作为jsp:include,jsp:forward标记的子标记来使用。
param动作标记的语法格式是:
<jsp:param name="参数"value "参数的值"/ >
2.7.3forward动作标记
forward动作标记的格式是:
<jsp:forward page="要转向的页面"/>
或<jsp:forward page="要转向的页面"/>
param子标记
</jsp:forward>
该指令的作用是:从该指令处停止当前页面的执行,而转向执行page属性指定的JSP页面。当forward动作标记不需要param子标记时,必须使用第一种形式。
example2_12.jsp使用forward标记转向example2_12_a.jsp和example2_12_b.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>
结果大于5则转向example2_12_b.jsp,否则为example2_12_a.jsp。
结果如下:
以上就是第二章 jsp语法的全部内容