三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。
对本次案例的分析:
个人对三层架构的理解就是基于MVC的思想,将MVC中的控制器放到了视图层的后台之中,逻辑业务层中对每一个功能的实现需要查看是否可划分?比如添加这个功能,应该先实现查询看数据库中是否有该添加数据,然后再作添加。数据访问层直接对数据库进行操作,其本身元素都是最小元素,即所有的诸如删除就是删除,不能再划分出其他的东西。
首先对于项目的划分:
(因为这张截图是我最终做好之后的,所以有些前端jsp代码,我着重讲功能和实现逻辑)
以添加数据为例:
前端代码就不说了,很简单,使用简单的表单即可,只是需要提一下,视图层的前台数据需要传到后台之中进行处理,我这里后台用的Servlet,即对应实现逻辑的Servlet,需要注意的是,一般建议一个功能对应一个Servlet;
我先把对应改功能的代码贴上,然后将实现逻辑;
那么直接看Servlet:
package org.Three.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.ThreeLayer.Entity.Student;
import org.ThreeLayer.Server.Student_Server;
public class addStudent_Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");//设置全局编码过滤
//
int num=Integer.parseInt(request.getParameter("uid"));//获取到jsp页面中的信息
String name=request.getParameter("uname");
String sex=request.getParameter("usex");
int age=Integer.parseInt(request.getParameter("uage"));
Student student =new Student(num,name,sex,age);//打包成为一个JavaBean
Student_Server studentS=new Student_Server();//将JavaBean向下一层,即业务逻辑层进行传输
boolean result =studentS.addStudent(student);//得到传输之后返回的结果,然后进行判断,接着向视图层进行传输结果
response.setContentType("text/html; charset=UTF-8");//处理响应编码
response.setCharacterEncoding("utf-8");
PrintWriter out=response.getWriter();
if(result)
{
//out.print("添加成功!");
response.sendRedirect("FindAllStudent_Servlet");
}else
{
out.print("添加失败!");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
StudentDao:
package org.ThreeLayer.Dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.ThreeLayer.Entity.Student;
public class StudentDao
{
public boolean AddStudent(Student student)
{
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/zxy?&useSSL=false&serverTimezone=UTF-8&useSSL=false&serverTimezone = GMT";
String username = "root";
String password = "zxy170518.";
Connection connection = null;//链接数据库
PreparedStatement pstmt=null;//执行sql语句
try
{
Class.forName(driver);
connection=DriverManager.getConnection(url,username,password);
if(!connection.isClosed())
{System.out.print("数据库连接成功!");}//验证是否连接成功
String sql="insert into student values(?,?,?,?)";
pstmt=connection.prepareStatement(sql);
pstmt.setInt(1, student.getId());
pstmt.setString(2, student.getName());
pstmt.setString(3, student.getSex());
pstmt.setInt(4, student.getAge());
int count=pstmt.executeUpdate();
if(count>0)
{
return true;
}
else
{
return false;
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}finally
{
try
{
if(pstmt!=null)
pstmt.close();
if(connection!=null)
connection.close();
}catch(SQLException e)
{
e.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
public boolean isExist(int num)//首先先进行查询是否存在
{
return FindStudentBy_id(num)==null?false:true;
}
public Student FindStudentBy_id(int num)//按照学号进行查询
{
Student student=null;
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/zxy?&useSSL=false&serverTimezone=UTF-8&useSSL=false&serverTimezone = GMT";
String username = "root";
String password = "zxy170518.";
Connection connection = null;//链接数据库
PreparedStatement pstmt=null;//执行sql语句
// Statement stmt=null;
ResultSet rs=null;//存放结果集(查询使用)
try
{
Class.forName(driver);
connection=DriverManager.getConnection(url,username,password);
if(!connection.isClosed())
{System.out.print("数据库连接成功!");}//验证是否连接成功
String sql="select * from student where id=?";
pstmt=connection.prepareStatement(sql);
pstmt.setInt(1,num);
rs=pstmt.executeQuery();
if(rs.next())
{
int id=rs.getInt(1);
String name=rs.getString(2);
String sex=rs.getString(3);
int age=rs.getInt(4);
student=new Student(id,name,sex,age);
return student;
}else
{
return null;
}
}catch(ClassNotFoundException e)
{
e.printStackTrace();
return null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
return null;
}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 null;//默认找不到
}
}
StudentServer:
package org.ThreeLayer.Server;
import java.util.List;
import org.ThreeLayer.Dao.StudentDao;
import org.ThreeLayer.Entity.Student;
//业务逻辑层
public class Student_Server {
StudentDao studentdao=new StudentDao();
public Student FindStudenBy_Id(int num)
{
return studentdao.FindStudentBy_id(num);
}
public boolean addStudent(Student student)//student就是一个JavaBean
{
if(!studentdao.isExist(student.getId()))//判断该用户是否已经存在于数据库中
{
studentdao.AddStudent(student);
return true;
}
else
{
System.out.print("此人已经存在!");
return false;
}
}
}
entity:
package org.ThreeLayer.Entity;
public class Student {
private int id;
private String name;
private String sex;
private int age;
public Student()
{};
public Student(int id,String name,String sex,int age)
{
this.id=id;
this.name=name;
this.sex=sex;
this.age=age;
}
public Student(String name,String sex,int age)
{
this.name=name;
this.sex=sex;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString()
{
return this.getId()+"-"+this.getName()+"-"+this.getSex()+"-"+this.getAge();
}
}
对于添加用户功能,我们按第一个图从下往上讲,首先实现的是,对数据库进行操作,具体步骤不难,因为操作数据库基本上就是固定格式,只是返回值按照自己功能需要进行设定即可。数据访问层结束之后,我们按照正常顺序应该是首先从业务逻辑层对数据访问层操作,那么下一步进行对业务逻辑层的编写。首先,获取到前端所传输过来的数据(用一个实体类进行打包,即JavaBean),首先是要进行判断数据库中是否已经有该用户,那么首先调用一下StudentDao中的isExist进行判断;
如果返回值为false,即没有这个人,那么进行第二步,就直接调用Dao中的AddStudent()方法进行添加,最后获取到该方法的返回值,以传给视图层进行对用户的交互功能。最后来看Servlet,直接进行对前台数据的打包,然后进行传值,最后获取到结果,然后进行判断,一气呵成。
修改,删除,查询这三个功能对应修改就行,对应SQL实现语句和数据访问层的返回值,然后是业务逻辑层的处理,比如查询全体用户信息功能,可以直接进行查询,不需要其他的逻辑,只是返回的信息因为不是单个用户信息,所以用list装起来就好,诸如此类的这几个方法就不详细解释了,毕竟都大差不差。只是要记住,每个层该做什么,该怎么做就行。视图—讲前台数据放到后台,然后由后台Servlet将数据封装为一个JavaBean传送到需要实现的业务逻辑层,由业务逻辑层进一步处理需要做哪些数据访问到数据访问层,最后由数据访问层返回给业务逻辑层,然后业务逻辑层对应其返回值做出响应返回值给显示层后台最后做出响应到前台。
具体的实现结果:
这是数据库中现在有的,然后我们进行实现增加功能(这个界面是后面加的前端代码,如果全说完太多了。。就懒得写了,嘿嘿,知道逻辑实现原理就行)
添加成功之后的:
最后删除和学号我都设置了超链接,所以直接点删除的话就直接删除改行的信息,点击学号就会显示该学生的全部信息;