什么是转发,重定向?
转发和重定向都是用于在服务器和浏览器之间进行页面跳转的方式。
转发是在服务器内部进行的,当一个Servlet接收到请求后,它可以将请求转发给另一个Servlet或JSP页面来处理请求,但是浏览器不知道这个操作,它仍然认为自己在和原来的Servlet打交道。转发是通过调用RequestDispatcher的forward方法实现的。
重定向是在浏览器端进行的,当一个Servlet接收到请求后,它会发送一个重定向指令给浏览器,告诉浏览器去访问另一个URL,浏览器会重新向新的URL发出请求。重定向是通过调用HttpServletResponse的sendRedirect方法实现的。
两者的主要区别在于:
- 转发是在服务器内部进行的,重定向是在浏览器端进行的。
- 转发是一次请求,浏览器只知道原始请求的URL,而不知道请求的实际处理地址,重定向是两次请求,浏览器会知道两个请求的URL。
- 转发不改变URL,而重定向会改变URL。
简单说,转发url路径不会变,重定向url路径会改变
转发和重定向图解
转发:A通过B的转发, 找到C
重定向:A请求B,B会通知A去访问C
在配置映射的时候我遇到一个问题,就是不能配置多个servlet-name,配置了就会报错,然后我找了原因,发现是那个头文件的问题,版本太老了,以下是我的解决方案
如果不能导入多个映射的名字,那就需要修改web.xml的头文件,那怎么获取呢,进入tomcat中的webapps下的root目录下面的web-INF下面的web.xml;把这里面的头文件复制粘贴进idea中web项目下的web.xml即可
下图是我从tomcat中拿到的头文件,因为idea中那个默认的配置文件,版本比较老
现在分别举例子说明转发和重定向的区别
转发:
web.xml配置文件,名字可以随意取,但是servlet名字要和映射的一致,这里我配置了两个servlet
HelloServlet的内容
ServletDemo类,这里我转发的路径是hello
访问的路径是sd,跳转到hello的页面,路径是没有改变的,只是页面变成了HelloServlet的页面
重定向:
HelloServlet的内容还是和上面的一样,没有变
Redirect代码
注意:这个路径要写这个项目的默认路径,在加上要重定向的路径,不然会报404
当我输入red,如下图:
回车后的效果如下,可以看到路径是发生了变化
重定向是302,转发是200
所以,综合两个例子,我得到的结论是,转发url路径不会变,重定向url路径会改变