Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
在这里首先介绍一下HttpServletResponse的常见应用。
=============================================================================================
有些应用之前已经见过。
关于使用HttpServletResponse设置HTTP响应头的应用例子,比如:
1.页面跳转
2.Refresh自动刷新
3.Content-Disposition文件下载
4.设置缓存页面
这些可以参考【Servlet——简单用户登录实例+http协议解析】文章的最后
下面进行一些简单的总结
=============================================================================================
向客户端传输内容
两种方法:
getWriter()
getOutputStream()
【区别】:
getWriter()用于向客户机回送字符数据
getOutputStream()返回的对象,可以回送字符数据,也可以回送字节数据。
【如何选择】:
如果我们是回送字符数据,则使用PrintWriter对象,效率高
如果我们是回送字节数据(binary data),则只能使用OutputStream对象。
【需要注意的是:这两个流不能同时使用!同时使用会报服务器500错误!】==============================================================================================
请求重定向以及实现向下个页面传输数据
这里先解释一个概念:
请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。
这个概念要和后面讲到的请求转发区别开来。
比如我们现在要实现这样一个需求:当用户登录成功后,把该用户名字显示在登录成功之后的主页面。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
【方法1】
通过java基础,使用static静态全局变量即可
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
【方法2】
sendRedirect()方法自带参数,可以将信息传递给下一个页面
比如:
sendRedirect(“welcome?uname=gavin”);
优点:传递信息的速度比较快
缺点:它只能传递字符串,而不能传递一个对象
注意点:
(1)welcome代表你要跳转的那个servlet的url
(2)servlet url名和变量名之间有问号?
(3)如要传递两个以上的值,它们间要用&号分开;比如:
sendRedirect(“welcome?uname=shunping&pass=ok”)
(4)如果传递的是中文,那你将得到乱码,需处理一下
即基本格式为:
response.sendRedirect(“servlet的地址?参数名=参数值&参数名=参数值…”)
参数值只能是字符串,参数名应当使用字母组合,不使用中文
接收页面获取这个参数的方法:
String参数 = request.getParameter(“参数名”);-------------------------------------------------------------------------------------------------------------------------------------------------------------------
使用session传递(后面会详讲)
这种方法的好处在于它不但可以传递字符串,也可以传递一个对象
在登录处理部分创建session对象,将User作为session的一个attribute:// session 可以传递对象
User user = new User();
user.setName(username);
user.setPwd(password);
// session很强大,可以传递多个对象,理论上没有限制
request.getSession().setAttribute("userobj", user);
在接收主页面,在session中取出这个User
User user = (User) request.getSession().getAttribute("userobj")
==============================================================================================
总结
1、通过HttpServletResponse回送的http头,可以控制浏览器的行为。
2、通过HttpServletResponse提供的函数,可以完成相应的功能(比如文件下载,生成随机验证码等)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
需要注意的
1.getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream、PrintWriter对象。
2.在同一个response对象中,getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
3.Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当做响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端
4.Servlet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。