转发和重定向的区别,web路径问题

一、给服务器使用的 “/”表示在当前web应用的根目录webRoot(WebContent)

request.getRequestDispatcher("/index.html")

转发是服务器级别,浏览器(客户端)的地址不会变。即是,浏览器(客户端)发送一个请求,服务器受理之后,发现要请求其他的内容,就是服务器自己去处理完成。由于是服务器自己处理,因此转发不能转发当前web应用以外的资源,可以把数据保存爱request对象当中。




二、给浏览器(客户端)使用的 “/”表示在tomcat的webapps的根

response.sendRedirect("/webDemo/index.html");

重定向是客户端级别,浏览器(客户端)的地址会改变。服务器收到请求后,发现要去请求其他的内容,就告诉客户端一个地址,那么客户端就去请求那个别的内容了。因为WEB-INF下面的内容都是只能由服务器级别才能访问,客户端级别并不能访问。因此重定向不能直接访问WEB-INF文件下的文件。


可以通过编写WEB-INF下的web.xml进行映射,例如有个JSP文件/WEB-INF/jsp/my.jsp,可以在配置文件web.xml中写:



<web-app>


<servlet>
    <servlet-name>myservlet-name>
    <jsp-file>/WEB-INF/jsp/hellow.jspjsp-file>
servlet>
<servlet-mapping>
    <servlet-name>myservlet-name>
    <url-pattern>/hellowurl-pattern>
servlet-mapping>
web-app>




三、web路径问题

现在web项目中有两个jsp页面,一个在WebRoot(WebContent)下,一个在/WebContent/WEN-INF下,我们尝试分别用重定向和转发分别访问以下这两个文件
转发和重定向的区别,web路径问题_第1张图片

package servlet;

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Servlet")
public class Servlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String i = request.getParameter("i");
        if(i!=null){    
            switch(i){
            case "1"://通过,Request URL:http://localhost:8080/hotel/login.jsp
                response.sendRedirect("login.jsp");
                break;
            case "2"://不通过,Request URL:http://localhost:8080/login.jsp
                response.sendRedirect("/login.jsp");
                break;
            case "3"://不通过,Request URL:http://localhost:8080/hotel/servlet?i=3
                    //通过,Request URL:http://localhost:8080/hotel/login.jsp
                response.sendRedirect("/hotel/login.jsp");
                break;
            case "4"://不通过,Request URL:http://localhost:8080/hotel/WebContent/login.jsp
                response.sendRedirect("/hotel/WebContent/login.jsp");
                break;
            case "5"://不通过,客户端级别是不能直接访问WEB-INF下面的文件的
                response.sendRedirect("/hotel/WebContent/WEB-INF/index.jsp");
                break;

            case "6"://通过
                request.getRequestDispatcher("login.jsp").forward(request, response);
                break;
            case "7"://通过
                request.getRequestDispatcher("/login.jsp").forward(request, response);
                break;
            case "8"://通过
                request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
                break;
            case "9"://通过
                request.getRequestDispatcher("WEB-INF/index.jsp").forward(request, response);
                break;
            case "10"://不通过,在服务端级别“/”,是代表是 /WebContent目录下
                request.getRequestDispatcher("/hotel/WebContent/login.jsp").forward(request, response);
                break;
            }
        }

    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

你可能感兴趣的:(转发和重定向的区别,web路径问题)