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源码
---->更新注销,注销的效果可以在列表中观察。
Struts2+DAO层实现实例03——添加监听器跟踪用户行为的更多相关文章
- Struts2+DAO层实现实例02——搭建DAO基本框架并与Struts2组合
实例内容 创建DAO(Data Access Oject)接口:BaseDAO 创建其实例化类:UserDAO 用于获取数据库struts中的userinfo表中的内容 创建User的Java Bea ...
- Struts2+DAO层实现实例01——搭建Struts2基本框架
实例内容 利用Strust2实现一个登陆+注册功能的登陆系统. 实现基础流程:
- 系统管理模块_部门管理_改进_抽取添加与修改JSP页面中的公共代码_在显示层抽取BaseAction_合并Service层与Dao层
系统管理模块_部门管理_改进1:抽取添加与修改JSP页面中的公共代码 commons.jspf <%@ page language="java" import="j ...
- 033医疗项目-模块三:药品供应商目录模块——供货商药品目录t添加查询功能----------Dao层和Service层和Action层和调试
什么叫做供货商药品目录t添加查询功能?就是说我们前面的博客里面不是说供货商登录后看到了自己供应的药品了么如下: 现在供货商想要往里面添加别的药品,那么这个药品的来源就是卫生局提供的那个Ypxx表(药品 ...
- DAO层注入HibernateTemplate的两种方式
-------------------------siwuxie095 DAO 层注入 HibernateTemplat ...
- [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...
- 01 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之业务分析与DAO层
作者:nnngu 项目源代码:https://github.com/nnngu/nguSeckill 这是一个整合IDEA+Maven+SSM框架的高并发的商品秒杀项目.我们将分为以下几篇文章来进行详 ...
- ssh_maven的搭建之dao层的开发
之前都是使用我们传统的方式进行引入jar包,现在我们使用maven进行管理依赖,这样,我们的jar就不需要我们进行管理,而且,我们的maven还可以进行项目构建,一个项目从编写源代码到编译,测试,运行 ...
- 给dao层注入jdbcTemplate时的一个强行bug(jdbcDaoSupport不要随便用!用了要记得!)
记录Dao层一个鱼唇至极的错误 这一天我在使用Spring的进行注解配置项目时, 我的Idea给我抛了一个如下的错误: Exception in thread "main" org ...
随机推荐
- MyBatis简单了解
MyBatis 是什么? MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 码,并提供了一个简单易用的 AP ...
- 第29章 电容触摸屏—触摸画板—零死角玩转STM32-F429系列
第29章 电容触摸屏—触摸画板 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- 转 IOS7开发错误收集
转自:http://blog.csdn.net/smallsky_keke/article/details/16117653 1. fatal error: file '/Applications/X ...
- datatable 单元格默认文本
在列字段中添加属性:"defaultContent": "-"
- HTML5--混合布局
1.先上效果图,大家来看看 2.代码如下: <!doctype html> <meta charset='utf-8' content='text/html' /> <h ...
- swoole中swoole_timer_tick回调函数使用对象方法
swoole_timer_tick的回调函数无法使用类似于array($this, 'method')来调用对象方法,所以我用一下方法变通了一下来调用 swoole_timer_tick(1000, ...
- 实用jquery插件
jquery toast 一个弹窗插件 jquery.form.min.js 一个Ajax表单插件
- 笔记-pyrhon-lib-requests
笔记-pyrhon-lib-requests 1. 简介 Requests is the only Non-GMO HTTP library for Python, safe for hum ...
- Linux命令、权限
一.新建用户natasha,uid为1000,gid为555,备注信息为“master”: groupadd -g 555 natasha useradd -u 1000 -g 555 -c mast ...
- JavaSE——javac、javap、jad
一.javac 用法:javac <选项> <源文件> 其中,可能的选项包括: -help 帮助信息 -g ...