韩顺平servlet笔记2完整版.docx
- 文档编号:6923602
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:30
- 大小:425.88KB
韩顺平servlet笔记2完整版.docx
《韩顺平servlet笔记2完整版.docx》由会员分享,可在线阅读,更多相关《韩顺平servlet笔记2完整版.docx(30页珍藏版)》请在冰豆网上搜索。
韩顺平servlet笔记2完整版
第二部分
◆MVC模式修改用户管理系统
◆对当前网站结构的问题分析
1.在LoginCl.java文件和ManageUser.java文件中都去操作了数据库,它们的逻辑相似,有重复代码
2:
整个框架没有清晰的层次关系,显得非常乱.
3:
代码一点也不优雅,可读性差,可维护性差.
解决方法:
指导思想:
1业务逻辑代码和界面分离
2把常用的代码(对数据库的连接和操作)封装到工具类
具体的方法
1每一张表对应一个domain类(表示数据)还要对应一个Service类
比如users表对应Users类(domain类)UserService类(该类会封装对users表的各种操作),实际上这里体现出数据和操作分离的思想
上机练习:
包登录部分改成mvc模式,建议先保存一份项目,再改.
1完成分页的mvc模式改写
首先在UsersService类中添加方法
//?
为什么要返回ArrayList,而不是我们想到ResultSet
//1.ArrayList中封装User对象,更加符合面向对象的编程方式OOP
//2.我们通过Resulst->User对象->ArrayList这样ArrayList和Resultset没有关系,就可以及时关闭数据库资源.
publicArrayListgetUsresByPage(intpageNow,intpageSize){
reutrnal;
}
练习:
把我们的用户管理系统出了cookie和session相关的功能不做,其它都做了.
一起完成用户管理系统的crud操作
1.一个请求对应一个控制器
优点:
逻辑清晰
缺点:
会造成控制器过多
可以这样考虑:
一类事务请求,我们做一个控制器,即让该控制器可以处理多个请求,为了让一个控制器去区分,不同的请求,我们可以这样做:
在发出请求的同时,在带一个type=del或者type=add或者type=update...,在控制器中我们接收type的值,从而判断用户希望做什么事情!
关于跳转到修改用户界面有两种思路:
(1)传递用户id号的同时,把用户的其它信息一并传递,这样可以减少数据库查询的次数(缺点:
增加网络开销100字节*1000000*2,优点:
减少对数据库的一次操作)
(2)只传递用户id好,控制器接收到id后,再查询数据库,从而显示.
添加用户
(1)用户id号,我们做成子增长
在oracle中先建立一个sequece
createsequenceusers_seq
startwith11
incrementby1
minvalue11
nomaxvalue
nocycle
nocache
课堂练习
添加查询用户功能:
安装老师给出网站结构写.
◆会话技术cookie和session
◆什么是会话
基本概念:
指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.
比如打电话.
◆为什么需要cookie技术(会话技术)
如何保存用户上次登录时间
如何显示用户浏览历史?
如何把登录的用户名和密码电脑,下次登录,不需要重新输入:
◆解决之道—cookie
◆cookie的原理图
◆cookie的小结
1cookie是在服务端创建
2cookie是保存在浏览器这端
3cookie的生命周期可以通过
cookie.setMaxAge(2000);
☞如果不设置setMaxAge则该cookie的生命周期当浏览器关闭时,就消亡.
4cookie可以被多个浏览器共享(与session的区别)
5怎么理解
我们可以把cookie想成一张表
?
如果cookie重名会有什么问题?
如果重名就会替换存在的cookie值.
6一个web应用可以保存多个cookie,但保存在同一个cookie文本在客户端浏览器下
7cookie存放的时候是以明文方式存放,因此安全较低.,我们可以通过加密后保存.
◆->补讲md5加密算法:
请大家注意,以后我们的密码都要使用加密存放,在验证密码的时候,对用户输入密码,进行md5加密,然后该到数据库去验证。
md5算法
packagecom.hsp;
importjava.security.*;
importjava.security.spec.*;
classMD5_test{
publicfinalstaticStringMD5(Strings){
charhexDigits[]={'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f'};
try{
byte[]strTemp=s.getBytes();
MessageDigestmdTemp=MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[]md=mdTemp.digest();
intj=md.length;
charstr[]=newchar[j*2];
intk=0;
for(inti=0;i bytebyte0=md[i]; str[k++]=hexDigits[byte0>>>4&0xf]; str[k++]=hexDigits[byte0&0xf]; } returnnewString(str); }catch(Exceptione){ returnnull; } } publicstaticvoidmain(String[]args){ //MD5_Testaa=newMD5_Test(); System.out.print(MD5_test.MD5("韩顺平")); } } ◆保存上次登录时间 publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); PrintWriterout=response.getWriter(); //先获取cookie //假设我们保存上次登录时间的cookie"lasttime""2011-11-1112: 12: 12"; //这里我们要考虑一个情况: 用户第一次登录'您是第一次登录..' Cookie[]cookies=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()); Cookiemycookie=newCookie("lasttime",nowTime); mycookie.setMaxAge(7*3600*24);//保存一周 response.addCookie(mycookie); 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); } } *上机练习 ◆cookie自动保存用户密码 打开登录页面的时候,自动填写该用户的用户名和密码【这个要求学员课堂练习(最好单开一个项目)】 ◆cookie保存浏览商品 请自己作为作业考虑实现 ◆cookie的细节 1一个浏览器最多放入300cookie,一个web站点,最多20cookie,而且一个cookie大小限制子4k 2cookie生命周期的再说明: 1.cookie默认生命周期是会话级别 2.通过setMaxAge()可以设置生命周期 setMaxAge(正数),即多少秒后该cookie失效 setMaxAge(0),删除该cookie setMaxAge(负数),相当于该cookie生命周期是会话级别. 案例: //先得到该cookie Cookiecookies[]=request.getCookies(); for(Cookiecookie: cookies){ if(cookie.getName().equals("id")){ System.out.println("id"); //删除 cookie.setMaxAge(0); response.addCookie(cookie);//一定带上这句话,否则不能删除 } } 特别说明: 如果该web应用只有一个cookie,则删除该cookie后,在浏览器的临时文件夹下没有该cookie文件,如果该web应用有多个cookie,则删除一个cookie后,文件还在,只是该cookie没有 3cookie存放中文,怎么处理 存放: Stringval=.URLEncoder.encode("顺平","utf-8"); Cookiecookie=newCookie("name",val); 取出: Stringval=.URLDecoder.decode(cookie.getValue(),"utf-8"); out.println("name="+val); ◆session为什么有? 问题1: 如何实现在不同的页面,可以去查看信息(比如说购物车),同时还要实现不同的用户看到的信息是自己. ◆session工作原理图 session的生命周期是30分钟 ◆session小结: 1session是存在服务器的内存中 2一个用户浏览器,独享一个session域对象 3session中的属性的默认生命周期是30min,你可以通过web.xml来修改 4 ◆3种session生命周期的设置 (1)一个地方是tomcat/conf/web.xml 对所有的web应用生效 (2)另外一个地方,就是在单个web应用的下去修改web.xml 如果发生冲突,则以自己的web应用优先级高 (3)session.setMaxInactiveinterval(60)发呆六十秒后session失效 对session和cookie生命周期小结: 5session中可以存放多个属性 6session可以存放对象 7如果session.setAttribute(“name”,val),如果名字重复,则会替换该属性. ? 如果同一个用户浏览器,向session设置一个属性的时候,如果名字相同了,会出现什么情况? 结论: 会替换该对象值. ◆session的更深入理解: 为什么服务器能够为不同的浏览器提供不同session? 因为每个浏览器去访问web站点的时候,如果发出的http请求头没有带JSESSIONID头就会自动给你创建一个并返回 ◆[开源之祖] ◆生成验证码案例 使用(原理是使用到java的绘图技术.) 这里最重要的就是生成验证码的servlet packagecom.hsp; 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{ //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);通过session就可以直接去到随即生成的验证码了 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{ doGet(request,response); } } 如何适用 Login.java 练习,请大家把验证码功能加入到用户管理系统. ◆过滤器(filter) ①开发过滤器的步骤: 1.创建继承HttpServlet同时实现Filter接口 2.默认filter不生效,需要配置. --自己配置的一个filter--> 3.在filter的方法中添加业务逻辑. packagecom.hsp.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.hsp.domain.User; publicclassMyFilter1extendsHttpServletimplementsFilter{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html;charset=utf-8"); PrintWriterout=response.getWriter(); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ this.doGet(request,response); } publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ System.out.print("myfilter1..."); //获取session HttpServletRequesthttpServletRequest= (HttpServletRequest)request; //看看请求的资源是什么 Stringuri=httpServletRequest.getRequestURI(); if(uri.startsWith("/UsersManager3/imgs")||uri.startsWith("/UsersManager3/Login")){ //直接放行. chain.doFilter(request,response); }else{ HttpSessionsession=httpServletRequest.getSession(); Useruser=(User)session.getAttribute("loginuser"); if(user! =null){ //该用户合法,放行 chain.doFilter(request,response);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺平 servlet 笔记 完整版