servlet中重定向或请求转发的路径如果用“/”开头,代表当前项目下的路径,浏览器转发这条路径时会自动加上当前项目的路径前缀,如果这个路径不是以“/”开头,那么代表这个路径和当前所在servlet的路径前缀是同一个,浏览器访问该网址时会自动加上当前servlet的路径前缀。
html中href或src网址如果用“/”开头,代表当前服务器下的路径,浏览器转发这条路径时会自动加上当前服务器的路径前缀,如果这个路径不是以“/”开头,那么代表这个路径和当前所在html的路径前缀是同一个,浏览器访问该网址时会自动加上当前html的路径前缀。
那么问题来了:为什么 servlet中的“/”代表当前项目,html中的“/”代表当前服务器?
因为servlet是后台代码,只针对某个应用有效,想想也知道,自己应用的后台处理肯定不能控制别人应用(亲测自己的servlet不能把请求转发到百度),所以不需要给后台转发或重定向路径太大的范围,最大范围设置为当前项目就是最佳的,如果设置成是当前服务器下,那就没必要了,这个编程语言经过长时间的发展改进肯定已经达到一个性能很优的程度,
而html是属于前端代码,前端页面是可以随意访问别人的的应用网页的,所以前端的访问路径必须至少是可以跨应用访问的,所以至少是服务器级别的,所以把默认当前路径设置为当前服务器下还是很合理的。
不禁感慨这个模块的设计者怎么能把细节考虑得这么周到。
所以当我们遇到一个机制,我们应该想想为什么设计者要这样设置,这样设计有什么优势,了解这个层面的话,对这个机制的原理应该就比较透彻了,以后再使用这个机制的话就更不会出错了。
为什么html页面中的跳转到servlet中的src中要加项目名${pageContext.request.contextPath}?
因为前端的页面是可以跳转到当前服务器下的其他项目的后台servlet的,所以如果其他项目也有一个通相对路径相同且同名的servlet的话,那么html就很难判断应该跳到哪去,所以为了明确要求跳转到本项目下的servlet中,要在路径前加一个项目名前缀
为什么有的时候html下面的src资源路径要加“../”前缀?
因为你的html可能是在当前项目的某个文件夹下,这样你的hmtl里的相对路径就是服务器名加这个问件夹名,必须退回到和要访问的资源文件夹同一级才可以访问这个资源。每加一个“../”前缀就往上退一级