首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >何时在RequestDispatcher中使用和不使用正斜杠(/)

何时在RequestDispatcher中使用和不使用正斜杠(/)
EN

Stack Overflow用户
提问于 2015-08-05 14:19:55
回答 3查看 2.1K关注 0票数 0

我在Head First Servlet和JSP中浏览了RequestDispatcher。我不清楚以下几点

  1. 什么时候应该在请求调度程序中使用正斜杠(/)?
  2. 什么时候不应该在请求调度程序中使用正斜杠(/)?
  3. 相对路径应该总是以正斜杠开始吗?
  4. 以正斜杠(/)开头的相对路径与没有正斜杠(/)的相对路径之间的差异。例如,index.html和/index.html的区别?

我试过一个例子。下面是我的项目结构和代码

这是我的Servlet代码

代码语言:javascript
运行
复制
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session = request.getSession();

        String userId = request.getParameter("userId");
        String password = request.getParameter("password");

        LoginService loginService = new LoginService();
        boolean result = loginService.authenticate(userId, password);
        if(result){
            User userDetails = loginService.getUserDetails(userId);
            request.setAttribute("user", userDetails);
            //response.sendRedirect("success.jsp");
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("success.jsp");
            requestDispatcher.forward(request, response);
            return;
        }else{
            response.sendRedirect("/login.jsp");
            return;
        }
    }

我的登录页面如下

我的成功页面如下

我正在验证登录用户,如果用户是有效用户,则将其转发到成功页面。

这是我说的代码

代码语言:javascript
运行
复制
 RequestDispatcher requestDispatcher = request.getRequestDispatcher("success.jsp");
            requestDispatcher.forward(request, response);

代码语言:javascript
运行
复制
 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/success.jsp");
            requestDispatcher.forward(request, response);

这两种方式,我的控制到Success.jsp。首先,JSP和Servlet在读取请求分配器时,我无法理解下面的一行,如下所示

代码语言:javascript
运行
复制
RequestDispatcher requestDispatcher = request.getRequestDispatcher("result.jsp");

--这是一个相对路径,因为没有初始的正斜杠(“/”).So--在本例中,容器在请求所在的同一逻辑位置查找"result.jsp“。

如果路径以正斜杠(‘/“)开头,容器将其视为”从此its应用程序的根目录开始“。如果路径不以正斜杠开头,则考虑相对于原始请求。

以下是Head First JSP和Servlet中的行。

以上几行是什么意思。我无法清楚地了解“其考虑的相对于最初的请求”,可以用一个例子来解释。

EN

回答 3

Stack Overflow用户

发布于 2015-08-05 14:24:25

如果你在这里。

代码语言:javascript
运行
复制
http://www.example.com/one/two/three/four/five.jsp

你用request.getRequestDispatcher("six.jsp").forward(req, resp);重定向到request.getRequestDispatcher("six.jsp").forward(req, resp);,然后着陆

代码语言:javascript
运行
复制
http://www.example.com/one/two/three/four/six.jsp      (relative path)

如果您通过/six.jsp重定向到request.getRequestDispatcher("/six.jsp").forward(req, resp);,那么您将登陆

代码语言:javascript
运行
复制
http://www.example.com/six.jsp      (starting from root)
票数 1
EN

Stack Overflow用户

发布于 2015-08-05 14:47:21

绝对路径和相对路径有不同的利弊。

如果您确信有一堆servlet (jsp是servlet)都位于同一层次结构级别,而且如果您不想被这个层次结构(前缀)所困扰,那么相对URL是合适的。一个实际的示例用例是javascript前端服务器后面的REST服务器的servlets angularjs开发人员通常使用REST服务的相对路径。

相反,如果您想要在一个完整的web应用程序中轻松地更改URL层次结构,绝对URL是可行的。但在这种情况下,您的必须考虑到servlet上下文路径,因为您将转发到本地路径,但将重定向到完整路径,使用:

代码语言:javascript
运行
复制
full_path = servlet_context_path/local_path

几乎真实的例子:如果一个webapp部署在http上,端口8080部署在host.domain上的webapp中,页面/subdomain1/page1将有一个http://host.domain:8080/webapp/subdomain/page1的完整URL,您将使用/subdomain/page1进行转发,在重定向或链接中使用/webapp/subdomain/page1

票数 0
EN

Stack Overflow用户

发布于 2018-03-12 12:06:02

URN开头处的正斜杠将重定向到应用程序容器/服务器的根目录,并且它在URN中的缺失将相对于客户机请求的URL重定向。

正斜杠“/”字符在链接中用于JSP中,例如:

代码语言:javascript
运行
复制
<a href="/foo/stuff.htm">Stuff page</a>

在servlet中,由RequestDispatcher.forward()HTTPResponse.sendRedirect()方法实现URL重定向。

只有在重定向url的开头中应用时,它才有效果。

下面是应用程序服务器如何在幕后解释它的规则:

  1. 首先:请注意重定向地址在重定向URL的域段中始终是区分大小写的-even。在下面的示例代码中,请参阅我的注释,通过示例查看如何工作和将失败的示例来说明这一点。
  2. 如果在重定向示例中提供了一个URL(而不是URN (为了理解差异,请参阅这里):如果重定向以'http://'开始,那么重定向链接将被视为绝对路径。 ,否则您的重定向链接将被视为相对链接。
  3. 如果重定向URI以正斜杠字符'/‘开头,则指示应用程序服务器构造相对于web容器的URL!例如:相对于localhost:8080 所以命令..。

response.sendRedirect("/foo/stuff.htm")

从servlet内部,或

<a href="/foo/stuff.htm">Stuff page</a>

在JSP中,将带您到

本地主机:8080/foo/stuff.htm

  1. 在您的重定向- URL (以及没有协议签名)开始时缺少正斜杠将指示应用服务器相对于原始请求的URL构造它的URL!也就是说,用户在客户端输入浏览器的URL . 重要的是要注意,此构造的URL既不是也不是
代码语言:javascript
运行
复制
- relative to the domain

nor

代码语言:javascript
运行
复制
- relative to the web container!

再次:应用服务器构建的URL将相对于客户端请求的原始URL!

因此,例如:如果客户端提交URL

http://www.example.com/level1/level2/stuff.htm

然后命令..。

response.sendRedirect("foo/stuff.htm")

从servlet或者,

<a href="foo/stuff.htm">Stuff page</a>

在JSP中,将重定向到

http://www.example.com/level1/level2/foo/stuff.htm

//不起作用!理由:案件敏感性。response.sendRedirect("/teluskolearnings/login.jsp");//将工作!理由:案件敏感性。response.sendRedirect("/TeluskoLearnings/login.jsp");//将重定向到localhost:8080/login.jsp,因为正斜杠告诉app // SERVER构建相对于APP服务器的URL。//因此您将被指向“http://localhost:8080/login.jsp'”。//这不是我们想要的。response.sendRedirect("/login.jsp");//将重定向到本地主机:8080/TeluskoL产/login.jsp //,因为没有正斜杠会告诉app服务器构建URL //相对于URL!//,因此您将被指向// 'http://localhost:8080/TeluskoLearnings/login.jsp'。//这就是我们想要的。response.sendRedirect("login.jsp");//将重定向到本地主机:8080/TeluskoL产/foo/login.jsp // (您可以在地址栏中看到重定向,即使没有找到// 404 -页),因为没有正斜杠(开始时)告诉/ app服务器构建相对于请求的URL!//的url,这也意味着如果用户输入/ 'http://localhost:8080/TeluskoLearnings/level1/level2/stuff"‘// he将被指向// 'http://localhost:8080/TeluskoLearnings/level1/level2/foo/login.jsp’// (当然是提供的),在@WebServlet()注释的// urlPatterns参数中捕获了“/level2 1/level2 2/stuff”)。response.sendRedirect("foo/login.jsp");

请参阅:https://www.safaribooksonline.com/library/view/head-first-servlets/9780596516680/ch04s27.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31835181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档