day20用户登录观察者模式.docx

上传人:b****7 文档编号:8804107 上传时间:2023-02-01 格式:DOCX 页数:25 大小:132.08KB
下载 相关 举报
day20用户登录观察者模式.docx_第1页
第1页 / 共25页
day20用户登录观察者模式.docx_第2页
第2页 / 共25页
day20用户登录观察者模式.docx_第3页
第3页 / 共25页
day20用户登录观察者模式.docx_第4页
第4页 / 共25页
day20用户登录观察者模式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

day20用户登录观察者模式.docx

《day20用户登录观察者模式.docx》由会员分享,可在线阅读,更多相关《day20用户登录观察者模式.docx(25页珍藏版)》请在冰豆网上搜索。

day20用户登录观察者模式.docx

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

cn.itcast.listener.RequestListener

说明:

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

Listlist=(List)sc.getAttribute("sessions");

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1