最近在编辑JSP页面时,遇到页面上图片无法显示和包含的页面找不到的问题。后来研究了一下,得出一些结论。下面以web应用myWeb为例进行说明。假设其下有common和test两个目录其目录结构大致如下:
myWeb
| -- index.jsp
| -- test
| | -- test.jsp
| -- common
| | -- taglibs.jsp
| | -- background.jpg
编译期路径:主要是在jsp页面编译成html之前的一些页面指令,如<@ page>、<@ taglig>等,其搜索路径的根目录是web应用目录,也就是myWeb。假如test/test.jsp需要包含common/taglibs.jsp,则在test.jsp中可以这样写:<%@ include file="/common/taglibs.jsp"%>,表示要包含根目录下common目录下的taglibs.jsp,也可以这样:<%@ include file="../common/taglibs.jsp"%>表示包含父目录下common目录下taglibs.jsp,推算如下:test的父目录为myWeb,也就是myWeb/common/taglibs。taglibs.jsp的内容大致如下:
编译期路径:主要是在jsp页面编译成html之前的一些页面指令,如<@ page>、<@ taglig>等,其搜索路径的根目录是web应用目录,也就是myWeb。假如test/test.jsp需要包含common/taglibs.jsp,则在test.jsp中可以这样写:<%@ include file="/common/taglibs.jsp"%>,表示要包含根目录下common目录下的taglibs.jsp,也可以这样:<%@ include file="../common/taglibs.jsp"%>表示包含父目录下common目录下taglibs.jsp,推算如下:test的父目录为myWeb,也就是myWeb/common/taglibs。taglibs.jsp的内容大致如下:<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/page.tld" prefix="page" %>
<%
String background="/common/background.jpg ";
%>
- 运行期路径:主要是指在jsp被编译成html后的搜索路径。这时其搜索路径的根路径为web应用的父目录。如果使用jboss为web服务器,则这时的根路径为<jboss安装目录>/server/default/deploy。
test.jsp内容大致如下:
<%@ include file="/common/taglibs.jsp"%>
<img src="<%=background%>" width="717" height="42">
如果在浏览器中敲入test.jsp所在路径,则图片显示不出来,这是因为被转成html后上面的代码会别翻译成<img src="/common/background.jpg" width="717" height="42"> ,这时图片的搜索路径是<jboss安装目录>/server/default/deploy/common/background.jpg,而实际这个文件是不存在的,所以图片无法显示。而如果将taglibs.jsp中background定义为:<%String background="../common/background.jpg ";%>或<%String background="/myWeb/common/background.jpg ";%>则可以正确显示。前一种根据相对路径会搜索/myWeb/test/../common/taglibs.jsp,后一种是绝对路径为/myWeb/common/taglibs.jsp都能找到文件。