Java getRequestDispatcher(“路径”)看起来在哪里?

Java getRequestDispatcher(“路径”)看起来在哪里?,java,tomcat,servlets,Java,Tomcat,Servlets,使用嵌入式tomcat,此代码: System.out.println("getServletPath: " + request.getServletPath()); System.out.println("getServletContext: " + request.getServletContext().getContextPath()); System.out.println("getServerName: " + request.getServerName()); System.out.

使用嵌入式tomcat,此代码:

System.out.println("getServletPath: " + request.getServletPath());
System.out.println("getServletContext: " + request.getServletContext().getContextPath());
System.out.println("getServerName: " + request.getServerName());
System.out.println("getServerPort: " + request.getServerPort());
打印出:

getServletPath: /example
getServletContext: 
getServerName: localhost
getServerPort: 9090
这是否意味着:

request.getRequestDispatcher("/example/read.jsp").forward(request, response);
将查看此URL以
转发(请求、响应)
到JSP:

http://localhost:9090/example/read.jsp

有没有办法打印出绝对URL
getRequestDispatcher(“relativePath”)
正在寻址的内容?

说明了这一点

getRequestDispatcher
方法采用一个描述 ServletContext范围内的路径此路径必须为 相对于ServletContext的根,并以“/”开头,或 空的。该方法使用路径来查找servlet,使用 第12章“将请求映射到”中的servlet路径匹配规则 Servlets“,用RequestDispatcher对象包装它,并返回 结果对象。如果没有servlet可以基于给定的 路径,提供了一个RequestDispatcher,用于返回 那条路

这些规则如下

  • 容器将尝试找到请求路径与servlet路径的精确匹配。成功匹配将选择 servlet
  • 容器将递归地尝试匹配最长路径前缀。这是通过在一个目录中的路径树上走下来完成的 每次使用“/”字符作为路径分隔符。最长的 match确定所选的servlet
  • 如果URL路径中的最后一段包含扩展名(例如.jsp),servlet容器将尝试匹配处理 请求延期。扩展被定义为的一部分 最后一个“.”字符后的最后一段
  • 如果前三个规则都没有导致servlet匹配,那么容器将尝试提供适合该servlet的内容 请求的资源。如果为 应用程序,它将被使用。许多容器提供隐式 为内容提供服务的默认servlet
  • 你问

    这是否意味着:

    request.getRequestDispatcher("/example/read.jsp").forward(request, response);
    
    request.getRequestDispatcher(“/example/display.jsp”).forward(请求, 反应);将查看此URL以转发(请求、响应)到 JSP:

    http://localhost:9090/example/display.jsp

    不,它不发送HTTP请求,因此路径与URI无关。它更像是一个内部路径,Servlet容器将尝试与Servlet的各种url映射相匹配

    你也问

    有没有办法打印出getRequestDispatcher(“relativePath”)正在寻址的绝对URL

    不,它也不是一个绝对的URL。这是一条可由web应用程序上下文中的某些资源处理的路径


    编辑后,将
    添加webapp
    Tomcat
    实例中

    tomcat.addWebapp(null, "/view2/example2", new File("src/com/example/view/example").getAbsolutePath());
    
    然后将请求发送到

     /view2/example2/read.jsp
    
    /example
    
    我将假设
    read.jsp
    处于

    src/com/example/view/example/
    
    我相信它位于web应用程序的公共可访问部分,因此Servlet容器可以呈现它并使用它进行响应

    您还添加了一个带有
    addContext
    的webapp,它似乎类似于
    addWebapp

    context = tomcat.addContext("", base.getAbsolutePath());
    
    并将servlet映射添加到此上下文中

    我错误地认为
    /example/*
    无法处理
    /example

    当您将请求发送到

     /view2/example2/read.jsp
    
    /example
    
    由于上下文路径为“”,因此将使用上面的
    上下文
    ,并且映射将与上面注册的
    示例控制器
    匹配。您的
    Servlet
    代码将执行并到达

    request.getRequestDispatcher("/view2/example2/read.jsp").forward(request, response);
    
    请注意

    指定的路径名可能是相对的,但不能扩展 在当前servlet上下文之外

    换句话说,这个
    Servlet
    ExampleController
    在映射到上下文路径
    ”的
    ServletContext
    中注册,即root。路径
    /view2/example2/read.jsp
    指向另一个上下文。因为这个上下文没有映射,所以它以404响应

    您可以在不同的上下文中获取对其他web应用程序的引用。你必须使用。比如说

     ServletContext otherContext = request.getServletContext().getContext("/view2/example2");
    
    现在您已经拥有了
    ServletContext
    ,您可以为该上下文中的资源获取
    RequestDispatcher

    自州

    路径名必须以/开头,并被解释为相对于当前上下文根


    最终答案:

    引用JSP文件时,
    getRequestDispatcher(“path”)
    将查看
    addWebapp
    方法中设置的目录。如果显示空白页或
    NullPointerException
    ,请确保已执行以下操作:

  • 删除所有
    addWebapp
    定义
  • 像这样运行
    addContext
    然后
    addWebApp
    ,这样它们都指向
    ROOT
  • File base=新文件(“src/com/example/view”);
    context=tomcat.addContext(“,base.getAbsolutePath());
    tomcat.addWebapp(null,“/”,base.getAbsolutePath())

  • 在servlet中,使用
    request.getRequestDispatcher(“/example/read.jsp”).forward(请求,响应)指向jsp
    前提是目录/示例存在于
    “src/com/example/view”