01.页面编码格式
 001.jsp页面本身的编码 page指令中的 pageEncoding属性!
	002.浏览器渲染页面采用的编码 contentType属性
	003.服务器保存数据采用的编码(request) 默认为 ISO-8859-1
	
	注意:
		01.--前两种(pageEncoding/contentType),一旦指定了一种,另一种如果不指定的话 默认采用已指定的编码!
		--request.setCharacterEncoding(String charset)用来设置request内部保存数据的格式!(不包括URL!)
		02.contentType和pageEncoding的区别:
			contentType定义的是响应的资源类型,也可以包含jsp页面和响应内容的字符集;
			pageEncoding指定jsp文件的字符集以及默认的contentType字符集!
		
02.JSP 九个内置对象!
	out : JspWriter类的实例!
			常用方法:01.void print(Object);  ==》输出各种类型!
					  02.void println(Object);==》输出各种类型!
					  03.void write(charset); ==》输出字符类型! 不能打印 null String str=null!
	response: 最常用重定向! void sendRedirect(String location)
	
	session:会话!(HttpSession类的实例)
		浏览器与web服务器之间使用http协议进行通信的!
		HTTP协议是一种基于请求/响应模式的 无状态 访问协议!
		“无状态”是指每一个HTTP请求都是独立的!服务器不会保存以往的请求和会话!
		因此,当一个客户端发送请求到web服务器时,无论是否是第一次来访,服务器都当他是第一次来访!
		作为服务器来说,必须有一种机制来唯一标识每一个请求用户(不然不能确定每一次操作是否是同一用户!),同时记录该用户的状态信息!==》会话跟踪机制!
		该机制可以保存每个请求用户的会话信息!
		
		session 一词指 有始有终的一系列动作!
		session执行过程:
		01.会话机制是一种服务器端的机制!当用户第一次向服务器发送请求时,服务器会为该用户创建唯一的会话,会话将一直持续到用户访问结束!
		02.当服务器接收到客户端请求时,服务器端会首先判断是否创建了与该客户端对应的会话!
		如果已创建,就将该请求与此会话相关联!反之,就创建一个新的会话!
		03.服务器端是否创建了相关会话,是通过一个唯一的标识 sessionid来实现的!
			如果在客户端的请求中包含了一个sessionid。则说明在此前已经为该客户端创建了会话!
			服务器就根据这个sessionid将之前的session对象读取出来!
			否则就创建一个新的会话对象并生成一个sessionid!
			并将sessionid在本次响应中 “返回给客户端保存” !(sessionid是保存在 客户端cookie中!)
			
		sessionid会返回客户端,那么在客户端sessionid保存在哪??
			在客户端保存信息使用 cookie,在cookie中,保存sessionid的名称是JESEEIONID!(由一串复杂的字符串组成!)
		
		session和浏览器窗口:
			通过超链接打开的新窗口,新窗口与其父窗口的sessionid相同!
			(目前针对与谷歌/IE8以上的浏览器,多个窗口为同一个sessionid!共享同一个缓存!保存在本地的cookie中!)
		
		会话的失效:
			01.会话超时:两次请求的时间间隔超过了服务器允许的最大时间间隔!
				001.通过session对象的setMaxInactionInterval(单位秒)设置session的 “非活动时间”!(浏览器最后依次访问服务器开始计算!)
				002.在项目的web.xml中设置!
				<session-config>
					<session-timeout>10(单位分钟)</session-timeout>
				</session-config>
				003.在应用服务器中的web.xml中设置!
				
				这里引入一个概念:
					项目中web.xml和tomcat服务器中的web.xml	
					01.tomcat-web.xml + 项目-web.xml = 合并的xml
					02.如果这两个中出现重复的配置,项目中的优先!(就近原则)
					03.tomcat服务器中为全局配置!项目中是局部的!只针对本项目有效!
					
			02.手动调用方法使其失效
				session.invalidate():设置session对象失效!主要应用于 用户注销登录的功能!
				如果只想清空会话中的某个数据对象,使用session.removeAttribute(String key)!会话仍然有效!
			
		注意:session.setAttribute(String key,Object value) value值为Object类型,get获取时需要向下转型!
		
		
	request:将url和data封装成request请求!
		请求中的中文乱码问题:
			01. post请求方式: tomcat对请求数据默认采用ISO-8859-1的编码!
				request.setCharacterEncoding("utf-8"); 页面中
				页面本身的编码要和请求没编码一致!<%@page contentType="text/html;charset=utf-8"%>
			02. get请求方式:
				因为get请求时,提交的数据作为查询字符串被附加到url的末尾发送至服务器!
				对于这部分数据,使用request.set..是不起作用的!
				解决方式1:
					得到请求的参数后进行编码转换!
					String name = request.setParameter("name");
					name = new String(name.getBytes("ISO-8859-1"),"utf-8");
					其中,getBytes()按照ISO-8859-1的编码格式把name转化为 byte数组!
					在通过new String()使用指定的utf-8将 byte数组狗造成一个新的String!
				解决方式2:
					方式1中,如果存在多个参数,则要对每个参数都进行操作!繁琐,效率不高!
					可以通过tomcat目录结构\conf\server.xml 文件
					设置<Connector>节点!
					<Connector port="8080" protocol="HTTP/1.1"
					connectionTimeout="20000" redirectPort="8443"
					URIEncoding="UTF-8"/>
					
	application : 类似于系统的全局变量!同一个应用内的所有用户之间的数据共享!
		常用方法:String getRealPath();返回相对路径的真实路径!
					e:\apache-tomcat-7.0.73\webapps\...
		经常应用于统计访问人数!
		Integer count = (Integer)application.getAttribute("count");
		if(count != null){
			count = count+1;
		}else{
			count =1;
		}
		application.setAttribute("count",count);
		
	page :当前jsp页面实例化的对象 (this)
		这里说明下 两个 include的区别:
			01.include指令:
			<%@include file="**.jsp"%>
			例如 a.jsp include b.jsp 
			过程:
				将a.jsp+b.jsp= c.jsp (合并后生成 c.jsp) c 是我们模拟的,实际没有 c.jsp文件!
				c.jsp--c.java--c.calss--执行!
				所以说 两个pageContext在同一个作用域中!
			02.pageContext.include("**.jsp");
			例如 a.jsp include b.jsp 
			过程:
				01.先执行 b.jsp--b.java--b.class--执行!--得到结果 c(null)
				02.将结果 c(null) 与 a.jsp合并成新的c.jsp! --c.java--c.class--执行!--得到结果
				所以说 两个pageContext分别在 a和b 两个作用域中!
		a.jsp页面:
			String name = "haha";
			pageContext.setAttribute("name",name);
			a中内容:<%=pageContext.getAttribute("name")%>
			<%=pageContext.include("b.jsp")%>//在 a页面中 引入b页面
		b.jsp页面:
			b中内容:<%=pageContext.getAttribute("name")%>
		
		运行a.jsp得到结果为:haha null
		
	config :指定jsp页面初始化配置(servlet中会使用!)
	
	exception :异常一般使用java代码处理!此对象很少使用!
				该对象只有在 page指令中设定 isErrorPage为true的页面中使用!
	
	pageContext :内置对象的集大成者!通过pageContext 可以获取其他8个内置对象! pageContext.getRequest()...
				Object getAttribute();//返回Object类型value值!
				void include();//请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中!
	
	JSP内置对象不需要实例化?
	所谓内置对象就是由Web容器加载的一组ServletAPI的实例,这些实例由JSP规范进行了默认的初始化操作!(_jsp.java中!)
	内置对象名均为JSP的保留字!
03.JSP四大作用域
	page;对应一个jsp页面的运行
	request:一次请求
	session: 会话有效期内
	application:整个应用上下文
	
	范围 : application > session > request > page
04.转发和重定向!
	转发过程:
		web容器内部将一个request请求的处理权交给了另外一个资源,属于同一个请求/响应的过程!request对象的信息不会丢失!
		转发是在 服务器端发挥作用!通过RequestDispatcher对象的forward()将提交信息在多个页面间进行传递!
		转发是在服务器内部进行控制权的转移!客户端浏览器地址栏不会显示出转发后的地址!(可以共享请求中的数据!)
	重定向过程:
		web容器向浏览器返回一个响应,浏览器接收这个响应后再发送一个新的http请求到服务器(属于两次不同的请求!第一次请求request对象的信息将丢失!)
		重定向是在客户端发挥作用!通过请求新的地址实现页面跳转!(浏览器重新请求地址!地址栏中显示转向后的地址!)
		
		注意:如果想在重定向下 传递少量的参数,可以将参数追加至url末尾!
		response.sendRedirect("welcome.jsp?userName="+name+"&pwd="+pwd);
		
		在使用超链接<a>进行数据传递时,采用的是get方式!
		(除了form中指定post和ajax指定post,其他情况都默认采用get方式提交请求!)
05.include指令!
	通过include指令引用公用代码文件,从而缓解代码冗余问题!
	<%@include file="文件路径"%>
	01.在JSP编译阶段 插入一个包含文本或代码的文件,这个包含的过程是 静态的!(可包含JSP HTML 文本文件等...)
	02.include指令只有 一个属性 file! 被包含的文件路径!
	
06.cookie
	cookie 由Netscape公司发明,是最常用的 跟踪用户会话的方式!
	是由服务器端生成 并发送给客户端浏览器!浏览器会将其保存在某目录下的文本文件!
	
	应用场景:
		01.判断用户注册用户是否已经登录,保存信息以便下次简化登录!
		02.最近浏览的商品
		03.统计网站浏览次数
		04.实现个性化服务,针对用户喜好展示不同内容
		
	注意:
		cookie会将用户信息保存在客户端,安全性上cookie存在一定风险!不建议将敏感信息保存在cookie中!
		
	01.创建cookie	
		Cookie cookie = new Cookie(String name,String value);
	02.写入cookie
		response.addCookie(cookie);
	03.读取cookie
		Cookie[] cookies = request.getCookies();//该方法返回http请求中的coookie数组!
		
		遍历此数组,通过getName()和getValue() 获取!
	
	04.验证sessionid以cookie的形式保存在客户端之中!
		创建会话
		session.setAttribute("str","haha");
		response.sendRedirect("getCookie.jsp");
		//此处如果为转发,则得不到cookie中的JSESSIONID!
			因为转发是一次请求,客户端没有得到响应!故没有向客户端写入cookie!
		
		在getCookie.jsp中进行获取
		out.print("sessionid="+session.getId());
		Cookie[] cookies = request.getCookies();
		if(cookies!=null){
			for(Cookie cookie:cookies){
				out.print("cookieName="+cookie.getName())
				out.print("cookieValue="+cookie.getValue());
			}
		}
		
		得到结果 sessionid 和 cookieValue 的值一致!
		
	05.cookie的有效期
		cookie是有生命周期的!
		cookie.setMaxAge(int expiry); 以秒为单位!
		
		注意:
			如果设置expiry=0  则表示从客户端删除该cookie!
			如果设置expiry为负数/不设置 则表示cookie会在当前窗口关闭后失效!
			
07.cookie 和 session
	session的作用域是在服务器端保存用户信息,cookie是在客户端!
	session作用域中保存的值是Obejct类型,cookie保存的值是String类型!
	session作用域随会话的结束而将其存储的数据销毁,cookie可以长期保存在客户端!
	session通常保存重要的信息,而cookie通常保存不重要的信息!
	
	例如 保存用户登录名/密码 不能使用cookie!
		 电商网站中的“最近浏览过的商品”可以使用cookie保存!
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	
原文:http://www.cnblogs.com/9513-/p/7954006.html