OpenCms中如何管理JSP?

来源:互联网 发布:淘宝下单api 编辑:程序博客网 时间:2024/04/29 00:10
    
  OpenCms中所有的文件通常都保存在数据库中,这也就是常说的OpenCms VFS(虚拟文件系统)。也就是说在OpenCms工作区中看到的文件结构在RFS(真实文件系统,也就是硬盘上)上并不存在(静态导出操作除外),然而,为了JSP能够正常工作,所有的OpenCms JSP文件都映射到真实文件系统中,也就是在硬盘上可以找到。
  为了能够理解这个过程,先让我们看一下标准的JSP文件是怎么被处理的:
  1. JSP文件必须存放于Web应用程序的根目录下;  
  2. JSP文件必须以“*.jsp”结尾(可以web.xml文件中进行配置);
  3. servlet容器接受JSP文件的请求,被请求的文件首先被转化成Java类源码,扩展名为“.java”。
  4. 在这个处理过程中,JSP directives(如<%@ include file= "..." %>)也被转化,转换成Java源码。
  5. 生成的“.java”源码然后被编译成实现Servlet接口的类。
  6. 最后,servlet调用service()方法。
  为了使OpenCms能够做到与servlet容器无关性,它使用了一个简单的技巧:把JSP从虚拟文件系统映射到真实文件系统,如下: 
  1. 所有的OpenCms资源请求都由OpenCms servlet控制,通常映射至/opencms/opencms;
  2. 一旦OpenCms接到一个JSP资源的请求,它就会把请求的JSP文件“存储”到它自己的web应用程序根目录下的“/WEB-INF/jsp/”下;
  3. 因为OpenCms中用online和offline区分一个资源的“发布”与“编辑”版本,所以在这个目录(/WEB-INF/jsp/)下也生成online和offline两个子目录;
  4. 在这两个目录下,它把JSP文件存储成带有完整VFS路径且以“.jsp”为后缀的文件;
  5. 例如:JSP文件是在VFS中是“/index.jsp” ,它会被映射为真实文件系统中的“/WEB-INF/jsp/online/index.jsp.jsp”,这叫做“文件名转换”的JSP。
  6. 当OpenCms存储资源时,JSP directives(<%@ include file= "..." %> 和 <%@ page errorPage= "..."%)所指向的JSP文件也同样进行“文件名转换”处理,即把它们映射到真实文件系统中;
  7. 假设我们在web应用目录有一下文件叫作“file.jsp”;
  8. OpenCms servlet调用requestDispatcher("{file.jsp}").include()并且把控制权传递到标准的servlet容器。剩下的步骤就和上面描述的标准的JSP处理一样了。
  如何区分onlineoffline JSP 版本?
  其实很简单:因为OpenCms为online和offline下的不同版本的JSP分别存储到两个目录,这样servlet容器就把它们当作不同的文件处理,也就做到了对offline下jsp的修改不会影响到online下的jsp。
  注意:online和offline下的JSP有着同样的web应用上下文,因为这一点,它们共用一个应用程序下下文对象,online和offline JSP页面访问的是同一组数据,不慎重使用会引起未预期的副作用,可以通过严格地控制访问应用程序上下文对象来避免这些副作用。
  OpenCms静态导出中如何使用JSP
  使用OpenCms静态文件导出能够提高网站的性能。OpenCms对JSP文件的管理也完全支持静态导出。当然,JSP通常是使用在动态页面中,因此,默认的生成的JSP文件的导出属性默认为false,万一想要导出JSP,必须要手动设置JSP的导出属性为true。
  为了支持到静态导出资源的链接,OpenCms中使用了标签或cms.link方法(用法)。
  另外,JSP directives中包含有文件名时,不要使用类似“”的语法,而是要使用<%@ include file="..." %>的语法 ,因为OpenCms中不支持对类似“”的语法解析,也就是说不能处理这种语法中的JSP文件,不能够把它映射到真实文件系统中。但对其它不包含文件名的这种语法是支持的,如: ,它们可以在OpenCms的JSP中正常使用。
  (谢谢关注OpenCms——中文资源第一博客:http://blog.csdn.net/qianxuncms/,欢迎与作者直接交流,共同进步。MSN:qianxuncms@hotmail.com,QQ:9165456)