MVC實例及用三層架構實現對學生信息的增刪改查


一、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找不到的問題,就是因為我多加了個空格


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM