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 ...
随机推荐
- 共变导数(Covariant Derivative)
原文链接 导数是指某一点的导数表示了某点上指定函数的变化率. 比如,要确定某物体的速度在某时刻的加速度,就取时间轴上下一时刻的一个微小增量,然后考察速度的增量和时间增量的比值.如果这个比值比较大,说明 ...
- phpmyadmin高级功能尚未完全设置部分功能未激活
1.登录phpmyadmin,点击导入,选择/var/ww/html/phpmyadmin/examples/create_tables.sql并执行 完成后可以看到多出了一个库phpmyadmin. ...
- 五、@property的参数
格式:@property(参数1,参数2)类型 名字: 参数可有可无 如:@property int age; @property (nonatomic,retain) UIButton* btn; ...
- process launch failed: Security
Xcode7/iOS9,真机测试的时候遇到这样的提示 通用-> 描述文件 -> 信任应用
- element-UI动态的循环生成Popover弹出框的方法
父组件:<div class="itemLi" :class="{gray: (salse.flashsaleStatus==3 || salse.flashsal ...
- 1、SpringBoot+MybatisPlus整合
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Servlet的工作原理和生命周期
Servlet的工作原理 . Web服务器加载Servlet:Web服务器启动后,它会根据每个工程的web.xml文件去查找该工程的Servlet,并且找到这些Servlet的Class文件所在的地址 ...
- [干货分享]一篇可能会让你爱上MVVM与ReactiveCocoa的文章
概要 在此工程中,本文将讨论将MVC改造为MVVM需要的一些基本方法,同时会适当穿插部分关于MVVM概念性的讨论!本文最大的意义在于,提供了一种读者可以复现的方式,逐步引出从MVC向MVVM尽可能平滑 ...
- 用FileReader对象获取图片base64代码并预览
MDN中FileReader的详细介绍: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader 用FileReader获取图片base ...
- redis 面试题
https://www.cnblogs.com/ftl1012/p/redisExam.html 1. 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashM ...