当前位置:首页 > (完整版)韩顺平 2011细说Servlet笔记
300-399 400-499 500-599 为完成请求,客户需要进行一步细化请求。例如:请求的资源已经移动一个新的地址,常用302,307 客户端的请求有错误404 服务器端出现错误,常用500
4.2.1http响应的状态行举例说明
200 就是整个请求和响应过程没有发生错误,这个最常见. 302: 表示当你请求一个资源的时候,服务器返回302 表示,让浏览器转向到另外一个资源,比如: response.sendRedirect(“/web应用/资源名”) 案例:
response.setStatus(302);
response.setHeader(\, \); //上面两句话等价
response.sendRedirect(\404:找不到资源 500: 服务器端错误
4.2.2 http响应消息头详解
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Location: http://www.baidu.org/index.jsp【让浏览器重新定位到url】 Server:apache tomcat【告诉浏览器我是tomcat】 Content-Encoding: gzip 【告诉浏览器我使用 gzip】 Content-Length: 80 【告诉浏览器会送的数据大小80节】 Content-Language: zh-cn 【支持中文】
Content-Type: text/html; charset=GB2312 [内容格式text/html; 编码gab2312]
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【告诉浏览器,该资源上次更新时间】
Refresh: 1;url=http://www.http://www.china-audit.com/【过多久去,刷新到 http://www.http://www.china-audit.com/】 Content-Disposition: attachment; filename=aaa.zip【告诉浏览器,有文件下载】
Transfer-Encoding: chunked [传输的编码]
Set-Cookie:SS=Q0=5Lb_nQ; path=/search[后面详讲] Expires: -1[告诉浏览器如何缓存页面IE]
Cache-Control: no-cache [告诉浏览器如何缓存页面火狐] Pragma: no-cache [告诉浏览器如何缓存页面]
Connection: close/Keep-Alive[保持连接 1.1是Keep-Alive] Date: Tue, 11 Jul 2000 18:23:51 GMT
4.2.3 定时刷新Refresh使用
response.setHeader(\
25
4.2.4文件下载 Content-Disposition
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType(\);
//PrintWriter out = response.getWriter(); //演示下载文件
response.setHeader(\, \attachment; filename=winter.jpg\);
//打开文件.说明一下web 站点下载文件的原理 //1.获取到要下载文件的全路径 String
path=this.getServletContext().getRealPath(\); //System.out.println(\ //2创建文件输入流
FileInputStream fis=new FileInputStream(path); //做一个缓冲字节数组
byte buff[]=newbyte[1024];
int len=0;//表示实际每次读取了多个个字节
OutputStream os=response.getOutputStream(); while((len=fis.read(buff))>0){ os.write(buff, 0, len); }
//缺点: 没有进度条./图标/ //关闭
os.close(); fis.close(); }
4.2.5 缓存讲解
提出问题:浏览器默认情况下,会缓存我们的页面,这样出现一个问题:如果我们的用户习惯把光标停留在地址栏,然后回车来取页面,就会默认调用cache中取数据。 i.有些网站要求及时性很高,因此要求我们不缓存页面 代码:
//指定该页面不缓存 Ie
response.setDateHeader(\, -1);【针对IE浏览器设置不缓存】 //为了保证兼容性.
response.setHeader(\, \);【针对火狐浏览器等】 response.setHeader(\, \);【其他浏览器】
ii.有些网站要求网页缓存一定时间,比如缓存一个小时 response.setDateHeader(\System.currentTimeMillis()+3600*1000*24);后面一个参数表示设置的缓存保持时间,-1表示永远缓存 练习:
26
加入防止盗链下载.
4. 3 HttpServletResponse的再说明
4.3.1getWriter()和getOutputStream()的区别
3 getWriter() 用于向客户机回送字符数据
2.getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据) OutputStream os=response.getOutputStream(); os.write(\
如何选择:
如果我们是回送字符数据,则使用 PrintWriter对象 ,效率高 如果我们是回送字节数据(binary date) ,则只能使用OutputStream ?这两个流不能同时使用. 比如:
OutputStream os=response.getOutputStream(); os.write(\.getBytes()); PrintWriter out=response.getWriter(); out.println(\); 就会报错:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
27
4.3.2不能同时使用printWriter和outputstream的原因
Web服务器会自动检查并关闭流
从该图,我们也可以看出. 为什么我们没有主动关闭流,程序也没有问题的原因. 当然:你主动关闭流,更好.
4.3.3参数的传递方式sendRedirect()和session()
需求: 当用户登录成功后,把该用户名字显示在登录成功页面; ①使用sendRedirect()来传递字符参数 解决思路:
1. 使用java基础 static 2. 使用sendRedirect() 代码:
response.sendRedirect(\ord);
3. 使用session 传递[后面讲] 这里,我们先预热. 说明: 基本格式:
response.sendRedirect(“servlet的地址?参数名=参数值&参数名=参数值...”); ?参照值是String , 参数名应当使用字母组合 在接受数据的Servlet中:
String 参数=request.getParameter(“参数名”); ②使用session()来传递字符参数和对象 A.传递字符串
放入session request.getSession.setAttribute(\
取出session 在JSP中通过session取出 request.getSession.getAttribute(\B.传递对象
User user= new User(); user.setName(“xiaoli”); user.setPassWord(“123”);
28
共分享92篇相关文档