OpenCms中所有的文件通常都保存在数据库中,这也就是常说的OpenCms VFS(虚拟文件系统)。也就是说在OpenCms工作区中看到的文件结构在RFS(真实文件系统,也就是硬盘上)上并不存在(静态导出操作除外),然而,为了JSP能够正常工作,所有的OpenCms JSP文件都映射到真实文件系统中,也就是在硬盘上可以找到。
为了能够理解这个过程,先让我们看一下标准的JSP文件是怎么被处理的:
JSP文件必须存放于Web应用程序的根目录下;
JSP文件必须以“*.jsp”结尾(可以web.xml文件中进行配置);
servlet容器接受JSP文件的请求,被请求的文件首先被转化成Java类源码,扩展名为“.java”。
在这个处理过程中,JSP directives(如<%@ include file= "..." %>)也被转化,转换成Java源码。
生成的“.java”源码然后被编译成实现Servlet接口的类。
最后,servlet调用service()方法。
为了使OpenCms能够做到与servlet容器无关性,它使用了一个简单的技巧:把JSP从虚拟文件系统映射到真实文件系统,如下:
所有的OpenCms资源请求都由OpenCms servlet控制,通常映射至/opencms/opencms;
一旦OpenCms接到一个JSP资源的请求,它就会把请求的JSP文件“存储”到它自己的web应用程序根目录下的“/WEB-INF/jsp/”下;
因为OpenCms中用online和offline区分一个资源的“发布”与“编辑”版本,所以在这个目录(/WEB-INF/jsp/)下也生成online和offline两个子目录;
在这两个目录下,它把JSP文件存储成带有完整VFS路径且以“.jsp”为后缀的文件;
例如:JSP文件是在VFS中是“/index.jsp”,它会被映射为真实文件系统中的“/WEB-INF/jsp/online/index.jsp.jsp”,这叫做“文件名转换”的JSP。
当OpenCms存储资源时,JSP directives(<%@ include file= "..." %>和 <%@ page errorPage= "..."%)所指向的JSP文件也同样进行“文件名转换”处理,即把它们映射到真实文件系统中;
假设我们在web应用目录有一下文件叫作“file.jsp”;
OpenCms servlet调用requestDispatcher("{file.jsp}").include()并且把控制权传递到标准的servlet容器。剩下的步骤就和上面描述的标准的JSP处理一样了。
如何区分online和offline 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>标签或cms.link方法(<cms:link>用法)。
另外,JSP directives中包含有文件名时,不要使用类似“<jsp:directive.include file="..." />”的语法,而是要使用<%@ include file="..." %>的语法 ,因为OpenCms中不支持对类似“<jsp:directive.include file="..." />”的语法解析,也就是说不能处理这种语法中的JSP文件,不能够把它映射到真实文件系统中。但对其它不包含文件名的这种语法是支持的,如: <jsp:useBean id="..." /> 或 <jsp:setProperty name="..." />,它们可以在OpenCms的JSP中正常使用。
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!