javaEE------------------有关servlet的一些细节(输出流以及转发、重定向和请求包含)

1.servlet中的两个输出流:字节流(response.getOutputStream()) 和字符流(response.getWriter())

1)用字节流输出时,英文可以out.print("Hello1");中文要采用out.write("中文".getBytes())。 对于字节流,用response.setCharacterEncoding("utf-8")设了也不行。
      2)用字符流输出时,无论中英文都是:out2.print(); //编码用 response.setContentType("text/html;charset=utf-8");

3)※※※两种流不能共存(无论是GET或POST方式提交): 用了字节流就不能同时用字符,反之亦然!

2.转发丶重定向以及请求包含时两个servlet的访问顺序, 读取页面数据, 传参

1)访问顺序:

转发——第1个POST方式,第2个走的是doPost()。-----该方式下,地址栏中最终会显示成第1个的访问地址

重定向——无论第1个是GET方式还是POST方式,第2个走的是doGet()。----该方式下,地址栏中最终会显示成第2个的访问地址

请求包含——第1个GET方式,第2个走的是doGet()。 第1个POST方式,第2个走的是doPost() 页面内容输出顺序:servlet1..包含之前的输出...servlet2.....(被包含的servlet输出)servlet1..包含之后的输出...

2)读取页面参数:

转发——由于是共享同一个request,请求页面的参数在两个servlet当中都可以读取出来。---请求页面中,GET方式的参数是在地址栏中通过"?name=Jack&age=22"上传,POST方式是通过<input>组件上传的。

重定向——由于是不同的request,请求页面的参数在第1个servlet当中能够读取出来,而第2个servlet中不能读取出来。

请求包含——由于该方式和转发一样是共享同一个request和response,因此有关页面参数读取和两个servlet之间的传参特性,同转发!

3)两个servlet之间传参:

转发——共享的req和resp,所以可以通过在第一个servlet的service里给req设置属性request.setAttribute(),在第二个servle中获取就好request.getAttribute()。

重定向——“无法”通过  在第1个中request.setAttribute(),在第2个中request.getAttribute();  ----通过attribute的路中走不通的,如果非要传参,可以通过:在第1个servlet当中给重定向地址添加“?name=Jack&age=25”实现---该方式下地址栏会显示参数信息,明文传输信息,因此敏感数据要加密。

请求包含——由于该方式和转发一样是共享同一个request和response,因此有关页面参数读取和两个servlet之间的传参特性,同转发!

4)两个servlet都输出信息的问题:

转发时:1)第一个servlet的输出信息只是保存到缓存中,会被第2个servlet清空。因此第1个servlet中的内容无法输出2)如果在第1个servlet中调用“out.flush();”,那么第1个servlet中的信息会输出,而第2个不会输出。不但如此,第1个servlet中的转发都会出异常,因为:刷缓存就是要Tomcat帮我们输出信息。而同一个请求,Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发。 3)该方式下,地址栏中始终显

示的是第1个的访问地址

是通过response实现的: response.sendRedirect()  第1个servlet中的内容会输出,但瞬间就会被第2个覆盖。因为浏览器接收到第1个的响应时,立刻会自

动发起第2次请求,进而接收并显示第2次请求的响应结果。

//重定向时的路径一定要带项目名称 ,站外跳转 只能通过重定向来实现,而且地址必须以“http://”开头,否则会被识别成站内。

通过request实现,与转发一样是通过RequestDispatcher,只是前者是rd.forward(req,resp),后者是rd.include(req,resp);在

第1个servlet中out.flush(),对两个servlet的输出都没有影响。但如果在第1个servlet中out.close(),则第1个之后的输出以及第2个servlet中的输

出都无效(不会输出),注意,后面的rd.include()仍然有效即第2个servlet虽然不能输出但仍会执行,且没有异常报出!一个小细节:被包含servlet中的所

有输出信息(包括&lt;html&gt;&lt;body&gt;等标记内容)都会原样输出,//因此要注意,两个servlet之间的输出内容不要出现标记嵌套冲突!

 ( 如:<html><body><html><body>...</body></html></body></html>  )

注意:在第1个servlet转发、重定向或者请求包含代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为转发之后,不

能再回到此处进行跳转到别的页面






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值