第二章:JSP语法

JSP页面的基本结构

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

格式:<HTML><代码>和<script>代码</script>
2.JSP标记,如指令标记、动作标记。

格式:<%@ 代码 %>
3.变量和方法的声明。

格式:<%!代码 %>
4.Java程序片。

格式:<% 代码 %> 
5.Java表达式。

格式:<%= 代码 %>

这是一段JSP源码,下面我将用其去展示JSP页面的基本结构:

<%@ 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>
<!-- HTML标记 -->
<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>

下面该JSP源码的页面显示:

 声明变量和定义方法

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

下面一段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>  
 

这是上面代码的实现

 

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

下面一段JSP源码在“<%!”和“%>”之间定义了两个方法 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>

这是上面代码的实现

 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程序片的局部变量释放所占的内存。

下面的JSP源码获得一个7~19的随机数,如果获得的数小于或等于13就显示一幅小学生的图像,否则显示一幅中学生的图像。

显示图像需要在程序片之间插入用于显示图像的
<imagesrc=图像的URL>文字说明</image>

<%@ 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>

这是上面代码的实现:

随机数大于13:

随机数不大于13

 Java表达式

可以在“<%=”和“%>”之间插入一个可求值的表达式(注意:不可插入语句,“<%=”是一个完整的符号,“<%”和“=”之间不要有空格)。表达式的值由服务器负责计算,并将计算结果用字符串形式发送到用户端显示。
Java表达式可以写在<HTML>之前,也可以写在<HTML>和</HTML>之间或</HTML>之后。
需要注意的是,在JSP页面中,表达式的值被表示成一个字符串的形式,即Tomcat服务器将表达式的结果转换成字符串,然后发送给用户的浏览器。因此,在编写JSP页面时,要把Java表达式按普通的文本来使用。

下面的JSP源码是计算几个表达式的值。

<%@ 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>

这是上面代码的实现:

 JSP中的注释

注释可以增强JSP页面的可读性,使JSP页面易于维护。JSP页面中的注释可分为两种。
(1)HTML注释:在标记符号“<!--”和“-->”之间加入注释内容:
<!--注释内容-->
JSP引擎把HTML注释交给用户,因此用户通过浏览器查看JSP页面的源文件时,能够看到HTML注释。
(2)JSP注释:在标记符号“<%--”和“--%>”之间加入注释内容:
<%--注释内容--%>
Tomcat服务器忽略JSP注释,即在编译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>  

 JSP指令标记

page指令标记用来定义整个JSP页面的一些属性和这些属性的值,属性值用单引号或双引号括起来。可以使用多个page指令分别为每个属性指定值,如:
<%@page属性1="属性1的值"%>
<%@page属性2="属性2的值"%>
<%@page属性n="属性n的值"%>
也可以用一个page指令指定多个属性的值,如:
<%@page属性1=“属性1的值”属性2=“属性2的值”⋯%>
例如,前面各个例子中的2个page指令:
<%@page contentType="text/html"%>
<%@page pageEncoding="utf-8"%>
也可以合并成1个page指令:
<%@page contentType="text/html"pageEncoding="utf-8"%>

❶contentType属性
  我们已经知道,当用户请求一个JSP页面时, Tomcat服务器负责解释执行JSP页面,并将某些信息发送到用户的浏览器,以便用户浏览这些信息。Tomcat服务器同时负责通知用户的浏览器使用怎样的方法来处理所接收到的信息。这就要求JSP页面必须设置响应的MIME(Multipurpose Internet Mail Extention)类型,即设置c ontentType属性的值。content Type 属性值确定JSP页面响应的MIME类型。属性值的一般形式是:
"MIME类型"
  比如,如果我们希望用户的浏览器启用HTML解析器来解析执行所接收到的信息(即所谓的网页形式),就可以如下设置contentType属性的值:
<%@page contentType="text/html"%>

❷pageEncoding属性
pageEncoding属性的默认值是UTF-8。需要注意的是,和contentType的附加属性charset的值的意义不同,pageEncoding属性值是定义JSP页面使用的编码,即是告诉Tomcat服务器的解析器用怎样的编码解析JSP页面中的字符,比如当JSP页面指定的编码是UTF-8时:
<%@page pageEncoding="utf-8"%>
保存JSP页面应当将“编码”选择为“UTF-8”,原因是, Tomcat服务器根据JSP页面产生成Java文件时, Tomcat服务器的解析器是按照UTF-8编码来解析JSP页面中的字符数据(JSP页面本质上是一个XML文档)产生对应Java文件。如果保存JSP页面时,不小心将“编码”选择为其他编码(不是UTF-8),那么Tomcat服务器的解析器产生的对应Java文件中的某些字符串就可能有乱码现象,而这些字符串又发送到了客户端浏览器,所以用户浏览器显示信息就出现了乱码现象(比如需要客户浏览器显示的非ASCⅡ字符就可能呈现“乱码”状态)。
另外,JSP页面使用page指令只能为pageEncoding指定一个值,不允许两次使用page指令给pageEncoding属性指定不同的或相同的属性值。
language属性
language属性定义JSP页面使用的脚本语言,该属性的值目前只能取“java”。
为language 属性指定值的格式是:
<%@page language ="java"%>
language属性的默认值是“java”,即如果在JSP页面中没有使用page指令指定该属性的值的,那么,JSP页面默认有如下的page指令:
29

<%@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.*"
当为import指定多个属性值时,比如:
<%@page import ="java.util.*"%>
<%@page import="java.io.*"%>
那么,JSP引擎把JSP页面转译成的Java文件中会有如下的import语句:
import java. util.*;
import java. io.*;
session属性
session属性用于设置是否需要使用内置的session对象。session的属性值可以是true 或false。session属性默认的属性值是true。
buffer属性
内置输出流对象out负责将服务器的某些信息或运行结果发送到用户端显示。buffer属性用来指定out设置的缓冲区的大小或不使用缓冲区。例如:
<%@page buffer="24kb"%>
buffer属性的默认值是8kb。buffer属性可以取值"none",即设置out不使用缓冲区。
autoFlush属性
autoFlush属性指定out的缓冲区被填满时,缓冲区是否自动刷新。
autoFlush可以取值true或false。autoFlush属性的默认值是true。当autoFlush属性取值false时,如果out的缓冲区填满,就会出现缓存溢出异常。当buffer的值是"none"时,autoFlush的值就不能设置成false。
isThreadSafc属性
isThreadSafe属性用来设置访问JSP页面是否是线程安全的。isThreadSafe的属性值可取true或false。当isThreadSafe属性值设置为true时,JSP页面能同时响应多个用户的请求;当isThreadSafe属性值设置成false时,JSP页面同一时刻只能响应一个用户的请求,其他用户须排队等待。isThreadSafe属性的默认值是true。
当isThreadSafe属性值为true时,CPU的使用权在各个线程间快速切换。也就是说,即使一个用户的线程没有执行完毕,CPU的使用权也可能要切换给其他的线程,如此轮流,直到各个线程执行完毕;当JSP使用page指令将isThreadSafe属性值设置成false时,该JSP页面同一时刻只能响应一个用户的请求,其他用户须排队等待。也就是说,CUP要保证一个线程将JSP页面执行完毕才会把CPU使用权切换给其他线程。
 info属性
info属性的属性值是一个字符串,其目的是为JSP页面准备一个常用但可能要经常修改的字符串。例如,
<%@page info="we are students"%>
可以在JSP页面中使用方法:
getServletInfo();
获取info属性的属性值。
注:当JSP页面被转译成Java文件时,转译成的类是Servlet的一个子类,所以在JSP页面中可以使用Servlet类的方法:getServletInfo()。

JSP动作标记

include动作标记
include动作标记语法格式为:
<jsp:include page="文件的URL"/

<jsp:include page="文件的URL">
param动作标记

param动作标记语法格式为:

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

forward动作标记

forward动作标记的语法格式是:
<jsp:forward page=“要转向的页面”/>

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

useBean动作标记(不在此章具体学习)




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值