zoukankan      html  css  js  c++  java
  • web路径问题

    web工程中的各种路径(eclipse开发)

    目前遇到的 web 工程中要写url和路径的文件有 

    • webContent中.jsp/.html :action
    • src中的servlet类 : 映射地址、重定向、请求转发、访问资源文件(webContent中、src中)
    • src非servlet类的普通类 :访问资源文件(webContent中、src中)

    以下一一说明:

    .jsp/.html中的路径

      form表单提交的action中要写servlet(jsp)的路径

        1. 跳转到.jsp

          action中使用相对路径,相对于当前页面。

        

    <!-- from JSP1.jsp to JSP2.jsp --> 
    <!-- JSP1.jsp中的form --> 
    <form action="File/JSP2.jsp">
    <!-- from JSP2.jsp to JSP1.jsp --> 
    <!-- JSP2.jsp中的form --> 
    <form action="../JSP1.jsp">

        2.跳转到servlet1

        注意,路径与package产生的目录无关。

        

    //Servlet1.java 的映射地址
    @WebServlet(name = "Servlet1", urlPatterns = { "/Servlet1" })
    <!-- from JSP2.jsp to Servlet1 --> 
    <!-- JSP2.jsp中的form --> 
    <form action="../Servlet1">

    改变servlet的映射地址,使servlet映射到与JSP2.jsp一个文件夹下

    //修改servlet1的映射地址后
    @WebServlet(name = "Servlet1", urlPatterns = { "/File/Servlet1" })
    <!-- from JSP2.jsp to Servlet1 --> 
    <!-- JSP2.jsp中的form --> 
    <form action="Servlet1">

     再次改变servlet映射地址,servlet映射到虚拟目录下

    //再次修改servlet1的映射地址后,映射到virtualFile虚拟目录
    @WebServlet(name = "Servlet1", urlPatterns = { "/virtualFile/Servlet1" })
    <!-- from JSP2.jsp to Servlet1 --> 
    <!-- JSP2.jsp中的form --> 
    <form action="../virtualFile/Servlet1">

         3.更新:利用超链接<a>跳转到servlet,其中的href:

    //相对于当前jsp的相对路径跳转到servlet,同时传递参数id = 111,111为String类
    
    //在servlet页面可以通过 request.getPatameter("id")获取111
    <a href="servlet1?id=111">点击跳转到servlet1</a>

    src中的servlet类

    •     url注解中的要写servlet的映射地址
    •     servlet类访问webContent中的资源文件    Servlet1访问1.txt(按照tomcat中的工程结构)

    //Servlet1.java 的映射地址
    @WebServlet(name = "Servlet1", urlPatterns = { "/Servlet1" }) 
    //利用getServletContext().getRealPath()获取web工程的绝对路径
    String filePath = this.getServletContext().getRealPath("/sourceFile/1.txt");
    //filePath=// D:	omcatapache-tomcat-8.0.50-windows-x64apache-tomcat-8.0.50webapps	est3sourceFile1.txt
    BufferedReader br = new BufferedReader(new FileReader(filePath));

     

    •  访问src中的资源文件     Servlet1访问2.txt

    //Servlet1.java 的映射地址
    @WebServlet(name = "Servlet1", urlPatterns = { "/Servlet1" }) 
    //访问src中的文件,要按照tomcat中的工程目录获取绝对路径
    //servlet不要映射到虚拟目录
    String filePath = this.getServletContext().getRealPath("/WEB-INF/classes/2.txt");
    BufferedWriter br = new BufferedWriter(new FileWriter(filePath));

     

    •  重定向到servlet(jsp),只能用相对路径  servlet1重定向到JSP2.jsp
    //重定向使用相对路径,url发生改变
    response.sendRedirect("File/JSP2.jsp");
    •  请求转发到servlet,可以 用相对路径、绝对路径 servlet1请求转发到Servlet2
    复制代码
    //相对路径
    RequestDispatcher rd = request.getRequestDispatcher("Servlet2");
    rd.forward(request,response);
    //绝对路径
    RequestDispatcher rd = request.getRequestDispatcher("/Servlet2");
    rd.forward(request,response);              
    复制代码

    src非servlet类的普通类

      

    •  普通类访问webContent中的资源文件  NormalClass中访问1.txt
    //利用class获取本类所在的目录(不含pacakage,只到classes),
    //利用getResource()获取资源文件绝对路径
    //在webContent中则要两次返回上级目录(WEB-INF,工程名URLTest)
    File filePath = new File(NormalClass.class.getClassLoader().getResource("../../sourceFile/1.txt").getPath());
    FileInputStream fn = new FileInputStream(filePath);
    •   普通类访问src中的资源文件  NormalClass中访问2.txt
    //利用class获取本类所在的目录(不含pacakage,只到classes),
    //利用getResource()获取资源文件绝对路径
    File filePath = new File(NormalClass.class.getClassLoader().getResource("2.txt").getPath());
    FileInputStream fn = new FileInputStream(filePath);

    注意:

    注意!! 第一次打开.jsp页面时,.jsp页面的所有相对路径都是相对.jsp页面的,然而从servlet转发到jsp页面时相对路径会变成相对于servlet的路径,会导致资源文件访问不到。

    如何避免:在所有相对路径前面加上 ${pageContext.request.contextPath}来获得相对web工程的目录。

    如:

    <!-- from JSP2.jsp to Servlet1 --> 
    <!-- JSP2.jsp中的form --> 
    <form action="../Servlet1">

     改为

    <!-- from JSP2.jsp to Servlet1 --> 
    <!-- JSP2.jsp中的form --> 
    <form action="${pageContext.request.contextPath}/Servlet1">

    文章目录

    1.前情提要
    2.相对路径
    3.绝对路径
    1.前情提要

    1.相关知识:
    java web项目发布时,其实只将WebContent文件夹部署到服务器上,并将文件夹名WebContent改为项目名,java源代码并不发布,而是运行存放在WebContent—>WEB-INF—>classes目录下的经过编译的class字节码文件。

    2.这是用于下面测试的 web项目:

    2.相对路径

    相对路径:相对于当前目录的路径为相对路径 (或者说是相对于当前文件所在目录的路径)

    在web项目中,若我们在访问路径的最前端不加上“/”,那就是使用相对路径,如下图所示

    上面图中是一个jsp页面,它是项目中WebContent下的index.jsp。这里面写了一个form表单,将表单提交给LoginServlet,而action中没有添加“/”,则这里就是用了相对路径。而这里的相对路径指的是相对于当前的这个前端页面所在的文件夹(我们将在第4步进行测试)。

    首先我们需要知道,在eclipse的web项目中,前端页面的默认起始路径就是WebContent.现在我们访问我这个项目中的index.jsp,那路径如下图:

    上图中,圈1是代表项目名,有人可能会问,你刚刚不是说前端页面的默认起始路径是webContent吗?这里没有看见webContent这字段,这是因为java web项目发布时,其实只将WebContent文件夹部署到服务器上,并将文件夹名WebContent改为项目名(这里项目就是叫TestWeb),圈2是文件名。

    我们还需要知道,若需要访问servlet这种在src下的Java文件,也是直接“IP地址/项目名/servlet”,不需要加上包名。如下图,我将访问我项目下LoginServlet。


    测试。
    当前我们jsp中代码如下(不加 / ,使用相对路径,看能否访问到LoginServlet):

    运行结果(点击提交后):


    可以访问到LoginServlet,接下来我将使用在WebContent文件下的Test文件下的index2.jsp文件进行测试,下面为index2.jsp的代码(依旧是使用相对路径)

    运行之后的结果图如下:

    大家注意了:此时路径中有改变。当我点击提交后,运行结果图如下:

     

    从上图可以看出来,此时相对路径是http://localhost:8080/TestWeb/Test/,因为我们index2.jsp的页面是在Test文件夹下的,所以此时相对路径是 相对于index2.jsp的路径,自然会多个Test路径,而我们知道要访问src下的servlet 路径应该是,“IP地址/项目名/servlet”,此时多了个Test 怎么可能可以访问到呢。那怎么办呢,这时,我们只能使用绝对路径来访问。

    3.绝对路径

    绝对路径的使用方式就是在路径的开始加上“/”,若在路径开始处加上了一个“/”,那相对路径前缀就会被“清零”,路径从最初位置开始。

    那么,绝对路径的最初位置路径是什么呢?就是服务器的IP地址+端口号,比如在本机访问,那就是http://localhost:8080。也就是说使用绝对地址,那访问所写的路径将会被拼接到http://localhost:8080之后。

    测试。

    测试二:
    接下来我index1.jsp中 改成action=“/LoginServlet”(此时是绝对路径了),查看是否可以访问到页面。

    由上图可以得知,路径中的项目名TestWeb不见了,且出现了404页面,第一,说明了绝对路径的路径是 localhost:8080/ 而我们知道要访问src下的servlet 路径应该是,“IP地址/项目名/servlet”,那我们怎么才能访问到LoginServlet呢,此时,我们改index.jsp代码改成下面的样子(这里先不用jsp的方法)。

    如果用了绝对路径把项目名(TestWeb)清除掉了,那我们就自己加上去。运行结果如下:

    运行成功,且出现了TestWeb。接着我们把index2.jsp中 改成action=“/LoginServlet”(此时是绝对路径了),查看是否可以访问到页面。

    此时,我们发现不仅仅是项目名TestWeb不见了,连Test也不见了,只剩下localhost:8080,再次说明了绝对路径的路径,那我们要如何访问呢,跟上面例子同理,若清除了,我们自己加上。


    总结:

    绝对路径就是在路径开头加“/”,那路径的起始就是服务器IP地址;
    而相对路径就是开头不加“/”,而起始就是发起跳转的文件的所在路径

    没有停止的脚步,只有倒下去的脚步
  • 相关阅读:
    集合已修改 ;可能无法执行枚举操作 Dictionary
    net 操作XML小结
    SQL SERVER 2000写存储过程出现列名无效的解决方法
    .net如何获得前一页面的地址
    SQL字符串叠加问题
    c# 保留2位小数
    如何取字符字段的第几个字符,如取name的左边从2位起的2个字符?
    SQL语句复制表的方法
    给页面加上Loading效果最简单实用的办法
    为XMl文档添加子节点,依据淘宝
  • 原文地址:https://www.cnblogs.com/hkMblogs/p/13374948.html
Copyright © 2011-2022 走看看