struts做的记录当前在线用户,不可重复登录,并且可对在线用户进行强制下线
2012-09-06 00:59
281 查看
本文主要是做了一个登录的简单实现功能,其中的实体类,管理类都是之前我那个学生信息管理系统的 大家翻翻以前的文章应该可以找到,这里 我还是重新发个完整的。
struts的配置我就不说了,在上一篇文章做了详细说明了。
先给大家发一张例子各种包的截图,方便大家一目了然的知道例子中的基本包(com.test是我测试代码用的 大家可以无视掉)
![](http://img.my.csdn.net/uploads/201209/06/1346863191_3860.jpg)
一、com.action包中的类 action作为中间层,和V层之间进行交互
①LoginAction.java
②LoginOutAction.java
二、com.control包中的类 监听器负责处理session
①SysListener.java
三、com.jdbc.entity包中的类
①UserInfoEntity.java 用户实体类
四、com.jdbc.manager
①SchoolManager.java 我直接把以前的拷贝过来 。大家只看用户的就行了
五、com.jdbc.service包中的类
①Manager.java 同样也是拷贝的 这是抽出来的方法,供项目中的其他类进行使用
②UserInfoService.java
六、com.jdbc.tool包中的类 (连接池)
①DBHelper.java
七、struts.xml
八、sys.xml(全局结果配置)
九、index.jsp
十、welcome.jsp
简单的实现用户不能重复登录,强制下线的功能,例子中肯定有很多bug,很多细节也没有考虑。刚学的struts大家多多指教。
struts的配置我就不说了,在上一篇文章做了详细说明了。
先给大家发一张例子各种包的截图,方便大家一目了然的知道例子中的基本包(com.test是我测试代码用的 大家可以无视掉)
![](http://img.my.csdn.net/uploads/201209/06/1346863191_3860.jpg)
一、com.action包中的类 action作为中间层,和V层之间进行交互
①LoginAction.java
package com.action; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.jdbc.entity.UserInfoEntity; import com.jdbc.manager.SchoolManager; import com.opensymphony.xwork2.ActionContext; public class LoginAction { private UserInfoEntity user; public UserInfoEntity getUser() { return user; } public void setUser(UserInfoEntity user) { this.user = user; } public LoginAction() { } public String execute(){ ActionContext act=ActionContext.getContext(); Map appmap=act.getApplication(); HttpSession session=ServletActionContext.getRequest().getSession(); Map<UserInfoEntity, HttpSession> uol=(Map<UserInfoEntity, HttpSession>) appmap.get("useronline"); if(uol==null){ uol=new HashMap<UserInfoEntity, HttpSession>(); appmap.put("useronline",uol); } Set<UserInfoEntity> keyset=uol.keySet(); for (UserInfoEntity user: keyset) { if(user.getLogname().equals(this.user.getLogname())){ return "unsuccess"; } } user=SchoolManager.checkLogin(user); if(user==null){ return "unsuccess"; } act.getSession().put("user", this.user); uol.put(this.user,session); return (user!=null)?"success":"unsuccess"; } }
②LoginOutAction.java
package com.action; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpSession; import com.jdbc.entity.UserInfoEntity; import com.opensymphony.xwork2.ActionContext; public class LoginOutAction { private String sessionid; public String getSessionid() { return sessionid; } public void setSessionid(String sessionid) { this.sessionid = sessionid; } public LoginOutAction() { // TODO Auto-generated constructor stub } public String execute(){ ActionContext act=ActionContext.getContext(); Map appmap=act.getApplication(); Map<UserInfoEntity, HttpSession> uol=(Map<UserInfoEntity, HttpSession>) appmap.get("useronline"); Set<UserInfoEntity> keyset=uol.keySet(); Iterator<UserInfoEntity> it=keyset.iterator(); while(it.hasNext()){ UserInfoEntity key=it.next(); HttpSession session=uol.get(key); if(session.getId().equals(sessionid)){ session.invalidate(); it.remove(); } } // HashMap<String, HttpSession> sessionmap=(HashMap<String, HttpSession>) appmap.get("sessionmap"); // sessionmap.get(sessionid).invalidate(); return "success"; } }
二、com.control包中的类 监听器负责处理session
①SysListener.java
package com.control; import java.util.HashMap; import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SysListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent se) { HttpSession session=se.getSession(); ServletContext application=session.getServletContext(); HashMap<String,HttpSession> sessionmap=(HashMap<String, HttpSession>) application.getAttribute("sessionmap"); if(sessionmap==null){ sessionmap=new HashMap<String,HttpSession>(); application.setAttribute("sessionmap", sessionmap); } sessionmap.put(session.getId(),session); } public void sessionDestroyed(HttpSessionEvent se) { HttpSession session=se.getSession(); ServletContext application=session.getServletContext(); HashMap<String,HttpSession> sessionmap=(HashMap<String, HttpSession>) application.getAttribute("sessionmap"); if(sessionmap==null){ sessionmap=new HashMap<String,HttpSession>(); } session.removeAttribute(session.getId()); } }
三、com.jdbc.entity包中的类
①UserInfoEntity.java 用户实体类
package com.jdbc.entity; import java.math.BigDecimal; import java.sql.Timestamp; import com.jdbc.manager.SchoolManager; public class UserInfoEntity { private BigDecimal userid; private String logname; private String keyword; private UserTypeEntity usertype; private BigDecimal utstate; private BigDecimal utid; public BigDecimal getUserid() { return userid; } public void setUserid(BigDecimal userid) { this.userid = userid; } public String getLogname() { return logname; } public void setLogname(String logname) { this.logname = logname; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public UserTypeEntity getUsertype() { UserTypeEntity type=SchoolManager.getUserTypeInfoById(utid); if(type!=null){ return this.usertype=type; }else{ return this.usertype; } } public void setUsertype(UserTypeEntity usertype) { this.usertype = usertype; } public BigDecimal getUtstate() { return utstate; } public void setUtstate(BigDecimal utstate) { this.utstate = utstate; } public UserInfoEntity(BigDecimal userid, String logname, String keyword, UserTypeEntity usertype, BigDecimal utstate) { super(); this.userid = userid; this.logname = logname; this.keyword = keyword; this.usertype = usertype; this.utstate = utstate; } public UserInfoEntity(BigDecimal userid, String logname, String keyword, BigDecimal utid, BigDecimal utstate) { super(); this.userid = userid; this.logname = logname; this.keyword = keyword; this.utid=utid; this.utstate = utstate; } public UserInfoEntity() { } }
四、com.jdbc.manager
①SchoolManager.java 我直接把以前的拷贝过来 。大家只看用户的就行了
package com.jdbc.manager; import java.math.BigDecimal; import java.sql.Connection; import java.sql.SQLException; import java.util.List; import com.jdbc.entity.ClassInfoEntity; import com.jdbc.entity.PopEntity; import com.jdbc.entity.StudentEntity; import com.jdbc.entity.TeacherEntity; import com.jdbc.entity.UserInfoEntity; import com.jdbc.entity.UserTypeEntity; import com.jdbc.entity.Ut_and_PopEntity; import com.jdbc.service.ClassInfoService; import com.jdbc.service.PopService; import com.jdbc.service.StudentService; import com.jdbc.service.TeacherService; import com.jdbc.service.UserInfoService; import com.jdbc.service.UserTypeService; import com.jdbc.service.Ut_and_PopService; import com.jdbc.tool.DBHelper; public class SchoolManager { private static TeacherService teacherManager=new TeacherService(); private static ClassInfoService classManager=new ClassInfoService(); private static StudentService studentManager=new StudentService(); private static UserInfoService userManager=new UserInfoService(); private static UserTypeService utManager=new UserTypeService(); private static PopService popManager=new PopService(); private static Ut_and_PopService upManager=new Ut_and_PopService(); /** * 添加新教师信息 * @param entity 添加教师的实体 * @return 成功返回true,失败返回false */ public static boolean addNewTeacherInfo(Object entity){ return teacherManager.insertInfo(entity); } public static boolean delTeacherInfoById(Object id){ return teacherManager.deleteInfo(id); } public static boolean updTeacherInfo(Object entity){ return teacherManager.updateInfo(entity); } public static TeacherEntity getTeacherInfoById(Object id){ return teacherManager.getAllInfoById(id); } public static List<TeacherEntity> getAllTeacherInfo(){ return teacherManager.getAllInfo(); } public static List<TeacherEntity> getAllTeacherInfoByPageSize(int pagesize,int rowcount){ return teacherManager.getAllInfoByPageSize(pagesize, rowcount); } public static int getTeacherPagesize(int rowcount){ return teacherManager.getPageSize(rowcount); } /** * 根据班级ID,删除班级信息 * @param id * @return */ public static boolean addNewClassInfo(Object entity){ return classManager.insertInfo(entity); } public static boolean delClassInfoById(Object id){ return classManager.deleteInfo(id); } public static boolean updClassInfo(Object entity){ return classManager.updateInfo(entity); } public static ClassInfoEntity getClassInfoById(Object id){ return classManager.getAllInfoById(id); } public static List<ClassInfoEntity> getAllClassInfo(){ return classManager.getAllInfo(); } public static List<ClassInfoEntity> getAllClassInfoByPageSize(int pagesize,int rowcount){ return classManager.getAllInfoByPageSize(pagesize, rowcount); } public static int getClassPagesize(int rowcount){ return classManager.getPageSize(rowcount); } //学生信息 public static boolean addNewStudentInfo(Object entity){ return studentManager.insertInfo(entity); } public static boolean delStudentInfoById(Object id){ return studentManager.deleteInfo(id); } public static boolean updStudentInfo(Object entity){ return studentManager.updateInfo(entity); } public static StudentEntity getStudentInfoById(Object id){ return studentManager.getAllInfoById(id); } public static List<StudentEntity> getAllStudentInfo(){ return studentManager.getAllInfo(); } public static List<StudentEntity> getAllStudentInfoByPageSize(int pagesize,int rowcount){ return studentManager.getAllInfoByPageSize(pagesize, rowcount); } public static int getStudentPagesize(int rowcount){ return studentManager.getPageSize(rowcount); } //用户信息 public static boolean addNewUserInfo(Object entity){ return userManager.insertInfo(entity); } public static boolean delUserInfoById(Object id){ return userManager.deleteInfo(id); } public static boolean updUserInfo(Object entity){ return userManager.updateInfo(entity); } public static UserInfoEntity getUserInfoById(Object id){ return userManager.getAllInfoById(id); } public static UserInfoEntity getUserInfoBylogname(Object id){ return userManager.getAllInfoBylogname(id); } public static List<UserInfoEntity> getAllUserInfo(){ return userManager.getAllInfo(); } public static UserInfoEntity checkLogin(UserInfoEntity user){ List<UserInfoEntity> list=userManager.checkLogin(user); return (list!=null&&list.size()>0)?list.get(0):null; } public static List<UserInfoEntity> getAllUserInfoByPageSize(int pagesize,int rowcount){ return userManager.getAllInfoByPageSize(pagesize, rowcount); } public static int getUserPagesize(int rowcount){ return userManager.getPageSize(rowcount); } //用户角色 public static boolean addNewUserTypeInfo(Object entity){ return utManager.insertInfo(entity); } public static boolean delUserTypeInfoById(Object id){ return utManager.deleteInfo(id); } public static boolean updUserTypeInfo(Object entity){ return utManager.updateInfo(entity); } public static UserTypeEntity getUserTypeInfoById(Object id){ return utManager.getAllInfoById(id); } public static List<UserTypeEntity> getAllUserTypeInfo(){ return utManager.getAllInfo(); } //权限 public static PopEntity getPopInfoById(Object id){ return popManager.getAllInfoById(id); } public static List<PopEntity> getAllPopInfo(){ return popManager.getAllInfo(); } //中间表 public static List<Ut_and_PopEntity> getPopByUtid(String utid){ return upManager.getInfoByUtid(utid); } public static boolean addNewUt_and_PopInfo(Object entity){ return upManager.insertInfo(entity); } public static boolean delAllUt_and_PopInfo(Object id){ return upManager.deleteInfo(id); } public static boolean updatePopOfUserType(UserTypeEntity ut,PopEntity[] pops){ Connection con=DBHelper.getConnection(); if(con==null){ return false; } try { con.setAutoCommit(false); upManager.deleteInfoByUtid(con, "utid", ut.getUtid()); for (int i = 0; i < pops.length; i++) { Ut_and_PopEntity up=new Ut_and_PopEntity(ut, pops[i]); upManager.insertInfo(con, up); } con.commit(); return true; } catch (SQLException e) { try { con.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }finally{ DBHelper.closeJDBC(null, null, con); } return false; } }
五、com.jdbc.service包中的类
①Manager.java 同样也是拷贝的 这是抽出来的方法,供项目中的其他类进行使用
package com.jdbc.service; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.jdbc.tool.DBHelper; import com.sun.corba.se.spi.orbutil.fsm.State; public abstract class Manager { public abstract boolean insertInfo(Object entity); public abstract boolean deleteInfo(Object id); public abstract boolean updateInfo(Object entity); public abstract Object getAllInfoById(Object id); public abstract List getAllInfo(); /** * 根据传入的每页行数返回分页数 * @param tname 要分页的表名 * @param rowcount 每页行数 * @return 分页数 */ int getPageSize(String tname,int rowcount){ Connection con=DBHelper.getConnection(); if(con==null){ return -1; } Statement st=null; ResultSet rs=null; try { st=con.createStatement(); rs=st.executeQuery("select count(*) from "+tname); int size=-1; if(rs.next()){ size=rs.getInt(1); if(size%rowcount==0){ return (size/rowcount); } return (size/rowcount)+1; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBHelper.closeJDBC(rs, st, con); } return -1; } /** * 用于父类 封装 子类根据对象属性查询的方法 * @param tname 表名 * @param clname 要查询的列名 * @param clvalue 传入的列名的值 * @param cl 用于 指定 实体类 类文件 * @return 查询结果集封装的数据(实体类对象集合) */ List getInfoByproperty(String tname,String[] clname,String[] clvalue,Class cl){ String sql="select * from "+tname+" where 0=0 "; for (int i = 0; i < clname.length; i++) { sql+=" and "+clname[i]+"=?"; } return this.getAllInfo(sql, clvalue, cl); } /** *用于父类 封装 增删改 的方法,以外部传取connection作为连接(可控制事务) 不需要关闭connection *本方方多用于批处理(结合其他业务一起进行操作) * @param con 外部获取的connection连接 * @param sql 操作的sql指令 * @param args 参数数组 * @return */ boolean updateDB(Connection con,String sql,String[] args){ //获取操作指令装置,并执行sql(可赋值) PreparedStatement ps=null; try { ps=con.prepareStatement(sql); if(args!=null&&args.length>0){ for (int i = 0; i < args.length; i++) { ps.setString(i+1, args[i]); } } return ps.executeUpdate()>0 ? true:false; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBHelper.closeJDBC(null, ps, null); } return false; } /** * 用于父类 封装 增删改 的方法,直接利用重载进行dml的操作(多用于单独执行) * @param sql 操作的sql指令 * @param args 参数数组 * @return */ boolean updateDB(String sql,String[] args){ Connection con=DBHelper.getConnection(); try { return updateDB(con, sql, args); } catch (Exception e) { // TODO: handle exception }finally{ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return false; } /** * 用于父类 封装 查询 的方法,供子类调用。 * @param sql 查询语句(select .......) * @param args 查询条件值(可以为null——基本查询) * @param cl 用于 指定 集合中封装的 实体类 类文件 * @return 查询结果集封装的数据(实体类对象集合) */ List getAllInfo(String sql,String[] args,Class cl){ //获取连接并判断 Connection con=DBHelper.getConnection(); //Connection con=DB_helper.getInstance().getConnection(); if(con==null){ return null; } //获取操作指令装置,并执行sql(可赋值) PreparedStatement ps=null; ResultSet rs=null; try { ps=con.prepareStatement(sql); if(args!=null){ for (int i = 0; i < args.length; i++) { ps.setString(i+1, args[i]); } } rs=ps.executeQuery(); //获取 rs 的源数据,从中得到操作表的 列数 int colcount=rs.getMetaData().getColumnCount(); //准备构造方法所用参数的数组,长度为 表 列数 Object[] canshu=new Object[colcount]; //封装返回值的容器 List list=new ArrayList(); //遍历 所有指定 实体类的构造方法,用 参数数组去获取 实体类 对象(如成功,则列值被封装成 对象 属性值) Object ob=null; //封装返回值的容器 while(rs.next()){ //将一行 表的数据 封装到 参数数组中 for (int i = 0; i < canshu.length; i++) { canshu[i]=rs.getObject(i+1); //可用于查看 Oracle数据库对应的 java 数据类型 //System.out.println(canshu[i].getClass()); } // ob=getObject(cl, canshu); //如成功,则将封装有属性值的对象,放入 list 集合 if(ob==null){ return null; } //如成功,则将封装有属性值的对象,放入 list 集合 list.add(ob); } return new ArrayList(list); } catch (Exception e) { }finally{ DBHelper.closeJDBC(rs, ps, con); } return null; } /** * 用于自动封装 行数据成为 指定类对象的方法 * @param cl 传进返回的实体类型 * @param canshu 进行参数匹配的数组 * @return 实体类型 */ private Object getObject(Class cl,Object[] canshu){ Constructor[] cons=cl.getConstructors(); Object ob=null; for (int i = 0; i < cons.length; i++) { try { ob=cons[i].newInstance(canshu); return ob; } catch (Exception e) { continue; } } return null; } }
②UserInfoService.java
package com.jdbc.service; import java.util.List; import javax.xml.registry.infomodel.User; import com.jdbc.entity.TeacherEntity; import com.jdbc.entity.UserInfoEntity; public class UserInfoService extends Manager{ public int getPageSize(int rowcount){ return this.getPageSize("sa.userinfo", rowcount); } public List<UserInfoEntity> getAllInfoByPageSize(int pagesize,int rowcount){ String sql="select * from (select * from sa.userinfo where userid not in(select * from (select userid from sa.userinfo where rownum<=(?-1)*? order by userid)) order by userid)where rownum<=?"; String[] args=new String[]{pagesize+"",rowcount+"",rowcount+""}; return this.getAllInfo(sql, args, UserInfoEntity.class); } public List<UserInfoEntity> checkLogin(UserInfoEntity user){ return this.getInfoByproperty("sa.userinfo",new String[]{"logname","keyword"},new String[]{user.getLogname(),user.getKeyword()},UserInfoEntity.class); } @Override public boolean deleteInfo(Object id) { String sql="delete from sa.userinfo where userid=?"; return this.updateDB(sql, new String[]{id+""}); } @Override public List getAllInfo() { String sql="select * from sa.userinfo"; return this.getAllInfo(sql, null, UserInfoEntity.class); } @Override public UserInfoEntity getAllInfoById(Object id) { String sql="select * from sa.userinfo where userid=?"; List<UserInfoEntity> list=this.getAllInfo(sql, new String[]{id+""},UserInfoEntity.class); return (list!=null&&list.size()>0)?list.get(0):null; } public UserInfoEntity getAllInfoBylogname(Object logname) { String sql="select * from sa.userinfo where logname=?"; List<UserInfoEntity> list=this.getAllInfo(sql, new String[]{logname+""},UserInfoEntity.class); return (list!=null&&list.size()>0)?list.get(0):null; } @Override public boolean insertInfo(Object entity) { UserInfoEntity user=(UserInfoEntity) entity; String sql="insert into sa.userinfo values(?,?,?,?,?)"; String[] args=new String[]{user.getUserid()+"",user.getLogname(),user.getKeyword(),user.getUsertype().getUtid()+"",user.getUtstate()+""}; return this.updateDB(sql, args); } @Override public boolean updateInfo(Object entity) { UserInfoEntity user=(UserInfoEntity) entity; String sql="update sa.userinfo set keyword=?,utid=?,utstate=? where userid=?"; String[] args=new String[]{user.getKeyword(),user.getUsertype().getUtid()+"",user.getUtstate()+"",user.getUserid()+""}; return this.updateDB(sql, args); } }
六、com.jdbc.tool包中的类 (连接池)
①DBHelper.java
package com.jdbc.tool; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DBHelper { private static ComboPooledDataSource cpds=new ComboPooledDataSource(); //private static OracleDispose od=new OracleDispose("f:/config.properties"); static { try { // 驱动器 cpds.setDriverClass("oracle.jdbc.OracleDriver"); // 数据库url cpds.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:ORCL"); //cpds.setJdbcUrl(od.jdbcurl);通过properties动态获取文件中存储的jdbcurl //用户名 cpds.setUser("sa"); //cpds.setUser(od.username);通过properties动态获取文件中存储的用户名称 //密码 cpds.setPassword("sa"); //cpds.setPassword(od.userpwd);通过properties动态获取文件中存储的用户密码 //初始化连接池的大小 cpds.setInitialPoolSize(30); //最小连接数 cpds.setMinPoolSize(20); //最大连接数 cpds.setMaxPoolSize(100); } catch (PropertyVetoException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 用于数据库的链接 * @return 返回Connection */ public static Connection getConnection(){ try { return cpds.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 用于关闭数据库的关闭 * @param rs ResultSet对象 * @param st Statement对象 * @param con Connection对象 */ public static void closeJDBC(ResultSet rs,Statement st,Connection con){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(st!=null){ try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 用于获取指定表明的列对应JAVA中的数据类型。 * @param tablename 指定的表名 * @return 列数据类型的数组 */ public Class[] getTypeOfJava(String tablename){ Connection con=DBHelper.getConnection(); if(con==null){ return null; } Statement st=null; ResultSet rs=null; Class[] types=null; try { st=con.createStatement(); rs=st.executeQuery("select * from "+tablename); int count=rs.getMetaData().getColumnCount(); types=new Class[count]; for (int i = 0; i < types.length; i++) { types[i]=Class.forName(rs.getMetaData().getColumnClassName(i+1)); } return types; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBHelper.closeJDBC(rs, st, con); } return null; } }
七、struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <include file="sys.xml"></include> <package name="app" extends="sys" namespace="/sysjsp"> <action name="login" class="com.action.LoginAction" > </action> <action name="logout" class="com.action.LoginOutAction"> </action> </package> </struts>
八、sys.xml(全局结果配置)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="sys" extends="struts-default" namespace="" abstract="true"> <global-results> <result name="success">/welcome.jsp</result> <result name="unsuccess">/index.jsp</result> </global-results> </package> </struts>
九、index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <% request.setCharacterEncoding("utf-8"); %> <body> <form action="sysjsp/login" method="post"> 用户名:<input type="text" name="user.logname"><br> 密 码:<input type="text" name="user.keyword"><br/> <input type="submit" value="登录"> </form> </body> </html>
十、welcome.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'b.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 您好:${user.logname },欢迎登录; <br/> <br/> <br/> <c:set var="map" value="${applicationScope.useronline}" scope="page"></c:set> <c:forEach items="${pageScope.map}" var="user"> 用户:${user.key.logname }在线,session编号为:${user.value.id } <a href="sysjsp/logout?sessionid=${user.value.id }">强制下线</a> <hr/> </c:forEach> </body> </html>
简单的实现用户不能重复登录,强制下线的功能,例子中肯定有很多bug,很多细节也没有考虑。刚学的struts大家多多指教。
相关文章推荐
- Java实现用户不可重复登录功能
- Linux下 审计当前登录用户及用户操作历史记录 ERIKXUE 薛忠权
- Linux下查看/管理当前登录用户及用户操作历史记录
- 实现“记录用户登录时间和退出时间,同时记录用户IP,并且要记录用户IP对应的省和城市地址”
- 关于Donews的记忆---将用户单击的列显示为红色,并且用此列对记录进行排序。
- Linux下查看/管理当前登录用户及用户操作历史记录
- .net C# 利用session控制用户重复登录及统计在线用户数解决方案
- Linux下查看/管理当前登录用户及用户操作历史记录
- 用户不可重复登录 java实现
- 单机登录实现思路(强制下线其他用户)
- redhat下查看系统当前登录的用户、更改用户密码、强制踢出用户
- 解决在线用户列表和重复登录
- Linux下查看/管理当前登录用户及用户操作历史记录
- 解决在线用户列表和重复登录
- Linux下查看/管理当前登录用户及用户操作历史记录
- ASP.NET中实现用户不可重复登录
- Oracle查询数据库中当前登录用户所有表的记录数
- Linux下查看/管理当前登录用户及用户操作历史记录
- Linux下查看/管理当前登录用户及用户操作历史记录
- Asp.net MVC4 记录在线用户数及登录时长