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