part1
getWriter() 和getOutputStream() 都可以回送字符数据
区别在于:
1. getWriter() 用于向客户机回送字符数据
2. getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)
/*getWriter()*/
PrintWriter out=response.getWriter();
out.println("abc");
/*getOutputStream()*/
OutputStream os=response.getOutputStream();
os.write("abc".getBytes());
但需要注意的是,同时使用printWriter和outputstream,则会发生错误:
OutputStream os=response.getOutputStream();
os.write("hello,world".getBytes());
PrintWriter out=response.getWriter();
out.println("abc");
报错内容:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
原因:当发现os.write()时,就会把回送的信息封装到response对象中,返回给web服务,web服务器将response拆解成http响应信息,之后web服务器会检测response相关的流是否关闭,如果没有关闭,则关闭。(这也是为什么我们没有主动关闭流,程序也没问题的原因)
part2
传递数据部分
方法:
1. 使用java基础 static
2. 使用sendRedirect()
3. 使用session 传递
(1)sendRedirect()
response.sendRedirect("/UsersManager/MainFrame?username="+username+"&pwd="+password);
基本格式:
response.sendRedirect("servlet的地址?参数名=参数值&参数名=参数值...");
在接受数据的Servlet中:
String 参数=request.getParameter("参数名");
(2)使用session()来传递字符参数和对象
A.传递字符串
放入session
request.getSession.setAttribute("loginUser",username);
取出session 在JSP中通过session取出
request.getSession.getAttribute("loginUser");
B.传递对象
User user= new User();
user.setName(“xiaoli”);
user.setPassWord(“123”);
放入session
request.getSession.setAttribute("userObj",user);
取出session
User user=(User)request.getSession.getAttribute(“userObj”);