其实这个路径的问题应该不只是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访问也是不写。重定向里也是代表服务器根目录。只有请求转发里可以写 / 代表项目根目录)