【Java中级学习】Servlet

/*
* 请求中文乱码解决:
 * 		方式一:uname=new String(uname.getBytes("iso8859-1"),"utf-8");
 * 		方式二:使用公共配置,与请求方式有关
 * 			post请求:
 * 				req.setCharacterEncoding("utf-8");
 * 			get请求:
 * 				步骤一:req.setCharacterEncoding("utf-8");
 * 				步骤二:需要在tomcat的conf目录下service.xml中Connector标签中增加属性useBodyEncodingForURI="true"
 * 
 * Servler流程总结:
 * 		浏览器发起请求到服务器 (请求)
 * 		服务器接收浏览器的请求进行解析,创建request对象,存储请求数据
 * 		服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
 * 		servlet的方法执行进行请求处理
 * 			设置请求编码格式
 * 			设置响应编码格式
 * 			获取请求信息
 * 			处理请求信息
 * 				创建业务层对象
 * 				调用业务层对象的方法
 * 					创建业务层接口
 * 					实现业务层接口
 * 					创建pojo类
 * 					创建DAO层
 * 						创建DAO层接口
 * 						实现DAO层接口
 * 							//申明jdbc对象
 * 							//申明数据存储对象
 * 							//加载驱动
 * 							//获取连接对象
 * 							//创建SQL命令
 * 							//创建SQL命令对象
 * 							//给占位符赋值	
 * 							//执行
 * 							//遍历执行结果
 * 							//关闭资源
 *							//返回
 * 			响应处理结果
 * 					直接响应
 * 					请求转发
 * 					重定向
 * 请求转发学习:
 * 		作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
 * 		使用:
 * 			req.getRequestDispatcher("要转发的地址").forward(req, resp);
 * 			要转发的地址:相对路径,直接书写servlet的别名(后期会有jsp)
 * 		特点:
 * 			一次请求,浏览器地址信息不改变。
 * 		注意:
 * 			请求转发后直接renturn结束即可。
 * request作用域:
 * 		作用:解决一次请求内不同servlet的数据共享问题(请求数据+其他数据)
 * 		使用:
 * 			req.setAttribute("str", "用户名或密码错误!");
 * 			req.getAttribute("str");
 * 		作用域:一次请求内所有servlet
 * 		特点:
 * 			request对象服务器创建
 * 			每次请求都会创建
 * 			声明周期一次请求内
 * 重定向:
 * 		解决问题:
 * 			1、当前请求,servlet无法处理
 * 			2、避免表单数据重复提交
 * 		使用:
 * 			resp.sendRedirect("/login/main");//本地资源uri  网络资源url
 * 		特点:
 * 			两次请求,两个request对象
 * 			浏览器地址栏信息改变
 * 		时机:
 * 			如果请求中有表单数据,而数据比较重要且不能重复提交,交易使用重定向
 * 			如果请求被servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源
* 解决主页面用户名显示为null的问题
 * 		原因:
 * 			因为在用户登陆成功后使用重定向显示主页面,两次请求,而用户的信息
 * 			在第一次请求中,第二次请求中没有用户数据,所以显示为null
 * 		解决:
 * 			使用session
 * Servlet重定向路径总结:
 * 	相对路径:从当前请求的路径查找资源的路径
 * 		相对路径如果servlet的别名中包含目录,会造成重定向资源查找失败
 * 	绝对路径:
 * 		/虚拟项目名/资源路径。第一个/表示服务器根目录webapps
 *  Servlet请求转发:
 * 		/表示项目根目录
 * 		req.getRequestDispatcher("/资源路径").forward(req, resp);

* Cookie学习:
 * 		作用:解决了不同发送的不同请求的数据共享问题
 * 		使用:
 * 			Cookie的创建和存储
 * 				//创建Cookie对象
 * 					Cookie c=new Cookie("mouse", "thinkpad");
 * 				//设置cookie(可选)
 * 					//设置有效期
 * 					c2.setMaxAge(int seconds);
 * 					c2.setPath(String uri);
 * 				//响应Cookie信息给浏览器
 * 					resp.addCookie(c);
 * 			Cookie的获取
 * 				//获取Cookie信息数组
 * 				Cookie[] cks=req.getCookies();
 * 				//遍历数组获取Cookie信息
 * 					使用for循环遍历即可,示例:
 * 					if(cks!=null){
					for(Cookie c:cks){
							String name=c.getName();
							String value=c.getValue();
							System.out.println(name+":"+value);
						}
					}
 * 		注意:
 * 			一个Cookie对象存储一条数据。多条数据,创建多个Cookie对象进行存储
 * 		特点:
 * 			浏览器端的数据存储技术
 * 			存储的数据声明在服务器端
 * 			临时存储:存储在浏览器的运行内存中,浏览器关闭即失效 
 * 			定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求,都会附带该信息。
 * 			默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径:
 * /
/*
 * session技术学习:
 * 		问题:
 * 			一个用户的不同请求处理的数据共享怎么办?
 * 		解决:
 * 			使用session技术
 * 		原理:
 * 			用户第一次访问服务器时,服务器会创建一个session对象给此用户,并将
 * 			该session对象的JSESSIONID使用cookie技术存储在浏览器中,保证
 * 			用户的其他请求能够获取同一个session对象,也保证了不同请求能够获取到
 * 			共享数据。
 * 		特点:
 * 			存储在服务器端
 * 			由服务器进行创建
 * 			依赖cookie技术
 * 			有效期:一次会话(不关浏览器)
 * 			默认存储时间是30分钟
 * 		作用:		
 * 			解决了一个用户不同请求处理的数据共享问题。
 * 		使用:
 * 			创建session对象/获取session对象
 * 				HttpSession hs=req.getSession();
 * 				如果请求中有session的标识符也就是JSESSIONID,则返回其对应的session对象
 * 				如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中
 * 				如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中
 * 			设置session存储时间
 * 				hs.setMaxInactiveInterval(int seconds);
 * 				注意:
 * 					在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时(默认存储时间也是如此)
 * 			设置session强制失效
 * 				hs.invalidate();
 * 			存储和获取数据
 * 				存储:hs.setAttribute(String name, Object name);
 * 				获取:hs.getAttribute(String name) 返回数据类型未object
 * 				注意:存储的动作和取出的动作可以发生在不同的请求中,但是存储要先于取出执行。
 * 			使用时机:
 * 				一般用户在登陆web项目时会将用户的个人信息存储到Session中,供该用户的其他请求使用。
 * 			总结:
 * 				session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。
 * 				用户的任意请求在处理时都能获取到同一个session对象
 * 			作用域:
 * 				一次会话
 * 				在JSESSIOINID和SESSION对象不失效的情况下为整个项目内。
 * 			session失效处理:
 * 				将用户请求中的JSESSIONID和后台获取到的SESSION对象的JESSIONID进行比对,如果一致,
 * 				则session没有失效,如果不一致则证明session失效了。失效了重定向到登陆页面,让用户重新登陆,
 * 				则会重新生成session对象
 * 			有效时间补充:
 * 				可以在tomcat conf/web.xml中session-config修改全局的所有项目的有效时间,默认30分钟
 * 				也可以将session-config标签放到项目的web.xml中来设置该项目的session有效时间
 * 		注意:
 * 			JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效
 * /
/*
* ServletContext对象
 * 		问题:
 * 			不同用户使用相同的数据
 * 		解决:
 * 			ServletContext
 * 		特点:
 * 			服务器创建
 * 			用户共享
 * 		作用域:
 * 			整个项目内
 * 		生命周期:
 * 			服务器启动到服务器关闭
 * 		使用:
 * 			获取ServletContext对象
 * 				//第一种方式
				ServletContext sc=this.getServletContext();
				//第二种方式
				ServletContext sc2=this.getServletConfig().getServletContext();
				//第三种方式 监听器中会用到
				ServletContext sc3=req.getSession().getServletContext();
 * 			使用ServletContext对象完成数据共享
 * 				数据存储
 * 					sc.setAttribute(String name, Object obj);
 * 				数据获取
 * 					sc.getAttribute(String name)  返回Object对象
 * 				注意:
 * 					不同的用户可以给ServletContext对象进行数据的存取
 * 					获取的数据不存在,返回null
 * 			获取项目中web.xml文件中的全局配置数据
 * 					sc.getInitParameter("name"); //根据键的名字,返回web.xml中配置的全局数据的值,返回String数据类型
 * 												  如果数据不存在,返回null
 * 					sc.getInitParameterNames(); //返回键名的枚举
 * 				配置方式:一组context-param只能配置一组键值对数据,多组可以声明多个 context-param进行存储
 * 					
					
							name
							zhangsan
					
				作用:将静态数据和代码进行解耦。
			获取项目webroot下的资源的绝对路径
 * 				String path=sc.getRealPath(String path);
 * 				获取的路径为项目的根目录,path参数为项目根目录中的路径
 * 			获取项目webroot下的资源的流对象
 * 				InputStream is=sc.getResourceAsStream(String path);
 * 				注意:
 * 					此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器
 * 					path参数为项目根目录中的路径
 * /
/*
* ServletConfig对象学习
 * 		问题:
 * 			如何获取在web.xml中给每个servlet单独配置的数据呢?
 * 		解决:
 * 			使用ServletConfig对象
 * 		使用:
 * 			获取ServletConfig对象
 * 			获取web.xml中的配置数据

 * 项目中的web.xml与tomcat下的web.xml
 * 		位置:
 * 			每个Web项目中
 * 			Tomcat服务器中(服务器目录conf目录中)
 * 		区别:
 * 			Web项目下web.xml文件为局部配置,针对本项目
 * 			Tomcat下的web.xml文件为全局配置,配置公共信息
 * 		内容(核心组件):
 * 			全局上下文配置(全局配置参数)
 * 			Servlet配置
 * 			过滤器配置
 * 			监听器配置
 * 		加载顺序:
 * 			Web容器会按ServletContext->context-para->listener->filter->servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置
 * 		加载时机:
 * 			服务器启动
 * /

service.xml说明

 <Server>
				<Service>
						<Connector /> 
						<Connector />
						<Engine>
								<Host>
										<Context />
								</Host>
						</Engine>
				</Service>
</Server>

一个server可以配置多个service
在这里插入图片描述
tomcat服务器端口号 协议号 超时时间 重定向端口(服务器端口被占用 会重定向到该端口)
在这里插入图片描述
服务器集群端口

【Java中级学习】Servlet_第1张图片
一个service只能有一个该配置。
HOST标签appBase属性 :项目存放目录
HOST标签name属性:项目的访问地址

热部署:

reloadable:为true时,自动加载,项目发生改变,tomcat会自动加载到内存。
注意:热部署模式下,路径下项目删除,tomcat启动会报错该项目。而在webapps目录下,有什么加载什么。
如果要删除热部署的项目,则一定要删除server.xml中的热部署配置

你可能感兴趣的:(#,JAVA中级学习,java,tomcat,servlet)