基于MVC框架开发开发JavaWeb图书管理系统
环境搭建:Tomcat 9、C3P0(数据库连接池) 、commons-dbutils-1.7(Apache开源组织提供的用于操作数据库的工具包)、mchange-commons-java-0.2.9.jar(c3p0的依赖包)mysql-connector-java-8.0.29(mysql驱动jar包)
架构大体:
- action:用于放Servlet类,获取用户在前端网页表单中输入的内容,并进行服务器请求和响应的跳转
- bean:放实体类:对应数据库中的每个表
- biz(business):负责整个应用程序的相关业务流程
- dao(data access object):主要负责处理数据库操作
- util:工具类包,导入一些外部写好的工具类,如DBHelper、CheckCodeUtil
- web:存放在前台显示出来的网页,jsp文件
完成User类、UserDao类、UserServlet类、UserBiz类、CheckCodeServlet类
1.User类
根据数据库User表中数据生成User类:给属性添加getter、setter、toString方法:自动生成。
package com.crz.book.bean;
import java.io.Serializable;
/**
* 保存用户的信息
* 1.Serializable:序列化接口,可以使用IO完成对象的读写\
* 2.属性都是私有的
* 3.getter/setter方法
* 4.默认的构造方法
*/
public class User implements Serializable {
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
", state=" + state +
'}';
}
private long id;
private String name;
private String pwd;
private long state;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
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 long getState() {
return state;
}
public void setState(long state) {
this.state = state;
}
}
2.UserDao
内部是用户登录和修改密码时需要对数据库进行操作的代码。利用DButils包中的QueryRunner对象进行数据库的查询操作:
-
query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。
-
query(String sql, Object[] params, ResultSetHandler rsh):方法本身不提供数据库连接,执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。
-
query(Connection conn, String sql, ResultSetHandler rsh):执行无需参数的选择查询。
-
update(Connection conn, String sql, Object[] params):被用来执行插入、更新或删除(DML)操作。
其中ResultSetHandler接口执行处理的一个结果集对象,实现类如下:
ArrayHandler:把结果集中的第一行数据转成对象数组。
BeanListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List
package com.crz.book.dao;
import com.crz.book.bean.User;
import com.crz.book.util.DBHelper;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.Connection;
import java.sql.SQLException;
/**
* DBUtils apache组织提供的一个对JDBC进行简单封装的开源工具类库,简化JDBC应用程序的开发同时也不会影响程序的性能
*/
public class UserDao {
//创建QueryRunner对象getUser方法
static QueryRunner runner = new QueryRunner();
/**
* 获取用户输入的用户名和密码
* @param name 输入框用户名
* @param pwd 输入框密码
* @return 用户对象——>包括用户名和密码
* @throws SQLException
*/
public static User getUser(String name, String pwd) throws SQLException {
/**
* 1.runner下的query方法
* 参数:new BeanHandler<User>(User.class) 将查询出来的数据按行进行封装成一个对象
*/
//1..调用DBHelper获取连接对象
Connection conn = DBHelper.getConnection();
//2.准备执行SQL语句
String sql = "select * from user where name = ? and pwd = ? and state = 1";
//3.调用查询方法,将查询的数据封装成User对象
User user = runner.query(conn, sql, new BeanHandler<User>(User.class), name, pwd);
//4.关闭连接对象
conn.close();
//5.返回User
return user;
}
/**
* 修改密码
*
* @param id 需要修改密码的用户编号
* @param pwd 新的密码
* @return 修改的行数
*/
public int modifyPwd(long id, String pwd) throws SQLException {
//修改数据的sql语句
String sql = "update user set pwd = ? where id = ?";
Connection conn = DBHelper.getConnection();
//传入连接对象、sql语句、第一个参数pwd,第二个参数id将返回值返回:处理的行数
int count = runner.update(conn, sql, pwd, id);
conn.close();
return count;
}
}
3.UserServlet
判断用户的请求类型:
userServlet?type=login //登录
userServlet?type=exit //安全退出
userServlet?type=modifyPwd //修改密码
在点击html页面表单中的按钮时,提交后会通过action将对应的请求类型发送给UserServlet,然后执行UserServlet中相应case代码。
package com.crz.book.action;
import com.crz.book.bean.User;
import com.crz.book.biz.UserBiz;
import com.crz.book.dao.UserDao;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
//构建UserBiz 的对象
UserBiz userBiz = new UserBiz();
/**
* 判断用户请求类型login:
* userServlet?type=login 登录
* userServlet?type=exit 安全退出
* userServlet?type=modifyPwd 修改密码
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//创建Session对象
HttpSession session = request.getSession();
//创建响应流对象,帮助我们打印信息
PrintWriter out = response.getWriter();
// 1.判断用户请求的类型为login
String method = request.getParameter("type");