2.5 Java语言

要学好JSP语言,掌握Java基础是非常重要的,因为Java语言是一种基础性的语言。而在学习Java时,要把重点放在面向对象的思想、基本的语法规则,以及可以不用担心Swing和Java的图形方面的知识中,因为在JSP中一般不会使用这些特征。

在JSP文件中嵌入Java程序片段,通常可以通过以下三种方式。

■声明<%! %>。

■输出表达式<%= %>。

■程序语句<% %>。

2.5.1 声明

在JSP页面中,Java程序片段中所使用的变量和方法与其他高级程序设计语言一样,也必须先进行声明或定义,这里声明的变量可以在多个实例中共享(当处理并发操作时,需要考虑同步问题),当在JSP页面初始化的同时可进行变量的初始化。声明的语法格式如下所示。

<%! Java variables and methods  %>

2.5.1.1 声明变量

在“<%!”和“%>”标记之间定义的变量,通过JSP引擎转译为Java文件时,将成为某个类的成员变量(即全局变量)。变量的类型可以是Java语言中的任何数据类型。所定义的变量在所定义的JSP页面内有效,即在本JSP页面中,任何Java程序片中都可以使用这些变量。下面通过一个具体的实例来说明如何在JSP页面中声明变量(请查看源码目录/Counter项目)。

图2.7 Counter项目目录

●首先,打开MyEclispe,新建一个Web项目,项目名为:Counter(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。新建项目后,项目目录如图2.7所示。

●然后,单击文件,在<body>和</body>之间输入以下代码,然后保存。

<%! int aCount = 0; %>
<br>
<h3>
您是第 <font color="#FF0000"><b>
<%
out.println(++aCount);
%>
</b></font>
位访问此页面的人!</h3>

在此代码中,我们通过<%! int aCount=0;%>定义了一个整型的aCount变量,其初始值为“0”,当显示一次该页面时,aCount会自动加1,这实际上就是一个访问页面的计数器。

●最后,把Counter项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图2.8所示。

图2.8 页面计数器显示效果

图2.8显示的结果是“37”,这是我们刷新页面所得到的结果,每刷新一次页面,计数结果就增加1,如果要重新进行计数,就要重新启动Tomcat服务器。

2.5.1.2 声明方法

在“<%!”和“%>”标记之间定义的方法在所定义的JSP页面内有效,即在本JSP页面中,任何Java程序片都可以调用这些方法。下面通过一个具体的实例来说明如何在JSP页面中声明方法(请查看源码目录/Time项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:Time(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,单击文件,在<body>和</body>之间输入以下代码,然后保存。

<%!
String getDateTimeDay()
{
     Date d=new Date();
  SimpleDateFormat TimeFmt = new SimpleDateFormat("yyyy年MM月dd日");
  SimpleDateFormat DateFmt = new SimpleDateFormat("HH时mm分ss秒");
  return TimeFmt.format(d)+","+DateFmt.format(d);
}
%>
<center>
<%
out.println("当前时间信息为:"+getDateTimeDay()); //显示当前时间信息
%>
</center>

在此代码中,我们通过<%! ……%>定义了返回字符串类型的方法getDateTimeDay(),其功能是显示当前的年、月、日及时间信息,因为在getDateTimeDay()方法中用到了Java中相应的包,因此我们还要把相应的包导入,导入代码写在 <html>和</html> 标记之外。一般情况下写在文件最开始处即可,其代码如下所示。

<%@ page import="java.util.Date" %>
<%@ page import="java.text.*" %>

●最后,把Time项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图2.9所示。

图2.9 当前时间信息的显示效果

2.5.2 输出表达式

可以在“<%=”和“%>”标记间插入一个表达式,这个表达式必须能计算出数据值,可以把Java数据类型转换成字符串类型,然后使用隐含对象out以HTML格式的形式输出。表达式的值由服务器负责计算,并将计算结果以字符串形式发送到客户端显示,其语法格式如下所示。

<%= expression %>

这里的“=”和“%”是连在一起的,不能分开。如:表达式<%=new java.util.Date()%>在转换后的Java中的语句是:out.print(new java.util.Date());。下面通过一个具体的实例来说明如何在JSP页面中使用输出表达式(请查看源码目录/Host项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:Host(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,单击文件,在<body>和</body>之间输入以下代码,然后保存。

主机名为:<%=request.getRemoteHost()%>

●最后,把Host项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图2.10所示。

图2.10 显示主机名的效果

2.5.3 程序语句

可以在“<%”和“%>”标记间包含多条Java语句,构成Java代码块,开发人员可以在JSP中使用Java语言的功能,包括Java的流程控制语句,其语法格式如下。

<%
//Java Code
%>

一个JSP页面可以有许多Java代码块,JSP引擎按顺序执行这些Java代码块。在Java代码块中定义的变量通过JSP引擎转译为java文件时,这些变量只在本JSP页面内的Java代码块中起作用,即这些变量是局部变量。下面通过一个具体的实例来说明如何在JSP页面中使用程序语句(请查看源码目录/Prime项目)。

●首先,打开MyEclispe,新建一个Web项目,项目名为:Prime(如何新建项目,请查看第1章1.6.2常用操作小节中的相关知识)。

●然后,单击文件,在<body>和</body>之间输入以下代码,然后保存。

<%!
  boolean isPrime(int n){
          for(int i=2;i<=(int)Math.sqrt(n);i++){
  if(n%i==0)
  return false;
          }
  return true;
    }
%>
<%
    int n=(int)(Math.random()*1000);
    if(isPrime(n)){
%>
  <p><%= n %>是一个素数
    <% }
    else{ %>
<p><%= n %>不是一个素数
    <% } %>

这段代码中,我们使用了前面介绍的三种嵌入Java代码的方式,在“<%!”和“%>”标记之间定义了判断是否为素数的方法isPrime();在“<%=”和“%>”标记间插入一个表达式,输出n的值;在“<%”和“%>”标记间插入判断一个数是否为素数的逻辑代码。

最后,把Prime项目进行部署发布(如何部署发布请查看第1章的相关内容),其显示效果如图2.11所示。

图2.11 判断是否为素数的显示效果

从上面的实例中我们可以看出,语句程序“<%”和“%>”标记间并不一定是一个完整的Java程序,它可能是某一条Java语句的一部分,或者包含若干条Java语句等;而且“<%”和“%>”标记间也可以声明变量,这里所声明的变量相当于局部变量,即声明一次,使用一次,而使用“<%!”和“%>”所声明的变量相当于全局变量,即声明一次,可多次使用。

通过上面的详细讲解,现在我们总结一下这三种方式的区别,细心的读者可以发现:声明变量后面必须带分号;表达式可以包含任何语言表达式,并不以分号结束;语句程序中,如果语言要求语句以分号结束,则必须要使用分号。