在脱机模式下,生成类需要二个步骤。第一步是用标准的编译器编译,第二步是重点——以脱机模式运行AWcompiler编译器,让它处理新生成的类。编译器将修改这些类的字节码,根据一个XML文件的定义,在适当的point-cut插入advice。脱机模式的优点是AWcompiler生成的类能够在任何JVM 1.3以上的虚拟机运行,本文下面要用的就是这种模式,因为它不需要对Tomcat作任何修改,只要对构造过程稍作修改就可以照搬到大多数现有的项目。
四、安装
本文将以一个简单的Web应用程序为例,它用Ant编译,部署在Tomcat 4+ Servlet容器上。下面我们假定读者己准备好上述环境,包括JVM 1.3+,同时Tomcat被设置成从webapps文件夹自动部署应用,自动将WAR扩展到目录(这是Tomcat默认的操作方式,因此只要你尚未修改Tomcat的运行方式,下面的范例可直接运行)。我们将把Tomcat的安装位置称为%TOMCAT_HOME%。
⑴ 从下载Aspectwerkz,解开压缩到适当的位置。我们将把这个位置称为%ASPECTWERKZ_HOME%。
⑵ 设置%ASPECTWERKZ_HOME%环境变量。
⑶ 将Aspectwerkz加入到PATH环境变量,即设置set PATH=%PATH%;%ASPECTWERKZ_HOME%inaspectwerkz
⑷ 下载本文的示范程序,将它放入%TOMCAT_HOME%webapps文件夹。
⑸ 将Aspectwerkz的运行时类加入到Tomcat的classpath。你可以将它的JAR文件放入示例应用的WEB-INFlib文件夹,或放入%TOMCAT_HOME%commonlib。
五、编译示例应用
如果你想深入研究一下本文的示例应用,可以解开WAR文件提取它的内容。你会发现根目录下有一个aspectwerkz.xml文件,构造应用时它会被复制到WEB-INF/classes目录。Servlet和advice的源文件在WEB-INF/src目录下,另外还有一个构建这些类的ANT脚本。
在运行这个示例程序之前,你还要对它进行后期编译。下面是具体的操作步骤:
⑴ 在命令行窗口中,转到解开WAR文件的目录。
⑵ 输入下面的命令调用AW编译器:aspectwerkz -offline aspectwerkz.xml WEB-INF/classes -cp %TOMCAT_HOME%commonlibservlet.jar。如后期编译顺利通过,应看到下面的输出:
( 1 s )
SUCCESS: WEB-INFclasses
在构建文件中有一个名称为war的ANT任务,你可以用它重新创建WAR文件。
六、运行示例应用
首先启动(或重新启动)Tomcat,然后在浏览器中打开:8080/demo/。
页面打开后,可以看到一个带二个输入框的HTML表单,一个输入名字,一个输入邮件地址。输入一些数据,然后点击按钮提交表单,出现一个页面显示出联系人信息和一个指向联系人清单的链接。
七、代码分析
JSP页面就不分析了,现在我们对它不感兴趣。我们来看看AOPServlet的代码。
package example;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AOPServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Person person = new Person();
if (request.getParameter("name") != null) {
person.setName(
request.getParameter("name"));
}
if (request.getParameter("email") != null) {
person.setEmail(
request.getParameter("email"));
}
request.setAttribute("person", person);
RequestDispatcher rd =request.getRequestDispatcher("/view.jsp");
rd.forward(request, response);
}
}
在这个例子中,Servlet的代码己尽量精简,只包含一些必不可少的代码,如创建了一个绑定请求参数的对象等,但没有持久化操作,不需要额外的imports,它只实现了作为Servlet必须实现的最基本的操作。
然而,根据说明文档的要求,这个应用程序必须将所有Person类型的对象特久化,所以要为这个应用程序加入一个aspect。为创建这个aspect,我们首先要创建一个aspectwerkz.xml文件并将该文件放入classpath指定的目录。本文示例提供了一个简单的例子,你可以用编辑器打开查看。
aspectwerkz.xml的第一部份定义了可用的advice,我们可以根据需要加入任意数量的advice:
<advice-def deployment-model="perJVM"/>
在这个片段中,我们定义了一个名称为persist的advice,它的类型是example.PersistenceAdvice。最后一个属性定义了该advice的排它性,在这里它的值是perJVM,表示在每一个JVM中只创建该advice的一个实例(有关部署模式的更多说明,请参见Aspectwerkz的文档。
第二部份开始定义aspect,这里就是我们将advice映射到point-cut创建aspect的地方。