J2EE简易银行管理系统
项目用到的技术如下: Java:
Java SE基础
前端:HTML
,CSS
,JavaScript
,jQuery
LayUI(前端模板框架)
J2EE:Tomcat
,Servlet
,JSP
,Filter
数据库:MySQL
后台管理页 1.管理员登录 1.1 新增用户信息 1.2 新增银行卡信息 1.3 修改银行卡信息 1.4 删除银行卡 1.5 查看所有银行卡信息 1.6 根据条件查看银行卡信息 前台用户页 2.用户登录 2.1 取钱功能 2.2 存钱功能 2.3 转账功能 2.4 查看自己银行卡信息 2.5 修改密码功能
表名 | 中文含义 | 介绍 |
---|---|---|
bankcard | 银行卡表 | 存放银行卡信息如卡号,密码,余额,卡类型,用户号 |
bankmanager | 管理员表 | 存放管理员信息如管理员号,管理员姓名,管理员密码 |
bankuser | 用户信息表 | 存放用户信息如用户id,用户名,手机,公司,籍贯 |
本文主要以用户表为例查询用户信息为示例功能演示 J2EE的核心思想
实体类就是基于ORM(Object Relational Mapping)思想,将Java的类与数据库的表进行映射 BankUser.java映射bankuser表
/**
* @ClassName: BankUser
* @Description:用户实体类
* @author: jingyi
* @date: 2021年5月10日 下午4:18:14
* @Copyright:
*/
public class BankUser {
private int uid;//用户id
private String uname;//用户名
private int uphone;//电话
private String company;//公司
private String hometown;//籍贯
public String getHometown() {
return hometown;
}
public void setHometown(String hometown) {
this.hometown = hometown;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getUphone() {
return uphone;
}
public void setUphone(int uphone) {
this.uphone = uphone;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
}
数据库bankuser表
用于进行数据库访问的操作 那么在访问数据库之前我们需要借助数据库连接池
使用数据库连接工具类帮助我们获取数据库连接对象,关闭数据库连接对象 connUtil.java
public class connUtil {
private static ThreadLocal<Connection> threadload=new ThreadLocal<>();
private static DataSource ds;
static {//数据源对象加载
try {
Properties properties = new Properties();
InputStream ins=connUtil.class.getResourceAsStream("/mysql.properties");
properties.load(ins);
ds=BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取数据库连接对象
public static Connection getConn() throws SQLException{
Connection conn=threadload.get();
if(conn==null||conn.isClosed()) {
conn=ds.getConnection();
threadload.set(conn);
}
return conn;
}
//关闭数据库连接对象
public static void closeConn() {
Connection conn=threadload.get();
try {
if(conn!=null&&!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
threadload.set(conn);
}
}
}
这里还需要一个资源文件用来告知工具类我们需要连接哪个数据库 mysql.proprerties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/class04?characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=root
maxActive=30
maxIdle=10
maxWait=60000
创建BankDao接口,这里不使用一个类直接操作数据库,而是使用接口声明方法,再用这个接口的实现类去操作数据库,这样可以降低层与层之间的耦合度 BankDao.java
public interface BankDao {
public List<BankUser> FindAllUser() throws SQLException;
}
BankDaoImpl.java(dao.Impl包下) 对于不同的功能对应不同的方法与数据库进行数据操作
public class BankDaoImpl implements BankDao {
@Override
public List<BankUser> FindAllUser() throws SQLException {
Connection conn = connUtil.getConn();
String sql="select * from bankuser";
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql);
List<BankUser> list =new ArrayList<BankUser>();
while(rs.next()) {
BankUser user = new BankUser();
user.setUid(rs.getInt(1));
user.setUname(rs.getString(2));
user.setUphone(rs.getInt(3));
user.setCompany(rs.getString(4));
user.setHometown(rs.getString(5));
list.add(user);
}
return list;
}
}
与controller层直接通信,进一步降低层之间的耦合性 BankService.java
public interface BankService {
public List<BankUser> FindAllUser();
}
数据结果的判断,事物的提交、回滚都在这里进行处理 BankServiceImpl.java(service.Impl包下)
public class BankServiceImpl implements BankService {
BankDao bankdao=new BankDaoImpl();
@Override
public List<BankUser> FindAllUser() {
List<BankUser> list=null;
try {
list=bankdao.FindAllUser();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
connUtil.closeConn();
}
return list;
}
}
当前台页面发出请求,最先会通过过滤器,过滤器会首先判断系统是否用角色登录,如果已经登录则转发该请求到controller层,由@WebServlet注解选择对应的servlet进行处理 AddCardServlet.java
@WebServlet("/addcard")
public class AddCardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
BankService bankService = new BankServiceImpl();
BankCard card=new BankCard();
BankUser user = new BankUser();
card.setBankuser(user);
card.setCpssword(Integer.valueOf(req.getParameter("password")));
card.setCmoney(Double.valueOf(req.getParameter("cmoney")));
card.setCtype(req.getParameter("ctype"));
card.getBankuser().setUid(Integer.valueOf(req.getParameter("ID")));
boolean flag=bankService.AddCard(card);
if(flag) {
if(flag) {
resp.sendRedirect("toaddcard");
}else {
resp.sendRedirect("jsp/addcardError.jsp");
}
}
}
}
过滤器主要功能 1.拦截所有请求 2. 判断是否登录 3. 已登陆发送的请求则通过并转发 4. 未登录发送的请求则跳转到登录页
MyFilter.java
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
String uri=req.getRequestURI();
if(uri.endsWith("Login.jsp")||uri.endsWith("login")||uri.endsWith("checkaccount")||uri.contains(".css") || uri.contains(".js") || uri.contains(".png")|| uri.contains(".jpg")) {//如果为登录请求
chain.doFilter(request, response);
}else {//不是去登录页面或登录请求
String uname=(String)req.getSession().getAttribute("uname");
String mname=(String)req.getSession().getAttribute("mname");
if(uname!=null||mname!=null) {//管理员或者用户已登录
chain.doFilter(request, response);
}else{
req.getSession().setAttribute("Needloginmsg", "something");
resp.sendRedirect("Login.jsp");
}
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
页面主要使用Layui前端模板框架编写,详细使用可参考layui官网