十二、脚本元素、指令和预定义变量 作 者 : 仙人掌工作室 12.1 JSP脚本元素
JSP脚本元素用来插入Java代码,这些Java代码将出现在由当前JSP页面生成的Servlet中。脚本元素有三种格式: 表达式格式<%= exdivssion %>:计算表达式并输出其结果。 Scriptlet格式<% code %>:把代码插入到Servlet的service方法。 声明格式<%! code %>:把声明加入到Servlet类(在任何方法之外)。 下面我们详细说明它们的用法。 12.1.1 JSP表达式 JSP表达式用来把Java数据直接插入到输出。其语法如下: <%= Java Exdivssion %> 计算Java表达式得到的结果被转换成字符串,然后插入到页面。计算在运行时进行(页面被请求时),因此可以访问和请求有关的全部信息。例如,下面的代码显示页面被请求的日期/时间: Current time: <%= new java.util.Date() %> 为简化这些表达式,JSP预定义了一组可以直接使用的对象变量。后面我们将详细介绍这些隐含声明的对象,但对于JSP表达式来说,最重要的几个对象及其类型如下: request:HttpServletRequest; response:HttpServletResponse; session:和request关联的HttpSession out:PrintWriter(带缓冲的版本,JspWriter),用来把输出发送到客户端 下面是一个例子: Your hostname: <%= request.getRemoteHost() %> 最后,如果使用XML的话,JSP表达式也可以写成下面这种形式: <jsp:exdivssion> Java Exdivssion </jsp:exdivssion> 请记住XML元素和HTML不一样。XML是大小写敏感的,因此务必使用小写。有关XML语法的说明,请参见《XML教程 》 12.1.2 JSP Scriptlet 如果你要完成的任务比插入简单的表达式更加复杂,可以使用JSP Scriptlet。JSP Scriptlet允许你把任意的Java代码插入Servlet。JSP Scriptlet语法如下: <% Java Code %> 和JSP表达式一样,Scriptlet也可以访问所有预定义的变量。例如,如果你要向结果页面输出内容,可以使用out变量: <% String queryData = request.getQueryString(); out.println("Attached GET data: " + queryData); %> 注意Scriptlet中的代码将被照搬到Servlet内,而Scriptlet前面和后面的静态HTML(模板文本)将被转换成println语句。这就意味着,Scriptlet内的Java语句并非一定要是完整的,没有关闭的块将影响Scriptlet外的静态HTML。例如,下面的JSP片断混合了模板文本和Scriptlet: <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have a <B>lousy</B> day! <% } %> 上述JSP代码将被转换成如下Servlet代码: if (Math.random() < 0.5) { out.println("Have a <B>nice</B> day!"); } else { out.println("Have a <B>lousy</B> day!"); } 如果要在Scriptlet内部使用字符“%>”,必须写成“%\>”。另外,请注意<% code %>的XML等价表达是: <jsp:scriptlet> Code </jsp:scriptlet> 12.1.3 JSP声明 JSP声明用来定义插入Servlet类的方法和成员变量,其语法如下: <%! Java Code %> 由于声明不会有任何输出,因此它们往往和JSP表达式或Scriptlet结合在一起使用。例如,下面的JSP代码片断输出自从服务器启动(或Servlet类被改动并重新装载以来)当前页面被请求的次数: <%! private int accessCount = 0; %> 自从服务器启动以来页面访问次数为: <%= ++accessCount %> 和Scriptlet一样,如果要使用字符串“%>”,必须使用“%\>”代替。最后,<%! code %>的XML等价表达方式为: <jsp:declaration> Code </jsp:declaration> 12.2 JSP指令 JSP指令影响Servlet类的整体结构,它的语法一般如下: <%@ directive attribute="value" %> 另外,也可以把同一指令的多个属性结合起来,例如: <%@ directive attribute1="value1" attribute2="value2" ... attributeN="valueN" %> JSP指令分为两种类型:第一是page指令,用来完成下面这类任务:导入指定的类,自定义Servlet的超类,等等;第二是include指令,用来在JSP文件转换成Servlet时引入其他文件。JSP规范也提到了taglib指令,其目的是让JSP开发者能够自己定义标记,但JSP 1.0不支持该指令,有希望它将成为JSP 1.1的主要改进之一。 12.2.1 page指令 page指令的作用是定义下面一个或多个属性,这些属性大小写敏感。 import="package.class",或者import="package.class1,...,package.classN": 用于指定导入哪些包,例如:<%@ page import="java.util.*" %>。import是唯一允许出现一次以上的属性。 contentType="MIME-Type" 或contentType="MIME-Type; charset=Character-Set":
该属性指定输出的MIME类型。默认是text/html。例如,下面这个指令: <%@ page contentType="text/plain" %>。 和下面的Scriptlet效果相同: <% response.setContentType("text/plain"); %> isThreadSafe="true
|