一、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找不到的问题,就是因为我多加了个空格