宣布告终!历经周折的学生管理系统

学生管理系统Web项目实现与总结

经过了两个阶段的学习与尝试,最终实现了Web端的学生管理系统。
为什么要说是两个阶段呢?

  1. 实际上在暑假学习Web的时候做了一个初版的学生管理系统,但是在最后一个传值 的过程中,遇到了一个我以为不能解决的问题,就因为这个问题捣鼓了一天没捣鼓出来,最终决定放弃这个项目。
  2. 直到我继续往下学习的时候觉得这个学生管理系统应该还是得尝试一下,于是最后一次尝试中,解决了问题,初版的学生管理系统的问题在开学的2周后解决,在昨天完成了其他的所有功能并且修改了一下BUG

项目做了很久,遇到的问题很多,在此做一个项目实现流程与项目个人总结来记录一下学习过程。接下来进入正题,为了分析这个项目,我分为五大块:

  1. 项目的层次结构
  2. 项目的逻辑流程
  3. 项目的代码实现
  4. 项目的运行效果
  5. 项目的问题总结
  6. 项目的感想与展望

1、项目的层次结构

项目结构

1、Dao层中包含了两个接口,分别是StudentDao与UserDao,其下为它们的实现类
2、Model层中PageBean为分页实现所需要的数据存储类,Account为登录功能所需要的用户数据类,Student为显示数据所需要的学生信息存储类
3、Service层为业务逻辑层,目的是为了确保避免Dao层与用户的直接接触,类似一个Dao的代理
4、Servlet层的功能主要实现了JSP页面与后端的数据交互并实现页面的跳转功能
5、Utils层的功能主要是为了使用数据库连接池以及判断JSP页面传递的值是否为空

JSP结构

N、这里六个JSP页面中student1与student2分别为单页与分页显示的页面(其余略)

注意:由于Eclipse的问题,所以导致图1没有明显的层次感,具体看包名分清

2、项目的逻辑流程

逻辑流程图

3、项目的代码实现
Dao层实现类

1、StudentDaoImpl

package Dao.DaoImpl;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import Dao.StudentDao;
import Model.PageBean;
import Model.Student;
import Utils.JDBCUtil_c3p0;
import Utils.StringUtil;
/**
 * StudentDaoImpl
 * @author Hillain
 */
public class StudentDaoImpl implements StudentDao{
	QueryRunner qr = JDBCUtil_c3p0.getQR();
	@Override
	public List<Student> findAll() {
		List<Student> list = null;
		try {
			list = qr.query("select * from stu",new BeanListHandler<Student>(Student.class));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}

	@Override
	public void insert(Student stu) {
		try {
			qr.update("insert into stu values (null,?,?,?,?,?,?,?,?)",
					stu.getSchool(),stu.getDepartment(),stu.getBanji(),stu.getName(),
					stu.getAge(),stu.getSex(),stu.getLocation(),stu.getRt());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void delete(int id) {
		try {
			qr.update("delete from stu where id = ?",id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public Student findOne(int id) {
		Student stu = new Student();
		try {
			 stu = qr.query("select * from stu where id = ?", new BeanHandler<Student>(Student.class) ,id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stu;
	}

	@Override
	public void update(Student stu) {
		try {
			qr.update("update stu set school=?,department=?,banji=?,name=?,age=?,sex=?,location=?,rt=? where id=?", 
					stu.getSchool(),stu.getDepartment(),stu.getBanji(),stu.getName(),stu.getAge(),
					stu.getSex(),stu.getLocation(),stu.getRt(),stu.getId());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	@Override
	public List<Student> search(String name, String sex) {
		String sql = "select * from stu where 1=1";		//先写一个sql语句,后面的1=1是为了方便加内容
		List<String> list = new ArrayList<String>();	//用于查询参数的list
		List<Student> students = null;
		if(!StringUtil.isEmpty(name)){
			sql += " and name like ?";
			list.add("%"+name+"%");	//模糊查询
		}
		if(!StringUtil.isEmpty(sex)){
			sql += " and sex = ?";
			list.add(sex);
		}
		try {
			students = qr.query(sql, new BeanListHandler<Student>(Student.class),list.toArray());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return  students;
	}

	@Override
	public List<Student> findStudentByPage(int currentPage) {
		List<Student> students = new ArrayList<Student>();
		try {
			students = qr.query("select * from stu limit ? OFFSET ?",new BeanListHandler<Student>(Student.class), Page_Size,(currentPage-1)*Page_Size);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return students;
	}

	@Override
	public int findCount() {
		Long count = null;
		try {
			count = (Long)qr.query("select COUNT(*) from stu", new ScalarHandler());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return count.intValue();
	}
}

2、UserDaoImpl

package Dao.DaoImpl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import Dao.UserDao;
import Model.Account;
import Model.Student;
import Utils.JDBCUtil_c3p0;
/**
 * StudentDaoImpl
 * @author Hillain
 */
public class UserDaoImpl implements	UserDao{
	@Override
	public boolean login(String username, String password) {
		QueryRunner qr = JDBCUtil_c3p0.getQR();
		List<Account> list = null;
		try {
			list = qr.query("select * from admin where username = ? and password = ?", 
					new BeanListHandler<Account>(Account.class),username,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return !list.isEmpty();
	}
	
}

Model层

1、Account

package Model;

public class Account {
	private int id = -1;
	private String username = null;
	private String password = null;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "Account [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
}

2、PageBean

package Model;

import java.util.List;

public class PageBean<T> {
	private String name;
	private String sex;
	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;
	}
	private int method;//查看是哪种查询
	public int getMethod() {
		return method;
	}
	public void setMethod(int method) {
		this.method = method;
	}
	private int currentPage;//当前页数
	private int totalPage;//总页数
	public int getCurrentPage() {
		return currentPage;
	}
	@Override
	public String toString() {
		return "PageBean [currentPage=" + currentPage + ", totalPage=" + totalPage + ", currentSize=" + currentSize
				+ ", totalSize=" + totalSize + ", list=" + list + "]";
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getCurrentSize() {
		return currentSize;
	}
	public void setCurrentSize(int currentSize) {
		this.currentSize = currentSize;
	}
	public int getTotalSize() {
		return totalSize;
	}
	public void setTotalSize(int totalSize) {
		this.totalSize = totalSize;
	}
	public List<T> getList() {
		return list;
	}
	public void setList(List<T> list) {
		this.list = list;
	}
	private int currentSize;//当前个数
	private int totalSize;//总个数
	private List<T> list;//集合
}

3、Student

package Model;

import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * Student数据存储对象
 * @author Hillain
 */
public class Student {
	public Student(int id,String school, String department, String banji, String name, int age, String sex,
			String location, Date rt) {
		super();
		this.id = id;
		this.school = school;
		this.department = department;
		this.banji = banji;
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.location = location;
		this.rt = rt;
	}
	public Student(String school, String department, String banji, String name, int age, String sex,
			String location, Date rt) {
		super();
		this.school = school;
		this.department = department;
		this.banji = banji;
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.location = location;
		this.rt = rt;
	}
	public Student(){}
	int id = -1;
	String school = null;
	String department = null;
	String banji = null;
	String name = null;
	int age = -1;
	String sex = null;
	String location = null;
	Date rt = null;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getLocation() {
		return location;
	}
	public void setLocation(String location) {
		this.location = location;
	}
	public Date getRt() {
		return rt;
	}
	public void setRt(Date rt) {
		this.rt = rt;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public String getDepartment() {
		return department;
	}
	public void setDepartment(String department) {
		this.department = department;
	}
	public String getBanji() {
		return banji;
	}
	public void setBanji(String banji) {
		this.banji = banji;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", school=" + school + ", department=" + department + ", banji=" + banji
				+ ", name=" + name + ", age=" + age + ", sex=" + sex + ", location=" + location + ", rt=" + rt + "]";
	}
}

Service层实现类

1、SystemServiceImpl

package Service.ServiceImpl;

import java.util.ArrayList;
import java.util.List;

import Dao.StudentDao;
import Dao.DaoImpl.StudentDaoImpl;
import Dao.DaoImpl.UserDaoImpl;
import Model.PageBean;
import Model.Student;
import Service.SystemService;
/**
 * 具体的业务处理
 * @author Hillain
 * @param <T>
 *
 */
public class SystemServiceImpl<T> implements SystemService{
	StudentDao stuDao = new StudentDaoImpl();
	@Override
	public List<Student> findAll() {
		return stuDao.findAll();
	}

	@Override
	public boolean login(String username, String password) {
		return new UserDaoImpl().login(username, password);
	}

	@Override
	public void insert(Student stu) {
		stuDao.insert(stu);
	}

	@Override
	public void delete(int id) {
		stuDao.delete(id);
	}

	@Override
	public Student findOne(int id) {
		Student stu = stuDao.findOne(id);
		return stu;
	}

	@Override
	public void update(Student stu) {
		stuDao.update(stu);
	}

	@Override
	public List<Student> search(String name, String sex) {
		return stuDao.search(name,sex);
	}

	@Override
	public PageBean<T> findStudentByPage(int currentPage) {
		PageBean<Student> pb = new PageBean<Student>();
		StudentDao stu = new StudentDaoImpl();
		int totalPage = -1;	//总页数
		int totalSize = -1;	//总个数
		totalSize = stu.findCount();
		totalPage = (totalSize%stu.Page_Size==0)?(totalSize/stu.Page_Size):(totalSize/stu.Page_Size)+1;
		pb.setCurrentPage(currentPage);
		pb.setCurrentSize(stu.Page_Size);
		pb.setTotalSize(stu.findCount());
		pb.setTotalPage(totalPage);
		pb.setList(stu.findStudentByPage(currentPage));
		pb.setSex("");
		pb.setName("");
		pb.setMethod(1);
		return (PageBean<T>) pb;
	}
	
	@Override
	public PageBean<T> searchByPage(String name,String sex,int currentPage,int method) {
		PageBean<Student> pb = new PageBean<Student>();
		StudentDao stu = new StudentDaoImpl();
		List<Student> students1 = stu.search(name, sex);
		List<Student> students2 = new ArrayList<Student>();
		for(int i = (currentPage-1)*5;i<currentPage*5;i++) {
			if(students1.size()<=i)break;
			students2.add(students1.get(i));
		}
		int totalPage = -1;	//总页数
		int totalSize = -1;	//总个数
		totalSize = students1.size();
		totalPage = (totalSize%stu.Page_Size==0)?(totalSize/stu.Page_Size):(totalSize/stu.Page_Size)+1;
		pb.setList(students2);
		pb.setCurrentPage(currentPage);
		pb.setCurrentSize(stu.Page_Size);
		pb.setTotalSize(students1.size());
		pb.setTotalPage(totalPage);
		pb.setName(name);
		pb.setSex(sex);
		pb.setMethod(method);
		return (PageBean<T>) pb;
	}
}

Servlet层

1、AddStudent

package Servlet;

import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
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.apache.commons.dbutils.QueryRunner;

import Model.Student;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;
import Utils.JDBCUtil_c3p0;

/**
 * Servlet implementation class AddStudent
 */
public class AddStudent extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			request.setCharacterEncoding("UTF-8");
			response.setContentType("text/html; charset=UTF-8");
			String school = request.getParameter("school");
			String department = request.getParameter("dept");
			String banji = request.getParameter("banji");
			String name = request.getParameter("name");
			String agestr = request.getParameter("age");
			String sex = request.getParameter("sex");
			String location = request.getParameter("location");
			String timestr = request.getParameter("time");
			Date time = null;
			int age = -1;
			if(school.trim().equals("")||department.trim().equals("")||banji.trim().equals("")||name.trim().equals("")||agestr.trim().equals("")||sex.trim().equals("")||location.trim().equals("")||timestr.trim().equals("")){
				response.getWriter().write("所填信息不能为空!");
				response.setHeader("refresh", "3;addStudent.jsp");
			}else{
				age = Integer.parseInt(agestr);
				time = new SimpleDateFormat("yyyy-MM-dd").parse(timestr);
				Student stu = new Student(school,department,banji,name,age,sex,location,time);
				SystemService service = new SystemServiceImpl();
				service.insert(stu);
				request.getRequestDispatcher("student").forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

2、DeleteStudent

package 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 Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;

/**
 * Servlet implementation class DeleteStudent
 */
public class DeleteStudent extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		SystemService service = new SystemServiceImpl();
		int id = Integer.parseInt(request.getParameter("id"));
		service.delete(id);
		request.getRequestDispatcher("student").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

3、FindStudent

package 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 Model.Student;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;

/**
 * Servlet implementation class UpdateStudent
 */
public class FindStudent extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int id = Integer.parseInt(request.getParameter("id"));
		SystemService service = new SystemServiceImpl();
		Student stu = service.findOne(id);
		request.getSession().setAttribute("student", stu);
		response.sendRedirect("update.jsp");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

4、LoginServlet

package 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 Dao.UserDao;
import Dao.DaoImpl.UserDaoImpl;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;

/**
 * 用于处理登录功能的Servlet
 */
public class LoginServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		SystemService service = new SystemServiceImpl();
		if(service.login(username, password)){
			response.sendRedirect("index.jsp");
		}else{
			response.setHeader("refresh", "3;login.jsp");
			response.getWriter().write("登陆失败,请重试!");
		}
	}
}

5、SearchStudent

package Servlet;

import java.io.IOException;
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.apache.catalina.core.ApplicationContext;

import com.sun.glass.ui.Application;

import Model.PageBean;
import Model.Student;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;
import Utils.StringUtil;

/**
 * Servlet implementation class SearchStudent
 */
public class SearchStudent extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		String name = request.getParameter("name");
		String sex = request.getParameter("sex");
		int method = Integer.parseInt(request.getParameter("method"));
		if(method==1){
			SystemService service = new SystemServiceImpl();
			List<Student> students = service.search(name,sex);
			request.getSession().setAttribute("student", students);
			request.getSession().setAttribute("name", name);
			request.getSession().setAttribute("sex", sex);
			request.getRequestDispatcher("student1.jsp").forward(request, response);
		}
		if(method==2){
			int currentPage = Integer.parseInt(request.getParameter("currentPage"));
			SystemService service = new SystemServiceImpl();
			if(StringUtil.isEmpty(name)&&StringUtil.isEmpty(sex)){
				method=1;
			}
			PageBean pb = service.searchByPage(name, sex, currentPage, method);
			request.getSession().setAttribute("pb", pb);
			request.getRequestDispatcher("student2.jsp").forward(request, response);
		}
		if(method==3){
			int currentPage = Integer.parseInt(request.getParameter("currentPage"));
			SystemService service = new SystemServiceImpl();
			PageBean<Student> pb1 = (PageBean<Student>) request.getSession().getAttribute("pb");
			PageBean pb2 = service.searchByPage(pb1.getName(), pb1.getSex(), currentPage,method);
			request.getSession().setAttribute("pb", pb2);
			request.getRequestDispatcher("student2.jsp").forward(request, response);
		}
	}
}

6、StudentPageServlet

package 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 Model.PageBean;
import Model.Student;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;

/**
 * Servlet implementation class StudentPageServlet
 */
public class StudentPageServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int currentPage = Integer.parseInt(request.getParameter("currentPage"));
		SystemService service = new SystemServiceImpl();
		PageBean pb = service.findStudentByPage(currentPage);
		request.getSession().setAttribute("pb", pb);
		/*for (Object student : pb.getList()) {
			System.out.println(student.toString());
		}*/
		request.getRequestDispatcher("student2.jsp").forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

7、StudentServlet

package Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Model.Student;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;

/**
 * Servlet implementation class StudentServlet
 */
public class StudentServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		SystemService service = new SystemServiceImpl();
		List<Student> list = service.findAll();
		request.getSession().setAttribute("student", list);
		response.sendRedirect("student1.jsp");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}

}

8、UpdateStudent

package Servlet;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Model.Student;
import Service.SystemService;
import Service.ServiceImpl.SystemServiceImpl;

/**
 * Servlet implementation class UpdateStudent
 */
public class UpdateStudent extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			request.setCharacterEncoding("UTF-8");
			response.setContentType("text/html; charset=UTF-8");
			int id = Integer.parseInt(request.getParameter("id"));
			String school = request.getParameter("school");
			String department = request.getParameter("dept");
			String banji = request.getParameter("banji");
			String name = request.getParameter("name");
			String agestr = request.getParameter("age");
			String sex = request.getParameter("sex");
			String location = request.getParameter("location");
			String timestr = request.getParameter("time");
			Date time = null;
			int age = -1;
			if(school.trim().equals("")||department.trim().equals("")||banji.trim().equals("")||name.trim().equals("")||agestr.trim().equals("")||sex.trim().equals("")||location.trim().equals("")||timestr.trim().equals("")){
				response.getWriter().write("所填信息不能为空!");
				response.setHeader("refresh", "3;addStudent.jsp");
			}else{
				age = Integer.parseInt(agestr);
				time = new SimpleDateFormat("yyyy-MM-dd").parse(timestr);
				Student stu = new Student(id,school,department,banji,name,age,sex,location,time);
				SystemService service = new SystemServiceImpl();
				service.update(stu);
				request.getRequestDispatcher("student").forward(request, response);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Utils层

1、C3P0

package Utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import org.apache.commons.dbutils.QueryRunner;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
 * 该类为c3p0实现的JDBCUtil工具类
 * @author Hillain
 *
 */
public class JDBCUtil_c3p0 {
	static ComboPooledDataSource cpds = null;
	static QueryRunner qr = null;
	//静态初始块
	static{
		cpds = new ComboPooledDataSource();
		qr = new QueryRunner(cpds);
	}
	public static Connection getConn() throws SQLException{
		//注册驱动
		//获取Connection
		return cpds.getConnection();
	}
	public static QueryRunner getQR(){
		return qr;
	}
	/**
	 * 利用方法关闭JDBC资源
	 * @param rs
	 * @param st
	 * @param conn
	 */
	public static void closeAll(ResultSet rs,Statement st,Connection conn){
		closeRs(rs);
		closeSt(st);
		closeConn(conn);
	}
	//关闭ResultSet
	public static void closeRs(ResultSet rs){
		try {
			if(rs!=null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally{
			rs = null;
		}
	}
	//关闭Statement
	public static void closeSt(Statement st){
		try {
			if(st!=null){
				st.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally{
			st = null;
		}
	}
	//关闭Connection
	public static void closeConn(Connection conn){
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally{
			conn = null;
		}
	}
}

2、StringUtil

package Utils;

public class StringUtil {
	static public boolean isEmpty(CharSequence s){
		return s==null||s.length()==0;
	}
}

3、C3P0-config

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
  	<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
  	<property name="jdbcUrl">jdbc:mysql://localhost:3306/sorm?useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai</property>
  	<property name="user">root</property>
  	<property name="password">1044722314</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">200</property>
  </default-config>


  <!-- This app is massive! -->
  <named-config name="intergalactoApp"> 
    <property name="acquireIncrement">50</property>
    <property name="initialPoolSize">100</property>
    <property name="minPoolSize">50</property>
    <property name="maxPoolSize">1000</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
    <property name="maxStatements">0</property> 
    <property name="maxStatementsPerConnection">5</property>

    <!-- he's important, but there's only one of him -->
    <user-overrides user="master-of-the-universe"> 
      <property name="acquireIncrement">1</property>
      <property name="initialPoolSize">1</property>
      <property name="minPoolSize">1</property>
      <property name="maxPoolSize">5</property>
      <property name="maxStatementsPerConnection">50</property>
    </user-overrides>
  </named-config>
</c3p0-config>

JSP层

1、addStudent

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="AddStudent" method="post">
		<table border="1">
			 <tr align="center">
				<td>学校</td>
				<td><input type="text" name="school"></td>
			 </tr>
			 <tr align="center">
				<td>学院</td>
				<td><input type="text" name="dept"></td>
			 </tr>
			 <tr align="center">
				<td>班级</td>
				<td><input type="text" name="banji"></td>
			 </tr>
			 <tr align="center">
				<td>姓名</td>
				<td><input type="text" name="name"></td>
			 </tr>
			 <tr align="center">
				<td>年龄</td>
				<td><input type="text" name="age"></td>
			 </tr>
			 <tr align="center">
				<td>性别</td>
				<td>
					<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"></td>
			 </tr>
			 <tr align="center">
				<td>籍贯</td>
				<td><input type="text" name="location"></td>
			 </tr>
			 <tr align="center">
				<td>注册日期</td>
				<td><input type="text" name="time"></td>
			 </tr>
			 <tr align="center">
				<td><input value="添加信息" type="submit"></td>
			 </tr>
		</table>
	</form>
</body>
</html>

2、index

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
	<h3><a href="student">显示所有学生信息列表</a></h3>
	<h3><a href="StudentPageServlet?currentPage=1">分页显示所有学生信息列表</a></h3>
</body>
</html>

3、login

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>student</title>
<script type="text/javascript">
	function deleteStudent(id) {
		var flag = confirm("是否要删除学生?");
		if(flag){
			//表明点了确定,访问Servlet,在当前标签页上打开超链接
			window.location.href="DeleteStudent?id="+id
		}
	}
</script>
</head>
<body>
	<form action="SearchStudent" method="post">
		<table border="1">
			<tr>
				<td colspan="10">
					&nbsp
					姓名:<input type="text" name="name" <c:if test="${!empty name }">value="${name }"</c:if>>
					<input type="hidden" name="method" value="1">
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					性别:<select name="sex" style="text-align: center;">
							<option value="" <c:if test="${empty sex }">selected="selected"</c:if>>--请选择--</option>
							<option value="男" <c:if test="${sex eq '男' }">selected="selected"</c:if>></option>
							<option value="女" <c:if test="${sex eq '女' }">selected="selected"</c:if>></option>
						 </select>
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<input type="submit" value="查询学生信息">
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp|&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<input type="button" value="添加学生信息" onclick="window.location.href='addStudent.jsp'">
				</td>
			</tr>
			<tr align="center">
				<td>编号</td>
				<td>学校</td>
				<td>学院</td>
				<td>班级</td>
				<td>姓名</td>
				<td>年龄</td>
				<td>性别</td>
				<td>籍贯</td>
				<td>注册日期</td>
				<td>操作</td>
			</tr>
			<c:forEach items="${student }" var="stu">
				<tr align="center">
					<td>${stu.id }</td>
					<td>${stu.school }</td>
					<td>${stu.department }</td>
					<td>${stu.banji }</td>
					<td>${stu.name }</td>
					<td>${stu.age }</td>
					<td>${stu.sex }</td>
					<td>${stu.location }</td>
					<td>${stu.rt }</td>
					<td><a href="FindStudent?id=${stu.id }">更新</a> <a href="#" onclick="deleteStudent(${stu.id })">删除</a></td>
				</tr>
			</c:forEach>
		</table>
	</form>
</body>
</html>

4、student1

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>student</title>
<script type="text/javascript">
	function deleteStudent(id) {
		var flag = confirm("是否要删除学生?");
		if(flag){
			//表明点了确定,访问Servlet,在当前标签页上打开超链接
			window.location.href="DeleteStudent?id="+id
		}
	}
</script>
</head>
<body>
	<form action="SearchStudent" method="post">
		<table border="1">
			<tr>
				<td colspan="10">
					&nbsp
					姓名:<input type="text" name="name" <c:if test="${!empty name }">value="${name }"</c:if>>
					<input type="hidden" name="method" value="1">
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					性别:<select name="sex" style="text-align: center;">
							<option value="" <c:if test="${empty sex }">selected="selected"</c:if>>--请选择--</option>
							<option value="男" <c:if test="${sex eq '男' }">selected="selected"</c:if>></option>
							<option value="女" <c:if test="${sex eq '女' }">selected="selected"</c:if>></option>
						 </select>
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<input type="submit" value="查询学生信息">
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp|&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<input type="button" value="添加学生信息" onclick="window.location.href='addStudent.jsp'">
				</td>
			</tr>
			<tr align="center">
				<td>编号</td>
				<td>学校</td>
				<td>学院</td>
				<td>班级</td>
				<td>姓名</td>
				<td>年龄</td>
				<td>性别</td>
				<td>籍贯</td>
				<td>注册日期</td>
				<td>操作</td>
			</tr>
			<c:forEach items="${student }" var="stu">
				<tr align="center">
					<td>${stu.id }</td>
					<td>${stu.school }</td>
					<td>${stu.department }</td>
					<td>${stu.banji }</td>
					<td>${stu.name }</td>
					<td>${stu.age }</td>
					<td>${stu.sex }</td>
					<td>${stu.location }</td>
					<td>${stu.rt }</td>
					<td><a href="FindStudent?id=${stu.id }">更新</a> <a href="#" onclick="deleteStudent(${stu.id })">删除</a></td>
				</tr>
			</c:forEach>
		</table>
	</form>
</body>
</html>

5、student2

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>student</title>
<script type="text/javascript">
	function deleteStudent(id) {
		var flag = confirm("是否要删除学生?");
		if(flag){
			//表明点了确定,访问Servlet,在当前标签页上打开超链接
			window.location.href="DeleteStudent?id="+id
		}
	}
</script>
</head>
<body>
	<form action="SearchStudent" method="post">
		<table border="1">
			<tr>
				<td colspan="10">
					&nbsp
					姓名:<input type="text" name="name" <c:if test="${!empty pb.name }">value="${pb.name }"</c:if> >
					
					<input type="hidden" name="method" value="2">
					<input type="hidden" name="currentPage" value="1">
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					性别:<select name="sex" style="text-align: center;">
							<option value="" <c:if test="${empty pb.sex }">selected="selected"</c:if>>--请选择--</option>
							<option value="男" <c:if test="${pb.sex eq '男' }">selected="selected"</c:if>></option>
							<option value="女" <c:if test="${pb.sex eq '女' }">selected="selected"</c:if>></option>
						 </select>
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<input type="submit" value="查询学生信息">
					&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp|&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
					<input type="button" value="添加学生信息" onclick="window.location.href='addStudent.jsp'">
				</td>
			</tr>
			<tr align="center">
				<td>编号</td>
				<td>学校</td>
				<td>学院</td>
				<td>班级</td>
				<td>姓名</td>
				<td>年龄</td>
				<td>性别</td>
				<td>籍贯</td>
				<td>注册日期</td>
				<td>操作</td>
			</tr>
			<c:forEach items="${pb.list }" var="stu">
				<tr align="center">
					<td>${stu.id }</td>
					<td>${stu.school }</td>
					<td>${stu.department }</td>
					<td>${stu.banji }</td>
					<td>${stu.name }</td>
					<td>${stu.age }</td>
					<td>${stu.sex }</td>
					<td>${stu.location }</td>
					<td>${stu.rt }</td>
					<td><a href="FindStudent?id=${stu.id }">更新</a> <a href="#" onclick="deleteStudent(${stu.id })">删除</a></td>
				</tr>
			</c:forEach>
			<c:if test="${pb.method == 1}">
				<tr>
					<td colspan="10">
						第${pb.currentPage }/${pb.totalPage }&nbsp&nbsp&nbsp
						每页显示:${pb.currentSize }条数据&nbsp&nbsp&nbsp
						总记录数:${pb.totalSize }条数据&nbsp&nbsp&nbsp
						<c:if test="${pb.currentPage!=1 }">
							<a href="StudentPageServlet?currentPage=1">首页</a>|<a href="StudentPageServlet?currentPage=${pb.currentPage-1 }">上一页</a>
						</c:if>
						
						<c:forEach begin="1" end="${pb.totalPage }" var="i">
							<c:if test="${pb.currentPage== i }">
								${i }
							</c:if>
							<c:if test="${pb.currentPage!= i }">
								<a href="StudentPageServlet?currentPage=${i }">${i }</a>
							</c:if>
						</c:forEach>
						
						<c:if test="${pb.currentPage!=pb.totalPage }">
							<a href="StudentPageServlet?currentPage=${pb.currentPage+1 }">下一页</a>|<a href="StudentPageServlet?currentPage=${pb.totalPage}">尾页</a>
						</c:if>
					</td>
				</tr>
			</c:if>
			<c:if test="${pb.method == 2||pb.method == 3}">
				<tr>
					<td colspan="10">
						第${pb.currentPage }/${pb.totalPage }&nbsp&nbsp&nbsp
						每页显示:${pb.currentSize }条数据&nbsp&nbsp&nbsp
						总记录数:${pb.totalSize }条数据&nbsp&nbsp&nbsp
						<%
							session.setAttribute("name", session.getAttribute("pb"));
							session.setAttribute("sex", session.getAttribute("pb"));
						%>
						<c:if test="${pb.currentPage!=1 }">
							<a href="SearchStudent?currentPage=1&method=3">首页</a>|<a href="SearchStudent?currentPage=${pb.currentPage-1 }&method=3">上一页</a>
						</c:if>
						
						<c:forEach begin="1" end="${pb.totalPage }" var="i">
							<c:if test="${pb.currentPage== i }">
								${i }
							</c:if>
							<c:if test="${pb.currentPage!= i }">
								<a href="SearchStudent?currentPage=${i }&method=3">${i }</a>
							</c:if>
						</c:forEach>
						
						<c:if test="${pb.currentPage!=pb.totalPage }">
							<a href="SearchStudent?currentPage=${pb.currentPage+1 }&method=3">下一页</a>|<a href="SearchStudent?currentPage=${pb.totalPage}&method=3">尾页</a>
						</c:if>
					</td>
				</tr>
			</c:if>
		</table>
	</form>
</body>
</html>

6、update

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>update</title>
</head>
<body>
	<form method="post" action="UpdateStudent">
		<table border="1">
			<tr>
				<td>编号</td>
				<td><input type="hidden" name="id" value="${student.id }">${student.id }</td>
			</tr>
			<tr>
				<td>学校</td>
				<td><input type="text" name="school" value="${student.school }"></td>
			</tr>
			<tr>
				<td>学院</td>
				<td><input type="text" name="dept" value="${student.department }"></td>
			</tr>
			<tr>
				<td>班级</td>
				<td><input type="text" name="banji" value="${student.banji }"></td>
			</tr>
			<tr>
				<td>姓名</td>
				<td><input type="text" name="name" value="${student.name }"></td>
			</tr>
			<tr>
				<td>年龄</td>
				<td><input type="text" name="age" value="${student.age }"></td>
			</tr>
			<tr>
				<td>性别</td>
				<td>
					<input type="radio" name="sex"<c:if test="${student.sex =='男'}"> checked="true"</c:if> value="男"><input type="radio" name="sex"<c:if test="${student.sex =='女'}"> checked="true"</c:if> value="女"></td>
			</tr>
			<tr>
				<td>籍贯</td>
				<td><input type="text" name="location" value="${student.location }"></td>
			</tr>
			<tr>
				<td>注册日期</td>
				<td><input type="text" name="time" value="${student.rt }"></td>
			</tr>
			<tr>
				<td>操作</td>
				<td><input value="更新" type="submit"><input value="返回" type="button" onclick="window.location.href='index.jsp'"></td>
			</tr>
		</table>
	</form>
</body>
</html>

注意:关于Dao类等接口这里没有贴上代码,但不影响代码的理解

4、项目的运行效果

具体运行效果请看视频:项目演示视频

5、项目的问题总结

由于Tomcat版本问题,学生管理系统项目提取不出学生的信息(已尝试n次)✘
前两周学习时,突然想最后一次尝试,由于学生管理系统项目需要添加新功能✔
--------------------------以上分别是我解决问题前后的两个阶段----------------------------

遇到了N多个问题,不过最后解决了,感觉如磐涅重生了一般,在此写下个人心得。
1、还是上一次的问题,我一直认为是Tomcat版本的问题导致我的数据库无法和Servlet连接,一直提不出数据。成功的原因是因为学了数据库连接池之后,打算使用 ComboPooledDataSource来重写JDBCUtil,发现使用ComboPooledDataSource还是不行,而且是根本无法运行,错误为找不到c3p0所在类?
2、吃惊的我百度之后发现JavaWeb不仅仅资源文件的实际位置不在Java工程,就连添加Build-Path都要放在WebContent的lib下进行才可以成功使用jar包中的类。
3、终于,c3p0是成功使用了,在登陆页面也终于可以尝试登录,只不过我无论输入账号密码是否正确,最后永远弹出登录错误提示,其实这个错误也是因为connection的jar包没有正确导入。
4、jar包的问题解决之后,就是jsp页面的问题,在jsp页面中,无法显示学生的信息,发现没有导入taglib,导致c:forEach无法正确运行。
5、导入了jstl包之后,jsp页面运行出现错误(虽然错,但起码前面的错都对了),说在StudentImpl中没有找到School这个属性,其实我是有这个变量,只不过可能jsp只识别小写,最后改为小写执行成功!
6、解决问题Invalid character found in the request target. The valid characters are defined in RFC 7230 and RF的问题,原因是利用href或者表单传值的method为get,但是不同版本的tomcat接收能力不一。我的tomcat不能用get接收中文数值(在Servlet设置编码问题也解决不了、xml配置文件修改了也无济于事),所以最后干脆把href的数据利用<%%>把查询的数据保存到Session中,这样的话解决了这个问题,并且达到了我想要的效果(查询过后,跳转的信息页面中仍然保存我之前所要查询的信息)
------------------------------------------------------------------------------------------------------------
以上为项目解决问题的过程以及心得,为了加强记忆以及记录这一神圣的时刻,因此写了个人第二份博客,以下为重点概括:
1、显示数据:EL + JSP + JSTL + 表格。
2、在jsp页面中想要使用c:forEach等系统未自带的方法,必须要在首行导入taglib。
3、JUnit4调试失败的原因很多,我是因为方法前有返回值,而返回值只能为void。
4、JSP页面与Servlet是一对一的,一个个实现而不是同时写出多个JSP或Servlet。
5、除MVC模式的三个部分,最好有一个业务逻辑类,专门负责处理业务。
6、JSP页面使用doGet方法无法传中文字符,故到Servlet写入数据库时就是乱码。
7、如果传到Servlet中的值有多个,则使用getParameterValues,返回值为数组。
8、Web项目中lib不与src同级,故要把所有jar包放在WEB-INF的lib下添加才可以。
9、在jsp的El表达式中,抓取对象的属性,尽量写为小写,否则无法识别,产生错误(这点没有查询过多的资料,自己判断的结果)。
10、如果Servlet的请求转发是doPost发送的,那么在另一个Servlet中必须写doPost,否则无效(最好在doGet中也调用doPost)。
11、完成了这些存储工作后,需要跳转到列表页面。这里不能直接跳转到列表页面,应该先跳转到Servlet,由Servlet跳转到列表页面。
12、隐藏表单的妙用:在更新信息的功能中,肯定要将id传递给Servlet,但是学生的id肯定是不可修改,但还是要传递。所以手动创建一个隐藏的输入框,给定id的值,以便提交表单。
13、模糊查询和普通查询方式不一,若模糊查询中使用普通查询的方式,则根据不同的情况可能要写4、5种sql查询。而"select * from stu where 1=1",可以保留sql语句中的where,默认查询所有,其他情况直接在末端添加相应语句即可。

6、项目的感想与展望

1、文章开头所提到的两个阶段确实是两个实打实的阶段,第一个阶段在解决了看似无法解决的问题之后,引发了一系列后续问题,所以初版的学生管理系统并不是这么简单。其次就是第二个阶段,后续功能的实现花了比较长的时间(在实现过程中还是有很多错误以及学校正常学习、Web的视频学习等也占了很多时间)

2、这一次的Web项目相比之前做过的项目,也许总耗时不是最长,但是逻辑层面和代码量是之前做过的项目所不及的。而且这个完整的管理系统并不是一次性就可以写好,而是一直改错一直改进所完成的。让我明白了,不管是什么作品,都可能是经过一波三折之后才写出来的。

3、这次的项目经历使我对MVC模式更加的了解,对数据库连接池、JSP页面的书写、JSTL以及EL表达式等这类代码书写更加的熟练,对分页功能的印象更加深刻。PS:一个看似简单的分页功能可能会让你可以整一个下午。

4、关于后续的学习,如果有好的项目,则还是会与这次一样把一系列的内容写到博客中进行记录与交流。

5、Web学生管理系统项目基本到此结束,之前做过一个应用程序版的学生管理系统(内包含:仿TIM登录界面、较为精美的管理系统界面,以及一系列功能),也是在学校花了近两个星期的周期写了这个项目(PS:关于界面的制作花了大量时间,毕竟想做一个让自己满意的项目),所以我可能也会在近期有空写一个博客,来记录并回忆一下所学所做的内容。

最后:本人为大二菜鸡一枚,花了近半天时间写下这篇博客来记录一下项目经验。同时也希望能够帮助到一些对Web或者项目有问题的同学。

发布了15 篇原创文章 · 获赞 18 · 访问量 4567

猜你喜欢

转载自blog.csdn.net/oZuoShen123/article/details/102027997