目录
前言
本章是关于jsp语法内容,主要内容包括jsp页面的基本结构、声明变量和定义方法、Java表达式、Java程序片、jsp中的注释以及jsp的指令和动作标记.其中 难点是Java程序片和jsp动作标记
1.1 jsp页面的基本结构
jsp页面由5种元素组成,分别是普通的html标记、JavaScriptb标记、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>
1.1.1声明变量和定义方法
"<%!"和“%>”之间声明的变量:成员变量
"<%"和“%>”之间声明的变量:局部变量
在"<%!"和"%>"标记符号之间声明变量和定义方法,标记符号的内容习惯上放在jsp页面指令之后,<html>之前。也可以写在<html>与</html>之间。
"<%!"和"%>"标记符号之间声明的变量在整个jsp页面内都有效,在将JSP页面转译为Java文件时,“<%!”和“%>”之间声明的变量作为类的成员变量这些变量占有的内存空间直至Tomcat服务器关闭才释放。这些变量能够被多个线程共享,任何一个用户对其操作的结果都会影响其他用户。而“<%”和“%>”之间声明的变量称为:JSP页面的局部变量。
代码如下(示例):
<%@ 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>
"<%!"和“%>”之间声明的方法:可以在程序片种调用,方法中声明的变量只在该方法内有效。
"<%!"和“%>”之间声明的类:可以在程序片中使用该类创建对象。
代码如下(示例):
<%@ 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>
1.1.2Java程序片
- 有三个特点:
- 操作jsp页面的成员变量
- 调用jsp页面方法
- 操作局部变量
"<%"和“%>”之间声明的变量:局部变量。
局部变量的有效范围与其声明的位置有关,即局部变量在jsp页面后继的所有程序片以及表达式部分内都有效。"<%"和“%>”之间插入程序片。
可以有许多个程序片,按顺序执行。
可以将一个程序片分割成多个程序片,然后再这些程序片间插入其他标记元素。html中的标记 <% java程序片 %> html中的标记 <% java程序片 %> html中的标记
tip:操作的成员变量是各个线程(用户)共享的变量,所调用的方法必须是jsp页面曾定义的方法
<%@ 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>
如果成员变量不想同时被多个用户同时调用,要用
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>
1.1.3Java表达式
语法: <%= expression %>
"<%"和“=”不要有空格
计算结果为字符串类型结果发送到客户端显示
<%@ 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>
tip:在编写jsp页面时,要把Java表达式按普通的文本来使用
1.1.4jsp中的注释
三种:
(1)HTML注释:<!--注释内容-->
HTML注释在发布网页时可以在浏览器源文件窗口中可以看到,并且在这种注释中可以使用JSP的表达式
(2)JSP注释:<%-- 注释内容 --%>
编译时忽略,也称隐藏注释(3)Java注释:
<%/*comment*/%>
<%@ 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>
1.2jsp指令标记
1.2.1page指令标记
对整个JSP页面有效,与书写位置无关。
(1)contentType:通知用户浏览器使用怎样的方法来处理接收到的信息。只能设置一个,默认值为”text/html“。”text/html“启动HTML解析器来解析; "application/msword"启动本地的MS-Word应用程序来解析。
可以附加属性charset设置浏览器用怎样的编码解析收到的字符。
(2)pageEncoding:告诉解析器用怎样的编码解析JSP页面中的字符,默认UTF-8。只能指定一个值
<%@ page contentType="image/jpeg" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="java.awt.geom.*" %>
<%@ page import="javax.imageio.ImageIO" %>
<% int width=320, height=300;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.lightGray);
g.fillRect(0, 0, width, height);
Graphics2D g_2d=(Graphics2D)g;
Ellipse2D ellipse=new Ellipse2D. Double (70,90,120,60);
g_2d.setColor(Color.blue);
AffineTransform trans=new AffineTransform();
for(int i=1;i<=24;i++) {
trans.rotate(15.0*Math.PI/180,160,130);
g_2d.setTransform(trans);
g_2d.draw(ellipse);
}
g_2d.setColor(Color.red);
Arc2D arc= new Arc2D.Double (200,220,100,40,0,270,Arc2D.PIE);
g_2d.fill(arc);
arc.setArc(5,5,100,40,0,-270,Arc2D.PIE);
g_2d.fill(arc);
g_2d.setColor(Color.black);
g_2d.setFont(new Font("",Font.BOLD,18));
g_2d.drawString("耿祥义, Graphic Drawer",10,280);
g_2d.dispose();
OutputStream outClient= response.getOutputStream(); //获取指向用户端的输出流
boolean boo =ImageIO.write(image,"jpeg",outClient);
%>
(3)language:定义JSP页面使用的脚本语言,目前只能是Java
(4)import:为JSP页面引入Java运行环境提供的包中的类。
<%@ page import="java.io.*", "java.util.Date" %>
(5)session:用于设置是否需要使用内置的session对象。指定这个页面是否参与一个Http会话
session的属性值可以是true或false。session属性默认的属性值是true。
(6)buffer:用来指定out设置的缓冲区的大小或不使用缓冲区。
<%@ page buffer= “24kb” %>
(7)autoFlush:指定out的缓冲区被填满时,缓冲区是否自动刷新。
<% @ page autoFlush=”true”%>
<% @ page autoFlush=”false”%>
如果值为“false”,则当缓冲区满时,会有一个缓存溢出异常。
如果值为nose,则不能设置为false.
autoFlush的默认值是true.
(8)isThreadSafe:用来设置JSP文件是否能多线程使用。若为true,则JSP能同时处理多个用户的请求。若为false,则JSP只能一次处理一个请求。
(9)info:属性值是一个字符串,为JSP页面准备一个常用但可能要经常修改的字符串。
<%@ page info ="we are students"%>
使用:
getServletInfo();
1.2.2include指令标记
<%@ include file="文件名的URL"%>
在JSP页面内静态嵌入一个文件,文件编码和当前JSP页面一致。静态的包含就是指这个被包含的文件将会被插入到JSP文件中去,这个被包含的文件可以是JSP文件、HTML文件、文本文件或者只是一段Java代码。
一个 JSP 页面中的 include 指令的数量不受限制。
如果 对嵌入的文件进行了修改,那么服务器会重新编译JSP页面,即将当前的JSP页面和修改后的文件合并成一个JSP页面,然后服务器再将这个新的JSP页面转译成Java类文件。
1.3jsp动作标记
1.3.1include动作标记
<jsp:include page=“文件的URL”/>
include指令标记与include动作标记的不同。
处理时间和处理方式不同。include指令标记是在编译阶段就处理所需要的文件,被处理的文件逻辑和语法上依赖于当前的JSP页面(编码一致);include动作标记是在JSP页面运行时才处理文件,被处理文件在逻辑和语法上独立于当前JSP页面。前者静态嵌入,后者动态包含。include指令标记执行速度高于include动作标记。
1.3.2param动作标记
它被用来以“名-值”对的形式为其它标签提供附加信息。
它和jsp:include、jsp:forward、jsp:plugin一起使用。
当该标记与jsp:include动作标记一起使用时,可以将param标记中的值传递到include动作标记要加载的文件中去,被加载的JSP文件可以使用Web服务器提供的request内置对象获取include动作标记的param子标记中name属性所提供的值
<jsp:param name=“参数” value=“参数的值”/>
forward动作标记
从该指令处停止当前页面的继续执行,而转向执行page属性指定的JSP页面。
forward转移后,浏览器中现实的URL仍是转向前的URL地址,因此刷新后返回原来的界面
<jsp:forward page="要转向的页面" />
总结
以上就是今天要讲的内容,本文介绍了JSP的基本语法。