重点笔记会话关键技术_第1页
重点笔记会话关键技术_第2页
重点笔记会话关键技术_第3页
重点笔记会话关键技术_第4页
重点笔记会话关键技术_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第36讲(会话技术简介)什么是会话?(会话是针对一种网站而言,不是针对各种网站。)基本概念:指顾客开一种浏览器,访问一种网站,只要不关闭该浏览器,不论该顾客点击多少个超链接,访问多少资源,直到顾客关闭浏览器,整个这个过程咱们称为一次会话。例如打电话,只要电话不断就算一次电话,至于过程中和多少人说过话,说多长时间,都算一次。点一次超链接就是一种request,不也许保存起来。因此要用会话来保存数据。//——————————————————————————————————————如何保存顾客上次登录时间如何显示顾客浏览历史如何把登录顾客名和密码保存到电脑,下次登录,不需要重新输入解决之道——cookieCookie是客户端技术,服务器把每个顾客数据以cookie形式写给顾客各自浏览器。当顾客使用浏览器再去访问服务器中web资源时,就会带着各自数据去。这样,web资源解决就是顾客各自数据了。服务器在客户端保存顾客信息,例如登录名,密码等...就是cookie,这些信息就像是小甜饼同样,数据量并不大,服务器端在需要时候可以从客户端读取,保存在客户端浏览器缓存目录下。Cookie原理示意图Cookie创立是在服务器创立,存储是在浏览器这头存储。ClassCookie//——————————————————————————————————————InterfaceHttpServletResponse//——————————————————————————————————————演示Cookie工作publicclassCreateCookieextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //创立cookie(api) Cookiecookie=newCookie("name","mingcheng1"); //设立cookie生命周期 cookie.setMaxAge(3600); //把cookie信息回写给浏览器 response.addCookie(cookie); }//——————————————————————————————————————在ie访问http://localhost:8888/cookie1/CreateCookie,用HttpWatch抓包得到信息(response):InterfaceHttpServletRequest//——————————————————————————————————————publicclassReadCookie1extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //读取所有cookie信息,再选中你要cookie Cookiecookies[]=request.getCookies(); System.out.println(cookies.length); }//——————————————————————————————————————在ie访问http://localhost:8888/cookie1/ReadCookie1,用HttpWatch抓包得到信息(request):在控制台浮现信息://—————————————————————————————————————— for(inti=0;i<cookies.length;i++) { Cookiecookie=cookies[i]; out.println("cookie信息名字="+cookie.getName()+"value="+cookie.getValue()); } }//——————————————————————————————————————cookie原理图cookie可以用来做什么保存上次登录时间等信息保存顾客名、密码,在一定期间不用重新登录记录顾客访问网站喜好(例如有无背景音乐、网页背景色是什么)网站个性化,例如定制网站服务,内容。cookie小结cookie是在服务器创立cookie是保存在浏览器这端cookie生命周期可以通过cookie.setMaxAge();☞如果不设立setMaxAge则该cookie生命周期当浏览器关闭时,就消灭.cookie可以被各种浏览器共享怎么理解咱们可以把cookie想成一张表?如果cookie重名会有什么问题?如果重名就会替代存在cookie值.一种web应用可以保存各种cookie(各种cookie存储在一种文献里,无论生命周期相似不相似)cookie存储时候是以明文方式存储,因而安全较低,咱们可以通过加密后保存.->补讲一种md5算法:请人们注意,后来咱们密码都要使用加密存储,在验证密码时候,对顾客输入密码,进行md5加密,然后再到数据库去验证//————————————————————————————————————publicclassServlet1extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //先获取cookie //假设咱们保存上次登录时间cookie"lasttime""-11-1112:12:12" //这里咱们要考虑一种状况:顾客第一次登陆'您是第一次登陆...' Cookiecookies[]=request.getCookies(); booleanb=false;//假设没有lasttimecookie if(cookies!=null)//保证有cookie,才去遍历 { for(Cookiecookie:cookies) {//取出名 Stringname=cookie.getName(); if("lasttime".equals(name)) {//显示 out.println("您上次登录时间是:"+cookie.getValue()); //更新时间 //把当前日期保存cookie SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringnowTime=simpleDateFormat.format(newjava.util.Date()); cookie.setValue(nowTime); cookie.setMaxAge(7*3600*24);//保存一周 response.addCookie(cookie); b=true; break; } } } if(!b) {//没有找到 out.println("您是第一次登陆..."); //把当前日期保存cookie SimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); StringnowTime=simpleDateFormat.format(newjava.util.Date()); Cookiecookie=newCookie("lasttime",nowTime); cookie.setMaxAge(7*3600*24);//保存一周 response.addCookie(cookie); } }//——————————————————————————————————————//——————————————————————————————————————打开登录页面时候,自动填写该顾客顾客名和密码(最佳单开一种项目)//——————————————————————————————————————//——————————————————————————————————————点击登录后再回到Login页面点击刷新,顾客id已自动填写://——————————————————————————————————————点一下商品名,就弹窗商品信息,同步在刷新主界面时候,能显示出看了哪些商品,并且还要加一种功能,最后看商品要放到最前面去,当浏览过商品超过了四个后来,只保存四个。//——————————————————————————————————————cookie细节①一种浏览器最多放入300cookie,一种web站点,最多20cookie,并且一种cookie大小限制在4k②cookie生命周期再阐明:1.cookie默认生命周期是会话级别2.通过setMaxAge()可以设立生命周期setMaxAge(正数),即多少秒后该cookie失效setMaxAge(0),删除该cookie③cookie存储中文,怎么解决存储:Stringval=.URLEncoder.encode("铭城","utf-8");Cookiecookie=newCookie("name",val);取出:Stringval=.URLDecoder.decode(cookie.getValue(),"utf-8");out.println("name="+val);案例://——————————————————————————————————————//——————————————————————————————————————点击刷新后:特别阐明:如果该web应用只有一种cookie,则删除该cookie后,在浏览器暂时文献夹下没有该cookie文献,如果该web应用有各种cookie,则删除一种cookie后,文献还在,只是该cookie没有setMaxAge(负数),相称于该cookie生命周期是会话级别。//第39讲(session技术)=========================================================☞张三和李四她们购买商品不同样,她们购物车中显示商品也不同样,这是怎么实现?☞此外一种问题,不同顾客登录网站后,不论该顾客浏览该网站哪个页面,都可显示登录人名字,同样可以随时去查看自己购物车中商品。session为什么有?问题1:如何实当前不同页面,可以去查看信息(例如说购物车),同步还要实现不同顾客看到信息是自己.对session阐明:session是存储在服务器内存中一种顾客浏览器,独享一种session域对象session默认生命周期是30minInterfaceHttpSession//——————————————————————————————————————InterfaceHttpServletRequestF:\tomcat\apache-tomcat-8.0.28\conf\web.xml//——————————————————————————————————————publicclassServlet1extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //访问session[当发现没有session时候,就会自动创立session] HttpSessionsession=request.getSession(); //给该session放入属性 session.setAttribute("uname","宋江"); //session生命周期(默认30min,你也可以修改) out.println("创立session,并放入了一种属性"); }//————————————————————————————————————publicclassServlet2extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //获取session HttpSessionsession=request.getSession(); //获取 Stringuname=(String)session.getAttribute("uname"); if(uname==null) { out.println("session中没有uname"); }else{ out.println("uname="+uname); } }//————————————————————————————————————先访问Servlet1:再访问Servlet2,在搜狗和ie浏览器中返回成果不同样,证明了一种顾客浏览器,独享一种session域对象//——————————————————————————————————————?如果同一种顾客浏览器,向设立一种属性时候,如果名字相似了,会浮现什么状况?结论:会替代该对象值。//——————————————————————————————————————演示publicclassServlet3extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //访问session[当发现没有session时候,就会自动创立session] HttpSessionsession=request.getSession(); session.setAttribute("uname","铭城"); out.println("重新设立uname"); }//——————————————————————————————————————先访问Servlet3重新设立uname再访问Servlet2,这是uname已经变成铭城了。//——————————————————————————————————————request.getSession(true);//和不带参数同样request.getSession(false);//没有session就算了,不再创立新//——————————————————————————————————————publicclassServlet4extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); HttpSessionsession=request.getSession(); session.removeAttribute("uname"); out.println("删除uname"); }//————————————————————————————————————Servlet2->Servlet4->Servlet2//——————————————————————————————————————//——————————————————————————————————————//—————————————————————————————————————— //创立一种对象 Useruser=newUser(); user.setName("小猫"); user.setColor("红色"); session.setAttribute("cat",user);//———————————————————————————————————— Useruser=(User)session.getAttribute("cat"); if(user!=null) { out.println("猫信息是"+user.getName()+""+user.getColor()); }//————————————————————————————————————Servlet1->Servlet2//——————————————————————————————————————session小结:①session是存在服务器内存中②一种顾客浏览器,独享一种session域对象③session中属性默认生命周期是30min,你可以通过web.xml来修改这样修改:1)一种地方是tomcat/conf/web.xml对所有web应用生效2)此外一种地方,就是在单个web应用下去修改web.xml如果发生冲突,则以自己web应用下为准 session.setMaxInactiveInterval(20);//20s指是发呆时间对session生命周期小结:④session中可以存储各种属性⑤session可以存储对象⑥如果session.setAttribute(“name”,val),如果名字重复,则会替代该属性//——————————————————————————————————————测试removeAttribute()办法效果://——————————————————————————————————————小作业:防止顾客非法登录到某个页面顾客必要登录后,才干操作管理页面。思路:当顾客成功登录后,可以把该顾客信息存储到session,然后在需要验证页面中获取顾客信息,如果为null,阐明顾客非法,可以让其重新登录.//——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————在之前LoginServlet写过request.getAttribute(“...”)接受到错误信息//——————————————————————————————————————效果://——————————————————————————————————————如果网站有非常多页面,可以使用下面办法封装成函数使用过滤器//——————————————————————————————————————session更进一步理解:为什么服务器可觉得不同浏览器提供不同session?//——————————————————————————————————————抓包来查看Jsessionid:访问http://localhost:8888/session1/Servlet1当发现没有session时候,就会自动创立。访问http://localhost:8888/session1/Servlet5当前在服务器内存已有session,浏览器祈求时带上Cookie(保存有jsessionid),服务器依照此id来寻找相应浏览器session。session.getId()用来在页面上打印jsessionid。.net[开源之祖]3万各种开源项目电驴、防火墙、杀毒软件、数据库、大型游戏、地图c语言、java、php、.net、asp//——————————————————————————————————————验证码案例使用(原理是使用到java绘图技术)这里最重要就是生成验证码servlet//——————————————————————————————————————packagecom.wmc;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassCreateCodeextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{// response.setContentType("text/html;charset=utf-8");// response.setCharacterEncoding("utf-8");// PrintWriterout=response.getWriter(); //7.禁止浏览器缓存随机图片 response.setDateHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache"); //6.告知客户机以图片方式打开发送过去数据 response.setHeader("Content-Type","image/jpeg"); //1.在内存中创立一副图片 BufferedImageimage=newBufferedImage(60,30,BufferedImage.TYPE_INT_RGB); //2.向图片上写数据 Graphicsg=image.getGraphics(); //设背景色 g.setColor(Color.black); g.fillRect(0,0,60,30); //3.设立写入数据颜色和字体 g.setColor(Color.red); g.setFont(newFont(null,Font.BOLD,20)); //4.向图片上写数据 Stringnum=makeNum(); //这句话就是把随机生成数值,保存到session request.getSession().setAttribute("checkcode",num); g.drawString(num,0,20); //5.把写好数据图片输出给浏览器 ImageIO.write(image,"jpg",response.getOutputStream()); } //该函数是随机生成7位数字 publicStringmakeNum() { Randomr=newRandom(); //9999999可以生成7位 Stringnum=r.nextInt(9999)+""; StringBuffersb=newStringBuffer(); //如果不够4位,前面补零 for(inti=0;i<4-num.length();i++) { sb.append("0"); } num=sb.toString()+num; returnnum; } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doGet(request,response); }}//——————————————————————————————————————图片实质上就是一种文献,咱们看电影都是按文献流来传播。因此地址写一种servlet,然后servlet再写会一种图片回来。 out.println("<h1>顾客登录</h1>"); //action应当这样写 /web应用名/Servleturl out.println("<formaction='/mycheckcode/LoginCl'method='post'>"); out.println("顾客id:<inputtype='text'name='id'/><br/>"); out.println("密码:<inputtype='password'name='password'/><br/>"); out.println("验证码:<inputtype='text'name='checkcode'/><imgsrc='/mycheckcode/CreateCode'><br/>"); out.println("<inputtype='submit'value='登录'/><br/>"); out.println("</form>"); Stringerr=(String)request.getAttribute("err"); if(err!=null) { out.println(err); }如何使用:Login.java<imgsrc=”/验证码url”/>//—————————————————————————————————————— //获取顾客id/password/输入验证码 Stringid=request.getParameter("id"); Stringpasswd=request.getParameter("passwd"); Stringcheckcode=request.getParameter("checkcode"); //取出session中验证码 Stringcheckcode2=(String)request.getSession().getAttribute("checkcode"); //1.先验证码 if(checkcode.equals(checkcode2)) { //验证码ok request.getRequestDispatcher("/Ok").forward(request,response); //到数据库去验证 }else{ request.setAttribute("err","验证码错误"); request.getRequestDispatcher("/Login").forward(request,response); }//————————————————————————————————————out.println("loginok");//————————————————————————————————————效果:输入对的验证码:输入错误验证码:练习,把验证码功能加入到顾客管理系统。//过滤器———————————————————————————————————过滤器(filter)①开发过滤器环节:创立继承HttpServlet同步实现Filter接口默认filter不生效,需要配备.web.xml:<!--自己配备一种filter/*表达对该WEB所有网页都过滤--><filter> <filter-name>MyFilter</filter-name> <filter-class>com.wmc.filter.MyFilter</filter-class></filter><filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>3.在filter办法中添加业务逻辑.packagecom.wmc.filter;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importcom.wmc.domain.User;publicclassMyFilterextendsHttpServletimplementsFilter{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doGet(request,response); } @Override publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ //TODOAuto-generatedmethodstub //获取request HttpServletRequesthttpServletRequest=(HttpServletRequest)request; //看看祈求资源是什么 Stringuri=httpServletRequest.getRequestURI(); if(uri.startsWith("/UsersManager3/imgs")||uri.startsWith("/UsersManager3/servlet/Login")||uri.startsWith("/UsersManager3/servlet/CreateCode")) { //如果是祈求到登录有关页面以及图片验证码uri,直接放行 chain.doFilter(request,response); }else{ HttpSessionsession=httpServletRequest.getSession(); Useruser=(User)session.getAttribute("loginuser"); if(user!=null) { //该顾客合法,放行 chain.doFilter(request,response); }else{ request.setAttribute("err","请好好登录"); httpServletRequest.getRequestDispatcher("/servlet/LoginServlet").forward(request,response); } } } @Override publicvoidinit(FilterConfigfilterConfig)throwsServletException{ //TODOAuto-generatedmethodstub }}过滤器链实现方式:在创立一种过滤器(继承HttpServlet同步还要实现Filter接口)配备过滤器配备过滤器顺序就可以决定调用过滤器顺序.Filter执行顺序与在web.xml配备文献中配备顺序一致,普通把Filter配备在所有Servlet之前。//—————————————————————————————————————————————————————————————————————————对session销毁时间讨论-借助一种案例面试题:(应用:关掉IE后,再开IE,上次购买商品还在,->设计到session销毁时间)分析咱们session生命周期如果是30min,该session不会随浏览器关闭,而自动销毁,而会到30min后,才会被服务器销毁.咱们使用代码来实现该功能(session+cookie结合使用)//—————————————————————————————————————— //创立一种session,并放入一种属性 HttpSessionsession=request.getSession(); session.setAttribute("username","王铭成"); //默认30min //把 该sessionid保存cookie,在保存id时,一定要按照 //规范命名这里区别大小写. Cookiecookie=newCookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*30); response.addCookie(cookie);//————————————————————————————————————————————————————————————————————————— //读取session属性 Stringuname=(String)request.getSession().getAttribute("username"); out.println("uname="+uname);//—————————————————————————————————————————————————————————————————————————关闭ie后再开ie,输入http://localhost:8888/session2/Servlet2,能显示出uname//—————————————————————————————————————————————————————————————————————————如何实现ie禁用cookie后,咱们还可以继续使用session*放到简易购物车那解说决//第43讲(简易购物车)——————————————————————————————简易购物车实例:思路:当顾客点击购买商品时,咱们把该商品保存到session中,该session构造是:name valmybooks hashMap对象而hashmap构造是:key val书号 书对象Book.java类;详细实现,参看myCart项目总结咱们使用到有关知识‘java基本集合ArrayListHashMapLinkedHashMap(有序)session技术servlet单态如何选取不同集合 list集合都是有序map集合是无序list和map集合都可以放入nulllist可以放入相似对象,而map也可以放相似对象,但是key不能重复session中存储键为”mybooks”,值为HashMap对象。HashMap对象中存储键为课本id(String),值为book对象。//——————————————————————————————————————publicclassShowBookextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //先死后活 out.println("<h1>欢迎购买</h1>"); out.println("java书<ahref='/myCart/BuyBookCl?id=1&name=java'>点击购买</a><br/>"); out.println("oracle书<ahref='/myCart/BuyBookCl?id=2&name=oracle'>点击购买</a><br/>"); out.println("c书<ahref='/myCart/BuyBookCl?id=3&name=c'>点击购买</a><br/>"); }//——————————————————————————————————————publicclassBuyBookClextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); Stringbookname=request.getParameter("name"); Stringid=request.getParameter("id"); HttpSessionsession=request.getSession(); //从session中取出mybooks HashMap<String,Book>hm=(HashMap<String,Book>)session.getAttribute("mybooks"); //如果是第一次购物hm=null if(hm==null) { hm=newHashMap<String,Book>(); //创立一种Book对象 Bookbook=newBook(); book.setId(id); book.setName(bookname); book.setNum(1); hm.put(id,book); }else{ //判断hm中与否有该书 if(hm.containsKey(id)) { //表达书购买过一次 //取出 Bookbook=hm.get(id); intbookNum=book.getNum(); book.setNum(bookNum+1); }else{ Bookbook=newBook(); book.setId(id); book.setName(bookname); book.setNum(1); hm.put(id,book); } } //更新 session.setAttribute("mybooks",hm); request.getRequestDispatcher("/ShowMyCart").forward(request,response); }//——————————————————————————————————————publicclassShowMyCartextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //从session中取出看购买数 HashMap<String,Book>myBooks=(HashMap<String,Book>)request.getSession().getAttribute("mybooks"); out.println("你购物车有如下书籍:<br/>"); //遍历HashMap Iteratorit=myBooks.keySet().iterator(); while(it.hasNext()) { Stringkey=(String)it.next(); Bookbook=myBooks.get(key); out.println("书名:"+book.getName()+"数量:"+book.getNum()+"<br/>"); } out.println("<ahref='/myCart/ShowBook'>返回购物大厅</a>"); }//——————————————————————————————————————效果://——————————————————————————————————————用ArrayList模仿一种内存数据库:packagecom.wmc;importjava.util.ArrayList;//用arrayList模仿一种内存数据库finalpublicclassDB{ privatestaticArrayListal=null; privateDB(){ } static{ al=newArrayList<Book>(); Bookbook1=newBook(); book1.setId("1"); book1.setName("java"); Bookbook2=newBook(); book2.setId("2"); book2.setName("oracle"); Bookbook3=newBook(); book3.setId("3"); book3.setName("c"); Bookbook4=newBook(); book4.setId("4"); book4.setName("linux"); al.add(book1); al.add(book2); al.add(book3); al.add(book4); } publicstaticArrayListgetDB() { returnal; } publicstaticBookgetBookById(Stringid) { Bookbook=null; for(inti=0;i<al.size();i++) { book=(Book)al.get(i); if(book.getId().equals(id)) { returnbook; } } returnnull; }}//——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————要在购物车中显示每类书总共价格和所有书总价://——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————效果://——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————

该办法实现机制为:

●先判断当前Web组件与否启用Session,如果没有启用Session,直接返回参数url。

●再判断客户端浏览器与否支持Cookie,如果支持Cookie,直接返回参数url;如果不支持Cookie,就在参数url中加入SessionID信息,然后返回修改后url。

//——————————————————————————————————————cookievssession①存在位置cookie:存在客户端暂时文献夹session:存在服务器内存中,一种session域对象为一种顾客浏览器服务②安全性cookie是以明文方式存储在客户端,安全弱,可以通过加密md5再存储session是存储在服务器内存中,因此安全性好③网络传播量cookie会传递信息,给服务器session属性值不会给客户端④生命周期cookie生命周期是合计时间:即如果咱们给cookie设立setMaxAge(30)则30s后失效session生命周期是间隔时间,如咱们设立session20min,指在20min内,如果没有访问session,则session失效(含义是指无法取出session属性),在如下状况session也会失效关闭tomcatreloadweb应用时间到invalidate也会让session失效⑤使用原则由于session会占用服务器内存,因而不要向session存储过多,过大对象,会影响性能.//第45讲(ServletContext)===============================================为什么需要servletContext需求1需求2解决之道——ServletContext原理图:迅速入门ServletContextServletContext是在服务器ServletContext是被所有客户端共享ServletContext是当web应用启动时候,自动创立ServletContext当web应用关闭/tomcat关闭/对web应用reload会导致servletContext销毁.//——————————————————————————————————————publicclassServlet1extendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //获取ServletContext对象引用 //1.通过this直接获取. ServletContextservletContext=this.getServletContext(); //2.通过ServletConfig获取 //ServletContextservletContext2=this.getServletConfig().getServletContext(); servletContext.setAttribute("uname","王铭成"); out.println("写入一种属性到servletContext"); }//—————————————————————————————————————— publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); //取出ServletContext某个属性 //1.一方面获取到ServletContext ServletContextservletContext=this.getServletContext(); //2.取出属性,这个属性值,相应什么类型就应当转成什么类型 Stringval=(String)servletContext.getAttribute("uname"); out.println("val="+val); }//——————————————————————————————————————成果:访问http://localhost:8888/serContext/Servlet1后,再用此外浏览器如搜狗,百度浏览器,访问。MyEclipse自带浏览器:搜狗浏览器:百度浏览器://——————————————————————————————————————对ServletContext用法小结获取:this.getServletContext();this.getServletConfig().getServletContext();添加属性:servletContext.setAttribute(string,object);取出属性:servletContext.getAttribute("属性名");删除:servletContext.removeAttribute("属性名");//————————————————————————————————————ServletContext应用获取WEB应用初始化参数在web.xml中<!--如果但愿所有servlet都可以访问该配备.--><context-param> <param-name>username</param-name><param-value>scott</param-value></context-param>如何获取?Stringval=this.getServletContext().getInitParameter("username");*只能给单个servlet访问参数配备办法使用ServletContext实现跳转 //当前咱们跳转到下一种页面 //1response.sendRedirect("/web应用名/资源名"); //2request.getRequestDispatcher("/资源名").forward(request,response); /** *区别 1. getRequestDispatcher跳转发生在web服务器 sendRedirect发生在浏览器 * 2. 如果request.setAttribute("name","wmc")但愿下一种页面可以使用name属性值, * 则使用getRequestDispatcher * 3. 如果session.setAttribute("name2","wmc2"),但愿下一种页面可以使用name2属性值, * 则两个办法均可使用,但是建议使用getRequestDispatcher * 4. 如果咱们但愿跳转到本web应用外一种url,应使用sendRedirect */ //3这种办法和2同样 this.getServletContext().getRequestDispatcher("/资源url").forward(request,response);运用ServletContext对象读取资源文献在WebRoot下建立一种资源文献(perties) 属性以及属性值:成功读到资源文献中属性:*如果文献放在src目录下,则使用类加载器 //如果文献放在src目录下,咱们应当使用类加载器来读取(如果文献在包下,还要写上包途径) InputStreamis=Servlet5.class.getClassLoader().getResourceAsStream("perties");获取文献全途径 //如果读取到一种文献全途径 Stringpath=this.getServletContext().getRealPath("/imgs/mao.jpg"); out.println("path="+path);ServletContext应用在网站开发中,有诸多功能需要使用ServletContext,例如:网站计数器网站在线顾客显示简朴聊天系统...总之,如果是涉及到不同顾客共享数据,而这些数据量不大,同步又不但愿写入数据库中,咱们就可以考虑使用ServletContext来实现.//——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————//——————————————————————————————————————问题:当web服务器关闭后,咱们计数器就被清空了,请人们思考一下,如何可以保证计数器稳定增长?当服务器关闭时,ServletContext里信息要刷新到服务器端文献中(数据库也行)。重写servletdestroy办法。除此之外,还需要在web.xml中配备,load-on-startup,让tomcat启动后自动加载此servlet到内存,这样tomcat关闭时才会看到相应信息。关闭服务器后控制台显示:*关闭应当用这种方式:或者这种方式为暴力关闭://——————————————————————————————————————代码:咱们建立一种文献record.txt文献,用于保存访问量,可以保证稳定增长。实现办法:建立InitServlet,用于初始化我ServletContext,和在关闭tomcat时保存访问量在counterWebRoot下创立一种text用于记录服务器关闭时ServletContext信息:New->File//——————————————————————————————————————packagecom.wmc;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassInitServletextendsHttpServlet{ /** *Destructionoftheservlet.<br> */ publicvoiddestroy(){ super.destroy();//Justputs"destroy"stringinlog //Putyourcodehere System.out.println("initservletdestroy()被调用.."); //把ServletContext值重新保存到文献. Stringfilepath=this.getServletContext().getRealPath("/record.text"); FileWriterfileWriter=null; BufferedWriterbufferedWriter=null; try{ fileWriter=newFileWriter(filepath); bufferedWriter=newBufferedWriter(fileWriter); Stringnums=(String)this.getServletContext().getAttribute("nums"); bufferedWriter.write(nums); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }finally{ //关闭 try{ bufferedWriter.close(); fileWriter.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("utf-8"); PrintWriterout=response.getWriter(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论