当servlet处理完请求之后,为浏览器做出响应
以前只能使用响应流来完成,使用响应流拼接html非常麻烦
我们可以准备好一张html页面,在servlet处理完请求后,直接跳转到这个html页面就可以了.
使用转发和重定向技术来实现.
转发
/*
*
* 转发:
* 语法:
* 1.取得转发对象 rd
* RequestDispatcher rd = request.getRequestDispatcher("");
* 方法中的参数,就是我们要转发到的资源的路径
* 访问的路径的写法:http://localhost:8080/1_servlet4/index.html
* 我们在应用路径的时候,习惯于使用 /项目名开头的绝对路径
* 标准绝对路径的写法为:/1_servlet4/index.html
* 在转发操作中,使用的虽然是绝对路径,但是是一种特殊的绝对路径,前面不加/项目名 这种绝对路径也叫做内部路径
* 转发:/index.html
*
* 2.通过转发对象,实现转发操作
* rd.forward(request, response);
*
*
* 总结:
* 转发后,路径为当前servlet的路径 (转发后维持路径不变)
*/
//1.转发到一个普通的html页面 比如转发到根路径下的html
//创建转发对象
/*RequestDispatcher rd = request.getRequestDispatcher("/index.html");
//实现转发操作
rd.forward(request, response);*/
//在实际项目开发中,以上两部可以合并为一步
//request.getRequestDispatcher("/index.html").forward(request, response);
//2.转发到WEB-INF下的资源
/*
* 以转发的形式,能够访问到WEB-INF下的资源
* 在解析原理之前,可以这样来记
* 以前之所以访问不到,是因为我们是以浏览器地址栏敲路径的形式来访问,地址栏上会出现WEB-INF这几个字符
* 我们通过转发的形式,地址栏仍然为当前servlet,没有出现WEB-INF这几个字符,所以能够访问到
*
*/
//request.getRequestDispatcher("/WEB-INF/html/index.html").forward(request, response);
//3.转发到另一个servlet
/*
* /myServlet2.do
* 转发到另一个servlet的路径就是url-pattern
*/
request.getRequestDispatcher("/myServlet2.do").forward(request, response);
重定向
/*
* 重定向:
* 语法:
* response.sendRedirect("");
* 参数:跳转的路径
* 重定向的路径的写法,为传统的绝对路径的使用方式 前面必须加 /项目名
*
* 总结:
* 重定向后,浏览器地址栏的路径为新路径,为重定向后资源的路径
* 与转发最大的不同就在跳转后 地址栏路径上
*
*/
//1.重定向到一个普通的html页面
//response.sendRedirect("/1_servlet4/index.html");
//2.重定向到WEB-INF下的资源
/*
* 使用重定向访问不到WEB-INF下的资源
* 因为路径为新 路径,地址栏上会出现WEB-INF这几个字符,所以访问不到
* 转发是唯一能够访问到WEB-INF下的资源的方式
*/
//response.sendRedirect("/1_servlet4/WEB-INF/html/index.html");
//3.重定向到另一个servlet
response.sendRedirect("/1_servlet4/myServlet4.do");
转发原理
全程是一次请求和一次响应,地址栏显示的路径是最后一次请求的路径,为什么WEB-INF下的资源通过转发可以访问到,因为是由服务器内部资源访问的,也就是说WEB-INF只接受由服务器内部资源的跳转,如果通过浏览器,WEB-INF下的资源是受保护的
重定向原理
全程是两次请求和两次响应,地址栏显示的路径是最后一次请求的路径,所以地址栏的路径会发生变化。
转发凸显出,访问一个servlet,servlet处理完请求之后,由servlet帮你找到指定资源
重定向凸显出,访问一个servlet,servlet处理完请求之后,会将资源的访问路径给你返回,你拿着这个路径,再发一次请求,再找到指定的资源