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 ...
随机推荐
- layui table 用法
1.使用模板列 改变样式 获取嵌套数据{ field: '', width: '12%', title: '响应状态', sort: true, templet: function (d) { if ...
- 【洛谷P3390】矩阵快速幂
矩阵快速幂 题目描述 矩阵乘法: A[n*m]*B[m*k]=C[n*k]; C[i][j]=sum(A[i][1~n]+B[1~n][j]) 为了便于赋值和定义,我们定义一个结构体储存矩阵: str ...
- URL中传递JSON数据
有关于JSON如何在前后之间进行传递,转换成对象等操作,请查看 C#Json数据交互 (这篇文章主要介绍了如何转化Json格式的数据,以及如何使用) 我们在URL中传递数据一般都是 XX.asp ...
- C# continue语句
一.C# continue语句 continue语句在循环体中结束本次循环,而重新开始下一次循环. 语法格式如下: continue;二.示例 using System;using System. ...
- 在Linux文件清空的几种方法
在Linux文件清空的几种方法 1.使用重定向的方法 [root@centos7 ~]# du -h test.txt 4.0K test.txt [root@centos7 ~]# > tes ...
- jQuery、Angluar、Avalon对比
最近在慕课网看一些关于avalon的视频,记录下一些笔记及代码实例以便日后自己复习可以用到,另外也可以给不想花时间看视频的小伙伴提供一丝丝帮助 这里主要是做一个简单的todolist 分别用三种不同的 ...
- php生成微信小程序二维码源码
目前有3个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口.第一步:获取 access_token public function getWxAccessToken(){ $appid ...
- Spark Streaming 交互 Kafka的两种方式
一.Spark Streaming连Kafka(重点) 方式一:Receiver方式连:走磁盘 使用High Level API(高阶API)实现Offset自动管理,灵活性差,处理数据时,如果某一时 ...
- Spark调优之JVM调优
一.JVM调优 JVM: 老年代: 存放少量生命周期长的对象,如连接池 年轻代: Spark task执行算子函数自己创建的大量对象 JVM机制: 对象进入java虚拟机之后会放在eden区域和一个s ...
- day1_作业2(三级菜单)--改进版
#!/usr/local/bin/python3 # -*- coding:utf-8 -*- province={ '江苏省':{ '南京市':['秦淮区','玄武区','栖霞区'], '苏州市': ...