向东博客

非澹泊无以明志,非宁静无以致远.
posts - 12,  comments - 19,  trackbacks - 0

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 上一级目录下,

../../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="../../one.css" rel="stylesheet" type="text/css"> 类似 href="one.css" ../../one.css html 相对路径是相对于引用这个 css 的文件的相对路径。而在 servlet 中转发时就是相对于这个 servlet 的相对路径了,因为 jsp 路径和 servlet 路径是不一样的,所以这样的引用肯定是出错的。

所以这个时候,要用站点根目录,就是相对于 http://192.168.0.1/ 的目录,以“ / ”开头。

因此上述错误应更正为 href=”/webapp/one.css” 类似的站点根目录的相对目录。这样在 servlet 转发后和 jsp 中都是相对于站点根目录的相对路径,就能正确使用所定义的 css 样式了。

 

说了这么多,不知道你了解没,有什么问题留言,大家一块交流!

posted on 2006-10-10 08:57 向东博客 阅读(3592) 评论(2)  编辑  收藏 所属分类: 开发技巧

FeedBack:
# re: JSP、Servlet中的相对路径和绝对路径
2007-02-23 10:47 | yangdamao
路徑問題把我給繁死了.
非常感謝,說的通俗易懂!
你去當老師應該是一個很不錯的老師!  回复  更多评论
  
# re: JSP、Servlet中的相对路径和绝对路径[未登录]
2008-10-22 08:32 | jason
以前一直搞.net,最近转到java,一开始就是这个路径问题,昨天晚上搞了整整一个晚上,也没弄出来,今天早上简单的一看,就明白了,太感谢楼主了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 







留言簿(3)

我参与的团队

随笔分类

在线文档

网站

最新随笔

积分与排名

  • 积分 - 55086
  • 排名 - 846

最新评论

阅读排行榜

评论排行榜