在JSP文件中可以嵌套很多内容,例如,JSP的脚本元素和注释等,这些内容的编写都需要遵循一定的语法规范,接下来,本节将针对这些语法进行详细的讲解。
1.1.1.1 JSP脚本元素
JSP脚本元素是指嵌套在<%和%>之中的一条或多条Java程序代码。通过JSP脚本元素可以将Java代码嵌入HTML页面中,所有可执行的Java代码,都可以通过JSP脚本来执行。
JSP脚本元素主要包含如下三种类型:
l JSP Scriptlets
l JSP声明语句
l JSP表达式
1. JSP Scriptlets
JSP Scriptlets 是一段代码段。当需要使用Java实现一些复杂操作或控制时,可以使用它。JSP Scriptlets的语法格式如下所示:
<% java 代码(变量、方法、语句等)%>
在JSP Scriptlets中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占有的内存空间。
2. JSP声明语句
JSP的声明语句用于声明变量和方法,它以“<%!”开始,以“%>”结束,其语法格式如下所示:
<%!
定义的变量或方法等
%>
在上述语法格式中,被声明的Java代码将被编译到Servlet的_jspService()方法之外,即在JSP声明语句中定义的都是成员方法、成员变量、静态方法、静态变量、静态代码块等。在JSP声明语句中声明的方法在整个JSP页面内有效。
在一个JSP页面中可以有多个JSP声明语句,单个声明中的Java语句可以是不完整的,但是多个声明组合后的结果必须是完整的Java语句。接下来,通过一个案例来演示JSP Scriptlets和声明语句的使用。
在day12项目的WebContent目录下创建一个名称为example01.jsp的文件,在该文件中编写声明语句,如文件1-1所示。
文件1-1 example01.jsp
1 <%@ pagelanguage="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"
4 "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">
8 <title>JSP声明语句</title>
9 </head>
10 <%!
11 int a = 1, b = 2; //定义两个变量a,b
12 %>
13 <%!
14 public String print() { //定义print方法
15 String str ="itcast"; //方法内定义的变量str
16 return str;
17 }
18 %>
19 <body>
20 <%
21 out.println(a + b); //输出两个变量的和
22 %>
23 <br>
24 <%
25 out.println(print());//调用print()方法,输出其返回值
26 %>
27 </body>
28 </html>
在文件1-1中,首先使用<%!和%>定义了两个变量a、b,以及print()方法,然后使用了<%和%>输出了两个常量的和,以及print()方法中的返回信息。启动项目后,在浏览器地址栏中输入地址“http://localhost:8080/day17/example01.jsp”访问example01.jsp文件,显示效果如图1-8所示。
从图1-8中可以看到,浏览器中已经显示出了相应的结果。
需要注意的是,<%!和%>里面定义的变量是成员变量,方法是全局的方法,此处只是声明,也就是定义,变量或方法都没有被调用。<%和%>里面定义的是局部变量,不能定义方法(Java方法中不能再嵌套定义方法),代码块操作可以将结果输出到浏览器。总之,<%!和%>是用来定义成员变量属性和方法的,<%和%>主要是用来输出内容的,因此如果涉及到了成员变量的操作,那么就应该使用<%!和%>,而如果是涉及到了输出内容的时候,就使用<%和%>。
1. JSP表达式
JSP表达式(expression)用于将程序数据输出到客户端,它将要输出的变量或者表达式直接封装在以“<%=”开头和以“%>”结尾的标记中,其基本的语法格式如下所示:
<%= expression %>
在上述语法格式中,JSP表达式中的将“expression”表达式结果输出到浏览器。例如,对example01.jsp文件进行修改,将<body>内的脚本元素修改为表达式,具体如下。
<%=a+b %><br>
<%=print() %>
在浏览器中再次访问example01.jsp页面,同样可以正确输出如图1-8中的显示结果。需要注意的是:
l “<%=”和“%>”标记之间插入的是表达式,不能插入语句。
l “<%=”是一个完整的符号,“<%”和“=”之间不能有空格。
l JSP表达式中的变量或表达式后面不能有分号(;)。
1.1.1.1 JSP注释
同其他各种编程语言一样,JSP也有自己的注释方式,其基本语法格式如下:
<%-- 注释信息 --%>
需要注意的是,Tomcat在将JSP页面编译成Servlet程序时,会忽略JSP页面中被注释的内容,不会将注释信息发送到客户端。接下来,通过一个案例来演示JSP注释的使用。
在day12项目的WebContent目录下创建一个名称为example02的JSP页面,如文件1-2所示。
文件1-1 example02.jsp
1 <%@ pagelanguage="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"
4 "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
8 <title>JSP注释</title>
9 </head>
10 <body>
11 <!-- 这个是HTML注释 -->
12 <%-- 这个是JSP注释 --%>
13 </body>
14 </html>
在上述页面代码中,包含HTML注释和JSP两种注释方式。启动Tomcat服务器,在浏览器的地址栏中输入地址“http://localhost:8080/day17/example02.jsp”访问example02.jsp页面,此时,可以看到example02.jsp页面什么都不显示,接下来在打开的页面中点击鼠标右键,在弹出菜单中选择【查看源文件】选项,结果如图1-9所示。
1.1.1 JSP指令
为了设置JSP页面中的一些信息,Sun公司提供了JSP指令。 JSP 2.0中共定义了page、include和taglib三种指令,每种指令都定义了各自的属性。接下来,本节将针对page和include指令进行详细的讲解。
1.1.1.1 page指令
在JSP页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式,JSP页面采用的语言等,这时,可以通过page指令来实现。page指令的具体语法格式如下所示:
<%@ page 属性名1= "属性值1"属性名2= "属性值2" ...%>
在上面的语法格式中,page用于声明指令名称,属性用来指定JSP页面的某些特性。page指令提供了一系列与JSP页面相关的属性,如表1-1所示。
表1-1 page指令的常用属性
表1-1中列举了page指令的常见属性,其中,除了import属性外,其他的属性都只能出现一次,否则会编译失败。需要注意的是,page指令的属性名称都是区分大小写的。
下面列举两个使用page指令的示例:
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.awt.*" %>
<%@ pageimport="java.util.*","java.awt.*"%>
上面代码中使用了page指令的language、contentType、pageEncoding和import属性。
需要注意的是,page指令对整个页面都有效,而与其书写的位置无关,但是习惯上把page指令写在JSP页面的最前面。
1.1.1.1 include指令
在实际开发时,有时需要在JSP页面静态包含一个文件,例如HTML文件,文本文件等,这时,可以通过include指令来实现,include指令的具体语法格式如下所示:
<%@ include file="被包含的文件地址"%>
include指令只有一个file属性,该属性用来指定插入到JSP页面目标位置的文件资源。
为了使读者更好地理解include指令的使用,接下来,通过一个案例来学习include指令的具体用法。
在day12项目的WebContent目录下创建两个JSP页面文件date.jsp和include.jsp,在include.jsp文件中使用include指令将date.jsp文件包含其中,具体如文件1-3和文件1-4所示。
文件1-1 date.jsp
1 <%@ pagelanguage="java" contentType="text/html; charset=UTF-8"%>
2 <html>
3 <head><title>Inserttitle here</title>
4 </head>
5 <body>
6 <% out.println(newjava.util.Date().toLocaleString());%>
7 </body>
8 </html>
文件1-2 include.jsp
9 <%@ pagelanguage="java" contentType="text/html; charset=UTF-8"%>
10 <html>
11 <head>
12 <title>欢迎你</title>
13 </head>
14 <body>
15 欢迎你,现在的时间是:
16 <%@ include file="/date.jsp"%>
17 </body>
18 </html>
启动tomcat服务器,在浏览器中访问地址“http://localhost:8080/day17/include.jsp”,浏览器的显示结果如图1-10所示。
从图1-10中可以看出,date.jsp文件中用于输出当前日期的语句已显示出来,这说明include指令成功地将date.jsp文件中的代码合并到了include.jsp文件中。
关于include指令的具体应用,有很多问题需要注意,接下来,将这些问题进行列举,具体如下:
(1) 被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。
(2) 除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。
1.1.1.1 taglib指令
用于页面中引入标签库的,这个指令会在后面介绍JSTL的时候讲解.
1.1.2 JSP内置对象
1.1.2.1 内置对象的概述
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在JSP页面中使用。这9个隐式对象的名称、类型和描述如表1-2所示。
1.1.1.1 out对象
在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。接下来,通过一张图来描述JSP页面的out对象与Servlet引擎提供的缓冲区之间的工作关系,具体如图1-11所示。
从图1-11可以看出,在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。为了验证上述说法是否正确,接下来,通过一个具体的案例来演示out对象的使用。
在day12项目的WebContent目录下创建一个名称为out的JSP页面,如文件1-5所示。
文件1-1 out.jsp
1 <%@ pagelanguage="java" contentType="text/html; charset=UTF-8"%>
2 <html>
3 <head>
4 <title>Insert titlehere</title>
5 </head>
6 <body>
7 <%
8 out.println("firstline<br>");
9 response.getWriter().println("secondline<br>");
10 %>
11 </body>
12 </html>
启动Tomcat服务器,在浏览器地址栏中访问“http://localhost:8080/day12/out.jsp”,浏览器的显示结果如图1-12所示。