day20用户登录观察者模式.docx
- 文档编号:8804107
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:25
- 大小:132.08KB
day20用户登录观察者模式.docx
《day20用户登录观察者模式.docx》由会员分享,可在线阅读,更多相关《day20用户登录观察者模式.docx(25页珍藏版)》请在冰豆网上搜索。
day20用户登录观察者模式
Day20
权限/监听器/观察者模式
1、今天的主要内容
1:
实现权限过虑器。
-综合示例。
相对比较复杂。
5个表联合工作。
ER实体关系图。
要用两个过虑器实现安全过虑。
认证过虑器和验证过虑器。
2、监听器-观察者模式
观察者。
被观察者。
观察事件。
3、事件监听器
分类:
监听ServletContext对象。
监听HttpSession对象。
监听HttpServletRequest对象。
监听器的配置方式。
-listener
4、功能:
用ContextListener监听网站的访问量。
需要记录。
用HttpSessionListener监听在线人数。
用HttpSessionAttributeListener监听登录人数。
通过监听HttpSession管理在线用户。
并能踢出在线用户。
5、在线支付
使用第三方支付。
补:
内省在数据封装中起的作用?
数据库反射与类反射共同使用带来的方便。
内省
一个核心类:
PropertyDescriptor。
内省本质上是反射。
补:
JNDI
2、以下是课上的记录
3、要求不同的用户登录以后可以看到不同的菜单。
(后台可以实现对用户菜单的管理。
)
第一步:
分析数据结构
1:
用户表
表名:
users
列名
类型
说明
id
Varchar(32)
主键
name
Varchar(30)
2:
角色表
3:
菜单表
E-R图(Entry-Relationship实体关系图)
第二步:
先写入表中几行数据进行基本分析
insertintousersvalues('U001','Jack','1234');
insertintousersvalues('U002','张三','4321');
insertintousersvalues('U003','Tom','1111');
insertintorolesvalues('R001','管理员','');
insertintorolesvalues('R002','教师','');
insertintoroleuservalues('U001','R001');
insertintoroleuservalues('U002','R002');
insertintomenusvalues('M001','系统管理','/sys.jsp');
insertintomenusvalues('M002','用户管理','/user.jsp');
insertintomenusvalues('M003','角色管理','/role.jsp');
insertintorolemenuvalues('M001','R001');
insertintorolemenuvalues('M002','R001');
insertintorolemenuvalues('M003','R001');
insertintorolemenuvalues('M003','R002');
/*查询某个拥有某个角色*/
selectu.name,r.name
fromusersuinnerjoinroleuserruonu.id=ru.uid
innerjoinrolesronru.rid=r.id;
/*某角色拥有某菜单*/
selectr.name,m.name
fromrolesrinnerjoinrolemenurmonr.id=rm.rid
innerjoinmenusmonrm.mid=m.id;
/*查询某人拥有某个菜单*/
selectu.name,m.name
fromusersuinnerjoinroleuserruonu.id=ru.uid
innerjoinrolesronru.rid=r.id
innerjoinrolemenurmonr.id=rm.rid
innerjoinmenusmonrm.mid=m.id;
第三步:
创建JavaBean(领域模型)和工具类
publicclassUser{
privateStringname;
privateStringid;
privateStringpwd;
连接数据库的工具类:
第三步:
设计界面的
第四步:
实现用户登录
分包:
提供用户的登录,退出修改
Cn.itcast.user.
userServlet
service
userService
dao
userDao
菜单
Cn.itcast.menu
MenuServlet
MenuService
MenuDao
角色
对主页面来只有Servvlet没有service,调用别的service实现。
Cn.itcast.main
MainServlet
(没有Service)
第五步:
开发登录页面
urlvalue='/UserServlet? cmd=login'/>"method="post"> Name: pwd: 第六步: 开发整个的usre包 Cn.itcast.user. userServlet service userService dao userDao 第七步: 实菜单的查询功能 菜单是菜单的功能包。 主功能,有自己的servvlet-MainServvlet 第八步: 使用过虑器验证/jsp/* 这只是第一步,只是验证用户有没有访问的凭证。 认证. 第九步: 验证 packagecn.itcast.filter; importjava.io.IOException; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; importjavax.servlet.http.HttpServletRequest; importmons.dbutils.QueryRunner; importmons.dbutils.handlers.ScalarHandler; importcn.itcast.domain.User; importcn.itcast.utils.DataSourceUtils; publicclassAuthFilterimplementsFilter{ publicvoidinit(FilterConfigfilterConfig)throwsServletException{ //TODOAuto-generatedmethodstub } publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ //获取uri HttpServletRequestreq=(HttpServletRequest)request; Stringuri=req.getRequestURI();//Http: //localhost: 8080/day20/jsps/role.jsp->day20/jsps/role.jsp uri=uri.replace(req.getContextPath(),""); //组成sql Stringsql="SELECTCOUNT (1)"+ "FROMmenusmINNERJOINrolemenurmONm.id=rm.mid"+ "INNERJOINrolesrONr.id=rm.rid"+ "INNERJOINroleuserruONr.id=ru.rid"+ "WHEREru.uid=? ANDurl=? "; //取到用户的id Useruser=(User)req.getSession().getAttribute("user"); try{ QueryRunnerrun=newQueryRunner(DataSourceUtils.getDatasSource()); Objecto=run.query(sql,newScalarHandler(),user.getId(),uri); intsize=Integer.parseInt(o.toString()); if(size==0){ System.err.println("你没有权限...."); }else{ chain.doFilter(req,response); } }catch(Exceptione){ } } publicvoiddestroy(){ //TODOAuto-generatedmethodstub } } 流程图 以下是认证(检查一个在Sesion中是否有usre),验证(是否具有某个资源的访问的权限: ) 登录过程: 显示菜单的过程: 4、监听器 监听器存在以下对象 监听者: XxxxxListener-所的监听者是的接口。 被监听者: 任意对象都可以成为被监听者-早已经存在。 监听到的事件: XxxxEvent-永远是一个具体类,用来放监听到的数据 里面都有一个方法叫getSource()–返回的是监听到对象。 1、观察者模式 packagecn.itcast.demo; publicclassMyFrameextendsJFrame{ publicMyFrame(){ JButtonbtn=newJButton("你好"); System.err.println("btn: is: "+btn.hashCode()); btn.addActionListener(newMyListener()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //获取容器 Containercon=getContentPane(); //设置布局 con.setLayout(newFlowLayout()); con.add(btn); setSize(300,300); setVisible(true); } publicstaticvoidmain(String[]args){ newMyFrame(); } //实现一个监听者 classMyListenerimplementsActionListener{ //监听方法 publicvoidactionPerformed(ActionEvente){ System.err.println("我监听到了: "+e.getSource().hashCode()); } } } 模拟一个观察者模式: 观察某人跑步这个事件: packagecn.itcast.demo; publicclassTestObersver{ publicstaticvoidmain(String[]args){ Personperson=newPerson();//声明被观察者 System.err.println("pp: "+person); person.addPersonListener(newPersonListener(){ publicvoidrunning(PersonEventpe){ System.err.println("你正在跑....."+pe.getSource()); thrownewRuntimeException("他跑了。 。 。 "); } }); person.run(); } } classPerson{ privatePersonListenerpl; publicvoidaddPersonListener(PersonListenerpl){ this.pl=pl; } publicvoidrun(){ if(pl! =null){ pl.running(newPersonEvent(this)); } System.err.println("我正在跑步......"); } } interfacePersonListener{ voidrunning(PersonEventpe); } classPersonEvent{ privateObjectsrc; publicPersonEvent(Objectobj){ this.src=obj; } publicObjectgetSource(){ returnsrc; } } 5、在JavaWeb中的监听器分类 在Javaweb中存在三个被监听对象: HttpServletRequest HttpSessoin ServletContext 监听者 被监听者 监听到事件对象 HttpSessionActivationListener HttpSession–监听HttpSession活化和顿化。 HttpSessionEvent HttpSessionAttributeListener HttpSession–监听session的属性变化的。 S.setAttributee(); HttpSessionBindingEvent HttpSessionBindingListener HttpSession-监听哪一个对象,绑定到了session上。 S.setAtrri(name,User); HttpSessionListener HttpSesion–监听sessioin创建销毁 HttpSessionEvent ServletContextAttributeListener ServletContext–属性变化的 ServletContextListener servletContext创建销毁 ServletRequestListener-serlvetRequestAttibuteListner Rrequest-创建销毁 实现一个监听器HttpServletRequest的创建销毁 第一步: 实现一个类: packagecn.itcast.listener; importjavax.servlet.ServletRequestEvent; importjavax.servlet.ServletRequestListener; publicclassRequestListenerimplementsServletRequestListener{ publicvoidrequestDestroyed(ServletRequestEventsre){ System.err.println("request销毁了: "); Objecto=sre.getSource(); System.err.println("这个ois: "+o);//apache.RequestFaced@22222 } publicvoidrequestInitialized(ServletRequestEventsre){ System.err.println("request创建了: "); Objecto=sre.getSource(); System.err.println("这个o是: "+o);//apache.RequestFaced@22222 } } 第二步: 必须要配置到web.xml 说明: 1: 配置一个Listener只要求提供类名就可以了。 2: 在tomcat启动时,会自动的初始化这个监听器类。 3: tomcat创建的Listner,Serlvet,Filter都是单列的. 3、在线人数 只要有人访问本站点,成功创建一个Session就是一个会话,一个会话就是一个在线人数。 用HttpSSessionListener来监听Session的创建。 第一步: packagecn.itcast.listener; importjava.util.ArrayList; importjava.util.List; importjavax.servlet.ServletContext; importjavax.servlet.http.HttpSession; importjavax.servlet.http.HttpSessionEvent; importjavax.servlet.http.HttpSessionListener; /** *以下实现在线人数的统计 */ publicclassMySessionListenerimplementsHttpSessionListener{ privateIntegeronline=1; //request.getSession(); publicvoidsessionCreated(HttpSessionEventse){ System.err.println("有人访问本网点了"); HttpSessionhs1=(HttpSession)se.getSource(); HttpSessionhs2=se.getSession(); System.err.println("hs1: "+hs1.getId()+","+hs2.getId()+",ip: "); //获取整个域的对象 ServletContextsc=se.getSession().getServletContext(); sc.setAttribute("online",online++); //将所有session放到servletContext //先从application获取所有已经维护的sesison List if(list==null){//第一个访问的人 list=newArrayList sc.setAttribute("sessions",list); } list.add(hs2); } //过期(30),s.invalidate(); publicvoidsessionDestroyed(HttpSessionEventse){ System.err.println("有人退出了..."+se.getSession().getId()); ServletContextsc=se.getSession().getServletContext(); sc.setAttribute("online",online--); } } 6、监听seession中的属性变化的 Session.setAttribute(“name”,”Jack”);==>添加新的属性 Seession.setAttribute(“name”,”Rose”)==>replace重新设置name值。 Session.removeAttribute(“name”)=>删除某个属性 HttpSessionAttributeListener void attributeAdded(HttpSessionBindingEvent se)Session.setAttribute(“name”,”Jack”);==>添加新的属性 Notificationthatanattributehasbeenaddedtoasession. void attributeRemoved(HttpSessionBindingEvent se)Session.removeAttribute(“name”)=>删除某个属性 Notificationthatanattributehasbeenremovedfromasession. void attributeReplaced(HttpSessionBindingEvent se)Seession.setAttribute(“name”,”Rose”)==>replace重新设置name值。 Notificationthatanattributehasbeenreplacedinasession. packagecn.itcast.listener; importjavax.servlet.http.HttpSession; importjavax.servlet.http.HttpSes
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day20 用户 登录 观察者 模式