必须知道的requestURI、servletPath、contextPath(转载)


版权声明:本文为CSDN博主「十二翼堕落天使」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XY1790026787/article/details/105735272

一、requestURI、servletPath、contextPath

假设:

  • 当前的项目根目录为:/demo,即访问首页的路径为http://localhost:8080/demo/index.jsp
  • 页面全部位于 web 根目录下。

假设有一个 Servlet:

public class TestServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.service(request, response);
        System.out.println("context-path=" + request.getContextPath());
        System.out.println("servlet-path=" + request.getServletPath());
        System.out.println("request-uri=" + request.getRequestURI());
    }
}

    那么访问首页 http://localhost:8080/demo/index.jsp则会输出:

    context-path=/demo
    servlet-path=/index.jsp
    request-uri=/demo/index.jsp
    

      二、转发、重定向的参数

      假设当前 Servlet 正在处理的请求的请求路径为/demo/control/login

      /转发

      假设转发的方式为:

      request.getRequestDispatcher("/home.jsp").forward(request, response);
      

        那么转发到的路径为:

        • http://localhost:8080/demo/home.jsp
        • 相对 web 根目录转发。符合期望。

        不带/转发

        假设转发的方式为:

        request.getRequestDispatcher("home.jsp").forward(request, response);
        

          那么转发到的路径为:

          • http://localhost:8080/demo/control/home.jsp

          • 相对当前请求路径转发。不符合期望。

          /重定向

          假设重定向的方式为:

          response.sendRedirect("/login.jsp");
          

            那么重定向的路径为:

            • http://localhost:8080/login.jsp
            • 相对项目路径(或 context-path)重定向。不符合期望。

            不带/重定向

            假设重定向的方式为:

            response.sendRedirect("login.jsp");
            

              那么重定向的路径为:

              • http://localhost:8080/demo/control/login.jsp
              • 相对当前请求路径转发。不符合期望。

              URL地址重定向

              假设重定向的方式为:

              response.sendRedirect("https://www.google.com/");
              

                那么重定向的地址为:

                • https://www.google.com/
                • 符合期望

                统一格式化

                可以定义一个方法来统一处理:

                    public static void formatResponse(HttpServletRequest request,
                                                      HttpServletResponse response, 
                                                      String target,
                                                      String responseMethod) throws ServletException, IOException {
                        switch (responseMethod) {
                            case "FORWARD": {
                                String url = ("/" + target).replaceAll("/+", "/");
                                request.getRequestDispatcher(url).forward(request, response);
                            }
                            case "REDIRECT": {
                                String url;
                                if (target.startsWith("http") || target.startsWith("www.")) {
                                    url = target;
                                } else {
                                    url = ("/" + request.getContextPath() + "/" + target).replaceAll("/+", "/");
                                }
                                response.sendRedirect(url);
                                break;
                            }
                            default: {
                            }
                        }
                    }
                
                
                
                
                
                -------- 本文结束 感谢阅读 --------

                本文标题:必须知道的requestURI、servletPath、contextPath(转载)

                文章作者:FunctFan

                发布时间:2020年07月28日 - 04:21:08

                最后更新:2020年07月28日 - 04:32:01

                原始链接:https://functfan.github.io/posts/558851770/

                许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。