草庐IT

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

coder 2024-03-03 原文

使用嵌入式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/

有关java - getRequestDispatcher ("path") 在哪里看?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

随机推荐