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中正常使用。
新闻热点
疑难解答