使用嵌入式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") 正在寻址?
最佳答案
The
getRequestDispatchermethod takes aStringargument 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.
规则如下
- 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.
- 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.
- 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.
- 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.
也就是说,这个Servlet,ExampleController是在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,请确保您已完成以下操作:
addWebapp 定义。addContext,然后运行 addWebApp,这样它们都指向 ROOT:File base = new File("src/com/example/view");
context = tomcat.addContext("", base.getAbsolutePath());
tomcat.addWebapp(null, "/", base.getAbsolutePath());
request.getRequestDispatcher("/example/read.jsp").forward(request, response); 指向 jsp,前提是目录/example 存在于 “src/com/example/view”。关于java - getRequestDispatcher ("path") 在哪里看?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997130/
我正在尝试测试是否存在表单。我是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
我在从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""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我遵循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
我正在尝试从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
我正在尝试编写一个将文件上传到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
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我正在尝试使用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
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas