三层架构
与MVC设计模式的目标一致,都是为了解耦合,提高代码复用度。
区别:二者对项目理解的角度不同
三层组成
表示层(USL,User Show Layer-视图层)
业务逻辑层(BLL,Business Logic Layer-Service层)
数据访问层(DAL,Data Access Layer-Dao层)
表示层
1、与客户交互:表示层前台代码(jsp,html,java,css,jquery等web前段技术)
用户和用户交互、界面的显示
代码位置:WebContent
2、与业务逻辑层交互:表示层后台代码(servlet,SpringMVC,Structs2)
用户控制跳转、调用业务逻辑层,
位于xxx.servlet包中
业务逻辑层
逻辑性,可拆
组装数据访问层,逻辑性操作
接收表示层的请求调用
一般位于xxx.service包
数据访问层
原子性,不可拆
直接访问数据库的操作
一般位于xxx…dao包
MVC和三层模型对比
V视图 ------- 表示层前台代码
C控制器----- 表示层后台代码
M模型--------业务逻辑层+数据访问层
三层间关系
上层将请求传递给下层,下层处理后返回给上层
下面用一个详细的案例展示三层模型构架,代码包括几个部分:
a、add.jsp(表示层前台代码)用于显示添加界面
b、(my.student.entity包)Student,java(数据访问层)用于作为传递学生信息的JavaBean
c、(my.student.dao包)StudentDao.java(业务逻辑层)用于进行和数据库的增删改查基本操作
d、(my.student.servlet包)AddStudentServlet.java(表示层后台代码)用于接受用户前台的操作,调用业务逻辑层
e、(my.student.service包)StudentService.java(业务逻辑层)根据用户的请求组合dao层的实现功能
下面是具体的代码:
add.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>
<form action="AddStudentServlet">
学号:<input type="text" name="sno"><br/>
姓名:<input type="text" name="sname"><br/>
年龄:<input type="text" name="sage"><br/>
地址:<input type="text" name="saddress"><br/>
<input type="submit" value="新增"><br/>
</form>
</body>
</html>
addStudentServlet.java
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");
String no=request.getParameter("sno");
String name=request.getParameter("sname");
int age=Integer.parseInt(request.getParameter("sage"));
String address=request.getParameter("saddress");
Student stu=new Student(no,name,age,address);
StudentService ss=new StudentService();
boolean flag=ss.addStudent(stu);
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
if(flag) {
//在Servlet里拿到out
//session:request.getSession();
//application:reqeust.getServletContext
out.print("增加成功");
}
else {
out.print("增加失败");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
StudentService.java
package org.student.service;
import org.student.dao.StudentDao;
import org.student.entity.Student;
//业务逻辑层:逻辑性的增删改查,对dao层进行组装
public class StudentService {
StudentDao sd=new StudentDao();
public boolean addStudent(Student stu) {
if(!sd.isExist(stu.getNo())) {
try {
sd.addStudent(stu);
System.out.println("添加成功!");
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("系统出错");
return false;
}
}
else {
System.out.println("此人已存在");
return false;
}
}
}
Student.java
package org.student.entity;
public class Student {
private String no;
private String name;
private int age;
private String address;
public Student() {}
public Student(String no,String name,int age,String address) {
this.no=no;
this.name=name;
this.age=age;
this.address=address;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
StudentDao.java
package org.student.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.student.entity.Student;
//数据访问层为原子层,不可拆
public class StudentDao {
private final String userName="root";
private final String passWord="123456";
private final String connectionUrl="jdbc:mysql://127.0.0.1:3306/school?useUnicode=true&characterEncoding=utf-8";
public boolean isExist(String sno) { //查询学号为sno的学生是否存在
Student stu=null;
try {
stu=queryStudentBySno(sno);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(stu!=null) {
return true;
}
else {
return false;
}
}
public Student queryStudentBySno(String sno) throws Exception{ //根据学号查询学生信息
Student stu=null;
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection(connectionUrl,userName,passWord);
String sql="SELECT * FROM student WHERE `sno`=?";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, sno);
ResultSet rs=pstmt.executeQuery();
if(rs.next()) {
String name=rs.getString("name");
int age=rs.getInt("age");
String address=rs.getString("address");
stu=new Student(sno,name,age,address);
}
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
return stu;
}
public boolean addStudent(Student stu) throws Exception{
boolean flag=false;
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection(connectionUrl,userName,passWord);
String sql="INSERT INTO student(`sno`,`name`,`age`,`address`) VALUE(?,?,?,?)";
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setString(1, stu.getNo());
pstmt.setString(2, stu.getName());
pstmt.setInt(3, stu.getAge());
pstmt.setString(4, stu.getAddress());
int count=pstmt.executeUpdate();
if(count>0) flag=true;
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
return flag;
}
}