监听器应用【统计网站人数、自定义session扫描器、踢人小案例】(修订版)

AI驱动的数据完整性:ECC到S/4HANA迁移 在SAP ECC到S/4HANA的迁移过程中,数据完整性验证是最复杂且关键的挑战之一。本文介绍了一个全面的AI驱动的端到端数据完整性框架,用于对账事务数据并验证数百万条主数据记录和事务记录的完整性。该框架结合了模式映射、自然语言提示到SQL生成、基于LLM的解决方案、大规模数据对账的数据完整性工具、基于云的测试数据管理以及实时Power BI仪表板,为开发者提供了一个可重复、可扩展的工作流程,确保ERP迁移过程中的数据质量。 阅读详情

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。

统计网站在线人数

ps:这个可以使用WebSocket来做,但这里讲解的是监听器,所以这里以监听器来举例子!

分析

我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性。如果没有登陆,那么Session的属性就应该为空。

现在,我们想要统计的是网站的在线人数。我们应该这样做:我们监听是否有新的Session创建了,如果新创建了Sesssion,那么在线人数就应该+1。这个在线人数是整个站点的,所以应该有Context对象保存。

大致思路:

代码

public class CountOnline implements HttpSessionListener {    public void sessionCreated(HttpSessionEvent se) {        //获取得到Context对象,使用Context域对象保存用户在线的个数        ServletContext context = se.getSession().getServletContext();        //直接判断Context对象是否存在这个域,如果存在就人数+1,如果不存在,那么就将属性设置到Context域中        Integer num = (Integer) context.getAttribute("num");        if (num == null) {            context.setAttribute("num", 1);        } else {            num++;            context.setAttribute("num", num);        }    }    public void sessionDestroyed(HttpSessionEvent se) {        ServletContext context = se.getSession().getServletContext();        Integer num = (Integer) se.getSession().getAttribute("num");        if (num == null) {            context.setAttribute("num", 1);        } else {            num--;            context.setAttribute("num", num);        }    }}class CountOnline implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent se) {

        //获取得到Context对象,使用Context域对象保存用户在线的个数
        ServletContext context = se.getSession().getServletContext();

        //直接判断Context对象是否存在这个域,如果存在就人数+1,如果不存在,那么就将属性设置到Context域中
        Integer num = (Integer) context.getAttribute("num");

        if (num == null) {
            context.setAttribute("num", 1);
        } else {
            num++;
            context.setAttribute("num", num);
        }
    }
    public void sessionDestroyed(HttpSessionEvent se) {

        ServletContext context = se.getSession().getServletContext();
        Integer num = (Integer) se.getSession().getAttribute("num");

        if (num == null) {
            context.setAttribute("num", 1);
        } else {
            num--;
            context.setAttribute("num", num);
        }
    }
}
在线人数:${num}

测试

我们每使用一个浏览器访问服务器,都会新创建一个Session。那么网站的在线人数就会+1。

使用同一个页面刷新,还是使用的是那个Sesssion,所以网站的在线人数是不会变的。

640?wx_fmt=gif


自定义Session扫描器

我们都知道Session是保存在内存中的,如果Session过多,服务器的压力就会非常大。

但是呢,Session的默认失效时间是30分钟(30分钟没人用才会失效),这造成Seesion可能会过多(没人用也存在内存中,这不是明显浪费吗?)

当然啦,我们可以在web.xml文件中配置Session的生命周期。但是呢,这是由服务器来做的,我嫌它的时间不够准确。(有时候我配置了3分钟,它用4分钟才帮我移除掉Session)

所以,我决定自己用程序手工移除那些长时间没人用的Session。

分析

要想移除长时间没人用的Session,肯定要先拿到全部的Session啦。所以我们使用一个容器来装载站点所有的Session。。

只要Sesssion一创建了,就把Session添加到容器里边。毫无疑问的,我们需要监听Session了。

接着,我们要做的就是隔一段时间就去扫描一下全部Session,如果有Session长时间没使用了,我们就把它从内存中移除。隔一段时间去做某事,这肯定是定时器的任务呀。

定时器应该在服务器一启动的时候,就应该被创建了。因此还需要监听Context

最后,我们还要考虑到并发的问题,如果有人同时访问站点,那么监听Session创建的方法就会被并发访问了。定时器扫描容器的时候,可能是获取不到所有的Session的。

这需要我们做同步

于是乎,我们已经有大致的思路了


代码

public class Listener1 implements ServletContextListener,        HttpSessionListener {    //服务器一启动,就应该创建容器。我们使用的是LinkList(涉及到增删)。容器也应该是线程安全的。    List<HttpSession> list = Collections.synchronizedList(new LinkedList<HttpSession>());    //定义一把锁(Session添加到容器和扫描容器这两个操作应该同步起来)    private Object lock = 1;    public void contextInitialized(ServletContextEvent sce) {        Timer timer = new Timer();        //执行我想要的任务,0秒延时,每10秒执行一次        timer.schedule(new MyTask(list, lock), 0, 10 * 1000);    }    public void sessionCreated(HttpSessionEvent se) {        //只要Session一创建了,就应该添加到容器中        synchronized (lock) {            list.add(se.getSession());        }        System.out.println("Session被创建啦");    }    public void sessionDestroyed(HttpSessionEvent se) {        System.out.println("Session被销毁啦。");    }    public void contextDestroyed(ServletContextEvent sce) {    }}class Listener1 implements ServletContextListener,
        HttpSessionListener 
{



    //服务器一启动,就应该创建容器。我们使用的是LinkList(涉及到增删)。容器也应该是线程安全的。
    List<HttpSession> list = Collections.synchronizedList(new LinkedList<HttpSession>());

    //定义一把锁(Session添加到容器和扫描容器这两个操作应该同步起来)
    private Object lock = 1;

    public void contextInitialized(ServletContextEvent sce) {


        Timer timer = new Timer();
        //执行我想要的任务,0秒延时,每10秒执行一次
        timer.schedule(new MyTask(list, lock), 0, 10 * 1000);

    }
    public void sessionCreated(HttpSessionEvent se) {

        //只要Session一创建了,就应该添加到容器中
        synchronized (lock) {
            list.add(se.getSession());
        }
        System.out.println("Session被创建啦");

    }

    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Session被销毁啦。");
    }
    public void contextDestroyed(ServletContextEvent sce) {

    }
}
/** 在任务中应该扫描容器,容器在监听器上,只能传递进来了。** 要想得到在监听器上的锁,也只能是传递进来** */class MyTask extends TimerTask {    private List<HttpSession> sessions;    private Object lock;    public MyTask(List<HttpSession> sessions, Object lock) {        this.sessions = sessions;        this.lock = lock;    }    @Override    public void run() {        synchronized (lock) {            //遍历容器            for (HttpSession session : sessions) {                //只要15秒没人使用,我就移除它啦                if (System.currentTimeMillis() - session.getLastAccessedTime() > (1000 * 15)) {                    session.invalidate();                    sessions.remove(session);                }            }        }    }}
class MyTask extends TimerTask {

    private List<HttpSession> sessions;
    private Object lock;

    public MyTask(List<HttpSession> sessions, Object lock) {
        this.sessions = sessions;
        this.lock = lock;
    }

    @Override
    public void run() {

        synchronized (lock) {
            //遍历容器
            for (HttpSession session : sessions) {

                //只要15秒没人使用,我就移除它啦
                if (System.currentTimeMillis() - session.getLastAccessedTime() > (1000 * 15)) {
                    session.invalidate();
                    sessions.remove(session);
                }

            }
        }
    }
}

15秒如果Session没有活跃,那么就被删除!

640?wx_fmt=gif


踢人小案列

列出所有的在线用户,后台管理者拥有踢人的权利,点击踢人的超链接,该用户就被注销了。

分析

首先,怎么能列出所有的在线用户呢??一般我们在线用户都是用Session来标记的,所有的在线用户就应该用一个容器来装载所有的Session。。

我们监听Session的是否有属性添加(监听Session的属性有添加、修改、删除三个方法。如果监听到Session添加了,那么这个肯定是个在线用户!)。

装载Session的容器应该是在Context里边的【属于全站点】,并且容器应该使用Map集合【待会还要通过用户的名字来把用户踢了】

思路:

代码

public class KickPerson implements HttpSessionAttributeListener {    // Public constructor is required by servlet spec    public KickPerson() {    }    public void attributeAdded(HttpSessionBindingEvent sbe) {        //得到context对象,看看context对象是否有容器装载Session        ServletContext context = sbe.getSession().getServletContext();        //如果没有,就创建一个呗        Map map = (Map) context.getAttribute("map");        if (map == null) {            map = new HashMap();            context.setAttribute("map", map);        }        //---------------------------------------------------------------------------------------        //得到Session属性的值        Object o = sbe.getValue();        //判断属性的内容是否是User对象        if (o instanceof User) {            User user = (User) o;            map.put(user.getUsername(), sbe.getSession());        }    }    public void attributeRemoved(HttpSessionBindingEvent sbe) {      /* This method is called when an attribute         is removed from a session.      */    }    public void attributeReplaced(HttpSessionBindingEvent sbe) {      /* This method is invoked when an attibute         is replaced in a session.      */    }}class KickPerson implements HttpSessionAttributeListener {

    // Public constructor is required by servlet spec
    public KickPerson() {
    }

    public void attributeAdded(HttpSessionBindingEvent sbe) {

        //得到context对象,看看context对象是否有容器装载Session
        ServletContext context = sbe.getSession().getServletContext();

        //如果没有,就创建一个呗
        Map map = (Map) context.getAttribute("map");
        if (map == null) {
            map = new HashMap();
            context.setAttribute("map", map);
        }

        //---------------------------------------------------------------------------------------

        //得到Session属性的值
        Object o = sbe.getValue();

        //判断属性的内容是否是User对象
        if (o instanceof User) {
            User user = (User) o;
            map.put(user.getUsername(), sbe.getSession());
        }
    }

    public void attributeRemoved(HttpSessionBindingEvent sbe) {
      /* This method is called when an attribute
         is removed from a session.
      */

    }

    public void attributeReplaced(HttpSessionBindingEvent sbe) {
      /* This method is invoked when an attibute
         is replaced in a session.
      */

    }
}
<form action="${pageContext.request.contextPath }/LoginServlet" method="post">    用户名:<input type="text" name="username">    <input type="submit" value="登陆"></form>
    用户名:<input type="text" name="username">
    <input type="submit" value="登陆">
</form>
//得到传递过来的数据String username = request.getParameter("username");User user = new User();user.setUsername(username);//标记该用户登陆了!request.getSession().setAttribute("user", user);//提供界面,告诉用户登陆是否成功request.setAttribute("message", "恭喜你,登陆成功了!");request.getRequestDispatcher("/message.jsp").forward(request, response);
String username = request.getParameter("username");

User user = new User();
user.setUsername(username);

//标记该用户登陆了!
request.getSession().setAttribute("user", user);

//提供界面,告诉用户登陆是否成功
request.setAttribute("message", "恭喜你,登陆成功了!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
<c:forEach items="${map}" var="me">    ${me.key} <a href="${pageContext.request.contextPath}/KickPersonServlet?username=${me.key}">踢了他吧</a>    <br></c:forEach>"me">

    ${me.key} <a href="${pageContext.request.contextPath}/KickPersonServlet?username=${me.key}">踢了他吧</a>

    <br>
</c:forEach>
String username = request.getParameter("username");//得到装载所有的Session的容器Map map = (Map) this.getServletContext().getAttribute("map");//通过名字得到SessionHttpSession httpSession = (HttpSession) map.get(username);httpSession.invalidate();map.remove(username);//摧毁完Session后,返回列出在线用户页面request.getRequestDispatcher("/listUser.jsp").forward(request, response);

//得到装载所有的Session的容器
Map map = (Map) this.getServletContext().getAttribute("map");

//通过名字得到Session
HttpSession httpSession = (HttpSession) map.get(username);
httpSession.invalidate();
map.remove(username);

//摧毁完Session后,返回列出在线用户页面
request.getRequestDispatcher("/listUser.jsp").forward(request, response);

测试

使用多个浏览器登陆来模拟在线用户(同一个浏览器使用的都是同一个Session)

640?wx_fmt=gif


监听Seesion的创建和监听Session属性的变化有啥区别???

最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?好看!转发!640


【日志】Prometheus/Loki+Alertmanager+Grafana监控告警 参考文章:匹配写法:https://blog.ossq.cn/2674.html。 阅读详情

相关推荐

信号输入到底要不要接GND?单端与差分输入的接地选择与抗干扰分析

在电子工程与工业现场中,接地是信号完整性的基石。电压本身是相对值,任何测量都需要一个公共参考点,这就是地(GND)在信号输入中的核心作用。单端输入依赖信号源与接收端共地,以GND为基准还原信号;差分输入则直接测量两根信号线之间的差值,天然不依赖本地地电位,因此能有效抑制共模干扰和地环路噪声。实际选型时,需要根据传感器类型、传输距离、地电位差大小权衡:短距离共地良好的场景可用单端,长距离或高干扰环境应优先考虑差分或隔离方案。本文从接地原理出发,结合实际接线与故障排查经验,帮助工程师在PLC、采集卡和传感器链路

weixin_28703507的博客 311

JSP页面统计当前用户访问量

需求:增加记录当前访问量的一个小功能 因为没有后台代码,所以只能在前端JSP页面进行修改,注意本方法不能持久化到数据库 <% //尝试从application中获取 Integer count=(Integer)application.getAttribute("count"); if(count==null){ //设置初始值为0 count = 0; } //访问后进行更新 application.setAttribute("count"

君子藏器于身,待时而动 1203

【机械视觉】Halcon—【二、Halcon算子全面介绍(超详细版)】

Halcon 的算子(operators)按照功能被系统性地划分为多个类别,官方文档中目前(Halcon 22.11 版本)共有 19 个主分类,每个主分类下还有若干子分类。 本人在此对这19个分类的常用核心算子进行了一系列的总结,且本人在文章最后还总结了一些案例经验。 注意: ​​​​​​​跨分类调用:某些算子可能在多个分类中,但官方文档中会明确其主分类。 例如: read_image(文件操作)常被其他分类(如图像处理)的示例调用,但其核心功能是文件读取。

qq_3517289697的博客 3917

Servlet HttpSessionListener监听器统计网站在线人数

在许多网站或者软件应用中都有统计当前在线人数这一功能。在通常情况下,当一个用户进入网站时就会创建一个 HttpSession 对象,而当用户离开网站时,HttpSession 对象就会被销毁。

unber的博客 1126

忆阻器(二)——忆阻模拟器

除了真实的器件,我们也可以用运放和乘法器来搭忆阻模拟器。这节将介绍数学模型、matlab仿真及multisim仿真。 一、数学模型 忆阻分为磁控和荷控两种,这里介绍三次非线性磁控忆阻模型: {I=W(φ)VW(φ)=a+3bφ2dφdt=V \begin{cases} I=W(\varphi)V \\ W(\varphi)=a+3b \varphi ^2\\ \frac{d \varphi }{dt}=V \end{cases} ⎩⎪⎨⎪⎧​I=W(φ)VW(φ)=a+3bφ2dtdφ​=V​ 这里的WWW

http://www.icfgblog.com/ 1万+

金蝶云ERP远程办公指南:零公网IP实现安全内网穿透访问

本文详细介绍了如何利用内网穿透技术,在无需公网IP和复杂路由器设置的情况下,安全远程访问内网部署的金蝶云ERP系统。通过使用cpolar工具,逐步指导用户创建加密隧道、配置固定域名,并实现管理中心与数据中心的远程登录,有效解决了企业员工在外出或居家办公时的核心业务系统访问难题。

weixin_29229261的博客 269

05统计网站的访问人数

application 相当于整个应用就也是当前的服务器,启动服务器时候这个对象就会产生,但是当关闭服务器的时候这个对象就会销毁, 所对应的数据也就会消失request的范围相当于一次请求, 请求结束了这个范围也就消失了session范围是相当于一次会话,也就是一个用户发送的多次请求之间数据可以共享 ServletContext context = req.getServletContext(...

呀!芝士的博客 350

忍者安全渗透系统(NINJITSU OS V3)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

忍者安全渗透系统(NINJITSU)的安装详细过程,亲测新旧vm版本都可安装,附带下载来源

1万+

java web 统计_java实现页面访问量统计的实例

有时候,我们可能需要统计Web站点上的一个特定页面的访问次数,考虑这样一个场景,你为了宣传一个产品,在某个门户网站花钱做了一个链接,你希望知道产品页面每天的访问量,借此了解广告的效果。要完成上述功能,可以使用ServletContext对象来保存访问的次数。我们知道一个Web应用程序只有一个ServletContext对象,而且该对象可以被Web应用程序中的所有Servlet所访问,因此使用Ser...

weixin_31754209的博客 2402

【Android 11】使用Android Studio调试系统应用之Settings移植(五):编译Settings 模块、解决编译错误

基于Andorid 11,系列第5篇文章,本章开始,终于轮到解决正主Settings的编译问题了,使用android studio编译出Settings.apk,能看到这一章的同学,也着实不容易了,再接再厉

上周的博客 3919

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6819

统计在线人数访问人数

监听器 统计访问某个站点的访问总人数和在线人数 访问总人数:用户登录人数(没有减的情况) 可能存在同一浏览器 同一站点 不同用户的登录(一个用户,多账号)–可以用session,但当服务器关闭的时候会清零,所以用context比较合理 不同用户在不同电脑上登录 – 适合用context 在线人数:取决于用户是否注销登录,session比较合理 用什么监听器 request:请求频率太高...

AYuan for Java 540

世界职业院校技能大赛商贸赛道项目参考逐字稿一

商贸赛道“智选优品”—基于大数据与AI驱动的跨境电商平台项目参考逐字稿您订阅本专栏后即可`永久享有所有文章的查阅权`,希望我们更新的参考资料能帮助到您。如果您需要我们团队赋能培训可联系我(企业一线工程师及国一获奖选手在线培训支持:每周直播精讲(可回放,支持弹幕答疑)、代码Review+技术售后(拉群随时问,12h内响应)、④路演PPT+答辩话术一对一点评,评委视角提前彩排、适合:中职/高职赛项选手、指导老师带队、校企工作室、整校打包另谈(可开发票))

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1587

php session统计登录在线人数_监听器应用【统计网站人数、自定义session扫描器、踢人小案例】(修订版)...

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。统计网站在线人数ps:这个可以使用WebSocket来做,但这里讲解的是监听器,所以这里以监听器来举例子!分析我们在网站中一般使用Session...

weixin_39815879的博客 339

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

session失效后怎么获取getattribute_监听器应用【统计网站人数、自定义session扫描器、踢人小案例】(修订版)...

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。统计网站在线人数ps:这个可以使用WebSocket来做,但这里讲解的是监听器,所以这里以监听器来举例子!分析我们在网站中一般使用Session...

weixin_42205405的博客 125

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

监听器应用【统计网站人数、自定义session扫描器、踢人小案例】

从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性。如果没有登陆,那么Session的属性就应该为空。 现在,我们想要统计的是网站的在线人数。我们应该这样做:我们监听是否有新的Session创建了,如果...

awxj68104的博客 135

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

监听器【第二篇应用】

从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。统计网站在线人数分析我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性。如果没有登陆,那么Session的属性就应该为空。现在,我们想要统计的是网站的在线人数。我们应该这样做:我们监听是否有新的Session创建了,如果新创建了Sesssi

zhong_fucheng 627

监听器第二篇【统计网站人数、自定义session扫描器、踢人小案例】

tags: Filter&amp;Listener 从第一篇已经讲解过了监听器的基本概念,以及Servlet各种的监听器。这篇博文主要讲解的是监听器的应用。 统计网站在线人数 分析 我们在网站中一般使用Session来标识某用户是否登陆了,如果登陆了,就在Session域中保存相对应的属性。如果没有登陆,那么Session的属性就应该为空。 现在,我们想要统计的是网站的在线人数。我们应该这样做...

weixin_34060299的博客 118

监听器的理解

监听器的理解 监听器就是结合servlet使用的 什么是监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。 为什么我们要使用监听器? 监听器可以用来检测网站的在线人数,统计网站的访问量等等! 监听器组件 监听器涉及三个组件:事件源,事件对象,事件监听器 当事件源发生某个动作的时候,它会调用事件监听器的方法,并在调用事件监听器方法的时候把事件对象传递进去。 我们在监听器中就可以通过

liulang68的博客 1596

Workbuddy接入微信的正确路径:企业微信API合规集成指南

企业微信API是微信生态中唯一面向开发者开放的稳定、可商用接口,其核心原理是通过OAuth2.0鉴权与Webhook事件回调实现系统间安全通信。相比已被封禁的个人微信非官方协议,企业微信API提供高可用性、可审计性和长期技术支持,技术价值在于规避封号风险、降低维护成本并保障业务连续性。典型应用场景包括客户咨询自动分发、订单状态同步、审批流程触发等智能工作流。本文详解从企业微信应用创建、可信域名配置到Workbuddy三层事件处理的完整落地实践。

weixin_33913332的博客 170

Java Web基础入门第八十二讲 Listener(监听器)——监听器在开发中的应用(一)

监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用。统计当前在线人数在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听器技术来实现这个功能了。 编写监听器,代码如下:public class CountNumListener implements HttpSessionListener { @Override

李阿昀的博客 1571

Java监听器案例

统计当前在线用户 - 创建监听器类 1 public class CountNumListener implements HttpSessionListener { 2 @Override 3 public void sessionCreated(HttpSessionEvent se) { 4 //通过事件对象获取ServletCon...

weixin_34406086的博客 232
上一篇: 过滤器监听器面试题都在这里(修订版)
下一篇: 监听器入门看这篇就够了(修订版)
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值