我在Head First Servlet和JSP中浏览了RequestDispatcher。我不清楚以下几点
我试过一个例子。下面是我的项目结构和代码
这是我的Servlet代码
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;
}
}
我的登录页面如下
我的成功页面如下
我正在验证登录用户,如果用户是有效用户,则将其转发到成功页面。
这是我说的代码
RequestDispatcher requestDispatcher = request.getRequestDispatcher("success.jsp");
requestDispatcher.forward(request, response);
或
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/success.jsp");
requestDispatcher.forward(request, response);
这两种方式,我的控制到Success.jsp。首先,JSP和Servlet在读取请求分配器时,我无法理解下面的一行,如下所示
RequestDispatcher requestDispatcher = request.getRequestDispatcher("result.jsp");
--这是一个相对路径,因为没有初始的正斜杠(“/”).So--在本例中,容器在请求所在的同一逻辑位置查找"result.jsp“。
如果路径以正斜杠(‘/“)开头,容器将其视为”从此its应用程序的根目录开始“。如果路径不以正斜杠开头,则考虑相对于原始请求。
以下是Head First JSP和Servlet中的行。
以上几行是什么意思。我无法清楚地了解“其考虑的相对于最初的请求”,可以用一个例子来解释。
发布于 2015-08-05 14:24:25
如果你在这里。
http://www.example.com/one/two/three/four/five.jsp
你用request.getRequestDispatcher("six.jsp").forward(req, resp);
重定向到request.getRequestDispatcher("six.jsp").forward(req, resp);
,然后着陆
http://www.example.com/one/two/three/four/six.jsp (relative path)
但
如果您通过/six.jsp
重定向到request.getRequestDispatcher("/six.jsp").forward(req, resp);
,那么您将登陆
http://www.example.com/six.jsp (starting from root)
发布于 2015-08-05 14:47:21
绝对路径和相对路径有不同的利弊。
如果您确信有一堆servlet (jsp是servlet)都位于同一层次结构级别,而且如果您不想被这个层次结构(前缀)所困扰,那么相对URL是合适的。一个实际的示例用例是javascript前端服务器后面的REST服务器的servlets angularjs开发人员通常使用REST服务的相对路径。
相反,如果您想要在一个完整的web应用程序中轻松地更改URL层次结构,绝对URL是可行的。但在这种情况下,您的必须考虑到servlet上下文路径,因为您将转发到本地路径,但将重定向到完整路径,使用:
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
。
发布于 2018-03-12 12:06:02
URN开头处的正斜杠将重定向到应用程序容器/服务器的根目录,并且它在URN中的缺失将相对于客户机请求的URL重定向。
正斜杠“/”字符在链接中用于JSP中,例如:
<a href="/foo/stuff.htm">Stuff page</a>
在servlet中,由RequestDispatcher.forward()
和HTTPResponse.sendRedirect()
方法实现URL重定向。
只有在重定向url的开头中应用时,它才有效果。
下面是应用程序服务器如何在幕后解释它的规则:
localhost:8080
所以命令..。response.sendRedirect("/foo/stuff.htm")
从servlet内部,或
<a href="/foo/stuff.htm">Stuff page</a>
在JSP中,将带您到
本地主机:8080/foo/stuff.htm。
- relative to the domain
nor
- 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
https://stackoverflow.com/questions/31835181
复制相似问题