Web模仿银行转账功能与登录-事物、mysql、filter、servlet

创建项目之前,先创建数据库,这里的库名是mydb1,表名是account,MySQL版本是5.6,jdk1.8,
Tomcat是8.0的。项目比较简单,有点基础就能看懂。
创建数据表语句
create table account(
   cardId  varchar(20)  primary key,
   name  varchar(20) not null,
   pwd   varchar(10) not null,
   balance double not null
)default charset='utf8';


登录页面:
<body>
<h3 style="color:red">${msg}</h3>
<form action="loginServLet" method="post">
用户名:<input type="text" name="name"/></br>
密码:<input type="password" name="password"/></br>
<input type="submit" value="登录"/></br>
<input type="reset" value="取消"/>
</form>
</body>


登录逻辑判断:
//注解,获取登录页面提交的内容
@WebServlet("/bank/loginServLet")
public class LoginServLet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse arg1) throws 


ServletException, IOException {
//获取表单提交姓名
String name=req.getParameter("name");
//获取表单提取的密码
String pwd=req.getParameter("password");
//这里进行非空验证,如果学了Ajax,这就比较简单了
if(name==null || name.equals("") || name.trim().isEmpty()){
req.setAttribute("msg", "your username not null");
req.getRequestDispatcher("/bank/login.jsp").forward(req, arg1);;
}else if(pwd==null || pwd.equals("") || pwd.trim().isEmpty()){
req.setAttribute("msg", "your password not null");
req.getRequestDispatcher("/bank/login.jsp").forward(req, arg1);;
}else{
//获取工具类的对象User,
User user = UtilConn.getLogin(name, pwd);
//判断是否为空
if(user!=null){
//把User放在session里面,进行传输
req.getSession().setAttribute("msg", user);
String name2 = user.getName();
double balance = user.getBalance();
//传输显示的余额到成功页面main.jsp
req.setAttribute("msg", name2+"   "+"balance"+"   


"+balance);
req.getRequestDispatcher


("/bank/success/main.jsp").forward(req, arg1);
}else{
//如果没有该用户或者密码错误,返回登录页面
req.setAttribute("msg", "your password or username 


error");
req.getRequestDispatcher("/bank/login.jsp").forward(req, 


arg1);
}
}
}


}
main.jsp页面,转账页面
<body>
<h3 style="color:red">${requestScope.msg}</h3>
<form action="bankServlet" method="post">
输入对方的账号:<input type="text" name="name"/></br>
输入要转账的金额:<input type="text" name="num"/></br>
<input type="submit" value="转账"/>
<input type="reset" value="取消"/>
</form>
</body>


转账成功页面:
<body>
<h2 style="color:red">${msg}</h2>
<h2 style="color:red">${msg1}</h2>
<h2 style="color:red">${msg2}</h2>
</body>


转账逻辑判断:
//mian.jsp页面的注解
@WebServlet("/bank/bankServlet")
public class ServletBank extends HttpServlet{

@Override
protected void service(HttpServletRequest req, HttpServletResponse arg1) throws 


ServletException, IOException {
//获取界面输入的参数
String id=req.getParameter("name");
String num = req.getParameter("num");
//获取前面session对象的user
User name1=(User) req.getSession().getAttribute("msg");
//进行判断,避免pointnull错误
if(name1==null || name1.equals("")){
//刷新页面后,User失效,必须重新进行登录
req.setAttribute("msg", "please first login");
req.getRequestDispatcher("/bank/login.jsp").forward(req, arg1);
return;
}
//转钱的一方的账号
int cardId = name1.getCardId();
//转化为字符串,这里可以不用转,看个人爱好
String id1=cardId+"";
//获取jsp界面账号id的用户名card
String card = UtilConn.IsCard(id);

//非空验证
if(id==null || id.equals("") || id.trim().isEmpty()){
req.setAttribute("msg", "your username not null");
req.getRequestDispatcher("/bank/success/main.jsp").forward(req, 


arg1);
}else if(num==null || num.equals("") || num.trim().isEmpty()){
req.setAttribute("msg", "your num not null");
req.getRequestDispatcher("/bank/success/main.jsp").forward(req, 


arg1); //判断卡号是不是自己的,不能给自己转账
}else if(id==id1 || id.equals(id1)){
req.setAttribute("msg", "not give self Transfer");
req.getRequestDispatcher("/bank/success/main.jsp").forward


(req,arg1);
//判断卡号是不是存在
}else if(card==null){
req.setAttribute("msg", "your cardId not exist");
req.getRequestDispatcher


("/bank/success/main.jsp").forward(req, arg1);
}
else{
//满足条件,进行转账
Connection conn=null;
Statement st=null;
try {
//获取封装好的链接对象
conn= UtilConn.getConn();
//判断是否链接上数据库
if(conn!=null){
//设置自动提交为FALSE
conn.setAutoCommit(false);
st = conn.createStatement();
//获取转账方名字
String tom = name1.getName();
//获取的转账方转账以前的余额
double d1 = UtilConn.getBalanc(tom);
//把从界面传过来的取钱数量转化为double,这里int就行了,看个人爱好
double a=Double.parseDouble(num);
//判断余额是否满足转账要求
double temp=d1-a;
if(temp<0){
req.setAttribute("msg", "Your balance is insufficient");
req.getRequestDispatcher


("/bank/success/main.jsp").forward(req, arg1);
return;
}
//进行转账
st.addBatch("update account set balance=balance-'"+num+"' where 


cardId='"+id1+"'");
st.addBatch("update account set balance=balance+'"+num+"' where 


cardId='"+id+"'");
st.executeBatch();
//确定完全无误以后提交
conn.commit();
//获取的转账方转账以后的余额
double d = UtilConn.getBalanc(tom);
//获取收款方的余额
double e = UtilConn.getBalanc(card);
//这里避免在jsp页面写太多的java代码,直接用El表达式进行获取
req.setAttribute("msg",tom+"   "+"transfer amount to"+"   "+card


+"   "+"is" +"  "+num+"¥");
req.setAttribute("msg1", "transfer after"+"  "+ tom+"   


"+"money"+"  "+"is"+"   "+d+"¥");
req.setAttribute("msg2", "collect money after"+"  "+ card+"   


"+"money"+"  "+"is"+"   "+e+"¥");
//跳转到转账成功页面
req.getRequestDispatcher("/bank/success/sucess.jsp").forward


(req,arg1);
}else{
//转账失败,跳转到转账页面
req.setAttribute("msg", "filed");
req.getRequestDispatcher


("/bank/success/main.jsp").forward(req, arg1);
}

} catch (Exception e) {
e.printStackTrace();
try {
// System.out.println("you Transfer failed");
//转账发生异常后,直接回滚到转账前的状态
conn.rollback();
req.setAttribute("msg", "you Transfer failed");
req.getRequestDispatcher


("/bank/success/main.jsp").forward(req, arg1);
} catch (SQLException e1) {
e1.printStackTrace();
}


}finally {
try {
//关闭数据库
if(st!=null && conn!=null){
st.close();
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

}
}


}
}
User对象Dao
public class User {


private int cardId;
private String name;
private String pwd;
private double balance;
//setter和getter方法
public int getCardId() {
return cardId;
}
public void setCardId(int cardId) {
this.cardId = cardId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
//无参构造方法
public User() {
super();
}
//带参构造方法
public User(int cardId, String name, String pwd, int balance) {
super();
this.cardId = cardId;
this.name = name;
this.pwd = pwd;
this.balance = balance;
}


}


数据库的操作方法:
package com.phone.bank;


import java.sql.*;
/*
 * 工具类
 */


public class UtilConn {


public static Connection getConn(){
//这里也可以用数据库的连接池DBCP或者C3P0,需要加载jar包
Connection conn=null;
try {
//加载数据库驱动包,看你自己的包是什么版本的,不同的版本,驱动包不一样
Class.forName("org.gjt.mm.mysql.Driver");
//设置数据库连接语句,mydb1是数据库,换成自己就行了
String url="jdbc:mysql://localhost:3306/mydb1?


characterEnconding=utf8";
//获取连接资源,密码为root,用户名也为root。
conn=DriverManager.getConnection(url,"root","root");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//这里是一个注册方法,没有用
public static int getReg(String name,String pwd){
int count=0;
Connection conn=getConn();
//这里用的预处理语句,也可以用他的父类Statement,
PreparedStatement ps=null;
if(conn!=null){
try {
//mysql的插入语句
String sql="insert into user(name,pass)values(?,?)";
ps = conn.prepareStatement(sql);
//设置参数的值
ps.setString(1, name);
ps.setString(2, pwd);
count = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭数据库资源
if(ps!=null){
try {
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

}
return count;
}
//判断数据库中是否存在该用户名和密码,用于登录验证
public static User getLogin(String name,String pass){
User user=null;
Connection conn=getConn();
PreparedStatement ps=null;
//查询结果返回一个结果集
ResultSet rs=null;
if(conn!=null){
//查询语句
String sql="select cardId,name,pwd,balance from account where 


name=? and pwd=?";
try {
//执行查询语句
ps = conn.prepareStatement(sql);
ps.setString(1, name);
ps.setString(2, pass);
rs = ps.executeQuery();
//System.out.println(sql);
if(rs.next()){
String password = rs.getString("pwd");
String username=rs.getString("name");
int cardId=rs.getInt("cardId");
int balance=rs.getInt("balance");
//把从数据库获取的值封装到对象中
user=new User(cardId,username,password,balance);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭资源
if(rs!=null || ps!=null){
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
return user;

}
//通过id获取用户的姓名
public static String IsCard(String id){
String cd=null;
Connection conn=getConn();
PreparedStatement ps=null;
if(conn!=null){
String url="select name,cardId from account where cardId=?";
try {
ps = conn.prepareStatement(url);
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
if(rs.next()){
//获取到用户的姓名赋值给cd
cd = rs.getString("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//返回用户的姓名
return cd;
}
//通过用户的姓名返回用户的余额,这里可以是账号cardId
public static double getBalanc(String name){
double d=0;
Connection conn=getConn();
PreparedStatement ps=null;
if(conn!=null){
String url="select balance from account where name=?";
try {
ps = conn.prepareStatement(url);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
if(rs.next()){
d = rs.getDouble("balance");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return d;

}
}


拦截器:
//防止未登录进入success页面
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)arg0;
String msg = (String)req.getSession().getAttribute("msg");
if(msg!=null){
//放行
arg2.doFilter(arg0, arg1);
}else{
//未登录,请你先登录
req.setAttribute("msg", "please first login");
req.getRequestDispatcher("/bank/login.jsp").forward(arg0, arg1);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值