在Servlet中有两个很重要的切容易混淆的东西,他们是请求转发,重定向.我接下来用代码来讲解他们并且区分.
首先来说一下请求转发.
看上图,当form表单点击提交按钮,根据Servlet,便会去web.xml中寻找demo1_,然后在看上图,便会去com包下的dispatcher中寻找Demo1这个类.下图便是我写的Demo1类。
对应的有doPost方法来处理post请求.我们可以看到,里面有一个if分支,我们可以根据前端传递过来的值来判断是否需要发生请求转发.
那个getRequestDispatcher传的参数是一个地址,是需要发送请求转发的地址,这样的话就会直接向那个地址请求.我们看到的是demo2_,Servlet会根据demo2-去web.xml中查找对应的类,然后执行相应的doGet或者doPost方法.
重定向类似,具体实现如下.
根据form表单的action,去web.xml中寻找对应的类.
这这个类中,我们可以用sendRedirect来实现重定向,但是这里请注意,sendRedirect里面必须是绝对地址,而请求转发可以是相对地址.Servlet会根据sendRedirect里面的参数去web.xml中寻找对应的类,然后就会进入到对应的类去实现doGet方法.注意,如果是重定向,只能实现doGet方法,不能实现doPost方法.
区别: 请求转发:1.浏览器地址栏不发生变化;2.只能转发到服务器内部资源中;3.转发也是一次请求;4.可以通过requestDispatcher.forward(req,resp)将请求和相应同步转发过去,也可以通过req.setAttribute()来设置值,另外一方也可以收到,实现数据共享. 重定向:1.浏览器地址会发生变化;2.可以转发到服务器外部;3.无法实现数据共享.