day20用户登录观察者模式Word格式文档下载.docx
- 文档编号:21940273
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:25
- 大小:132.08KB
day20用户登录观察者模式Word格式文档下载.docx
《day20用户登录观察者模式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《day20用户登录观察者模式Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
3、要求不同的用户登录以后可以看到不同的菜单。
(后台可以实现对用户菜单的管理。
)
第一步:
分析数据结构
1:
用户表
表名:
users
列名
类型
说明
id
Varchar(32)
主键
name
Varchar(30)
2:
角色表
3:
菜单表
E-R图(Entry-Relationship实体关系图)
第二步:
先写入表中几行数据进行基本分析
insertintousersvalues('
U001'
'
Jack'
1234'
);
U002'
张三'
4321'
U003'
Tom'
1111'
insertintorolesvalues('
R001'
管理员'
'
R002'
教师'
insertintoroleuservalues('
insertintomenusvalues('
M001'
系统管理'
/sys.jsp'
M002'
用户管理'
/user.jsp'
M003'
角色管理'
/role.jsp'
insertintorolemenuvalues('
/*查询某个拥有某个角色*/
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
innerjoinrolesronru.rid=r.id
innerjoinrolemenurmonr.id=rm.rid
第三步:
创建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)
第五步:
开发登录页面
<
formname="
name"
action="
<
c:
urlvalue='
/UserServlet?
cmd=login'
/>
"
method="
post"
>
Name:
inputtype="
text"
name="
br/>
pwd:
pwd"
<
submit"
<
/form>
第六步:
开发整个的usre包
Cn.itcast.user.
第七步:
实菜单的查询功能
菜单是菜单的功能包。
主功能,有自己的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(){
}
流程图
以下是认证(检查一个在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{
Personperson=newPerson();
//声明被观察者
pp:
+person);
person.addPersonListener(newPersonListener(){
publicvoidrunning(PersonEventpe){
你正在跑....."
+pe.getSource());
thrownewRuntimeException("
他跑了。
。
});
person.run();
classPerson{
privatePersonListenerpl;
publicvoidaddPersonListener(PersonListenerpl){
this.pl=pl;
publicvoidrun(){
if(pl!
=null){
pl.running(newPersonEvent(this));
我正在跑步......"
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){
request销毁了:
Objecto=sre.getSource();
这个ois:
+o);
//apache.RequestFaced@22222
publicvoidrequestInitialized(ServletRequestEventsre){
request创建了:
这个o是:
必须要配置到web.xml
listener>
listener-class>
cn.itcast.listener.RequestListener<
/listener-class>
/listener>
说明:
1:
配置一个Listener只要求提供类名就可以了。
2:
在tomcat启动时,会自动的初始化这个监听器类。
3:
tomcat创建的Listner,Serlvet,Filter都是单列的.
3、在线人数
只要有人访问本站点,成功创建一个Session就是一个会话,一个会话就是一个在线人数。
用HttpSSessionListener来监听Session的创建。
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){
有人访问本网点了"
HttpSessionhs1=(HttpSession)se.getSource();
HttpSessionhs2=se.getSession();
hs1:
+hs1.getId()+"
"
+hs2.getId()+"
ip:
//获取整个域的对象
ServletContextsc=se.getSession().getServletContext();
sc.setAttribute("
online"
online++);
//将所有session放到servletContext
//先从application获取所有已经维护的sesison
List<
HttpSession>
list=(List<
)sc.getAttribute("
sessions"
if(list==null){//第一个访问的人
list=newArrayList<
();
sc.setAttribute("
list);
list.add(hs2);
//过期(30),s.invalidate();
publicvoidsessionDestroyed(HttpSessionEventse){
有人退出了..."
+se.getSession().getId());
online--);
6、监听seession中的属性变化的
Session.setAttribute(“name”,”Jack”);
==>
添加新的属性
Seession.setAttribute(“name”,”Rose”)==>
replace重新设置name值。
Session.removeAttribute(“name”)=>
删除某个属性
void
attributeAdded(HttpSessionBindingEvent
se)Session.setAttribute(“name”,”Jack”);
Notificationthatanattributehasbeenaddedtoasession.
attributeRemoved(HttpSessionBindingEvent
se)Session.removeAttribute(“name”)=>
Notificationthatanattributehasbeenremovedfromasession.
attributeReplaced(HttpSessionBindingEvent
se)Seession.setAttribute(“name”,”Rose”)==>
Notificationthatanattributehasbeenreplacedinasession.
importjavax.servlet.http.HttpSes
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day20 用户 登录 观察者 模式