Java getRequestDispatcher(“路径”)看起来在哪里?
使用嵌入式tomcat,此代码: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.
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
有没有办法打印出绝对URLgetRequestDispatcher(“relativePath”)
正在寻址的内容?说明了这一点
getRequestDispatcher
方法采用一个描述
ServletContext范围内的路径此路径必须为
相对于ServletContext的根,并以“/”开头,或
空的。该方法使用路径来查找servlet,使用
第12章“将请求映射到”中的servlet路径匹配规则
Servlets“,用RequestDispatcher对象包装它,并返回
结果对象。如果没有servlet可以基于给定的
路径,提供了一个RequestDispatcher,用于返回
那条路
这些规则如下
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”
中