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访问也是不写。重定向里也是代表服务器根目录只有请求转发里可以写  /  代表项目根目录)

 

 

  

原文地址:https://www.cnblogs.com/youwuyi/p/10251039.html