我先讲解一下重定向和转发的原理再发代码吧。
注:jsp文件也是servlet
1、重定向
假设有一个服务器,里面有若干个servlet,假定有一个浏览器向一个servlet程序发送请求访问另一个servlet,那么servlet程序会将另一个servlet的地址信息返回给浏览器让他重新访问,然后浏览器就能够访问到另一个servlet了。
主要的servlet文件的代码如下:
package cn.hncu.img;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 演示重定向
* @author Lenovo
* @author hgx
*/
public class RedirectServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//重定向---法1
String path="/helloWeb_mine/b/bb.jsp";
//resp.sendRedirect(path);
//重定向---法2
resp.setStatus(302);//重定向,法1中的sendRedirect(path)方法其实就相当于这一句为响应设置状态为302使其停掉
resp.setHeader("Location", path);//然后再通过这一句告知原发送方新的路径
//演示状态码
//resp.setStatus(404);//404表示找不到资源
//resp.getWriter().print("welcome");
}
}
2、转发
假设有一个服务器,里面有若干个servlet,假定有一个浏览器向servlet程序发送请求访问另一个servlet,那么servlet程序会通过request将浏览器的请求直接发送到另一个servlet
还有就是转发技术只适用于站内转发,即只能在同一个项目中转发,而重定向可以在多个项目间使用
主要的servlet文件代码如下:
package cn.hncu.img;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DispatcherServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//转发
String path="/a/a.jsp";//因为转发只能在栈内进行,因此不需要写到项目名,而重定向需要写到项目名,因为它是可以转发到其他项目的
RequestDispatcher rd=req.getRequestDispatcher(path);
rd.forward(req, resp);
}
}
重定向和转发其实也可以在servlet之间进行,比方说写两个servlet,浏览器访问一个servlet
重定向:第一个servlet为浏览器重定向到第二个servlet,这里第一个servlet里面要这样写:
String path="/helloWeb_mine/servlet/RedirectServlet";//注意这里要把项目名也写上
resp.sendRedirect(path);
第二个就可以像上面的例子中说到的那样写。
转发:第一个servlet直接将请求转发到第二个servlet,这里第一个servlet里面要这样写:
String path="/servlet/dispatcher";
req.getRequestDispatcher(path).forward(req, resp);
第二个就可以像上面的例子中说到的那样写。