HttpServletRequest: 请求的转发forward和包含include
很多时候Servlet对某个请求的处理结果并不是直接发还给客户端,而是转交给下一个Servlet做进一步处理。转发请求可以使用HttpServletRequest的getRequestDispatcher()方法取得RequestDispatcher对象,再转发给相应的Servlet:
RequestDispatcher rd = request.getRequestDispatcher("loginAction.do");
取得RequestDispatcher实例以后再调用forward()方法来将请求转发,转发时将HttpServletRequest和HttpServletResponse作为参数传入,因此在同一个请求周期中,后续处理请求的Servlet/Jsp可以继续使用ServletRequest和ServletResponse处理请求和回应:
rd.forward(request, response);
使用了forward方法表示当前的Servlet不会对请求做回应,而是将回应的职责交给下一个Servlet来处理。应此在执行forward之前,不能对客户端做http回应,否则发生IllegalStateException。forward()的Jsp/Servlet执行完毕,执行流程会回到原来的Jsp/Servlet,这是可以继续一些流程处理,但是无法再对浏览器做回应。
请求的转发是在容器中进行的,浏览器不会知道请求被转发,因此网址上不会有变化。
如果在目前的Servlet中,打算先进行一部分对客户端的回应,中间再将其他Servlet包括进来回应,则可以使用RequestDispatcher的include()方法:
request.getRequestDispatcher().include(request, response);
所包含的Servlet处理完毕之后,原Servlet还可以继续进行流程处理以及对客户端的回应。不过一般来说include方法会放在Jsp中,使用标签<jsp:include>
HttpServletResponse: sendRedirect()和sendError()方法
可以使用HttpServletResponse的sendRedirect()方法要求客户端浏览器重新请求另外一个url,这称为重定向(Redirect):
response.sendRedirect("http://www.xxx.de");
这个方法会在回应中设定HTTP状态码301以及Location标头,浏览器接收到这个标头,会重新使用Get()方法请求指定的url,因此网址列上会出现url的变更。