第二节中,我们通过JSP编译成的java源文件对比出了<% %> <%! %>的区别。一个jsp文件会被解释编译成对应的java类,而<%!%>里面声明的变量或方法都将成为对应java类的成员方法,<% %>里面的代码段将会直接放置到jspService()方法中执行。因此,我们可以在<% %>的代码段中使用jspService()方法中预定义的几个常用对象,第三节我们专门介绍了这几个常用的对象。
除了<% %>和<%! %>标签外,jsp中还可以使用的元素有:<%= %>表达式、<%-- --%>注释和<%@ page %>、<%@include %>、 <%@taglib %>编译指令,以及jsp:useBean、jsp:setProperty 、jsp:getProperty 、jsp:include、jsp:forward、jsp:plugin、jsp:fallback等操作指令。本节及下节中详细介绍这些页面标签。
还记得我们的测试应用吗?它在tomcat的webapps目录下,对应目录结构是:
webapps / test
/MyJsp.jsp
/WEB-INF
/ web.xml
MyJsp.jsp将会被tomcat解释成MyJsp_jsp.java文件,并编译成MyJsp_java.class文件,放置在tomcat的work目录下,对应的路径是: work\Catalina\localhost\test\org\apache\jsp目录。我们将在MyJsp.jsp里面来验证上述jsp元素的作用。
<%= expression %>
在jsp中,输出expression 表达式的值。注意<%=必须写在一起,中间不能有空格。先看一下示例: 修改MyJsp.jsp内容如下:
<html>
<body>
This is my first JSP! Now time is: <%=new java.util.Date() %>
</body>
</html>
在TOMCAT的work目录找到对应的MyJsp_jsp.java文件,查看_jspService()方法对于的代码:
out.write("<html>\r\n");
out.write(" <body>\r\n");
out.write(" This is my first JSP! Now time is: ");
out.print(new java.util.Date() );
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
表达式new java.util.Date()直接被out对象的print()方法所输出。由于print()方法接受一切对象Object和基本类型,因此<%= %>里面可以是任意的取值表达式,甚至是一个方法的调用。
<%-- --%>
jsp隐藏注释。与html中的注释<!-- -->相比较,这里的注释内容将不会被显示到客户端的html中。
先看示例:
<html>
<body>
This is my first JSP! Now time is: <%=new java.util.Date() %>
<!-- This is a html comment -->
<%-- This is a jsp hidden comment --%>
</body>
</html>
对应的源代码:
out.write("<html>\r\n");
out.write(" <body>\r\n");
out.write(" This is my first JSP! Now time is: ");
out.print(new java.util.Date() );
out.write("\r\n");
out.write(" <!-- This is a html comment -->\r\n");
out.write(" ");
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>");
从源码里可以看出,HTML的注释将被原样地打印到客户端HTML代码中去,而jsp注释则不会被输出。因此jsp注释里面你可以输入你任何想输入的处理流程,而不担心被别人通过客户端HTML源代码窥视,因为jsp注释只是为开发者服务。
<%@ page %>
page指令用来定义jsp的页面属性。具体可配置参数如:
<%@ page
language="java"
extends="className""
import=importList""
session="true|false"
buffer=none|size""
autoFlush="true|false"
isThreadSafe="true|false"
info="infoText"
errorPage="errorPageURL"
isErrorPage="true|false"
contentType=" "
%>
language=”scriptingLanguage”: 设定描述语言,默认值是”java”,而且也是目前唯一有效的设定值。如果一个月前不是Oracle而是Miscrosoft收购了sun,这里可能还将会有个c#的选项。
extends=”className”:设定产生出来的class所以继承的类。前文的源码中科研看到,默认继承的类是HttpJspBase,除非你认为自己可以优化tomcat的源码,否则不要去指定它。
import=”importList” :导入jsp程序所要用到的类的列表。这是唯一可以多次指定的属性。很明显,这里import的类,转换为java源码后将成为类头的import语句。
session="true|false":定义页面是否要用到session。默认是true.当页面加上<%@ page session=”false” %>后,_jspService()方法里将会去除这里缺少了session的声明和赋值。在jsp代码段中直接调用session将会提示变量未声明的错误。因此,session=”false”的意思是禁用了session这个变量,但session技术并没有被禁用,你仍然可以使用request.getSession()来获取并使用session.
buffer="none|size": jsp所需缓存量的大小,单位是KB.默认不得小于8KB.
autoFlush="true":定义jsp所用的buffer满时,是否自动将内容输出到客户端,默认是true。如果指为false,当内容超出时,将会产生overflow的exception。特别要注意的是,当buffer设为none的时候,autoFlush不能被设成false。
isThreadSafe="true|false": 设置线程安全。默认为true,表示以多线程方式出来客户端的请求。当设置为false时,将以单线程方式执行客户的请求,这在页面请求量过多是将是一场灾难,因为必须在前一个请求处理完毕后才能处理后一个请求。
info="infoText":设置jsp程序说明,这个一般不会去设置。
errorPage="errorPageURL":设置发生异常时的转向页面。
isErrorPage="true|false":是否异常页面,默认是false。如果设定为true,则会在解释后的java类里面声明一个exception对象:
Throwable exception = (Throwable) request.getAttribute(“javax.servlet.jsp.jspException”);
因此在错误页面中可以直接使用exception对象。
contentType=”contentType” 设置jsp的文件及编码格式,如contentType=”text/html; charset=utf-8”,作用同response.setContentType(“contentType”),但必须在传回任何结果之前调用它。