以前读书的时候,刚学servlet的时候老实搞不清楚HttpServletRequest 和HttpServletResponse的关系,搞不清楚request和response是主要是做什么的,还有就是为什么Servlet里面的方法老是看到doPost和doGet。所以现在就来详细谈谈。
先放一张我喜欢的博主发的一张新疆伊犁的照片
谈谈request和response的本质关系:
一个是请求对象,一个是响应对象,那么这两个对象是由谁创建的?
答案是,web容器创建的,简单来说,tomcat容器创建的。
整个流程是这样的:
-
首先由客户端(也就是客户浏览器)对web容器发出HTTP请求,
-
如果是首次访问,那么需要先创建目标servlet。
-
再由web容器根据http请求创建出request对象和response对象。虽然response对象里面是空的,但是这个时候他就已经被创建出来了,他俩相当于是同一天生的亲兄弟。
-
然后web容器将生成的request对象和response对象传递到servlet。
来我们来看一个标准的servlet是怎么工作的:
@WebServlet(name = "DemoServlet", urlPatterns = "/two")
public class Demo7TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("这是Two,从请求域中取出one中的值:" + request.getAttribute("name"));
}
}
我们来看看上面的这段代码干了上面事
-
如果发送过来的是get请求,servlet会调用doGet方法,把request和response传递到doPost方法。相当于不管是get方法还是post方法,我都把它变到doPost方法里面去。
-
doPost方法体里面就开始各种操作,但是归根结底就是将得到的数据写到response里面去,然后再由response载着这些数据返回给Tomcat容器,再由tomcat容器返回给客户端。
由于request和response对象都早就已经创建好了,所的Servlet中的doPost方法和doGet方法传的值都要有
doPost(HttpServletRequest request, HttpServletResponse response)
doGet(HttpServletRequest request, HttpServletResponse response)
doGet和doPost方法的区别是 :
看form表单提交的是get方法还是post方法
当form框里面的method为get时,执行doGet方法
当form框里面的method为post时,执行doPost方法
由此衍生转发和重定向的根本区别就显而易见:
重定向为什么是response来做而转发是request来做?
response.sendRedirect("/MyServlet");
request.getRequestDispatcher("/MyServlet")
-
重定向本质其实是将
"/MyServlet"
这个地址作为数据放到了response里面返回给了客户端,也就是说已经出了web容器了,客户端拿到了这个地址,然后根据这个地址再去访问。所以就相当于两次访问,所以地址会变化。 -
而转发的本质是,把当前request对象里面的地址替换成新的地址,然后由同一个request对象,再去访问新的servlet。整个过程都在web容器里面,所以是同一次http请求了。在客户端那边地址不会变。