Struts2+DAO层实现实例03——添加监听器跟踪用户行为

实例说明

  根据上两次的成品进行二次加工。

  加入Listener,监听用户的登陆注销情况。

所用知识说明

  采用SessionBindingListener对Session进行监听。

  同时,Action中获取Application,Session,request的方法(在此只列出一种)更多方法

    public class LoginAction {  
        private Map request;  
        private Map session;  
        private Map application;  
          
        public String execute() {  
            request = (Map)ActionContext.getContext().get("request");  
            session = ActionContext.getContext().getSession();  
            application = ActionContext.getContext().getApplication();  
            request.put("username1", "jingjing1");  
            session.put("username2", "jingjing2");  
            application.put("username3", "jingjing3");  
            return "success";  
        }  
    }  

 代码实例

  登陆控制UserManagment

package UserBlock;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import javafx.application.Application;
import org.apache.struts2.views.util.ContextUtil;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import java.util.ArrayList;
import java.util.Map;

/**
 * Servlet监听器,控制记录用户的登陆注销信息
 * Created by Richard on 2017/6/16.
 */
public class UserManagment {
    class Userlistener implements HttpSessionBindingListener{
        private  String username;


        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }


        @Override
        public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
                ActionContext context = ActionContext.getContext();
                Map application = context.getApplication();
                ArrayList online= (ArrayList) application.get("online");
            if(online==null){
                    online=new ArrayList();
                }
            online.add(username);
            application.put("online",online);
        }

        @Override
        public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
            ActionContext context = ActionContext.getContext();
            Map application = context.getApplication();
            ArrayList online= (ArrayList) application.get("online");
            online.remove(username);
        }


    }

    /*
            登陆
                首先判别是否登陆
                已经登陆---->return
                没有登陆---->获取对应的Session,存入对应用户名的listener
     */

    public void login(String username){
        if(islogin(username)){
            return;
        }else{
            Userlistener newUser=new Userlistener();
            newUser.setUsername(username);
            ActionContext actionContext=ActionContext.getContext();
            Map session=actionContext.getSession();
            session.put("username",newUser);
        }

    }

    /*
            判断是否登陆:
                判别条件Session中是否有对应的该用户名的Listener
                有--->已经登陆,未注销
                无--->没有登陆
     */
    public  boolean islogin(String username){
        ActionContext actionContext=ActionContext.getContext();
        Map session=actionContext.getSession();
        Userlistener judge= (Userlistener) session.get("username");
        if(judge!=null){
            return true;
        }else {
            return false;
        }
    }

    /*
              注销
                    首先判断是否登陆
                    已经登陆--->移除Listener--->true
                    没有登陆--->false

     */

    public boolean logoff(String username){
        if(islogin(username)){
            ActionContext actionContext=ActionContext.getContext();
            Map session=actionContext.getSession();
            session.remove(username);
            return true;
        }else {
            return false;
        }
    }
    /*
            人数统计
                 返回Session中List的Size。
     */

    public int returnNum(){
        ActionContext actionContext=ActionContext.getContext();
        Map session=actionContext.getSession();
        ArrayList online= (ArrayList) session.get("online");
        if(online==null){
            online=new ArrayList();
        }
        return online.size();
    }

    /*
            list返回
     */
    public ArrayList  returnlist(){
        ActionContext actionContext=ActionContext.getContext();
        Map session=actionContext.getSession();
        ArrayList online= (ArrayList) session.get("online");
        if(online==null){
            online=new ArrayList();
        }
        return online;
    }
}

主页in.jsp

<%--
  Created by IntelliJ IDEA.
  User: Richard
  Date: 2017/6/16
  Time: 21:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
<h1>WelCome to My Struts Page</h1>
<hr>
当前登录的用户:${param.username}<br>
<hr>
当前所有登陆的用户:
<table border=1 width=200>
    <s:iterator value="#application.online" var="user">
        <tr <s:if test="#user.odd"> style="background-color: dimgray"  </s:if> >
            <td><s:property value="#user.count"></s:property> </td>
            <td><s:property value="#user"></s:property></td>
        </tr>
    </s:iterator>

</table>

<a href="login.jsp">注销</a>
</body>
</html>

Action:

package UserBlock;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.ArrayList;
import java.util.Map;
import java.util.logging.LogManager;

/**
 * Created by Richard on 2017/6/16.
 * 继承ActionSupport实现一个Action
 * 登陆界面通过loginuser.action调用login()方法来处理数据
 *          login()方法中通过ActionContext调用Session对象,存入输入错误的数据
 *          通过addActionMessage()方法向页面输出相关信息
 * 注册页面通过reguser.action调用reg()方法来处理数据
 */
public class UserAction extends ActionSupport {
    private String INDEX="index";
    private String LOGIN="login";
    private  String REG="register";
    private String username;
    private String password;
    private String compassword;
    private UserDao user;
    private UserManagment managment;

    public String getCompassword() {
        return compassword;
    }

    public void setCompassword(String compassword) {
        this.compassword = compassword;
    }



    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public String login(){
        try{
            managment=new UserManagment();
            user=new UserDao();
            ArrayList result=user.up_select(username);
            if(result.size()>0){
                User aim= (User) result.get(0);
                if(aim.getPassword().equals(password)){
                    /*登陆成功*/
                    managment.login(username);
                    return INDEX;
                }else{
                    ActionContext applicton=ActionContext.getContext();
                    Map session=applicton.getSession();
                    int count;
                    if(session.get("count")==null){
                        count=0;
                    }else{
                        count= (int) session.get("count");
                    }
                    if(count>=3){
                        addActionMessage("错误次数过多");
                        count=0;
                        session.put("count",count);
                        return LOGIN;
                    }else{
                        count++;
                        addActionMessage("您输入的用户名或密码错误"+count);
                        session.put("count",count);
                        return LOGIN;
                    }

                }
            }else{
                addActionMessage("该用户不存在,已经跳转到注册页面");
                return REG;
            }
        }catch (Exception e){
            addActionError(e.getMessage());
            System.out.println(e.getMessage());
            e.printStackTrace();
            return LOGIN;
        }
    }


    public String reg(){
        try{
            managment=new UserManagment();
            user=new UserDao();
            ArrayList result=user.up_select(username);
            if(result.size()>0)
            {
                addActionMessage("该用户已经存在");
                return REG;
            }
            else{
                if(user.insert(username,password)){
                    managment.login(username);
                    return INDEX;
                }else{
                    addActionMessage("发生未知错误,请重试!");
                    return REG;
                }

            }
        }catch (Exception e){
                addActionError(e.getMessage());
                return REG;
        }
    }
}

 Git源码

  ---->更新注销,注销的效果可以在列表中观察。 

       ----->程序源码

posted @ 2017-06-23 14:29  Rekent  阅读(297)  评论(0编辑  收藏  举报