先给大家看了看apache的Common项目,其中包括许多有用的工具程序,例如,BASE64和url编码的,xml到javabean映射的,http客户端程序,rss框架,甚至有workflow。告诫大家:要相信,我们要做的事,别人早已做过,我们要写的程序,别人早已写过。最重要的就是,从哪里找到别人的源代码?工作中的一个重要能力就是要英语好,能够迅速找到资源。
著名的开源站点:jakarta.apache.org、sourceforge.net,open-open.com

接着介绍了如何利用HttpServletResponse产生响应状态和构建响应消息头,各种响应状态码定义成常量的好处。

字符串在java程序内部总是以unicode编码存在的,但字符串输出给浏览器时,它的编码可以是GBK,或者UTF-8。
printwriter.print总是将unicode码的字符串转换成某种字符编码的数组输出,牢牢记住print方法内有编码转换过程,那PrintWriter对象怎么知道该转换成何种编码呢?我想创建一个PrintWriter对象时,应该可以指定输出时的编码。JDK 1.4中的PrintWriter设计的缺陷,JDK 1.5中的PrintWriter还有要改进的地方。

response.setContentType()方法有几个作用:控制getWriter返回的PrintWriter,输出Content-Type头。
问题:先调用getWriter,再得到setContentType会有什么问题?

Locale里面有各种国家语言的常量定义。Locale.China与Locale.Chinese的应用区别?打印出它们的值,一个是zh,一个是zh_CN。
响应消息头的实用案例:
Servlet的中文输出问题
让浏览器定时刷新网页
禁止浏览器缓存当前文档内容
使用<meta>标签模拟响应消息头

Servlet的中文输出问题。讲浏览器显示字符乱码时,以it315/bss为例。中文乱码与Locale时的小例子代码:
  response.setContentType("text/html; charset=GB2312");
  PrintWriter out = response.getWriter();
  out.println("我是中国人");
  Date now = new Date();
  out.println(DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,Locale.CHINESE).format(now));
  System.out.println(Locale.CHINESE);
  System.out.println(Locale.CHINA);
  out.close();

创建响应正文:
getOutputStream与getWriter方法
与getWriter方法相关的一些小疑问
输出缓冲区
实现动态文件内容的下载
图像访问计数器


其实我们完全不必要getWriter,只要getOutputStream就可以了。故意引导大家犯错误:请求Servlet给我一个“文本”文件,用哪个呢?

讲动态下载时,才发现同学们对邮件原理非常陌生,必须演示一下sina的附件下载页面和一封邮件的原始结构。一封带附件的邮件就是一个整体文件,显示邮件的过程就象显示数据库中的信息一样,取附件实际上是从整个文件中抽取附件内容,附件文件并不真正事先存在。用outlook express演示创建一个附件邮件的过程时,用“另存为”方式将邮件存储为一个eml文件后再打开。

“Content-Disposition”头可以翻译为“内容处理”头

作业:把图像访问计数器改为javascript输出,李杰做这个实验时,发现受到浏览器的限制(都是各种插件惹的祸)。

如果没有Content-type头,原来的实验是:浏览器把内容当普通文本处理,而现在的实验是:浏览器把内容当html文本处理了,郁闷!

RequestDispatcher接口与用include方法实现资源包含。被include的资源不能修改状态码和响应头。

课后分组作业:写出Jakarta.apche.org的Validator框架的应用手册

随记:
晚上读了读struts的RequestProcessor的processPath方法的源码,了解将路径映射成*.do的访问形式,与映射为/action/*一样。