request:
有关于客户端请求的信息,都可以由它来取得,例如请求标头、请求方法、请求参数、使用者IP等等信息。
response:
有关于对客户端请求之响应,可以利用它来设定一些要响应的讯息,例如标题信息、响应状态码等.
 
response:
           属于重定向请求;
           其地址栏的URL会改变;
           会向服务器发送两次请求;
 sendRedirect用法:
       response.sendRedirect("跳转页面路径或需要执行的操作路径");
       不保持request中设置属性,也就是说会产生一个新的request。跳转到得页面刷新仍然是当前页面。
sendRedirect用法:
    response.sendRedirect("hello.jsp")    是在响应后转向 
 
 request:
            属于请求转发;
           其地址栏的URL不会改变;
           向服务器发送一次请求;
 forward用法:
       RequestDispatcher view = request.getRequestDispatcher("跳转页面路径或需要执行的操作路径");
       view.forward(request, response);
      也可以写成:
      request.getRequestDispatcher("跳转页面路径或需要执行的操作路径").forward(request, response);
      保持request中设置的属性,跳转页面后刷新会重新执行操作。
      例如:
      index.html  ->(submit 数据) -> http://......../submit.do
      submit.do  对应的 Servlet 为 submit.java.  其中包含下列片段的两种情况:
     1.     response.sendRedirect("hello.html") .           浏览器会指向hello.html,并且地址栏是http://...../hello.html
     2.      RequestDispatcher view = request.getRequestDispatcher("hello.html");
             view.forward(request, response);
             浏览器会指向hello.html, 但是地址栏仍然是http://...../submit.do
  forward用法:
        RequestDispatcher     rd     =     request.getRequestDispatcher(URL);   
        request.setAttribute("str",str);   
        rd.forward(request,response);   
        是响应前转向,可以把参数带过去,你也可以在这里设置request.setAttribute("str",str);
笔记:
回顾:
http::
	超文本传输协议
	请求和响应
servlet:
	运行在服务器端的一个java小程序,本质就是一个类
	接受请求,处理逻辑,生成动态内容
	编写步骤:
		1.编写一个类
			继承HttpServlet
			重写doGet或者doPost方法
		2.编写路径
			<servlet>
				<serlvet-name>
				<serlvet-class>
				
			<servlet-mapping>
				<serlvet-name>
				<url-pattern>
		3.测试
			http://主机:端口号/项目名/路径
	servlet的体系结构:
		Servlet--->GenericServlet-->HttpServlet
	HttpServlet:
		实现了service方法,强转了两个参数,调用了重载的service方法
		 重载的service方法中,获取请求的方式,根据请求方式的不同调用相应的doXxx方法
		doGet():处理get请求的逻辑
		doPostt():处理post请求的逻辑 (只有表单提交的时候把method设置成post的时候)
	servlet的生命周期:
		init(ServletConfig config):
		service(ServletRequest request,ServletResponse response):
		destroy():
/////////////////////
	url-pattern的配置:
		完全匹配  /a/b
		目录匹配  /a/b/*
		后缀名匹配 *.jsp
		优先级:完全匹配 >目录匹配 >后缀名匹配
	  一个路径对应一个servlet
	  一个servlet可以对应多个路径
//////////////////////
	load-on-startup:修改servlet的初始化时机
////////////////////////
	当我们的项目处理不了请求的时候,服务器里面defaultservlet来处理.
//////////////////////////
	路径的写法:
		相对路径
		绝对路径:(常用)
			带主机和协议的路径(访问站外资源)
			不带主机和协议的路径(最常用的)
				/项目名/资源路径
////////////////////////////
servletConfig:(了解)
	servlet的配置对象
	作用:
		获取servlet的名称
		获取servlet初始化参数
		★获取全局管理者
servletContext:
	上下文(全局管理者)
	作用:
		1.获取全局的初始化参数
		2.共享资源
		3.获取资源
		4.获取文件的mime类型
	获取:
		在servlet中直接调用 getServletContext()
	常用方法:
		String getInitParameter(String key):根据key获取指定的初始化参数
			<context-param>
				<param-name>
				<param-value>
			
		String getRealPath(String 文件路径):获取的指定文在在tomcat上的绝对路径
			文件路径从项目的根目录往后写
		InputStream getREsourceAsStream(String 文件路径):以流的形式返回一个文件
		
		String getMimeType(文件名):格式 大类型/小类型
		
/////////////////////////////////////
域对象:
	创建:在服务器启动的时候,服务器会为每一个项目创建一个全局管理者,servletcontext就是当前项目的引用
	销毁:在项目被移除或者服务器关闭的时候销毁
	常用的方法:
		xxxAttribute()
			setAttribute(String key,Object value)
			Object getAttribute(String key)
			removeAttribute(String key)
//////////////////////////////////////////
通过类加载器获取文件的路径(处于classes目录下的文件)
	类.class.getClassLoader().getReource("文件路径").getPath()
	类.class.getClassLoader().getReourceAsStream("文件路径")
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
要求:会使用request和response
案例1-文件下载案例
技术分析:
	response
	文件下载
//////////////////////
response:响应
	作用:
		往浏览器写东西
	组成部分:
		响应行 响应头 响应体
	操作响应行 
		格式:
			协议/版本 状态码 状态码说明
		状态码:
			1xx:已发送请求
			2xx:已完成响应
				200:正常响应
			3xx:还需浏览器进一步操作
				302:重定向 配合响应头:location
				304:读缓存
			4xx:用户操作错误
				404:用户操作错误.
				405:访问的方法不存在
			5xx:服务器错误
				500:内部异常
		常用方法:
			setStatus(int 状态码):针对于 1 2 3 
			了解 :
				sendError(int 状态码):针对于 4xx和5xx
	操作响应头 
		格式:key/value(value可以是多个值)
		常用的方法:
			setHeader(String key,String value):设置字符串形式的响应头
			了解:setIntHeader(String key,int value):设值整形的响应头
			了解:setDateHeader(String key,long value):设值时间的响应头
			
			addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
			了解:addIntHeader(String key,int value):添加整形的响应头
			了解:addDateHeader(String key,long value):添加时间的响应头
		常用的响应头:
			location:重定向
			refresh:定时刷新
			content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
			content-disposition:文件下载
			
			重定向:	
				方式1:
					★response.sendRedirect("/day10/loc2");
				方式2:
					response.setStatus(302);
					respooen.setHeader("location","/day10/loc2");
					
			定时刷新:
				方案1:设置头 refresh 昨天做过
					respooen.setHeader("refresh","秒数;url=跳转的路径");
				方案2:http的meta标签
					<meta http-equiv="refresh" content="3;url=/day10/refresh2.html">
					
		/////////////////////	
	操作响应体:
		页面上要展示的内容
		常用方法:
			Writer getWriter():字符流
			ServletOutputStream getOutputStream() :字节流
			
			自己写的东西用字符流,其他一概用字节流.
			
		处理响应中文乱码:
			方式1:★
				response.setContentType("text/html;charset=utf-8");
			方式2:理解
				response.setHeader("content-type", "text/html;charset=utf-8");
	
		注意:
			两个流互斥
			当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)
//////////////////////////////	
文件下载:
	下载方式:
		1.超链接下载
			<a href="/day10/download/day10.txt">下载 day10.txt</a>
			若浏览器能解析该资源的mime类型,则打开;若不能接下则下载;
		2.编码下载 通过servlet完成
			<a href="/day10/download?name=day10.txt">下载 day10.txt</a>
			a.设置文件的mime类型
				String mimeType=context.getMimeType(文件名)
				response.setContentType(mimeType);
				
			b.设置下载头信息 content-disposition
				response.setHeader("content-disposition", "attachment;filename="+文件名称);
				
			c.提供流
				response.getOutputStream();
				
		扩展:使用commons-io工具类
			对拷流:
				IOUtils.copy(is,os);
/////////////////////////////
扩展:
	通过response生成验证码
	验证码:
		作用:防止暴力攻击
	点击换一张的js代码:
		function changeImg(obj){
			//操作src属性
			obj.src="/day10/code?i="+Math.random();
			//alert(1)
		}
//////////////////////////////////////////////	
案例2-完成用户注册操作
需求:
	在一个表单页面上填写用户数据,点击提交,将所有的数据提交的服务器上,通过java代码最终保存到数据库中.
技术分析:
	表单
	request
////////////////////////////////
request:请求
	作用:获取浏览器发送过来的数据
	组成部分:
		请求行 请求头 请求体
	操作请求行 
		格式:
			请求方式 请求资源 协议/版本
		常用方法:HttpServletRequest
			掌握
				String getMethod():获取请求方式
				String getRemoteAddr():获取ip地址
				String getContextPath() :在java中获取项目名称  (/day10)
 
			
			了解:
				getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist
				getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist
				String getQueryString():get请求的所有参数   username=tom&password=123
				String getProtocol():获取协议和版本
				
		例如:请求行
			GET /day10/row?username=tom&password=123 HTTP/1.1
		//////////////////		
	操作请求头 
		格式:key/value(value可以是多个值)
		常用方法:
			★String getHeader(String key):通过key获取指定的value (一个)
			
			了解:
				Enumeration getHeaders(String name) :通过key获取指定的value(多个)
				Enumeration getHeaderNames() :获取所有的请求头的名称
				int getIntHeader(String key):获取整型的请求头
				long getDateHeader(String key):获取时间的请求头
		重要的请求头:
			user-agent:浏览器内核 msie firefox chrome
			referer:页面从那里来 防盗链
 
		///////////////////
	操作请求参数 ★
		username=tom&password=123&hobby=drink&hobby=sleep
		常用方法:
			String getParameter(String key):获取一个值
			String[] getParameterValues(String key):通过一个key获取多个值
			Map<String,String[]> getParameterMap():获取所有的参数名称和值
			
			
		username:tom
		---------values---------
		hobby:[drink, sleep]
		=====map=======
		username::[tom]
		password::[123]
		hobby::[drink, sleep]
	//////////////////////
	请求的中文乱码:
		对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
		对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
		
		通用的方法:
			new String(参数.getBytes("iso-8859-1"),"utf-8");
		针对于post请求来说:只需要将请求流的编码设置成utf-8即可
			request.setCharacterEncoding("utf-8");
/////////////////////////////////////////////////////////////
域对象:
	request:
		创建:一次请求来的时候
		销毁:响应生成的时候
		作用:
			一次请求里面的数据
		请求转发(请求链,请求串)
			request.getRequestDispatcher("内部路径").forward(request,response);
///////////////////////////////////////////////////////////////			
///////////////////////////////////////////////////////////////			
			
案例2-步骤分析:
	1.数据库和表(day09)
	2.页面(表单)
		给每个字段添加name属性
		还需修改表单提交的路径 method=post
	3.表单提交到一个servlet(RegistServlet)
	4.RegistServlet:
		操作:
			接受数据,封装成一个user
			调用UserSerivce完成保存操作  int regist(User user)
			判断结果是否符合我们预期
				若int=1; 插入成功
				若int!=1; 插入失败
			相应的提示信息在当前的servlet不做处理,将信息转发给另一个servlet展示(MsgServlet);
	5.UserService
		调用dao
	6.userdao 通过dbutils在数据库中插入一条记录.
//////////////////
封装对象:
	apache提供的一个工具类
		BeanUtils
			封装数据
			使用步骤:
				1.导入jar包
				2.调用 BeanUtils.populate(Object bean,Map<> 参数);
			
/////////////////////////////////////////////
/////////////////////////////////////////////
请求转发和重定向区别:
	重定向发送两次请求,请求转发一次请求
	
	重定向地址栏发生该表,请求转发不变
	
	重定向是从浏览器发送,请求转发是服务器内部
	
	重定向不存在request域对象,请求转发可以使用request域对象
	
	重定向是response的方法,请求转发是request的方法
	
	重定向可以请求站外资源,请求转发不可以		
	
			
	/////////////////////////////////////////////		
	/////////////////////////////////////////////		
扩展:
	URLEncoder.encode(s, "utf-8"); 指定编码
	URLDecoder.decode(s8, "iso8859-1");指定解码
文件下载扩展:
	中文名称的文件名下载的时候名称会出现问题
	常见的浏览器需要提供文件名称的utf-8编码
	对于火狐来说需要提供文件名称的base64编码
		方案1:使用工具类
		方案2:网上的方式(8成好使)
			new String(filename.getByte("gbk"),"iso8859-1");
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
上午回顾:
response:
	操作响应行
		状态码
		常用方法:
			setStatus(int code)  针对的1xx 2xx 3xx
	操作响应头:
		setHeader(String key,String value):设置
		addHeader(String key,String value):添加
		
		常用的响应头:
			location:重定向:
				response.sendRedirect("跳转路径");
			refresh:定时刷新
				response.setHeader("refresh","秒数;url=路径");//java
				meta标签//html代码
			content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开
				response.setContentType("text/html;charset=utf-8");
			content-disposition:设置文件下载
				response.setHeader("content-disposition","attachment;filename="+文件名称);
	操作响应体
		getWriter():
		getOutputStream():
		注意:俩流互斥,服务器帮我们关闭此流
	响应的中文乱码:
		response.setContentType("text/html;charset=utf-8");
////////////////////////////////
文件下载:
	1.超链接下载
	2.编码下载(两个头一个流)
		设置文件的mimetype
		设置下载头信息
		对拷流
	扩展:
		文件名称中文问题:
			方法1:
				firefox :base64
				其他:utf-8
			方法2:(八九成可以使用)
				new String(filename.getBytes("gbk"),"iso8859-1");
////////////////////////////////
request:请求 获取浏览器发送过来的数据
	操作请求行
		getMethod():请求方式
		getContextPath():获取项目名称
		getRemoteAddr():获取请求的ip地址
		
	操作请求头
		String getHeader(String key)
		常见的头信息:
			user-agent:获取浏览器内核
			referer:页面从那里跳转过来的
	操作请求参数
		String getParameter(String key):
		String[] getParameterValues(String key):
		Map<String ,String[]> getParameterMap();
		
	请求的中文乱码:
		对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
		对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
		
		通用的方法:
			new String(参数.getBytes("iso-8859-1"),"utf-8");
		针对于post请求来说:只需要将请求流的编码设置成utf-8即可
			request.setCharacterEncoding("utf-8");
	域对象:request
		请求转发:
			request.getRequestDispatcher("内部路径").forward(request,response);
		request生命周期:
			一次请求
////////////////
扩展:封装数据:
	apache的BeanUtils
		1.导入两个jar包
		2.调用 BeanUtils.populate(Object bean,map);
原文:http://www.cnblogs.com/Jixiangwei/p/6838937.html