1.对于复杂的系统,分层让代码结构清晰,便于开发人员对系统进行整体的理解、把握。如果代码没有分层,把逻辑都写在一个方法里面的代码就好比是一本没有目录的文档,要找出其中某一节都要对全文遍览一次。
2.基于第一点,如果代码层次分明,则便于开发人员维护。系统基本的架构可以通过工具(如动软代码生成器)自动生成代码。当数据库发生改变时,只需通过生成器重新生成代码,然后改动业务层中的部分代码即可。假设使用三层架构模式开发系统时,开发人员可以通过自己的判断来确定哪一层需要改动。
3.好的架构一旦写好,那么不管UI层怎么变都可以使用,比如开始使用Winform开发的后来变成web了,但是架构的代码不用变,只是对界面表现进行改动(譬如使用三层架构开发,逻辑层和数据访问层不变,只是UI层需要做变动)。管理好代码,使用户界面逻辑(UI)与业务逻辑(BLL)和数据访问代码(DAL)分割开来,这样才能在将来需要的时候把应用程序迁移到浏览器上。这也应该算是可移植性的体现吧。
4.开发人员可以节省更多的时间去注重业务的实现,而不必过多考虑数据库的连接、访问等其它问题。
在src中创建四个包
创建好数据库
在JDBC中写出数据库的链接
private static Connection con=null;
public static Connection getCon() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school?useSSL=false&serverTimezone=UTC","root","root");
System.out.println(con);
return con;
}
public static void close(ResultSet rs, PreparedStatement ps,Connection con){
try {
if (rs!=null){
rs.close();
}
if (ps!=null){
ps.close();
}
if (con!=null){
con.close();
}
} catch (Exception e){
e.printStackTrace();
}
}
在bean中把数据库的工具类写出来
在dao包里写出数据库的查询和增加
public class UserDao {
Connection con = null;
PreparedStatement pst = null;
ResultSet rs = null;
public User login(String username, String password) {
User login = null;
try {
// 1.加载数据库驱动
con = JDBCUtil.getCon();
// 3.定义登录的sql语句
String sql = "select * from t_user where username=? and password=?";
// 4.获取预处理对象
pst = con.prepareStatement(sql);
// 5.传参
pst.setObject(1, username);
pst.setObject(2, password);
// 6.执行代码
rs = pst.executeQuery();
// 7.解析结果集
if (rs.next()) {
login = new User();
int uid = rs.getInt("uid");
login.setUid(uid);
login.setPassword(rs.getString("username"));
login.setPassword(rs.getString("password"));
login.setPhone(rs.getInt("phone"));
login.setAddress(rs.getString("address"));
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
JDBCUtil.close(rs,pst,con);
}
return login;
}
}
增加(这里我是先查询数据库,如果注册的账号存在,这注册失败跳转到cunzai。jsp的页面中)
public class Userzheng {
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
public boolean Cun(String username){
boolean bb = false;
try {
con = JDBCUtil.getCon();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
if (con != null) {
String sql = "select * from t_user where username=?";
try {
ps = con.prepareStatement(sql);
ps.setObject(1, username);
rs = ps.executeQuery();
while (rs.next()) {
bb = true;
break;
}
} catch(Exception e){
e.printStackTrace();
} finally{
JDBCUtil.close(rs, ps, con);
}
}return bb;
}
public boolean zheng(String username,String password,String phone,String address){
boolean aa=false;
if(!Cun(username)){
try {
try {
con = JDBCUtil.getCon();//加载驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//定义sql语句
String sql="insert into t_user(username,password,phone,address)values(?,?,?,?)";
//获取预处理对象
ps = con.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
ps.setString(3,phone);
ps.setString(4,address);
//受影响的行赋值给nn
int nn = ps.executeUpdate();
if (nn>0){
aa=true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close(rs, ps, con);
}
} return aa;//返回boolean的值,判断是否添加成功
}
}
在service包中完成最后的代码应用
登录
@WebServlet("/Login")
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.设置请求和响应的编码格式,以及响应格式
request.setCharacterEncoding("utf-8");//设置请求的编译格式为中文
response.setCharacterEncoding("utf-8");//设置响应的编译格式为中文
response.setContentType("text/html;charset=UTF-8");//以什么样的格式来响应
// 2.获取请求的参数
String username= request.getParameter("username");//根据表单的name属性获取用户名输入的值
String password = request.getParameter("password");
System.out.println(username);
System.out.println(password);
UserDao userDao= new UserDao();
User login = userDao.login(username, password);
if (login!=null){
response.sendRedirect("zhuye.jsp");
}else {
response.sendRedirect("shibai.jsp");
}
}
}
注册
@WebServlet("/zhuce")
public class Zhuce extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//设置请求的编译格式为中文
response.setCharacterEncoding("utf-8");//设置响应的编译格式为中文
response.setContentType("text/html;charset=UTF-8");//以什么样的格式来响应
String username= request.getParameter("username");//根据表单的name属性获取用户名输入的值
String password = request.getParameter("password");
String phone = request.getParameter("phone");
String address = request.getParameter("address");
Userzheng uz=new Userzheng();
boolean cun;//数据库是否存在用户
boolean zj;//数据量是否添加成功
cun= uz.Cun(username);
zj= uz.zheng(username, password,phone,address);
if (cun){//如果存在,就跳转到指定的页面
response.sendRedirect("cunzai.jsp");
}
else {//不存在就,就跳转到注册成功的页面
response.sendRedirect("zhucecg.jsp");
}
}
}