多个servlet之间的跳转(转发、重定向、请求包含)的总结
2017-10-01 14:45
274 查看
知识点:
1、servlet中的两个输出流:字节流(response.getOutputStream()) 和字符流(response.getWriter())
1)用字节流输出时,中文要采用out.write("中文".getBytes()),不能用print("中文")。 对于字节流,用response.setCharacterEncoding("utf-8")设了也不行。
2)用字符流输出时,无论中英文都是:out2.print(); //用response.setCharacterEncoding("utf-8")只是设置传输编码,并没有告诉浏览器采用什么编码来解析,因此也可能乱码。应该用response.setContentType("text/html;charset=utf-8");//该句既可设传输又可告诉浏览器采用什么编码来解析。
3)※※※两种流不能共存(无论是GET或POST方式提交): 用了字节流就不能同时用字符,反之亦然!
2、转发时,两个servlet都输出信息的问题: 转发是通过request进行----助理解是呼叫转移, 转发时,路径不要带项目名
1)第一个servlet的输出信息只是保存到缓存中,会被第2个servlet清空。因此第1个servlet中的内容无法输出
2)如果在第1个servlet中调用“out.flush();或out.close();”,那么第1个servlet中的信息会输出,而第2个不会输出。不但如此,第1个servlet中的转发都会出异常,因为:
刷缓存就是要Tomcat帮我们输出信息。而同一个请求,Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发。
3)该方式下,地址栏中始终显示的是第1个的访问地址
3、转发时(共享同一个request和response),两个servlet的访问顺序,传参:
1)访问顺序: 第1个GET方式,第2个走的是doGet()。 第1个POST方式,第2个走的是doPost()。
2)在第1个servlet转发代码之后,不能再调用类似 转发或重定向的代码。否则会500异常,因为转发之后,不能再回到此处进行跳转到别的页面
3)读取页面参数: 由于是共享同一个request,请求页面的参数在两个servlet当中都可以读取出来。---请求页面中,GET方式的参数是在地址栏中通过"?name=Jack&age=22"上传,POST方式是通过<input>组件上传的。
4)两个servlet之间传参: 在第1个中request.setAttribute(),在第2个中request.getAttribute();
4、重定向(两个不同的request和response),两个servlet的访问顺序,传参:
1)重定向是通过response实现的: response.sendRedirect() //重定向时的路径一定要带项目名称
2)第1个servlet中的内容会输出,但瞬间就会被第2个覆盖。因为浏览器接收到第1个的响应时,立刻会自动发起第2次请求,进而接收并显示第2次请求的响应结果。
3)在第1个servlet重定向代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为跳转之后,不能再回到此处进行跳转到别的页面
4)访问顺序: 无论第1个是GET方式还是POST方式,第2个走的是doGet()。----该方式下,地址栏中最终会显示成第2个的访问地址
5)读取页面参数: 由于是不同的request,请求页面的参数在第1个servlet当中能够读取出来,而x第2个servlet中不能读取出来。
6)两个servlet之间传参: “无法”通过 在第1个中request.setAttribute(),在第2个中request.getAttribute(); ----通过attribute的路中走不通的
如果非要传参,可以通过:在第1个servlet当中给重定向地址添加“?name=Jack&age=25”实现---该方式下地址栏会显示参数信息,明文传输信息,因此敏感数据要加密
7)站外跳转 只能通过重定向来实现,而且地址必须以“http://”开头,否则会被识别成站内。
5、请求包含(共享同一个request和response ,类似函数调用中的传参)
1)通过request实现,与转发一样是通过RequestDispatcher,只是前者是rd.forward(req,resp),后者是rd.include(req,resp); 包含之后可以再包含其它servlet即1个servlet可同时包含多个servlet。
2)在第1个servlet中out.flush(),对两个servlet的输出都没有影响。但如果在第1个servlet中out.close(),则第1个之后的输出以及第2个servlet中的输出都无效(不会输出),注意,后面的rd.include()仍然有效即第2个servlet虽然不能输出但仍会执行,且没有异常报出!
3)页面内容输出顺序:
servlet1..包含之前的输出...
servlet2.....(被包含的servlet输出)
servlet1..包含之后的输出...
4)由于该方式和转发一样是共享同一个request和response,因此有关页面参数读取和两个servlet之间的传参特性,同转发!
5)访问顺序(同转发): 第1个GET方式,第2个走的是doGet()。 第1个POST方式,第2个走的是doPost()。
6)一个小细节:被包含servlet中的所有输出信息(包括<html><body>等标记内容)都会原样输出。因此要注意,两个servlet之间的输出内容不要出现标记嵌套冲突! ( 如:<html><body><html><body>...</body></html></body></html> )----如果被包含的Servlet中调用了out.close()则前一个servlet后续的内容如</body></html>不会输出!
---以后开发,如果要输出页面内容,通常是在第一个servlet中输出<html>框架标记,被包含的servlet中都不输出<html>框架也不调out.close(),即后者只负责实现业务功能,不负责页面框架标记输出和关流。
1、servlet中的两个输出流:字节流(response.getOutputStream()) 和字符流(response.getWriter())
1)用字节流输出时,中文要采用out.write("中文".getBytes()),不能用print("中文")。 对于字节流,用response.setCharacterEncoding("utf-8")设了也不行。
2)用字符流输出时,无论中英文都是:out2.print(); //用response.setCharacterEncoding("utf-8")只是设置传输编码,并没有告诉浏览器采用什么编码来解析,因此也可能乱码。应该用response.setContentType("text/html;charset=utf-8");//该句既可设传输又可告诉浏览器采用什么编码来解析。
3)※※※两种流不能共存(无论是GET或POST方式提交): 用了字节流就不能同时用字符,反之亦然!
2、转发时,两个servlet都输出信息的问题: 转发是通过request进行----助理解是呼叫转移, 转发时,路径不要带项目名
1)第一个servlet的输出信息只是保存到缓存中,会被第2个servlet清空。因此第1个servlet中的内容无法输出
2)如果在第1个servlet中调用“out.flush();或out.close();”,那么第1个servlet中的信息会输出,而第2个不会输出。不但如此,第1个servlet中的转发都会出异常,因为:
刷缓存就是要Tomcat帮我们输出信息。而同一个请求,Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发。
3)该方式下,地址栏中始终显示的是第1个的访问地址
3、转发时(共享同一个request和response),两个servlet的访问顺序,传参:
1)访问顺序: 第1个GET方式,第2个走的是doGet()。 第1个POST方式,第2个走的是doPost()。
2)在第1个servlet转发代码之后,不能再调用类似 转发或重定向的代码。否则会500异常,因为转发之后,不能再回到此处进行跳转到别的页面
3)读取页面参数: 由于是共享同一个request,请求页面的参数在两个servlet当中都可以读取出来。---请求页面中,GET方式的参数是在地址栏中通过"?name=Jack&age=22"上传,POST方式是通过<input>组件上传的。
4)两个servlet之间传参: 在第1个中request.setAttribute(),在第2个中request.getAttribute();
4、重定向(两个不同的request和response),两个servlet的访问顺序,传参:
1)重定向是通过response实现的: response.sendRedirect() //重定向时的路径一定要带项目名称
2)第1个servlet中的内容会输出,但瞬间就会被第2个覆盖。因为浏览器接收到第1个的响应时,立刻会自动发起第2次请求,进而接收并显示第2次请求的响应结果。
3)在第1个servlet重定向代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为跳转之后,不能再回到此处进行跳转到别的页面
4)访问顺序: 无论第1个是GET方式还是POST方式,第2个走的是doGet()。----该方式下,地址栏中最终会显示成第2个的访问地址
5)读取页面参数: 由于是不同的request,请求页面的参数在第1个servlet当中能够读取出来,而x第2个servlet中不能读取出来。
6)两个servlet之间传参: “无法”通过 在第1个中request.setAttribute(),在第2个中request.getAttribute(); ----通过attribute的路中走不通的
如果非要传参,可以通过:在第1个servlet当中给重定向地址添加“?name=Jack&age=25”实现---该方式下地址栏会显示参数信息,明文传输信息,因此敏感数据要加密
7)站外跳转 只能通过重定向来实现,而且地址必须以“http://”开头,否则会被识别成站内。
5、请求包含(共享同一个request和response ,类似函数调用中的传参)
1)通过request实现,与转发一样是通过RequestDispatcher,只是前者是rd.forward(req,resp),后者是rd.include(req,resp); 包含之后可以再包含其它servlet即1个servlet可同时包含多个servlet。
2)在第1个servlet中out.flush(),对两个servlet的输出都没有影响。但如果在第1个servlet中out.close(),则第1个之后的输出以及第2个servlet中的输出都无效(不会输出),注意,后面的rd.include()仍然有效即第2个servlet虽然不能输出但仍会执行,且没有异常报出!
3)页面内容输出顺序:
servlet1..包含之前的输出...
servlet2.....(被包含的servlet输出)
servlet1..包含之后的输出...
4)由于该方式和转发一样是共享同一个request和response,因此有关页面参数读取和两个servlet之间的传参特性,同转发!
5)访问顺序(同转发): 第1个GET方式,第2个走的是doGet()。 第1个POST方式,第2个走的是doPost()。
6)一个小细节:被包含servlet中的所有输出信息(包括<html><body>等标记内容)都会原样输出。因此要注意,两个servlet之间的输出内容不要出现标记嵌套冲突! ( 如:<html><body><html><body>...</body></html></body></html> )----如果被包含的Servlet中调用了out.close()则前一个servlet后续的内容如</body></html>不会输出!
---以后开发,如果要输出页面内容,通常是在第一个servlet中输出<html>框架标记,被包含的servlet中都不输出<html>框架也不调out.close(),即后者只负责实现业务功能,不负责页面框架标记输出和关流。
相关文章推荐
- servlet---知识点深化---重定向/转发/字节流字符流共存问题/多个servlet输出问题/请求包含
- Servlet中的站内转发、重定向以及请求包含
- 【转】struts2中的跳转详解 ----“请求转发”和“重定向”之间的区别
- javaEE------------------有关servlet的一些细节(输出流以及转发、重定向和请求包含)
- HttpServletRequest对象请求转发和HttpServletResponse对象请求重定向之间的区别
- Servlet请求转发和请求重定向之间的区别
- servlet请求转发、包含以及重定向
- struts2中的跳转详解 ----“请求转发”和“重定向”之间的区别
- servlet请求转发、包含以及重定向
- Servlet技术-请求转发,重定向和包含的关系
- struts2中的跳转详解 ----“请求转发”和“重定向”之间的区别
- servlet请求转发的三种方式,请求转发与重定向以及包含
- 重定向、转发、请求包含、同一个servlet中字符字节流共存问题相关的一些知识点
- Servlet请求转发与重定向的区别 Session&Application 总结笔记
- HttpServletResponse.sendRedirect方法实现的请求重定向与RequestDispatcher.forward方法实现的请求转发的总结比较
- 请求包含、重定向、转发总结
- Servlet入门介绍第四章——Servlet中的请求转发、包含、重定向
- servlet请求重定向、请求转发、请求包含 及cookie的应用
- Servlet第三方jar包使用3(Servlet获取form表单中的多有元素以及,请求转发,请求重定向,请求包含)
- servlet获取表单提交的数据、请求转发、请求包含、请求重定向