web项目中的路径

来源:互联网 发布:织田信忠 知乎 编辑:程序博客网 时间:2024/06/05 02:13

1.web项目中的路径

    1.1 路径中最左边的/
        /a/b/c/d
        我们要讨论的是类似这样的路径中的最左边的/,除此之外其他/都是正常的路径分割符
        
        客户端解析路径最左边的/
            代表的是端口号后面的/
            http://ip:port/
            例如:
                在页面中有一个超链接
                <a href="/hello.html">测试</a>
                当我们点击这个超链接的时候,地址栏中的地址会变成:
                http://ip:port/hello.html            
            例如:
                在servlet完成一个客户端重定向操作
                String url = "/hello.html";
                response.sendRedirect(url);
                由于客户端重定向是把url地址返回给浏览器,浏览器解析之后,发出新的请求,这时候浏览器地址栏中的url地址变为:
                http://ip:port/hello.html
            

            所以在这俩种情况下,url最左边加了/,那么运行之后出现404报错,查看浏览器地址栏后,发现请求的url地址中缺少了项目名

        服务器端解析路径最左边的/
            代表的是项目名后面的/
            http://ip:port/项目名/

            例如:
                在web.xml文件中配置servlet的映射路径
                <url-pattern>/TestServlet</url-pattern>
                这个最左边的/是由服务器端进行解析的,所以它代表的是项目名后的/,浏览器进行访问的时候就要写这样的URL地址:
                http://ip:port/项目名/TestServlet
            
            例如:
                在servlet中进行服务器内部跳转操作
                String url = "/TestServlet";
                request.getRequestDispatcher(url).forward(request, response);
                这个最左边的/是由服务器端进行解析的,所以它代表的是项目名后的/,最后内部跳转所访问的url地址就是:
                http://ip:port/项目名/TestServlet
    1.2 HttpServletRequest中和路径相关的方法
        // /jd1615_servlet
        request.getContextPath();

        // /PathServlet
        request.getServletPath();

        // http://127.0.0.1:8989/jd1615_servlet/PathServlet
        request.getRequestURL();

        // /jd1615_servlet/PathServlet
        request.getRequestURI();
    -------------------------------------------------------
           例2
        contextPath:/Web_Test
        servletPath:/HttpServletRequest_test
        requestURL:http://127.0.0.1:8989/Web_Test/HttpServletRequest_test
        requestURI:/Web_Test/HttpServletRequest_test
    1.3 ServletContext中和路径相关的方法
        ServletContext servletContext = getServletContext();

        // /jd1615_servlet
        servletContext.getContextPath();
        
        //获得一个资源的绝对路径
        // D:\A_jd160405\apache-tomcat-7.0.62\webapps\jd1615_servlet\
        servletContext.getRealPath("/");
        
        //获得一个指定路径下面所有的资源路径名
        // [/hello.html, /success.html, /WEB-INF/, /error.html, /param.html, /login.html, /first.html, /META-INF/]
        servletContext.getResourcePaths("/");
        -------------------------------------------------------------------
        例2
        contextPath:/Web_Test
        realPath:/opt/apache-tomcat-8.0.38/webapps/Web_Test/
        resourcePaths:[/META-INF/, /bottom.html, /WEB-INF/, /timg_美女.jpeg, /index.html, /jianli_add.html]
    1.4 相对路径和绝对路径
        绝对路径
            使用servletContext.getRealPath("..")就可以获得一个资源的绝对路径

        web形式的路径
            /hello.html
            http://ip:port/hello.html
            或者
            http://ip:port/项目名/hello.html
            具体是哪一种路径,要看解析这个/的是客户端还是服务器端
        相对路径
            例1:
            假设path.html和hello.html在同一个目录下
            path.html页面中有一个超链接
            <a href="hello.html">测试</a>
            超链接中的这个路径就是一个相对路径,相对于当前路径,当前路径指的是浏览器地址栏中这个时候的路径
            所以当我们点击超链接的时候,就是在当前路径后面加上这个相对路径

            访问path.html的url地址:
            http://127.0.0.1:8989/jd1615_servlet/path.html

            点击超链接之后,地址栏中的内容变为:
            当前路径+相对路径
            http://127.0.0.1:8989/jd1615_servlet/
            +
            hello.html
            =
            http://127.0.0.1:8989/jd1615_servlet/hello.html
        
            
            例2:
            假设path.html和hello.html不在同一个目录下,path.html在test目录下
            path.html页面中有一个超链接
            <a href="hello.html">测试</a>
            超链接中的这个路径就是一个相对路径,相对于当前路径,当前路径指的是浏览器地址栏中这个时候的路径
            所以当我们点击超链接的时候,就是在当前路径后面加上这个相对路径
            
            访问path.html的url地址:
            http://127.0.0.1:8989/jd1615_servlet/test/path.html
            点击超链接之后,地址栏中的内容变为:
            当前路径+相对路径
            http://127.0.0.1:8989/jd1615_servlet/test
            +
            hello.html
            =
            http://127.0.0.1:8989/jd1615_servlet/test/hello.html

            这时候出现404错误,页面找不到
            这个时候可以修改这个相对路径,使得点击超链接后可以正常访问
            <a href="../hello.html">测试</a>


            例3:
            假设path.html和hello.html在同一个目录下
            path.html页面中有一个超链接
            <a href="hello.html">测试</a>
            web.xml中给PathServlet映射了一个路径
            <url-pattern>/servlet/PathServlet</url-pattern>
            访问这个servlet之后,会进行一个服务器内部跳转,跳转到path.html页面
            浏览器显示path.html后,再点击页面中的超链接

            先访问servlet
            http://127.0.0.1:8989/jd1615_servlet/servlet/PathServlet

            然后点击页面中的超链接
            <a href="hello.html">测试</a>
            超链接中的这个路径就是一个相对路径,相对于当前路径,当前路径指的是浏览器地址栏中这个时候的路径
            所以当我们点击超链接的时候,就是在当前路径后面加上这个相对路径

            点击超链接之后,地址栏中的中变为:
            当前路径+相对路径
            http://127.0.0.1:8989/jd1615_servlet/servlet
            +
            hello.html
            =
            http://127.0.0.1:8989/jd1615_servlet/servlet/hello.html
            
            所以最后又出现了404报错信息

            
            例4:
            在html页面添加base标签之后,这个页面中的所有相对路径,就不再是相对于地址栏中的路径了,而是相对于base标签中设置的路径
            <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
            <html>
            <head>
            <base href="http://127.0.0.1:8989/jd1615_servlet/" />
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>path.html</title>
            </head>
            <body>
                
                <div align="center">
                    <a href="hello.html">测试</a>
                </div>
                
            </body>

            </html>


3.jsp页面中的路径
    一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一样的,但是在jsp中可以动态获得该项目的url。
 
    如果在jsp页面的上面写了这样一个脚本:
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    并且再<head>标签中加入了一个子标签:
    <base href="<%=basePath%>" />
 
    那么在这个jsp页面中,我们再去写上一个相对路径(最左边没有加/的那种路径),它就不是相对于地址栏中的当前路径了,而是要相对于这个basePath变量所代表的这个路径.



1 0
原创粉丝点击