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