JAVA开发笔记

权限管理系统完整教案

一、项目演示

1.1 用户登录

1.2 登录界面

1.3 安全退出

1.4 角色的增删改查

1.5 角色的权限分配

1.6 用户管理

1.7 个人信息

二、MVC 开发模式

三、预备知识JDBC完善

3.1 入门案例

public class Dbutils {
	private static Connection conn;
	private static Properties properties = new Properties();
	//1.获得链接
	static {
		try {
			//1.注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			//2.加载配置文件信息
			//properties.load(new FileInputStream("config/db.properties"));存在硬编码
			properties.load(Dbutils.class.getClassLoader().getResourceAsStream("db.properties"));
			//System.out.println(properties);
			String name = properties.getProperty("jdbc.username");
			String password = properties.getProperty("jdbc.password");
			String url = properties.getProperty("jdbc.url");
			//3.创建链接
			conn = DriverManager.getConnection(url, name, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//2.返回链接
	public static Connection getConnection() {
		return conn;
	}

}

public class Money {
	private int id;
	private String name;
	private int money;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	@Override
	public String toString() {
		return "Money [id=" + id + ", name=" + name + ", money=" + money + "]";
	}
	
}
package com.hckj.privilege.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.hckj.privilege.model.Money;
import com.hckj.privilege.utils.Dbutils;

public class MoneyDao {
	//1.查询所有
	public List<Money> queryAll() {
		Connection conn = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		List<Money> list = new ArrayList<>();
		
		try {
			conn = Dbutils.getConnection();
			String sql = "select * from money";
			preparedStatement = conn.prepareStatement(sql);
			resultSet = preparedStatement.executeQuery();
			while(resultSet.next()) {
				Money money = new Money();
				money.setId(resultSet.getInt("id"));
				money.setName(resultSet.getString("name"));
				money.setMoney(resultSet.getInt("money"));
				list.add(money);
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		} finally {
			try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}
			try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}
			try {conn.close();} catch (SQLException e) {e.printStackTrace();}
		}
		return list;
	}
	public static void main(String[] args) {
		MoneyDao moneyDao = new MoneyDao();
		List<Money> list = moneyDao.queryAll();
		System.out.println(list);
		
	}
}

3.2 jdbc提升 dbutils框架1

public class MoneyDao2 {
	private QueryRunner queryRunner = new QueryRunner();
	public List<Money> queryAll() throws Exception{
		List<Money> list = queryRunner.query(Dbutils.getConnection(), "select * from money",new BeanListHandler<Money>(Money.class));
		return list;
	}
	public static void main(String[] args) throws Exception {
		MoneyDao2 moneyDao2 = new MoneyDao2();
		List<Money> list = moneyDao2.queryAll();
		System.out.println(list);
	}
}

3.3 jdbc提升连接池2

public class Dbutils2 {
	private static DataSource dataSource;
	static {
		try {
			dataSource = new ComboPooledDataSource("hellc3p0");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Connection getConn() throws Exception {
		return dataSource.getConnection();
	}
}

3.4 jdbc提升3解决事务问题

public class Dbutils2 {
	private static DataSource dataSource;
	//1.将本地正在运行的线程与连接绑定
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
	static {
		try {
			//dataSource = new ComboPooledDataSource("hellc3p0");
			dataSource = new ComboPooledDataSource();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//2.获得连接
	public static Connection getConn() throws Exception {
		//2.从本地线程中获取连接
		Connection conn = threadLocal.get();
		if(conn==null) {
			//3.从连接池中取出连接
			conn = dataSource.getConnection();
			//4.将连接绑定到本地线程
			threadLocal.set(conn);
		}
		return conn;
	}
}

public class MoneyServiceImpl implements MoneyService{
	private MoneyDao2 moneyDao2 = new MoneyDao2();
	@Override
	public void zhuanzhang(int userId1, int userId2, int money){
		try {
			//1.开启事务:就是内存的数据不自动刷新到磁盘
			Dbutils2.getConn().setAutoCommit(false);
			moneyDao2.exportMoney(userId1,money);
			//int i= 1/0;
			moneyDao2.importMoney(userId2,money);
			//2.提交事务:把内存上的数据刷到磁盘
			Dbutils2.getConn().commit();
		} catch (Exception e) {
			//1.清空内存的垃圾数据
			try {Dbutils2.getConn().rollback();} catch (Exception e1) {e1.printStackTrace();}
		} 
		
	}
	public static void main(String[] args) throws Exception{
		MoneyService moneyService = new MoneyServiceImpl();
		moneyService.zhuanzhang(1, 2, 10);
	}
	
}
//转出
	public void exportMoney(int userId1, int money) throws Exception {
		queryRunner.update(Dbutils2.getConn(), "update money set money=money-? where id =?", money,userId1);
		
	}
	//转入
	public void importMoney(int userId2, int money) throws Exception {
		queryRunner.update(Dbutils2.getConn(), "update money set money=money+? where id =?", money,userId2);
	}

3.5 jdbc提升4 封装事务

public class Dbutils2 {
	private static DataSource dataSource;
	//1.将本地正在运行的线程与连接绑定
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
	static {
		try {
			//dataSource = new ComboPooledDataSource("hellc3p0");
			dataSource = new ComboPooledDataSource();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//2.获得连接
	public static Connection getConn() throws Exception {
		//2.从本地线程中获取连接
		Connection conn = threadLocal.get();
		if(conn==null) {
			//3.从连接池中取出连接
			conn = dataSource.getConnection();
			//4.将连接绑定到本地线程
			threadLocal.set(conn);
		}
		return conn;
	}
	//3.开启事务
	public static void startTransaction() throws Exception{
		Connection conn = getConn();
		if(conn!=null) {
			conn.setAutoCommit(false);
		}
		
	}
	//4.提交事务
	public static void commit() throws Exception{
		Connection conn = getConn();
		if(conn!=null) {
			conn.commit();
		}
	}
	//5.回滚事务
	public static void rollback() throws Exception{
		Connection conn = getConn();
		if(conn!=null) {
			conn.rollback();
		}
	}
	//6.断开连接
	public static void close() throws Exception{
		Connection conn = getConn();
		if(conn!=null) {
			//从本地线程中移除连接
			threadLocal.remove();
			//将连接还给连接池
			conn.close();
		}
	}
}
@Override
public void zhuanzhang(int userId1, int userId2, int money){
    try {
        //1.开启事务:就是内存的数据不自动刷新到磁盘
        Dbutils2.startTransaction();
        moneyDao2.exportMoney(userId1,money);
        int i= 1/0;
        moneyDao2.importMoney(userId2,money);
        //2.提交事务:把内存上的数据刷到磁盘
        Dbutils2.commit();
    } catch (Exception e) {
        //1.清空内存的垃圾数据
        try {Dbutils2.rollback();} catch (Exception e1) {e1.printStackTrace();}
    } finally {
        try {
            Dbutils2.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
public static void main(String[] args) throws Exception{
    MoneyService moneyService = new MoneyServiceImpl();
    moneyService.zhuanzhang(1, 2, 10);
}

3.6 jdbc 提升5 代理事务

/**
 * 代理服务层的类:生成具有事务的业务类
 *
 */
public class ServiceProxyFactory {
	public static <T> T getProxy(T target) {
		return (T)Proxy.newProxyInstance
				(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				new TransactionHandler(target)
				);
	}
	private static class TransactionHandler<T> implements InvocationHandler{
		private T target;
		public TransactionHandler(T target) {
			this.target = target;
		}
		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			//1.开启事务
			Dbutils2.startTransaction();
			//2.执行目标类的方法
			Object result = null;
			try {
				result = method.invoke(target, args);
			} catch (Exception e) {
				Dbutils2.rollback();
			} 
			//3.提交事务
			Dbutils2.commit();
			return result;
		}
		
	}
}
@Override
public void zhuanzhang(int userId1, int userId2, int money) throws Exception{
    moneyDao2.exportMoney(userId1,money);
    int i= 1/0;
    moneyDao2.importMoney(userId2,money);	
}
public static void main(String[] args) throws Exception{
    MoneyService moneyService = ServiceProxyFactory.getProxy(new MoneyServiceImpl());
    moneyService.zhuanzhang(1, 2, 10);
}
	

四、预备知识servlet的完善

4.1 入门使用

@WebServlet("/userAction.action")
public class UserAction extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		resp.getWriter().print("响应数据");
	}
}

4.2 servlet完善

思考:上面代码出现问题:一个类只能有一个service方法处理业务;但是一个UserAction,可能有登录、退出、添加、删除等多个操作需要多个service方法完成。

@WebServlet("/userAction.action")
public class UserAction extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		String method = req.getParameter("method");
		if("add".equals(method)) {
			add(req,resp);
		}else if("del".equals(method)) {
			del(req,resp);
		}
	}
	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("删除业务");
	}
	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("添加业务");
	}
	
}

4.3提取BasicServlet完善

public class BasicServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String methodName = req.getParameter("method");
		try {
			resp.setContentType("text/html;charset=utf-8");
			//1.获得提价参数:就是提交参数也是要调用的方法的名字
			
			if(methodName==null) {
				methodName = "listUI";
			}
			//2.获得要执行类的字节码
			Class clazz = this.getClass();
			//3.让clazz执行方法名为methodName的方法
			Method method = clazz.getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
			method.setAccessible(true);
			method.invoke(this, req,resp);
		} catch (Exception e) {
			throw new RuntimeException("没有提供对应的方法:"+methodName);
		}	
	}
}
@WebServlet("/userAction.action")
public class UserAction extends BasicServlet {
	
	private void del(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("删除业务");
	}
	private void add(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("添加业务");
	}
	private void listUI(HttpServletRequest req, HttpServletResponse resp) {
		System.out.println("查询业务");
	}
}
posted @ 2020-10-27 13:03  小申同学  阅读(155)  评论(2编辑  收藏  举报