JSP 和 Servlet 中的绝对路径和相对路径问题困扰了我好几天,经过努力之后将其部分心得和大家共享。?
?????? 前提:假设你的 Http 地址为 http://192.168.0.1/ 你的 web 应用为 webapp ,那么你的 web 应用 URL 为 http://192.168.0.1/webapp/?
?????? web 应用的目录结构:?
?????? webapp/?
????????????? web-inf/?
???????????????? classes/?
???????????????????? lib/?
???????????????????? web.xml?
????????????????????????????? <servlet-mapping>?
?????????????????????????????? <servlet-name>handleservlet</servlet-name>?
?????????????????????????????? <url-pattern>/handleservlet</url-pattern> 此映射是相对于当前 web 应用的?
???????????????????????????? </servlet-mapping>?
????????????? user/?
a.jsp?
b.jsp?
????????????? images/?
????????????? css/?
????????????? js/?
??????????????
?????? 所有相对路径都是由“ / ”开头的。如: /image/a.gif , /user/main.jsp ,大家知道在 html 中的相对路径是这样的:?
?????? 有个 html 文件: a.html ,其中有 <link href="one.css" rel="stylesheet" type="text/css"> ,其中 href 属性表示引用的 css 文件的路径。?
one.css :表示 one.css 和 a.hmtl 处于同一个目录?
user/one.css :表示 one.css 处于 a.html 所在目录的子目录 user 中。?
../one.css :表示 one.css 位于 a.hmtl 上一级目录下,?
http://www.cnblogs.com/one.css :表示 one.css 位于 a.hmtl 上一级目录的上一级目录下,?
./ :表示和 a.hmtl 同一目录?
我们称上述相对路径为 html 相对路径?
1、 服务器端的地址?
服务器端的相对地址指的是相对于你的 web 应用的地址,这个地址是在服务器端解析的(不同于 html 和 javascript 中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在 jsp 和 servlet 中的相对地址应该是相对于你的 web 应用,即相对于 http://192.168.0.1/webapp/ 的。?
其用到的地方有:?
forwarder : servlet 中的 request.getRequestDispatcher(address); 这个 address 是在服务器端解析的,所以,你要 forwarder 到 a.jsp 应该这么写: request.getRequestDispatcher(“/user/a.jsp”) 这个 / 相对于当前的 web 应用 webapp ,其绝对地址就是: http://192.168.0.1/webapp/user/a.jsp 。?
sendRedirect :在 jsp 中 <%response.sendRedirect("/rtccp/user/a.jsp");%>?
2、 客户端的地址?
所有的 html 中的相对地址都是相对于 http://192.168.0.1/ 的,而不是 http://192.168.0.1/webapp/ 的。?
Html 中的 form 表单的 action 属性的地址应该是相对于 http://192.168.0.1/ 的,所以,如果提交到 a.jsp 为: action = ”/webapp/user/a.jsp” ;提交到 servlet 为 action = ”/webapp/handleservlet”?
Javascript 也是在客户端解析的,所以其相对路径和 form 表单一样。?
3、 站点根目录和 css 路径问题?
我们称类似这样的相对路径 /webapp/…. 为相对于站点根目录的相对路径。?
当在 jsp 中引入 css 时,如果其相对路径相对于当前 jsp 文件的,而在一个和这个 jsp 的路径不一样的 servlet 中 forwarder 这个 jsp 时,就会发现这个 css 样式根本没有起作用。这是因为在 servlet 中转发时 css 的路径就是相对于这个 servlet 的相对路径而非 jsp 的路径了。所以这时候不能在 jsp 中用这样的路径: <link href="one.css" rel="stylesheet" type="text/css"> 或者 <link href="http://www.cnblogs.com/one.css" rel="stylesheet" type="text/css"> 类似 href="one.css" 和 http://www.cnblogs.com/one.css 的 html 相对路径是相对于引用这个 css 的文件的相对路径。而在 servlet 中转发时就是相对于这个 servlet 的相对路径了,因为 jsp 路径和 servlet 路径是不一样的,所以这样的引用肯定是出错的。?
所以这个时候,要用站点根目录,就是相对于 http://192.168.0.1/ 的目录,以“ / ”开头。?
因此上述错误应更正为 href=”/webapp/one.css” 类似的站点根目录的相对目录。这样在 servlet 转发后和 jsp 中都是相对于站点根目录的相对路径,就能正确使用所定义的 css 样式了。?
===================================================================?
在jsp中经常会遇到路径的问题,出现404的错误或者是图片无法显示.?
这个问题可以从以下几个方面来解决:?
??? 1 链接或表单提交的路径?
??? 2 重定向和转发的路径?
??? 3 在MyEclipse有jsp的两种模板advanced 和 base Templates的路径问题?
以下为解决之道?
1 表单提交和链接都是从客户端请求请求而来?
? /指的Tomcat的根目录,写绝对路径应该写成"/当前Web程序根名称/资源名" 如"/WebModule1/jsp1.jsp","/bbs/servlet/MyServlet"?
2 重定向和转发的路径问题?
? 写相对路径重定向和转发没有区别?