(servlet)路径问题
资源路径 和 资源名称以访问栏信息最后一个斜杠为标准,前面的是资源路径后面的为资源名称对于url和uri都是一样的例:以下是一个url路径http://localhost:8080/14-requestDispatcherForward/loginServlet以下是一个uri路径/oo/xx/jj/index.html绝对路径和相对路径web应用的绝对路径就是url绝对路径...
资源路径 和 资源名称
以访问栏信息最后一个斜杠为标准,前面的是资源路径后面的为资源名称
对于url和uri都是一样的
例:以下是一个url路径
http://localhost:8080/14-requestDispatcherForward/loginServlet
以下是一个uri路径
/oo/xx/jj/index.html
绝对路径和相对路径
web应用的绝对路径就是url
绝对路径=相对路径+参照路径
相对路径
分为两大类:1.以斜杠开头的 2.以路径名称开头的
1.以斜杠开头的
分为前台路径和后台路径
前台路径,是由浏览器解析执行的代码文件中所包含的路径,如html文件里,css文件,js文件
将前台路径转换为绝对路径的工作是由浏览器完成的
例子,给出以下例子
在一个web项目下,html文件如何写这个temp.jpg的路径
<!-- 如果按照以下格式写的话斜杠开头是一个相对路径,同时是放在html文件中的,
所以是一个前台路径,根据分析,知道绝对路径 = 参照路径+相对路径
前台路径中的参照路径为服务器的根目录 则为http://localhost
则以下绝对路径为 http://localhost/images/temp.JPG 明显是不对的,缺少一个找到web应用的标识
-->
<img alt = "temp" src = "/images/temp.JPG">
同时主要web应用的根是在WebContent文件下的
所以更改后的访问方式如下,这样绝对路径=相对路径+参照路径就可以成功访问了
<img alt = "temp" src = "/17-relativePath/images/temp.JPG">
以斜杠开头的相对路径,对于访问表单提交访问servlet的代码如下
注意这里提交后面要跟url-parttern 而不是servle-tname
<form action="/17-relativePath/login" method="GET">
后台路径,主要区分web服务器路径的根路径和web应用的根路径
后台路径是以当前web应用根路径为参照路径
绝对路径= 参照路径+相对路径
后台路径的参照路径如下
http://localhost/17-relativePath
以下例子是xml配置文件里:
后台路径是由服务器解析的,如下面这段代码,服务器就会解析为
http://localhost/17-relativePath/login
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
注意:后台路径的绝对路径,其作用是“标识”,标识的意思就是当浏览器想访问这个资源(LoginServlet)时,就得通过输入标识来访问
当客户端提交请求为:http://localhost/17-relativePath/login,才能访问到LoginServlet
以下例子是服务器中的java代码块,以资源跳转中的(请求转发)为例
分析模式与.xml文件一样,后台路径以web应用的根路径为参照路径
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("login GET请求");
System.out.println("req == " +req);
System.out.println("respones = " + resp);
req.getRequestDispatcher("/other").include(req, resp);
}
以下例子是服务器中的java代码块,以资源跳转中的(重定向)为例
因为重定向是重新向浏览器提交信息,所以决定了它可以跳转到其他web应用,所以重定向提交到浏览器,是由浏览器解析,所以重定向提交时,是以web服务器的根目录为参照路径。(同时注意resp.sendRedirect为这种特例,其他重定向还是遵循后台路径提交规则)
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("login GET请求");
System.out.println("req == " +req);
System.out.println("respones = " + resp);
// 下面的写法无法完成跳转
resp.sendRedirect("/other");
//下面的方法虽然可以完成跳转,项目名称固定了
resp.sendRedirect("/17-relativePath/other");
//最好的写法,可以获取当前目录的名字,而且项目名称改变也无所谓
resp.sendRedirect(req.getContextPath()+"/other");
}
2.以路径名称开头的相对路径
浏览器/web服务器均适用
参照路径为:当前访问路径的资源路径
以下是前台路径(不严谨的说法):
以.html文件里为例
当访问这个html文件时:绝对路径为:http://localhost/16-relative/index.html
http://localhost/16-relative为资源路径,index.html为资源名称
以下是一个以“路径名称开头的相对路径”,其参照路径是“当前访问路径的资源路径”
可以看到资源路径是动态变化的,具体情况具体分析
<img alt = "temp" src = "images/temp.JPG">
再以html的表单form提交提交
//可以看到是一个路径名开头的相对路径,则要找资源路径
//对于本例而言访问html文件的绝对路径为http://localhost/16-relative/index.html
//则资源路径为http://localhost/16-relative
<form action="loginServlet" method = "GET">
以下是后台路径(不严谨的说法,对比带斜杠路径的说法)
在.xml文件下的
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern> //这个斜杠不能去掉,因为他是用来标识资源得,相当于是后面有资源路径这个概念的前提
</servlet-mapping>
java服务器中的代码块
//这时候的绝对路径是http://localhost/16-relative/SomeServlet
//则资源路径为http://localhost/16-relative
//故通过以下格式提交是没问题的
req.getRequestDispatcher("other").forward(req,resp);
//同样的重定向也是适用的,就没有前面前台路径的特例了
resp.sendRedirect("other");
总结注意,若加上斜杠与不加斜杠都能跳转的话,那么选择加上斜杠,因为加上斜杠是以当前web应用根目录为参照是不会变得。而不加斜杠是以资源路径为参照,是不会改变的
更多推荐
所有评论(0)