服务器端以/开始就代表当前项目名
客户端必须以 /项目名/资源	才能定位到资源
软件与软件之间,以字符为标准传递,传递字节,接收端自己按原来的编码集编码之后再按照自己的编码集解码编码(如果没有对应字符,将会丢失数据)
软件与文件或者浏览器之间,以字节为标准传递,传递字节,接收端直接将字节按照自己的编码集进行编码(不会丢失数据)
数据丢失发生在解码的时候
servlet一定要初始化之后才能对里面的对象赋值,否则对象为null
	  加载----初始化----执行----消亡
如何实现数据共享
	  方案1(了解):静态变量(耗费内存,特别是服务器端)
	  方案2(ServletContext):
    A、服务器为我们提供了一个内置的 ServletContext 对象
			      this.getServletContext();
		    B、这个对象可以实现不同Servlet 之间的数据共享
		    C、设置数据的API: setAttribute("键","值");
		         获取数据的API: getAttribute("键");
		         删除数据的API:removeAttribute("键"); 
		         such as:浏览量统计(每一个客服端请求时的servlet得到的都是用的同一个ServletContext)
response
	  作用:服务器通过这个对象向浏览器发送数据
	  servlet向tomcat传递消息:
		    response.setCharacterEncoding("UTF-8");	//告诉Tomcat用UTF-8进行编码
	
	  response设置响应行:
		    A:设置状态码:(默认是又tomcat管理)
			      setStatus(int i);	//响应行出现的状态码
			      setError(int i,String s);	//响应行出现的错误提示的状态码,后面是错误提示的信息
	
	    response设置响应头:
		      A:设置的响应头最好是HTTP协议规定的,不然没有具体用处
		      B:setHeader("键","值")
			        多次设置,键重复时,会覆盖
		      C:addHeader("键","值")
			        多次设置,追加
			        such as:	键:refresh 
						              值:秒数;url=路径 ---- 以项目名开始(值中出现多个属性时用分号)
						              键:content-type		//简化版:response.setContentType("text/html;charset=utf-8");
						              值:text/html;charset=utf-8
	
	    response 设置响应体
		      getWriter() ---- 获取字符流
		      getOutputStream() ---- 获取字节流
			        注意:
				          1、二者不能同时开启
				          2、流可以不关,因为是 Tomcat 管理的(自己创建的流需要关闭)
文件的下载操作:
	  提交到服务器的时候:在url后面直接用get方式的形式跟上要下载的文件名
		  <a href="/day3504/DownLoad?name=hello.txt">hello.txt</a>
	  在Servlet中解析请求行:
		    String fileName = request.getParameter("name");
		    byte[] buffer = fileName.getBytes("ISO-8859-1");
		    fileName = new String(buffer,"UTF-8");
		    System.out.println(fileName);
	  设置响应头,文件的类型
		    response.setHeader("Content-Type", this.getServletContext().getMimeType("/" + fileName));
	  设置响应头,告诉浏览器使用正确的打开方式,不要直接显示,而是执行下载操作
		    response.setHeader("Content-Disposition", "attachment; filename =" + fileName);
		向浏览器传送文件名时的编码乱码问题:(文件名需要单独编码解码)
			  eclipse:GBK
			  Tomcat:unicode
			  浏览器:GBK
				    eclipse和tomcat之间,以字符为标准
				    Tomcat与浏览器之间,以字节为标准
			      1:byte[] buffer = fileName.getBytes("GBK");
			           String newName = new String(buffer,"ISO-8859-1");
			           response.setHeader("Content-Disposition", "attachment; filename =" + newName);
			      2:调用DownLoadUtils
				        String agent = request.getHeader("user-agent");
				        String downName = DownLoadUtils.getName(agent, fileName);
				        response.setHeader("Content-Disposition", "attachment; filename =" + downName);
				
	项目中的文件读写操作:
		  获取读取当前文件的流:(获取到相对路径中文件的读取流)
			    InputStream in = this.getServletContext().getResourceAsStream("/" + fileName);("/"定位到当前webapps目录)
			  获取字节输出流
			    ServletOutputStream out = response.getOutputStream();
  读的同时写
			    byte[] buffer2 = new byte[1024];
			    int length;
			    while((length = in.read(buffer2)) != -1){
				      out.write(buffer2, 0, length);
			    }
			    in.close();
		  读取绝对路径中的文件
			    String s = this.getServletContext().getRealPath("文件");	//得到的是Tomcat服务器下的文件路径,而不是eclipse下的文件路径
			    FileInputStream in = new FileInputStream("s");
			
获取文件读取流时的三种方法:
	  1:获取绝对路径的文件读取流
		    FileInputStream in = new FileInputStream("绝对路径");
	  2:获取WebContent中文件的读取流
		    InputStream in = this.getServletContext().getResourceAsStream("webContent下的绝对路径")
	  3:获取src目录下的文件读取流(常用于读取配置文件)
		    类名.class.getClassLoader().getResourceAsStream("src目录下的文件名");
		
验证码中点击一次验证码更换一次图片:(原理,点击一次图片由servlet重新动态发送一次图片)
图片是通过服务器穿过来的
	  <script type="text/javascript">
		    $(function(){
			      $("#show").click(function(){
				        $(this).prop("src","/day3505/Code?test=" + new Date());		//new Date():让每一次访问时提交的数据变化,不读取本地缓存
			      });
		    });
	  </script>
原文:http://www.cnblogs.com/chonglchong/p/6847643.html