我发现
response.sendRedirect("/some-path/")
重构的容忍度不是很高。是否有一些等效的做法:
response.sendRedirect(lookupPath("NameOfMyServlet"))
即查找 servlet 的路径而不是硬编码它。
如果你可以转发到命名的 servlet 而不是重定向,ServletContext.getNamedDispatcher(String name)
就是你需要的。这是javadoc 说:
RequestDispatcher getNamedDispatcher(String name)
返回一个
RequestDispatcher
对象,该对象充当命名 servlet 的包装器。
假设sc
是当前的 servlet 上下文(您可以从请求对象获取它):
sc.getNamedDispatcher("NameOfMyServlet").forward(request, response);
将控制权传递给 servlet。
但是如果你真的需要做一个重定向,你只能重定向到一个URL,并且没有直接的方法可以知道命名的servlet将处理哪个URL。
因此,替代方法是:
- 在应用中的某个位置存储映射 {servletname: path} 并使用它来查找要使用的路径 将您的 servlet 映射到一个技术路径,除了它的正常路径之外,它永远不会在
- 应用程序的其他地方使用,并将该技术路径用于您的内部重定向 - 糟糕的新,它这个技术路径将显示在浏览器的 URL 栏中......