servlet可以将发送给自己的某个请求转发给另外一个URL地址,这个地址可以是html、jsp、servlet或是其他的http地址。servlet的请求转发有三种方式:
1.inclue方法,应用代码为request.getRequestDispatcher("/url").include (request, response),其中URL地址是某个http地址。include转发时,地址栏没有改变,是原来的地址,这个过程是在服务器端完成,Servlet和被包含的页面同时被输出。
2.forward方法,request.getRequestDispatcher("/url").forward(request, response),地址栏也不会改变,同样是在服务器端完成,[color=red]但仅输出被转发的URL中的内容[/color]。
3.sendRedirect,只是客户重新发起一个请求,第二个请求指向其参数url。一般称做重定向,[color=red]客户端的地址栏将改变为url值[/color],是由客户端发起的第二次请求。参数中要写明具体的url地址,因为当客户端再次发送请求时,会直接请求web服务器根目录。要是要转发的一个html地址,它在WEB-INF文件夹下,那么要从servlet转发到这个
html地址,必须加上当前的web路劲名,这个路劲名可以通过request.getContextPath()获得,那么该转发代码可以为response.sendRedirect(request.getContextPath()+"/login.html");
注意:重定向是浏览器向服务器重新发出请求,但转发相当于把request的范围扩大,例如:
在a界面有个连接<a href="b.jsp?id=1">,在b界面可以通过request.getAttribute("id")获得,
在b界面也有个连接<a href="c.jsp?name="123">,则在界面用request.getAttribute("id")就取不到值。这是每个连接就像一个重定向,相当于重新创建了一个request,当b->c时,a->b的request已经结束了。
接下来,在c的界面前加<jsp:forward page="d.jsp"/> ,那么变量name在c、d都有效,所以在d想取到参数name的值,不必要把参数值放到session里来扩大他的范围。
1.inclue方法,应用代码为request.getRequestDispatcher("/url").include (request, response),其中URL地址是某个http地址。include转发时,地址栏没有改变,是原来的地址,这个过程是在服务器端完成,Servlet和被包含的页面同时被输出。
2.forward方法,request.getRequestDispatcher("/url").forward(request, response),地址栏也不会改变,同样是在服务器端完成,[color=red]但仅输出被转发的URL中的内容[/color]。
3.sendRedirect,只是客户重新发起一个请求,第二个请求指向其参数url。一般称做重定向,[color=red]客户端的地址栏将改变为url值[/color],是由客户端发起的第二次请求。参数中要写明具体的url地址,因为当客户端再次发送请求时,会直接请求web服务器根目录。要是要转发的一个html地址,它在WEB-INF文件夹下,那么要从servlet转发到这个
html地址,必须加上当前的web路劲名,这个路劲名可以通过request.getContextPath()获得,那么该转发代码可以为response.sendRedirect(request.getContextPath()+"/login.html");
注意:重定向是浏览器向服务器重新发出请求,但转发相当于把request的范围扩大,例如:
在a界面有个连接<a href="b.jsp?id=1">,在b界面可以通过request.getAttribute("id")获得,
在b界面也有个连接<a href="c.jsp?name="123">,则在界面用request.getAttribute("id")就取不到值。这是每个连接就像一个重定向,相当于重新创建了一个request,当b->c时,a->b的request已经结束了。
接下来,在c的界面前加<jsp:forward page="d.jsp"/> ,那么变量name在c、d都有效,所以在d想取到参数name的值,不必要把参数值放到session里来扩大他的范围。