struts做的记录当前在线用户,不可重复登录,并且可对在线用户进行强制下线

本文主要是做了一个登录的简单实现功能,其中的实体类,管理类都是之前我那个学生信息管理系统的 大家翻翻以前的文章应该可以找到,这里 我还是重新发个完整的。

struts的配置我就不说了,在上一篇文章做了详细说明了。

先给大家发一张例子各种包的截图,方便大家一目了然的知道例子中的基本包(com.test是我测试代码用的 大家可以无视掉)

 

一、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大家多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值