gpt4 book ai didi

java - getRequestDispatcher ("path") 在哪里看?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:52 24 4
gpt4 key购买 nike

使用嵌入式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 forward(request, response) 到 JSP:

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

有没有办法打印出绝对 URL getRequestDispatcher("relativePath") 正在寻址?

最佳答案

Servlet Specification解释这个

The getRequestDispatcher method takes a String argument describing a path within the scope of the ServletContext. This path must be relative to the root of the ServletContext and begin with a ‘/’, or be empty. The method uses the path to look up a servlet, using the servlet path matching rules in Chapter 12, “Mapping Requests to Servlets”, wraps it with a RequestDispatcher object, and returns the resulting object. If no servlet can be resolved based on the given path, a RequestDispatcher is provided that returns the content for that path.

规则如下

  1. The container will try to find an exact match of the path of the request to the path of the servlet. A successful match selects the servlet.
  2. The container will recursively try to match the longest path-prefix. This is done by stepping down the path tree a directory at a time, using the ’/’ character as a path separator. The longest match determines the servlet selected.
  3. If the last segment in the URL path contains an extension (e.g. .jsp), the servlet container will try to match a servlet that handles requests for the extension. An extension is defined as the part of the last segment after the last ’.’ character.
  4. If neither of the previous three rules result in a servlet match, the container will attempt to serve content appropriate for the resource requested. If a "default" servlet is defined for the application, it will be used. Many containers provide an implicit default servlet for serving content.

你问

Does that mean that:

request.getRequestDispatcher("/example/display.jsp").forward(request, response); Will look at this URL to forward(request, response) to the JSP:

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

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

你也问

Is there a way to print out what absolute URL getRequestDispatcher("relativePath") is addressing?

没有。而且它不完全是一个绝对 URL。它是可以由 Web 应用程序上下文中的某些资源处理的路径。


编辑后,您将 addWebapp 添加到您的 Tomcat 实例。

tomcat.addWebapp(null, "/view2/example2", new File("src/com/example/view/example").getAbsolutePath());

然后您将请求发送至

 /view2/example2/read.jsp

我假设 read.jsp

src/com/example/view/example/

我相信它位于 Web 应用程序的可公开访问部分,因此 Servlet 容器可以呈现它并用它进行响应。

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

context = tomcat.addContext("", base.getAbsolutePath());

并将 servlet 映射添加到这个上下文。

Tomcat.addServlet(context, "example", new ExampleController());
context.addServletMapping("/example/*", "example");

关于 /example/* 无法处理 /example 我错了。

当您向

发送请求时
/example

因为上下文路径是“”,上面的Context将被使用并且映射将匹配上面注册的ExampleController。您的 Servlet 代码将执行并到达

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

注意 ServletRequest#getRequestDispatcher(String) 的 javadoc

The pathname specified may be relative, although it cannot extend outside the current servlet context.

也就是说,这个ServletExampleController是在ServletContext中注册的,映射到上下文路径"",即。根。路径 /view2/example2/read.jsp 指的是另一个上下文。由于此上下文没有对应的映射,因此它以 404 响应。

您可以在不同的上下文中获取对另一个 Web 应用程序的引用。你必须使用 ServletContext#getContext(String) .例如

 ServletContext otherContext = request.getServletContext().getContext("/view2/example2");

现在您有了 ServletContext,您可以为那个上下文中的资源获取一个RequestDispatcher

otherContext.getRequestDispatcher("/read.jsp").forward(request, response);

ServletContext#getRequestDispatcher(String)

The pathname must begin with a / and is interpreted as relative to the current context root.


最终答案:

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

  1. 删除所有 addWebapp 定义。
  2. 像这样运行 addContext,然后运行 ​​addWebApp,这样它们都指向 ROOT:

File base = new File("src/com/example/view");
context = tomcat.addContext("", base.getAbsolutePath());
tomcat.addWebapp(null, "/", base.getAbsolutePath());

  1. 在 servlet 中使用 request.getRequestDispatcher("/example/read.jsp").forward(request, response); 指向 jsp,前提是目录/example 存在于 “src/com/example/view”

关于java - getRequestDispatcher ("path") 在哪里看?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com