动态可执行文件目的是简化和管理动态网页的工作,而在kangaroo-egg中DQM技术就是动态可执行文件技术。本章将介绍DQM的语法,至于DQM的运行机制可以参见附录一《DQM容器介绍》,其中有详细介绍,这章就不再复述。
在传统的网页HTML文件中加入java程序片段和DQM标签就构成了动态可执行文件(DQM网页)。动态文件可以操纵数据库、重定向网页以及实现其他高级功能。所有的动态文件都在服务器端执行,网络上传送客户端的仅仅是得到的结果,这样大大降低了对客户浏览器的要求。
指令是在<%@和%>内的,用来设置整个动态文件相关的属性,目前共有三个指令。
1. page指令
page指令的语法形式为:<%@page 属性名A="值A" 属性名B="值B" %>
属性名是不区分大小写的。属性语句可在动态文件中任何行出现。当多次出现相同的指令则以最后一次出现的值为准。
Page指令的属性 |
功能描述 |
举例 |
contenttype |
指定响应结果的MIME类型。如果不指定此值,则默认类型为text/html。 |
<%@page contenttype= "text/html; charset=GB2312" %> |
buffer |
是否开启缓存,值只能取true或false,如果不指定此值则默认是关闭的。 |
<%@page buffer = "true" %> |
compress |
是否开启压缩,只能取true或false,如果不指定此参数则是根据当前主机或虚拟主机设置的值为准(参见2.3和2.4节中的needCompress标签)。 |
<%@page compress = "true" %> |
import |
指定导入的java类库列表,该列表用逗号或分号分隔。可以多次使用该指令来导入不同的软件包。即使不指定此参数也会默认导入java.io.*和com.kangaroo_egg.dqm.*二个列表。 |
<%@page import = "java.awt.*; java.awt.image.BufferedImage, javax.imageio.ImageIO" %> |
session |
指定当前动态文件是否使用session,只能取true或false,如果不指定此值则默认是启用的。Session请参见第8章。 |
<%@page session = "true" %> |
command |
指定当前动态文件是否使用command,只能取true或false,如果不指定此值则默认是关闭的。command会在后面介绍。 |
<%@page command = "true" %> |
isthreadsafe |
是否启用线程安全模式,只能取true或false,如设置为true,则表明对线程安全,同一时刻可以被多个线程访问。 如设置为false,则表明对线程不安全,同一时刻只能被一个线程访问。 如果不指定此值则默认为true。 |
<%@page isthreadsafe = "true" %> |
表3-2-1
2. include指令
dqm动态文件可以通过include指令来包含其他文件,被包含的文件可以是动态文件、html文件或其他文本文件。如果被包含的文件中含有的java程序片段或指令则也会被执行。
include指令的语法形式为:<%@ include file="filename"%>
在开发web应用时,如果多数动态文件都包含相同内容则可把这部分相同的内容单独放到一个文件中去,那些需要这部分内容的动态文件可以用include指令包含进来。这样做可以提高效率同时便于维护。
注意:一个include指令只有第一个file是有效的,如果有其余的会报错。如: <%@ include file="1.txt" file="2.txt"%> 则file="2.txt"是非法的,如果要插入2.txt请再写一行,如: <%@ include file="1.txt"%><%@ include file="2.txt"%> 同时插入的文件前后如果有空格则这些空格会被忽略,如: <%@ include file=" 1.txt "%>就等于<%@ include file="1.txt"%>
插入的文件路径可以是是相对路径或绝对路径。相对路径是指相对于当前使用指令的动态文件的路径。相对路径写法如:../xxx.txt”、“test/xxx.txt”等,绝对路径写法如:“c:\xxx.txt”、“/xxx.txt”等。同时如果在windows下以‘/’或‘\’开头则表示从当前动态文件所在盘的根目录开始,而在linux或unix下则表示从根目录开始。 |
3. bean指令
类似于与jsp的javabean,主要用于可重复使用且跨平台的组件。详细介绍请参见第11章,这里就不再复述了。
动态文件中可以在<%和%>标记间直接嵌入有效的java语言代码。我们来看一个简单的例子,新建一个hello.dqm文件,如果改变了默认的动态文件扩展名则将其改为设定的扩展名。hello.dqm非常简单,源代码如下:
1 2 3 4 |
<% String s = "hello!"; out.print(s); %> |
以上这段代码,当用浏览器访问时输出的结果为“hello!”,可以看到<%和%>内的都是标准java代码,只是有一个out对象,这个对象是内置的,dqm之所以简单实用很大一部分就是由于提供了功能强大的六大内部对象out、request、response、session、application和command,我们稍后将会介绍这些对象。
动态文件的发布只需要将此文件放入前面提到过的主机和虚拟主机webPath所指定的目录下。此目录具有固定的目录结构
目 录 |
描 述 |
webPath所指定的目录 |
主机和虚拟主机根目录,所有的动态文件、html文件和其它资源都存放此目录下。 |
webPath所指定的目录/WEB-INF/classes |
存放各种class文件。 |
webPath所指定的目录/WEB-INF/lib |
存放动态文件所需要的各种jar或zip文件。例如可以在这个目录下存放JDBC驱动程序的jar文件。 |
webPath所指定的目录/WEB-INF/work |
存放动态文件编译后的文件。 |
表3-4-1
从表3-4-1中看到classes和lib目录下都可以存放类文件,但是他们还是有些区别的,在classes目录中只能存放class文件,而在lib目录下只能存放已将class打包的jar或者zip文件。如果classes和lib目录下含有相同名的类则会载入classes目录下的同名类。
注意:class和lib目录下存放的类只能被当前的主机或虚拟主机访问到。 |
WEB-INF目录也并不是一定需要存在的(因为不使用动态文件就不需要此文件夹),如果WEB-INF目录或其下面的classes和lib目录不存在则可以手动建立。
WEB-INF/work目录下是存放动态文件编译后的文件,如果允许自动编译(参见2.4和2.5节的autoCompile参数)那么即使WEB-INF/work目录不存在也会在编译时自动建立。
关于动态文件的名字“dqm技术”限定的比较严格,必须符合java定义类名的规范,比如一个动态文件he-llo.dqm就不能通过,因为he-llo的中划线不符合java类名规范,同样动态文件存放的目录也必须遵循相同的规范。
在windows下因为文件名和目录名都不区分大小写,但是java区分大小写,所以会发生这样一种情况,比如一个sd目录下hello.dqm文件,编译后会存放在WEB-INF/work目录下的sd目录下,名为hello_dqm.class文件。如果此时将sd目录变化大小写,比如修改为Sd同时在这目录下再建一个动态文件如hello1.dqm,那么hello1.dqm编译后还是存放在WEB-INF/work目录下的sd目录下,名为hello1_dqm.class,这是因为windows不区分大小写,所以认为WEB-INF/work目录下已经存在的sd目录和Sd目录是一样的,于是就将hello1_dqm.class放在原来的sd目录下,此时问题就来了,因为java区分大小写,所以执行hello1_dqm.class会出错因为其不在Sd目录下,然而你也不能简单的将WEB-INF/work目录下的sd改为Sd,因为先前编译的hello_dqm.class必须在sd目录下工作执行,这种目录我们称为编译错乱的目录,解决的办法是将WEB-INF/work目录下已经存在的sd目录及其下面所有文件全部删除,然后重新编译。kangaroo-egg已经会自动检测这一情况并按上面解决方法处理,不过有时也会无法自动删除编译错乱的目录,此时会提示用户手动删除这些目录。虽然大部分编译错乱目录服务器能够自动解决,不过为了避免不必要的麻烦所以请不要去改变已经存在且编译过的目录或文件大小写,如发现异常请删除已编译的文件。
注意:如果在linux或unix下使用本系统,请不要将webapp(web应用)放在导入的windows文件格式下,因为有些linux或unix在windows文件格式下系统将无法建立大写的WEB-INF文件夹。 |