J2EE中的绝对路径根相对路径文档相对路径 问题注意Word文档格式.docx
《J2EE中的绝对路径根相对路径文档相对路径 问题注意Word文档格式.docx》由会员分享,可在线阅读,更多相关《J2EE中的绝对路径根相对路径文档相对路径 问题注意Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
这上面显示路径/LoginServlet不可用,发现我的代码没有问题,后来看了下地址栏的路径,发现连接的相对路径映射到绝对路径的时候发生了错误:
这个是原始的欢迎页面的路径,我的web应用名为FilterLoginApp
下面这个是进行定位Servlet的路径,这时候发生了连接错误:
这个时候发现地址栏的主机名后面少了web应用名FilterLoginApp,这时候发现了自己的相对路径的设置出现了问题,出现相对路径的地方应该是<
form>
的action属性:
经过试验发现这里去掉"
/"
即可,当去掉"
的时候,这里的LoginServlet就相当于FilterLoginAppweb应用程序根目录的资源地址,而当加上"
的时候就会出现上面错误的URL地址,即没有了FilterLoginApp,而只有"
主机名"
+/LoginServlet,在这里就是"
http:
//localhost:
8080/LoginServlet"
这个资源请求地址是明显不对的.
利用这种思想也可以将action的值改为/FilterLoginApp/LoginServlet时返回的是正确的结果,原因很简单,这样的资源请求地址就变为"
8080/FilterLoginApp/LoginServlet"
这个地址是正确的.
PS:
这里就是根相对路径的使用形式.
小结一下原因,就是"
代表主机根目录,在linuxOS中也是这个意思,前面的http:
8080代表主机名,紧跟着的"
符号代表的是目标主机的根目录,因此上面的"
/LoginServlet"
路径的意思就是web容器下的根目录下的LoginServlet资源,在这个例子下当然是找不到的,应该是"
/FilterLoginApp/LoginServlet"
这个路径.
*所以以后记住加了"
+"
资源名"
是相对于主机根目录的资源地址,而直接写"
则是相对于"
主机名/web应用名"
web应用程序的根目录地址的资源.这里的资源指的是sevlet.
但是当不加"
时,而仅仅加入资源名,这个时候就是相对于FilterLoginApp这个web应用的根目录的资源地址了,在后面的代码中我也发现了自己相同的错误代码.
这里可以清楚的看见资源定位的错误,没有加入web应用程序的根目录
导致这个错误的原因是
在这里又在HTML代码中的超链接<
a>
中把路径写错,道理同上面的错误一样,不应该加入"
符号,
在这里只要记住"
在linux代表相对于主机根目录即可,而不是应用根目录,而不带"
代表的是相对于web应用程序根目录的资源位置.
--------------------------------------------------------------------------------------------------
另外一种是用相对路径的方法是将<
ahref=/manager/WelcomeServlet>
试试访问管理资源<
/a>
改为
<
ahref=./manager/WelcomeServlet>
这里就是在/manager前加入一个"
."
即可
"
代表该代码所在文件的所在的当前目录.这里就相当于LoginServlet.java文件所在的目录,即根目录.
而"
.."
(两个点)代表父目录,即当前文件所在目录的上级目录.
经过试验发现,当把login.html欢迎页面放在深层目录的时候,只能是用不加"
的方法定位Servlet资源地址,否则发生错误,包括根相对路径和文档相对路径,均会发生错误.
上图:
原来的路径:
改动后的路径:
这时只能这样是用路径,而不能是用根绝对路径;
即,不能是用"
或是"
../LoginServlet"
这样设置之后会发生这样的错误
但是可以使用绝对路径:
经过这样设置以后,能准确连接到目标资源:
但是在服务器内部不推荐使用绝对路径,这是因为当程序移植到其他主机或服务器上时候,这些链接都需要重新修改,而使用相对路径则不会出现这些问题.
使用文档相对路径在这里用来定位Servlet资源是行不通的:
这里使用两层目录:
FilterLoginApp/test/test/Login.html
但是通过文档相对目录定位的时候,在这里定位Servlet资源行不通:
这里是文档相对路径的使用形式.
-------------------------------------------------------------------------------------------------
经过实验已经发现了上述问题的原因:
这里全是因为设置了默认主页的原因.
在这里设置的默认主页的层级比较深,是为了测试:
地址栏中敲入:
//127.0.0.1:
8080/FilterLoginApp/则会出现预先编好的HTML主页.但是地址栏中的URL并没有发生改变.这时候提交表单的时候将出现错误(表单提交的action属性为"
../../LoginServlet"
)
注意这里的URL为http:
8080/LoginServlet也没有出现web应用名称因此可以确定action部分发生了错误,即文档相对路径发生错误.
但是手动敲入Login.html的路径打开这个主页:
当还是原来的那个文档相对路径提交表单的时候则会连接到正确的页面.
这时可以得出结论,在J2EE后台中所有的文档相对链接都是相对于浏览器的地址栏中的URL定位其他后台资源的而不是根据实际的资源在后台的存放路径进行定位的.
而类似于Servlet这些后台资源是在web.xml中通过配置来映射到URL的路径中的.
从后面有关JSTL标签的学习中才知道,普通的普遍存在于类似于<
、<
img>
这些HTML标签中的字符串URL只能使用的是绝对路径字符串和文档相对路径字符串,就是不能使用相对于web应用的根相对路径,如果要使用跟相对路径就必须加入JSTL的核心标签库中的<
c:
urlvalue="
根相对路径"
>
这样就可以正常工作了,因为根相对路径具有很多的优点,所以我比较偏向于这种URL的使用方法.另外,<
url>
标签也可以使用绝对路径和文档相对路径.
JSTL标签仅仅限于在JSP页面中的使用,但普通的Servlet类中是不能使用这些标签的,但是经过试验发现,在Servlet中使用request.getRequestDispatcher("
路径"
).forward();
其中这里的路径可以使用根相对路径,绝对路径也可是文档相对路径.这是跟JSP页面不相同的一个特点.
如下图: