学生信息管理1.0
涉及的知识点:三层架构理论
简单理解三层架构就是,上层调用下层,下层为上层提供服务。
最上层(视图层):由jsp+servlet组成
中间层(服务层):组装数据访问层所实现的功能
最下层(数据访问层):实现单一得某项功能,为服务层提供服务
实体类是作为三层架构传数据的参数。
应用实例:运用三层架构实现对学生信息得增删改查
项目目录结构图
1.需要用到的数据库与数据表
create database test;
use test;
drop table if exists student;
create table student(
s_id int not null primary key,
s_name varchar(20),
s_age int,
s_address varchar(20)
)
select * from student;
delete from student where s_id=11;
insert into student (s_id,s_name,s_age,s_address) values(11,'zs','21','jx');
update student set s_name='欧文',s_age=29,s_address='布鲁克林' where s_id=11;
select * from student where s_id=11;
数据表结构图
2.导入数据库驱动包目录WebContent下的WEB-INF的lib文件夹中,选中改jar包:右键build path—>点击add build path
3.在WebContent目录下新建实现增删改查的jsp页面(一个jsp页面对应一个servlet)
studentsystem.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>
<a href="addstudent.jsp">增加学生信息</a><br>
<a href="deletestudent.jsp">删除学生信息</a><br>
<a href="updatestudent.jsp">修改学生信息</a><br>
<a href="querystudentbysno.jsp">查询单个学生信息</a><br>
<a href="queryallstudent.jsp">查询所有学生信息</a><br>
</body>
</html>
addstudent.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>
<!-- 将该表单数据传递到StudentServlet处理 -->
<form action="AddStudentServlet" method="post">
学号:<input type="text" name="sid"><br>
姓名:<input type="text" name="sname"><br>
年龄:<input type="text" name="sage"><br>
地址:<input type="text" name="saddress"><br>
<input type="submit" value="增加学生">
</form>
</body>
</html>
deletestudent.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="DeleteStudentServlet" method="post">
输入你要删除学生信息的学号:<br>
<input type="text" name="sid"><br>
<input type="submit" value="删除学生">
</form>
</body>
</html>
updatestudent.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="UpdateStudentServlet" method="post">
输入你要修改学生信息:<br>
学号:<input type="text" name="sid"><br>
姓名:<input type="text" name="sname"><br>
年龄:<input type="text" name="sage"><br>
地址:<input type="text" name="saddress"><br>
<input type="submit" value="修改学生">
</form>
</body>
</html>
querystudentbysno.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="QueryStudentBySnoServlet" method="post">
请输入你要查询学生信息的学号:<br>
<input type="text" name="sid"><br>
<input type="submit" value="查询单个学生信息">
</form>
</body>
</html>
queryallstudent.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="QueryAllStudentServlet" method="post">
<input type="submit" value="查询所有学生信息">
</form>
</body>
</html>
4.在src目录下新建包com.xiaochen.entity,在该包内新建实体类Student作为三层架构中传数据的参数
student.java
package com.xiaochen.entity;
public class Student {
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
}
private int id;
private String name;
private int age;
private String address;
public Student() {
}
public Student(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public Student(int id, String name, int age, String address) {
super();
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
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 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;
}
}
5.在src目录下新建包com.xiaochen.servlet,在该包内新建与增删改查等jsp页面对应的servlet
AddStudentServlet.java
package com.xiaochen.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaochen.entity.Student;
import com.xiaochen.service.StudentService;
@WebServlet("/AddStudentServlet")
public class AddStudentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
// 设置统一编码格式
request.setCharacterEncoding("utf-8");
// 接收jsp页面传来的表单数据
int id = Integer.parseInt(request.getParameter("sid"));
String name = request.getParameter("sname");
int age = Integer.parseInt(request.getParameter("sage"));
String address = request.getParameter("saddress");
// 将接收的数据封装成一个实体类(即封装数据的javabean)
Student student = new Student(id, name, age, address);
// 操作service层来实现增加学生信息的功能
StudentService studentservice = new StudentService();
boolean result = studentservice.addStudent(student);
response.setCharacterEncoding("GBK");
if (result != false) {
response.getWriter().println("增加成功!");
} else {
response.getWriter().println("增加失败!");
}
}
}
DeleteStudentServlet.java
package com.xiaochen.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaochen.entity.Student;
import com.xiaochen.service.StudentService;
@WebServlet("/DeleteStudentServlet")
public class DeleteStudentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
// 设置统一编码格式
request.setCharacterEncoding("utf-8");
// 接收jsp页面传来的表单数据
int id = Integer.parseInt(request.getParameter("sid"));
// 操作service层来实现删除学生信息的功能
StudentService studentservice = new StudentService();
boolean result = studentservice.deleteStudent(id);
response.setCharacterEncoding("GBK");
if (result != false) {
response.getWriter().println("删除成功!");
} else {
response.getWriter().println("删除失败!");
}
}
}
UpdateStudentServlet.java
package com.xiaochen.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaochen.entity.Student;
import com.xiaochen.service.StudentService;
@WebServlet("/UpdateStudentServlet")
public class UpdateStudentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
// 设置统一编码格式
request.setCharacterEncoding("utf-8");
// 接收jsp页面传来的表单数据
int sno = Integer.parseInt(request.getParameter("sid"));
String name=request.getParameter("sname");
int age=Integer.parseInt(request.getParameter("sage"));
String address=request.getParameter("saddress");
//将修改信息封装到学生实体类
Student student=new Student(name,age,address);
//操作service层来实现修改学生信息的功能
StudentService studentservice = new StudentService();
boolean result = studentservice.updateStudent(sno,student);
response.setCharacterEncoding("GBK");
if (result != false) {
response.getWriter().println("修改成功!");
} else {
response.getWriter().println("修改失败!");
}
}
}
QueryStudentBySnoServlet.java
package com.xiaochen.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaochen.entity.Student;
import com.xiaochen.service.StudentService;
/**
* Servlet implementation class QueryStudentBySnoServlet
*/
@WebServlet("/QueryStudentBySnoServlet")
public class QueryStudentBySnoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
// 设置统一编码格式
request.setCharacterEncoding("utf-8");
// 接收jsp页面传来的表单数据
int sno = Integer.parseInt(request.getParameter("sid"));
//操作service层来实现查询学生信息的功能
StudentService studentservice = new StudentService();
Student student=studentservice.queryStudentBySno(sno);
response.setCharacterEncoding("GBK");
//将学生信息打印出来
response.getWriter().println("学号:"+student.getId());
response.getWriter().println("姓名:"+student.getName());
response.getWriter().println("年龄:"+student.getAge());
response.getWriter().println("地址:"+student.getAddress());
}
}
QueryAllStudentServlet.java
package com.xiaochen.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaochen.entity.Student;
import com.xiaochen.service.StudentService;
@WebServlet("/QueryAllStudentServlet")
public class QueryAllStudentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
// 设置统一编码格式
request.setCharacterEncoding("utf-8");
//操作service层来实现查询所有学生信息的功能
StudentService studentservice = new StudentService();
List<Student> students = studentservice.queryAllStudent();
response.setCharacterEncoding("GBK");
// 将学生信息打印出来
response.getWriter().println(students.toString());
}
}
6.在src目录下新建包com.xiaochen.service,在该包新建类StudentService实现逻辑性的增删改查
StudentService.java
package com.xiaochen.service;
import java.util.List;
import com.xiaochen.dao.StudentDao;
import com.xiaochen.entity.Student;
//业务逻辑层:逻辑的增删改查(增:查+增),对dao层进行了组装
public class StudentService {
StudentDao studentdao=new StudentDao();
//增加学生:(增=查+增)
public boolean addStudent(Student student) {
if(!studentdao.isExist(student.getId())) {//判断该学生是否存在
//不存在则增加
studentdao.addStudent(student);
return true;
}else {
//存在则打印
System.out.println("此人已存在!");
return false;
}
}
//删除学生:(删=查+删)
public boolean deleteStudent(int sno) {
if(!studentdao.isExist(sno)) {//判断该学生是否存在
//不存在则删除失败
System.out.println("删除失败!");
return false;
}else {
//存在则删除该学生
studentdao.deleteStudent(sno);
return true;
}
}
//修改学生:(改=查+删)
public boolean updateStudent(int sno,Student student) {
if(!studentdao.isExist(sno)) {//判断该学生是否存在
//不存在则修改失败
System.out.println("修改失败!");
return false;
}else {
//存在则修改该学生
studentdao.updateStudent(sno,student);
return true;
}
}
//查询学生:(查询单个学生)
public Student queryStudentBySno(int sno) {
return studentdao.queryStudentBySno(sno);
}
//查询所有学生信息:
public List<Student> queryAllStudent() {
return studentdao.queryAllStudent();
}
}
7.在src目录下新建包com.xiaochen.dao,在该包新建类StudentDao实现原子性的增删改查
StudentDao.java
package com.xiaochen.dao;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import com.xiaochen.entity.Student;
//此类中的增删改查方法都是原子性的,须将其传递到service进行组装
//以此来实现逻辑性的增删改查
public class StudentDao {
private static final String DRIVER="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/test";
private static final String NAME="root";
private static final String PWD="123abc";
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
int count=-1;
/*
* 判断学生是否存在
调用通过学号查询学生方法来判断
*/
//通过学号判断该学生是否存在
public boolean isExist(int sno) {
return queryStudentBySno(sno)==null?false:true;
}
/*增加学生信息功能
* return true:增加成功
* return false:系统异常,增加失败
*/
//通过实体类传参来增加学生
public boolean addStudent(Student student) {
try {
//加载具体的驱动类
Class.forName(DRIVER);
//连接数据库
con=DriverManager.getConnection(URL,NAME,PWD);
//获取操作数据库对象
String sql="insert into student (s_id,s_name,s_age,s_address) values(?,?,?,?)";
pstmt=con.prepareStatement(sql);
//给占位符赋值
pstmt.setInt(1, student.getId());
pstmt.setString(2, student.getName());
pstmt.setInt(3, student.getAge());
pstmt.setString(4, student.getAddress());
//操作数据库
count=pstmt.executeUpdate();
//判断是否添加成功
if(count>0)
return true;
else
return false;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
/*删除学生功能信息
* return true:删除成功
* return false:系统异常,删除失败
*/
//根据学号删除学生信息
public boolean deleteStudent(int sno) {
try {
//加载具体的驱动类
Class.forName(DRIVER);
//连接数据库
con=DriverManager.getConnection(URL,NAME,PWD);
//获取操作数据库对象
String sql="delete from student where s_id=?";
pstmt=con.prepareStatement(sql);
//给占位符赋值
pstmt.setInt(1, sno);
//操作数据库
count=pstmt.executeUpdate();
//判断是否删除成功
if(count>0)
return true;
else
return false;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
/*修改学生信息
* return true:修改成功
* return false:系统异常,修改失败
*/
//根据学号修改学生信息
public boolean updateStudent(int sno,Student student) {
try {
//加载具体的驱动类
Class.forName(DRIVER);
//连接数据库
con=DriverManager.getConnection(URL,NAME,PWD);
//获取操作数据库对象
String sql="update student set s_name=?,s_age=?,s_address=? where s_id=?";
pstmt=con.prepareStatement(sql);
//给占位符赋值
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getAge());
pstmt.setString(3, student.getAddress());
pstmt.setInt(4, sno);
//操作数据库
count=pstmt.executeUpdate();
//判断是否修改成功
if(count>0)
return true;
else
return false;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
/*
* 查询单个学生
* 查询学生是否存在:通过学号查询
return student:查询成功,返回该学生信息
return null:查询失败,系统异常,返回null
*/
//通过学号来查询单个学生的信息
public Student queryStudentBySno(int sno) {
Student student=null;
try {
//加载具体的驱动类
Class.forName(DRIVER);
//连接数据库
con=DriverManager.getConnection(URL,NAME,PWD);
//获取操作数据库对象
String sql="select * from student where s_id=?";
pstmt=con.prepareStatement(sql);
//给占位符赋值
pstmt.setInt(1, sno);
//返回结果集
rs=pstmt.executeQuery();
while(rs.next()!=false) {
//若查询单个学生成功,将其数据封装到Student实体类
int id=rs.getInt("s_id");
String name=rs.getString("s_name");
int age=rs.getInt("s_age");
String address=rs.getString("s_address");
student=new Student(id,name,age,address);
return student;
}
return student;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}catch (Exception e) {
e.printStackTrace();
return null;
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
return null;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
/*
* 查询所有学生信息
* 将所有学生信息存到list中
*/
//将所有学生信息存到List来将其输出
public List<Student> queryAllStudent() {
List<Student> students=new ArrayList<>();
Student student=null;
try {
//加载具体的驱动类
Class.forName(DRIVER);
//连接数据库
con=DriverManager.getConnection(URL,NAME,PWD);
//获取操作数据库对象
String sql="select * from student";
pstmt=con.prepareStatement(sql);
//返回结果集
rs=pstmt.executeQuery();
while(rs.next()!=false) {
//若查询学生成功,将其数据封装到Student实体类
int id=rs.getInt("s_id");
String name=rs.getString("s_name");
int age=rs.getInt("s_age");
String address=rs.getString("s_address");
student=new Student(id,name,age,address);
//将查询出来的学生信息加入到list集合
students.add(student);
}
return students;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
运行结果图
增加学生
查询单个学生
查询所有学生信息
修改学生信息
删除学生信息