MVC实例及用三层架构实现对学生信息的增删改查

时间:2024-03-07 07:21:47

一、MVC设计模式实例

M层

Login.java

package org.entity;

public class Login {
       private int id;
       private String uname;
       private String upwd;
       public Login() {
           
       }
       public Login( String uname, String upwd) {
           
           this.uname = uname;
           this.upwd = upwd;
       }
    public Login(int id, String uname, String upwd) {
        this.id = id;
        this.uname = uname;
        this.upwd = upwd;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public String getUpwd() {
        return upwd;
    }
    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }
       
       
}

LoginDao.jsp

package org.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.entity.Login;

//模型层,用于处理登录(查询数据)
public class LoginDao {
      public static int login(Login login) {//登录
          int flag=-1;//登录成功与否的标识  -1:系统异常,0:用户名或密码有误,1:登录成功
          int result =-1;
          Connection connection =null;
          PreparedStatement pstmt =null;
          ResultSet rs =null;
          try {
              Class.forName("com.mysql.cj.jdbc.Driver");
              //Ctrl+1自动返回
               connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?serverTimezone=UTC&characterEncoding=utf-8","root","vayne");
              String sql="Select count(*) from login where uname=? and upwd =?";
              pstmt = connection.prepareStatement(sql);
              pstmt.setString(1, login.getUname());
              pstmt.setString(2, login.getUpwd());
               rs = pstmt.executeQuery();
              if(rs.next()) {
                   result =rs.getInt(1);
              }
              if(result>0) {//登录成功
                  flag= 1;
              }else {
                  flag=0;//用户名或密码错误
              }
          }catch(ClassNotFoundException e) {
              e.printStackTrace();
              flag=-1;//系统异常
          }catch(SQLException e) {
              e.printStackTrace();
              flag=-1;//系统异常
          }catch(Exception e) {
              e.printStackTrace();
              flag=-1;//系统异常
          }finally {
                  try {
                      if(rs!=null) rs.close();
                      if(pstmt!=null) pstmt.close();
                      if(connection!=null) connection.close();
                  }catch(SQLException e) {
                      e.printStackTrace();
                  }catch(Exception e) {
                      e.printStackTrace();
                  }
                 
              
          }
          return flag;
      }
}

View

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
        <form action="LoginServlet" method="post">
        用户名:<input type="text" name="uname"><br/>
        密码:<input type="password" name="upwd"><br/>
        <input type="submit" value="登录"><br/>
        
        </form>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
      登陆成功!!!
</body>
</html>

Controller

 

LoginServlet.java

package org.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dao.LoginDao;
import org.entity.Login;

//控制器层:接受view层的请求,并分发给Model处理
public class LoginServlet extends HttpServlet {
     
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //处理登录请求    
        request.setCharacterEncoding("utf-8");
        String name= request.getParameter("uname");
        String pwd= request.getParameter("upwd");
        Login login=new Login(name,pwd);
        //调用模型层的登录功能
        int result=LoginDao.login(login);
        if(result>0) {
            request.getRequestDispatcher("welcome.jsp").forward(request, response);
        }else {//返回登录页,重新登录
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

登录失败,返回登录页面

 

 

 

 

 二、三层架构

 

 与MVC设计模式的目的一致:都是为了提高代码复用
    区别:两者对项目的理解角度不同
三层结构的组成:
表示层(USL User Show Layer; View层):
1、表示层前台代码:jsp/html/css/js         等价于MVC中的V层:用于和用户的交互、界面的显示   web前端技术
   代码位置:Webcontent
2、表示层后台代码:servlet用来调用业务逻辑层      等价于MVC中的C层:用于控制跳转、调用业务逻辑层  Servlet、SpringMVC、Struts2
   代码位置:xxx.servlet
业务逻辑层(BLL Business Logic Layer; Service层):逻辑性,可拆   
1、 接受表示层的请求、调用
2、 组装数据访问层:根据逻辑关系,对增删改查方法进行调用
   代码位置:xxx.service
数据访问层(DAL Data Access Layer; Dao层):不可再分、原子性    直接访问数据库
  增删改查的方法实现
  代码位置:xxx.dao


三层间的关系:
上层将请求传递给下层,下层处理后,返回给上层

上层依赖于下层。 依赖:a持有b的成员变量,就是a依赖于b。先有b,后有a。

Servlet:
一个Servlet一般对于一个功能,如果有增删改查(查询单个、查询全部)五个功能,则创建五个Servlet

表示层前台

实例

对学生信息的增删改查,

 

 

index.jsp

<%@page import="org.student.entity.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息列表</title>
</head>
<body>
      <table border="1px">
         <tr>
         <th>学号</th>
         <th>姓名</th>
         <th>年龄</th>
         <th>爱好</th>
         </tr>
         <%
         List <Student> students =(List<Student>) request.getAttribute("students");
           for(Student student:students){
               %>
               
               <tr>
                   <td><%=student.getSno() %></td>
                   <td><%=student.getSname() %></td>
                   <td><%=student.getSage() %></td>
                   <td><%=student.getShobby() %></td>
                   <td><a href ="DeleteStudentServlet?sno=<%=student.getSno() %>">删除</a></td>
                   <td><a href="QueryStudentServlet?sno=<%=student.getSno() %>">查询</a></td>
               </tr>
               <%
           }
         %>
      </table>
</body>
</html>

add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加学生信息</title>
</head>
<body>
      <form action="AddStudentServlet" method="post">
      学号:<input type="text" name="sno"><br/>
      姓名:<input type="text" name="sname"><br/>
      年龄:<input type="text" name="sage"><br/>
      爱好:<input type="text" name="shobby"><br/>
      <input type="submit" value="添加">
      </form>
</body>
</html>

studentinfo.jsp

<%@page import="org.student.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生个人信息</title>
</head>
<body>
    <%
       Student student= (Student)request.getAttribute("student");
    %>
    <form action="UpdateStudentServlet">
         学号:<input type="text" name="sno" value="<%=student.getSno()%>" readonly="readonly"><br/>
         姓名:<input type="text" name="sname" value="<%=student.getSname()%>"><br/>
         年龄:<input type="text" name="sage" value="<%=student.getSage()%>"><br/>
         爱好:<input type="text" name="shobby" value="<%=student.getShobby()%>"><br/>
         <input type="submit" value="修改">
    </form>
</body>
</html>

package org.student.dao;

package org.student.dao;

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

import org.student.entity.Student;


public class StudentDao {
    //数据库URL和账号密码
        private static final String URL="jdbc:mysql://localhost:3306/login?serverTimezone=UTC&characterEncoding=utf-8";
        private static final String UNAME="root";
        private static final String UPWD="vayne";
        
        //数据库连接
        public static Connection getConn () {
            Connection conn = null;
            
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                conn = DriverManager.getConnection(URL, UNAME, UPWD);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return conn;
        }
        
        
        public static void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs)
        {
            try {
                if(conn!=null)
                    conn.close();
            } catch (SQLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        
            try {
                if(pstmt!=null)
                    pstmt.close();
            } catch (SQLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        
            try {
                if(rs!=null)
                    rs.close();
            } catch (SQLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
            
        //关闭conn和pstmt
        public static void closePart(Connection conn,PreparedStatement pstmt)
        {
            try {
                if(conn!=null)
                    conn.close();
            } catch (SQLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        
            try {
                if(pstmt!=null)
                    pstmt.close();
            } catch (SQLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        //添加学生信息
        public static boolean AddStudent(Student student) {
            boolean flag = false;
             String sql="insert into student(sno,sname,sage,shobby) values(?,?,?,?)" ;
             Connection conn = StudentDao.getConn();
             PreparedStatement pstmt = null;
             try {
                 pstmt = conn.prepareStatement(sql);
                 pstmt.setInt(1,student.getSno());
                 pstmt.setString(2, student.getSname());
                 pstmt.setInt(3, student.getSage());
                 pstmt.setString(4, student.getShobby());
                 int count = pstmt.executeUpdate();
                 if(count>0) {
                     flag=true;
                 }
             }catch(SQLException e) {
                 e.printStackTrace();
             }catch(Exception e) {
                 e.printStackTrace();
             }finally {
                 StudentDao.closePart(conn, pstmt);
             }
            
            return flag;
        }
        //根据学号删除学生信息
        public static boolean DeleteStudent(int sno) {
            boolean flag = false;
             String sql="delete from student where sno =?" ;
             Connection conn = StudentDao.getConn();
             PreparedStatement pstmt = null;
             try {
                 pstmt = conn.prepareStatement(sql);
                 pstmt.setInt(1,sno);
                 int count = pstmt.executeUpdate();
                 if(count>0) {
                     flag=true;
                 }
             }catch(SQLException e) {
                 e.printStackTrace();
             }catch(Exception e) {
                 e.printStackTrace();
             }finally {
                 StudentDao.closePart(conn, pstmt);
             }
            
            return flag;
        }
        //根据学号修改学生信息:根据sno找到学生,并将学生改为student
        public static boolean UpdateStudent(int sno,Student student) {
            boolean flag = false;
             String sql="update student set sname =?,sage=?,shobby=? where sno =?" ;
             Connection conn = StudentDao.getConn();
             PreparedStatement pstmt = null;
             try {
                 pstmt = conn.prepareStatement(sql);
                 pstmt.setString(1, student.getSname());
                 pstmt.setInt(2, student.getSage());
                 pstmt.setString(3, student.getShobby());
                 pstmt.setInt(4, sno);
                 int count = pstmt.executeUpdate();
                 if(count>0) {
                     flag=true;
                 }
             }catch(SQLException e) {
                 e.printStackTrace();
             }catch(Exception e) {
                 e.printStackTrace();
             }finally {
                 StudentDao.closePart(conn, pstmt);
             }
            
            return flag;
        }
        //查询学生是否存在
                public static boolean isExist(int sno) {
                    return Query(sno)==null? false:true;
                }
        //根据学号查询学生全部信息
        public static Student Query(int sno) {
             Student student= null;
             String sql="select * from student where sno =?" ;
             Connection conn = StudentDao.getConn();
             PreparedStatement pstmt = null;
             ResultSet rs = null; 
             try {
                 pstmt = conn.prepareStatement(sql);
                 pstmt.setInt(1,sno);
                 rs = pstmt.executeQuery();
                 if(rs.next()) {
                     int no=rs.getInt("sno");
                     String name=rs.getString("sname");
                     int age=rs.getInt("sage");
                     String hobby=rs.getString("shobby");
                     student= new Student(no,name,age,hobby);
                 }
             }catch(SQLException e) {
                 e.printStackTrace();
             }catch(Exception e) {
                 e.printStackTrace();
             }finally {
                 StudentDao.closeAll(conn, pstmt, rs);
             }
             return student;
        }
        //查询全部学生信息
                public static List<Student> QueryAll() {
                    List<Student> students = new ArrayList<>();
                     Student student= null;
                     String sql="select * from student " ;
                     Connection conn = StudentDao.getConn();
                     PreparedStatement pstmt = null;
                     ResultSet rs = null; 
                     try {
                         pstmt = conn.prepareStatement(sql);
                         rs = pstmt.executeQuery();
                         while(rs.next()) {
                             int no=rs.getInt("sno");
                             String name=rs.getString("sname");
                             int age=rs.getInt("sage");
                             String hobby=rs.getString("shobby");
                             student= new Student(no,name,age,hobby);
                             students.add(student);
                         }
                     }catch(SQLException e) {
                         e.printStackTrace();
                     }catch(Exception e) {
                         e.printStackTrace();
                     }finally {
                         StudentDao.closeAll(conn, pstmt, rs);
                     }
                     return students;
                }
}

package org.student.entity;

package org.student.entity;

public class Student {
       private int sno;
       private String sname;
       private int sage;
       private String shobby;
       
       @Override
    public String toString() {
        return "Student [sno=" + sno + ", sname=" + sname + ", sage=" + sage + ", shobby=" + shobby + "]";
    }
    public Student() {
           
       }
       public Student( String sname, int sage, String shobby) {
           this.sname = sname;
           this.sage = sage;
           this.shobby = shobby;
       }
    public Student(int sno, String sname, int sage, String shobby) {
        this.sno = sno;
        this.sname = sname;
        this.sage = sage;
        this.shobby = shobby;
    }
    public int getSno() {
        return sno;
    }
    public void setSno(int sno) {
        this.sno = sno;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public int getSage() {
        return sage;
    }
    public void setSage(int sage) {
        this.sage = sage;
    }
    public String getShobby() {
        return shobby;
    }
    public void setShobby(String shobby) {
        this.shobby = shobby;
    }
       
}

org.student.service

package org.student.service;

import org.student.entity.Student;

import java.util.List;

import org.student.dao.*;
public class StudentService {
      public boolean AddStudent(Student student) {
          boolean flag=false;
          if(!StudentDao.isExist(student.getSno())) {
              StudentDao.AddStudent(student);
              flag=true;
          }else {
              System.out.println("此人已存在");
          }
         return flag; 
      }
      //根据学号进行删除
      public boolean DeleteStudent(int  sno) {
          boolean flag=false;
          if(StudentDao.isExist(sno)) {
              StudentDao.DeleteStudent(sno);
              flag=true;
          }else {
              System.out.println("此人不存在");
          }
         return flag; 
      }
      //根据学号进行修改
      public boolean UpdateStudent(int sno,Student student) {
          boolean flag=false;
          if(StudentDao.isExist(sno)) {
              StudentDao.UpdateStudent(sno,student);
              flag=true;
          }else {
              System.out.println("此人不存在");
          }
         return flag; 
      }
      //根据学号查询学生
      public Student Query(int sno) {
          return StudentDao.Query(sno);
      }
      //查询全部学生
      public List<Student> QueryAll(){
          return StudentDao.QueryAll();
      }
}

package org.student.servlet;

AddStudentServlet
package org.student.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.student.entity.Student;
import org.student.service.StudentService;


public class AddStudentServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        int no= Integer.parseInt(request.getParameter("sno"));
        String name= request.getParameter("sname");
        int age= Integer.parseInt(request.getParameter("sage"));
        String hobby= request.getParameter("shobby");
        Student student = new Student(no,name,age,hobby);
        StudentService studentservice = new StudentService();
        boolean result=studentservice.AddStudent(student);
        //out对象的获取方法
        PrintWriter out = response.getWriter();
        if(result) {
            
            out.println("添加成功");
        }else {
            
            out.println("添加失败");
        }
    }
  
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
DeleteStudentServlet
package org.student.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.student.service.StudentService;



public class DeleteStudentServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        int no= Integer.parseInt(request.getParameter("sno"));
        StudentService studentservice = new StudentService();
        boolean result=studentservice.DeleteStudent(no);
        //out对象的获取方法
        PrintWriter out = response.getWriter();
        if(result) {
            
            out.println("删除成功");
            response.sendRedirect("QueryAllStudentServlet");
        }else {
            
            out.println("删除失败");
        }
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
QueryAllStudentServlet
package org.student.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.student.entity.Student;
import org.student.service.StudentService;

public class QueryAllStudentServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        
        StudentService studentservice = new StudentService();
        List<Student> students=studentservice.QueryAll();
        //out对象的获取方法
        PrintWriter out = response.getWriter();
        request.setAttribute("students", students);
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
QueryStudentServlet 
package org.student.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.student.entity.Student;
import org.student.service.StudentService;

public class QueryStudentServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        //获取待查询修改人的学号
        int no= Integer.parseInt(request.getParameter("sno"));
        
        StudentService studentservice = new StudentService();
        Student student=studentservice.Query(no);
        //out对象的获取方法
        PrintWriter out = response.getWriter();
        out.println(student);
        request.setAttribute("student", student);
        request.getRequestDispatcher("studentinfo.jsp").forward(request, response);
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

 

UpdateStudentServlet
package org.student.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.student.entity.Student;
import org.student.service.StudentService;

public class UpdateStudentServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        //获取待修改人的学号
        int no= Integer.parseInt(request.getParameter("sno"));
        //获取修改后的内容
        String name= request.getParameter("sname");
        int age= Integer.parseInt(request.getParameter("sage"));
        String hobby= request.getParameter("shobby");
        //将修改后的内容封装到一个实体类中
        Student student = new Student(name,age,hobby);
        StudentService studentservice = new StudentService();
        boolean result=studentservice.UpdateStudent(no,student);
        //out对象的获取方法
        PrintWriter out = response.getWriter();
        if(result) {
            
            out.println("修改成功");
            response.sendRedirect("QueryAllStudentServlet");
        }else {
            
            out.println("修改失败");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

点击删除

 

 

进行查询

 

 

 

进行修改

 

 

 

 

 

今天在测试过程中遇到了Servlet找不到的问题,就是因为我多加了个空格