问题1:转发的时候路径上没有加/request-demo而重定向加了,那么到底什么时候需要加,什么时候不需要加呢?1628862652700.png
    其实判断的依据很简单,只需要记住下面的规则即可:

    • 浏览器使用:需要加虚拟目录(项目访问路径)
    • 服务端使用:不需要加虚拟目录

    对于转发来说,因为是在服务端进行的,所以不需要加虚拟目录
    对于重定向来说,路径最终是由浏览器来发送请求,就需要添加虚拟目录。
    掌握了这个规则,接下来就通过一些练习来强化下知识的学习:

    答案:
    1.超链接,从浏览器发送,需要加
    2.表单,从浏览器发送,需要加
    3.转发,是从服务器内部跳转,不需要加
    4.重定向,是由浏览器进行跳转,需要加。

    1. 问题2:在重定向的代码中,/request-demo是固定编码的,如果后期通过Tomcat插件配置了项目的访问路径,那么所有需要重定向的地方都需要重新修改,该如何优化?1628863270545.png

    答案也比较简单,我们可以在代码中动态去获取项目访问的虚拟目录,具体如何获取,我们可以借助前面咱们所学习的request对象中的getContextPath()方法,修改后的代码如下:
    重新启动访问测试,功能依然能够实现,此时就可以动态获取项目访问的虚拟路径,从而降低代码的耦合度。

    1. @WebServlet("/resp1")
    2. public class ResponseDemo1 extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. System.out.println("resp1....");
    6. //简化方式完成重定向
    7. //动态获取虚拟目录
    8. String contextPath = request.getContextPath();
    9. response.sendRedirect(contextPath+"/resp2");
    10. }
    11. @Override
    12. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    13. this.doGet(request, response);
    14. }
    15. }