一、请求转发
这是一种在服务器内部的资源跳转方式,过程为:
当客户端(就是浏览器)把请求发送到服务器中以后,假设原本该由资源a来接收,那么此时资源a可以将请求转发(forword)给另一个资源b,然后由资源b来响应请求的结果。
实现方式:只需在资源a中获取forword方法,为服务器提供资源b的路径即可。
req.getRequestDispatcher("资源b路径").forward(req,resp);
在这个过程中,本来由资源a从客户端获取的数据可以使用Reauest对象来传送共享给资源b。
// 存储数据到 request域中。
void setAttribute(String name,Object o);
// 根据 key,获取值。
Object getAttribute(String name);
// 根据 key,删除该键值对。
void removeAttribute(String name);
注意:进行请求转发时,是在服务器内的资源之间进行跳转,浏览器始终只发一次请求,所以可以看到浏览器的地址栏路径是不变的,同样的,因为是在服务器内进行跳转,所以只能转发到当前服务器内的内部资源,而不能与互联网上其他地方的资源连接。
例如:
将req与req2连接。
在req2里将请求转发给req1,并设置相应输出语句。
设置req1的输出语句。
在访问req.html过后,在服务器控制台上可以看到req1先于req2响应。
且搜索栏里的路径没变过。
二、重定向
这是另一种资源跳转的方式:
资源a内可以设置重定向的资源b路径,当客户端将请求发送给资源a后,资源a会给予跳转响应,使得浏览器重新向资源b发送请求。
实现方式:
在资源a中先设置状态码302,然后调用response对象的setHeader方法,为客户端提供资源b的路径。
需要注意的是,这里的路径需要加上虚拟路径,因为浏览器重新发送的响应可以是任何地方,包括互联网上的其他资源,而不是仅限于服务器内的资源。
resp.setStatus(302); //先设置状态码。
resp.setHeader(“location”,“资源B的路径");
//告诉客户端b路径,使得客户端向资源b重新发送请求。
/*或者,(因为状态码的设置是必须的),所以调用sendRedirect方法省
略设置状态码的代码,只需填写资源b的路径即可。*/
resp.sendRedirect("资源B的路径");
而且,在重定向完成后,浏览器搜索栏的路径也会发生变化。
例如:
在req2中设置重定向至我的主页的语句。
结果输入req.html后直接就跳转到我的主页了。(#^_^#)