JavaWeb复习巩固
第四天:请求转发 重定向 response对象
1.请求转发:资源进行跳转的一种方式
当客户端发送请求请求服务端某个资源的时候,这个资源处理不了请求,会把这个请求交给其他服务器内部的其他资源处理这个请求。
请求转发的特点:
1.浏览器只会发送一次请求
2.浏览器地址栏不会发生变化
3.请求转发的时候只能跳转到服务器内部的资源(不能跳转到服务以外的资源)
例子代码如下:
package com.swlz.response; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/response1") public class Response1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("客户端接收到用户请求借1100元"); //但是response1处理不了这个请求,就转发给/response2处理这个请求 //设置数据信息(保存数据 ),可以用getAttribute("money");获取到这个数据 request.setAttribute("money",1000); //response1和response2的request对象是同一个 request.getRequestDispatcher("/response2").forward(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
package com.swlz.response; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/response2") public class Response2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response1和response2的request对象是同一个 int money = (int)request.getAttribute("money"); System.out.println("reponse1传过来了"+money+"元"); System.out.println("接收到/response1请求响应1100元给客户端"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
2.重定向
重定向:也是资源跳转的一种方式
特点:
1.地址路径会发生变化
2.重定向可以跳转到其他外部资源
3.重定向会向服务器发送两次请求
例子代码如下:
package com.swlz.response; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/servletResponseDemo2") public class ServletResponseDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("从客户端接收到了请求,但是处理不了"); System.out.println("告诉客户端ServletResponseDemo3这个可以帮你处理,提供ServletResponseDemo3的信息给客户端"); // 重定向 // response.setStatus(302); // response.setHeader("location","/servletResponseDemo3"); response.sendRedirect("/tomcat/servletResponseDemo3");//重定向到ServletResponseDemo3这个资源下帮客户端处理请求 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
package com.swlz.response; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/servletResponseDemo3") public class ServletResponseDemo3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("----帮助客户端处理好请求!"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
2.重定向和请求转发的区别
- 转发客户端只会发送一次请求,重定向会发送两次
- 转发浏览器地址栏不会发送变化,重定向的时候浏览器地址栏会发送变化
- 转发只能跳转到服务器内部资源,重定向可以跳转到其他服务器资源
3.什么时候使用重定向 什么时候使用转发
如果跳转的两个资源直接要通过request对象去共享数据,那就只能使用转发
如果地址栏要发送变化或者要跳转到其他服务器的资源的时候,必须使用重定向
代码细节
重定向的路径前面一定要加虚拟路径 转发不需要加虚拟路径
4.Response
http协议响应消息数据
使用response设置响应(响应行,响应头和响应体)数据的方法
HTTP常用状态码:
200 请求处理成功
302 重定向
304 找缓存
404 请求的资源找不到
405 请求方式有问题(get请求post请求)
500 服务器内部异常
例子代码如下
package com.swlz.response; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/servletResponseDemo4") public class ServletResponseDemo4 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // response.setCharacterEncoding("utf-8");//设置缓冲区编码格式 // response.setHeader("Content-Type","text/html;charset=utf-8");//然后把utf-8的数据响应到浏览器之后, // 浏览器在接收你传过来的数据的时候用什么编码格式打开?它不知道就会自动用操作系统的编码格式GB2312,所以也会乱码, // 所以要设置response.setHeader("Content-Type","text/html;charset=utf-8"); response.setContentType("text/html;charset=utf-8");//这个是对前面两行的封装,只需要设置这一行(相当于上面两行)就可以解决乱码问题 response.getWriter().println("aaaaa"); response.getWriter().println("恭喜发财");//没有设置缓冲区的编码格式会有乱码存在,因为缓冲区的编码格式GBK,服务器的编码格式是UTF-8,编码变不不一样,所有乱码 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
今日学习总结:日子一天一天的过,事情一件一件的做,路要一步一步走争取不能错,错了也没关系,人生总会走弯路的,学习中也会有不少弯路,闯过去了,就是成功的。最后一句话:自己打败自己是最可悲的失败,自己战胜自己是最可贵的胜利。
浙公网安备 33010602011771号