Servlet域对象详细使用

Request对象解决了一次请求内的数据共享问题。(重定向-两次请求/请求转发-一次请求)
Cookie是浏览器端的数据存储技术,解决了不同发送请求的数据共享问题。(用户登录界面)
Session是依赖于Cookie的服务器端的数据存储技术,解决了用户的不同请求处理的数据共享。(服务器端一个用用户一个)
ServletContext全局域和ServletConfig加载(服务器端全部用户共享);
用处:获取webxml文件信息;获取项目下资源文件绝对路径和资源流对象

Requset

/**
 * 请求中文乱码解决:
 * 	1、使用String进行数据重新编码
 * 			uname=new String(uname.getBytes("iso8859-1"),"utf-8");
 *  2、使用公共配置
 * 		get方式:
 * 			步骤一:req.setCharacterEncoding("utf-8");
 * 			步骤二:
 * 				在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性 useBodyEncodingForURI="true"
 * 		post方式:
 * 			req.setCharacterEncoding("utf-8");
 * Servlet流程总结:
 * 		浏览器发起请求到服务器(请求)
 *      服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
 *      服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
 *      servlet的方法执行进行请求处理
 *      		//设置请求编码格式
 *      		//设置响应编码格式
 *      		//获取请求信息
 *      		//处理请求信息
 *      			//创建业务层对象
 *      			//调用业务层对象的方法
 *      		//响应处理结果
 *请求转发学习:
 *		作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
 *		使用:
 *				req.getRequestDispatcher("要转发的地址").forward(req, resp);
 *				地址:相对路径,直接书写servlet的别名即可。
 *		特点:
 *			一次请求,浏览器地址栏信息不改变。
 *		注意:
 *			请求转发后直接return结束即可。
 *reuqet作用域:
 *		解决了一次请求内的servlet的数据共享问题
 *重定向:
 *		解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
 *		使用:
 *			resp.sendRedirect(String uri);
 *		示例:
 *			resp.sendRedirect("/login/main");
 *		特点:
 *			两次请求,两个request对象。
 *			浏览器地址栏信息改变
 *		时机:
 *			如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
 *			如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。	
 *解决主页面用户名显示为null的问题:
 *		原因:
 *			因为在用户登录成功后使用重定向显示主页面,两次请求,而用户的信息
 *			在第一次请求中,第二次请求中没有用户数据,所以显示为null
 *		解决:
 *			使用session
 *使用ServletContext对象完成网页计数器
 *		在用户登录校验中创建计数器并自增,然后存储到ServletContext对象中
 *		在主页面里取出计数器数据显示给用户即可。
 *
 * @author MyPC
 */
public class LoginServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式:
			req.setCharacterEncoding("utf-8");
		//设置响应编码格式
			resp.setContentType("text/html;charset=utf-8");
		//获取请求信息
			String uname=req.getParameter("uname");
			//uname=new String(uname.getBytes("iso8859-1"),"utf-8");//使用String进行数据重新编码
			String pwd=req.getParameter("pwd");
			System.out.println(uname+":"+pwd);
		//处理请求信息
			//获取业务层对象
			LoginService ls=new LoginServiceImpl();
			User u=ls.checkLoginService(uname, pwd);
			System.out.println(u);
		//响应处理结果
		if(u!=null){
				//创建Cookie信息实现三天免登录。
					Cookie c=new Cookie("uid", u.getUid()+"");
					//设置Cookie的有效期
					c.setMaxAge(3*24*3600);
					c.setPath("/login/ck");
					//添加Cookie信息
					resp.addCookie(c);
				//请求转发
					//req.getRequestDispatcher("main").forward(req, resp);
				//将数据存储到session对象中
					HttpSession hs=req.getSession();
					hs.setAttribute("user",u);
				//创建网页计数器
					//获取计数数据
					ServletContext sc=this.getServletContext();
					if(sc.getAttribute("nums")!=null){
						int nums=Integer.parseInt((String) sc.getAttribute("nums"));
						//计数器自增
						nums+=1;
						//再次存储到ServletContext对象中
						sc.setAttribute("nums", nums);
					}else{
						sc.setAttribute("nums", 1);
					}
					
				//重定向
				resp.sendRedirect("/login/main");
				return;
			}else{
				//使用request对象实现不同Servlet的数据流转
				req.setAttribute("str", "用户名或密码错误");
				//使用请求转发
				req.getRequestDispatcher("page").forward(req, resp);
				return;
			}
	}

Cookie

/**
 * Cookie学习:
 * 		作用:解决了发送的不同请求的数据共享问题
 * 		使用:
 * 			Cookie的创建和存储
 * 				//创建Cookie对象
 * 					Cookie c=new Cookie(String name, String value);
 * 				//设置cookie(可选)
 * 					//设置有效期
 * 					c.setMaxAge(int seconds);
 *					//设置有效路径
 *					c.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信息存储好之后,每次请求都会附带,除非设置有效路径
 * @author MyPC
 *
 */
public class CookieServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");
		//获取请求信息
		
		//处理请求信息
		//响应处理结果
			//使用Cookie进行浏览器端的数据存储
				//创建Cookie对象
				Cookie c=new Cookie("mouse", "thinkpad");
				Cookie c2=new Cookie("key", "bjsxt");
				//设置Cookie
					//设置Cookie的有效期
					c2.setMaxAge(3*24*3600);
					//设置有效路径
					c2.setPath("/cookie/gc");
				//响应Cookie信息
				resp.addCookie(c);
				resp.addCookie(c2);
			//直接响应
				resp.getWriter().write("Cookie学习");
			//请求转发
			//重定向
	}

Session

/**
 * 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 value);
 * 				获取:hs.getAttribute(String name) 返回的数据类型为Object
 * 				注意:
 * 					存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
 * 			使用时机:
 * 				一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
 * 			总结:
 * 				session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。
 * 				用户的任意请求在处理时都能获取到同一个session对象。
 * 			作用域:
 * 				一次会话
 * 				在JSESSIONID和SESSION对象不失效的情况下为整个项目内。
 * 			session失效处理:
 * 				将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致
 * 				则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。
 * 		注意:
 * 			JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效。
 * 
 * @author MyPC
 *
 */
public class SessionServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式
		req.setCharacterEncoding("utf-8");
		//设置响应编码格式
		resp.setContentType("text/html;charset=utf-8");
		//获取请求信息
			String name="张三";
		//处理请求信息
			//创建session对象
			HttpSession hs=req.getSession();
			//设置session的存储时间
				//hs.setMaxInactiveInterval(5);
			System.out.println(hs.getId());
			//设置session强制失效
				//hs.invalidate();
			//存储数据
				hs.setAttribute("name",name);
		//响应处理结果
			//直接响应
			resp.getWriter().write("session学习");
			//请求转发
			//重定向
	}

ServletContext

/**
 * ServletContext对象学习:
 * 		问题:
 * 			不同的用户使用相同的数据
 * 		解决:
 * 			ServletContext对象
 * 		特点:
 * 			服务器创建
 * 			用户共享
 * 		作用域:
 * 			整个项目内
 * 		生命周期:
 * 			服务器启动到服务器关闭
 * 		使用:
 * 			获取ServletContext对象
 * 					//第一种方式:
						ServletContext sc=this.getServletContext();
					//第二种方式:
						ServletContext sc2=this.getServletConfig().getServletContext();
					//第三种方式:
						ServletContext sc3=req.getSession().getServletContext();
 * 			使用ServletContext对象完成数据共享
 * 					//数据存储
 * 						sc.setAttribute(String name, Object value);
 * 					//数据获取
 * 						sc.getAttribute("str") 返回的是Object类型
 * 					注意:
 * 						不同的用户可以给ServletContext对象进行数据的存取。
 * 						获取的数据不存在返回null。
 * 			获取项目中web.xml文件中的全局配置数据
 * 					sc.getInitParameter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。
 * 													  如果数据不存在返回null。
 * 					sc.getInitParameterNames();返回键名的枚举
 * 				配置方式:注意 一组<context-param>标签只能存储一组键值对数据,多组可以声明多个  <context-param>进行存储。
 * 					  <context-param>
						  	<param-name>name</param-name>
						  	<param-value>zhangsan</param-value>
  					  </context-param>
  				作用:将静态数据和代码进行解耦。
  			获取项目webroot下的资源的绝对路径。
  				String path=sc.getRealPath(String path);	
  				获取的路径为项目根目录,path参数为项目根目录中的路径
  			获取webroot下的资源的流对象
  				InputStream is = sc.getResourceAsStream(String path);
  				注意:
  					此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
  					path参数为项目根目录中的路径
 * 
 * 
 * @author MyPC
 *
 */
public class ServletContextServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//获取ServletContext对象
			//第一种方式:
			ServletContext sc=this.getServletContext();
			//第二种方式:
			ServletContext sc2=this.getServletConfig().getServletContext();
			//第三种方式:
			ServletContext sc3=req.getSession().getServletContext();
			System.out.println(sc==sc2);
			System.out.println(sc==sc3);
		//使用ServletContext对象完成数据共享
			//数据存储
			sc.setAttribute("str", "ServletContext对象学习");
		//获取项目web.xml的全局配置数据
			String str = sc.getInitParameter("name2");
			System.out.println("全局配置参数:"+str);
		//获取项目根目录下的资源的绝对路径
			//String path="D:\\apache-tomcat-7.0.56\\webapps\\sc\\doc\\1.txt";
			String path=sc.getRealPath("/doc/1.txt");
			System.out.println(path);
		//获取项目根目录下资源的流对象
			InputStream is = sc.getResourceAsStream("/doc/1.txt");
	
	}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值