• servlet的路径跳转及路径问题


    其实这个路径的问题应该不只是servelt,应该是整个项目里比如jsp的跳转,超链接,都符合。

     1 <body>
     2     <h1>Servlet路径跳转</h1>
     3     <hr>
     4     <!--使用相对路径访问HelloServlet -->
     5     <!-- /servlet/HelloServlet 第一个/表示服务器的根目录 -->
     6     <a href="servlet/HelloServlet">访问HelloServlet!</a><br>
     7     <!-- 使用绝对路径 访问HelloServlet,可以使用path变量:path变量表示项目的根目录-->
     8     <a href="<%=path%>/servlet/HelloServlet">访问HelloServlet!</a><br>
     9     <!--表单中action的URL地址写法,与超链接方式完全相同。 -->
    10     <a href="servlet/TestServlet">访问TestServlet,跳转到Test.jsp</a>
    11      
    12   </body>

    1.  相对路径

      <a href="servlet/HelloServlet">访问HelloServlet!</a>。只所以这样写,是因为当前jsp和要访问的servelt不在一个目录下,所以要写明所在的包:
      

      这里我不太理解的是,index.jsp其实是和src一个目录等级,为什么不是写src/servlet/HelloServlet?还是说src这样项目自带的文件夹是不需要写明的?只需要些了包名/类名就是相对路径?还是说index和src是一个层次,相对路径就直接从下一个层次的servlet开始?

      

      超链接里servlet/HelloServelt前面不能有  反斜线,反斜线是代表服务器根目录,"/servlet/HelloServlet"代表的地址是:

        

    2. 绝对路径

      <a href="<%=path%>/servlet/HelloServlet">访问HelloServlet!</a>里的path就是当前的上下文,表示项目的根目录:

      JSP开头一般会有这两句代码:

    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>

      (我前面不知道哪里有认为相对路径更靠谱,因为绝对路径的话,发布出去的项目和自己电脑的代码,绝对路径不一样。不过这么看的话,绝对路径是获取上下文,那倒是任何时候都靠谱了,怪不得项目的代码里都是用path)

      项目结构里index.jsp是在ServletPathDirectionWebRoot下面(ServletPathDirection是项目名)。但是打印这个path,值是项目名:ServletPathDirection。和WebRoot无关。

      这么说的话,HelloServlet虽然在ServletPathDirectionsrcservlet下面,但是实际的path是ServletPathDirectionservlet??

      也就是说,获取上下文路径,项目创建时自带的文件夹是无效的,不算路径,只有自己创建的文件夹才算?

      不对,这个上下文,就只是项目名,是项目的根目录,HelloServlet获取上下文,值也是ServletPathDirection??

      

      那这样的话,绝对路径就是项目根目录+自己创建的包/类??项目本身有的文件夹是不算的?

      这么看的话,文件的物理路径,和代码里那个路径就不是一个意思了,物理路径一定是包含有src的:

          /ServletPathDirection/src/servlet/HelloServlet.java

      

    ps:

      尝试了几次想要在servelt里打印一下路径看看,但是一直写不对。

      刚刚看到,servelt输出是到页面,一直写System.out是不行的,要写HTML:

        

    PrintWriter out=response.getWriter();//取得输出流
    out.println("<html>");//输出的内容要放在HTML中
    out.println("<body>");
    out.println("要输入的内容.........");
    out.println("</body>");
    out.println("</html>");

         好吧,还是没做出来。

      不过绝对路径应该就是项目的根目录+自己创建的那个文件路径了,servlet绝对路径的则是项目根目录+<url-pattern>的值

      

      

    3.  url方法

      web.xml里注册servlet时有写其url:

     <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <!--url-pattern处必须以/开头,这里的/表示项目的根目录  但是超链接里使用时,是不写/的-->
        <url-pattern>/servlet/TestServlet</url-pattern>
      </servlet-mapping>

      这里和上面不一样,超链接里的  反斜线代表服务器的根目录,所以超链接里使用servlet的url时,前面是不写/的;url的反斜线代表的是项目的根目录

      表单里的  action:“url”  写法和超链接一致:

    <a href="servlet/TestServlet">访问TestServlet,跳转到Test.jsp</a>

       web.xml里的url是有   /     但是表单里   action后的url   是没有   /   的。。

      ps: 超链接方法servlet是直接是url,不带前面的  反斜线,也不带  .java.但是超链接访问jsp就要写   .jsp:

        

    <a href="test.jsp">访问Test.jsp</a>
    

      

      

      此时,由当前页面index.jsp访问到了TestServlet.java。然后TestServlet的     doPost(){   里面写跳转 }(doGet里面直接写的是doPost,所以不管什么提交方式最后肯定是用doPost,但是超链接访问也没有写是get还是post啊?(ps:超链接的默认请求方式是get,也能修改)):

      

    //请求重定向方式跳转到test.jsp,当前路径是ServletPathDirection/servlet/
             response.sendRedirect("test.jsp");
             //使用request.getContextPath获得上下文对象
             response.sendRedirect(request.getContextPath()+"/test.jsp");
            //服务器内部跳转,这里的斜线表示项目的根目录
            request.getRequestDispatcher("/test.jsp").forward(request, response);
            request.getRequestDispatcher("../test.jsp").forward(request, response);

       第一种用重定向,地址就直接写目标的名字,是在当前目录下找test.jsp,找不到。Servlet的Java文件和jsp不在一级的目录里。

      第二句加上了上下文(其实就是项目根目录),就补全了路径(但如果jsp文件也在一个包下面呢?那也应该加上包名)

      第三句用请求转发,  反斜线代表是根目录,路径是对的

      第四句的  ../    也可以(这是回退到根目录的意思还是  回退到上一级?)

    ps:

       

          ./表示当前目录

         ../表示父级目录

     /表示根目录(超链接里是代表服务器的根目录,所以超链接里是不写  /   ;表单的action访问也是不写。重定向里也是代表服务器根目录只有请求转发里可以写  /  代表项目根目录)

     

     

      

  • 相关阅读:
    驾驶细节
    python 字符串前面加u,r,b,f的含义
    pandas dataframe指定列字符串转成数字的方法
    python 休息随机秒
    Windows搭建ffmpeg推流服务端 sky
    在golang中如何正确判断接口是否为nil
    快速了解一门技术的学习方法
    TortoiseGit使用教程(图文详细版)
    centos7升级安装openssl版本
    CentOS7防火墙,开放端口配置
  • 原文地址:https://www.cnblogs.com/youwuyi/p/10251039.html
Copyright © 2020-2023  润新知