1.classAdmin.jsp 前端代码,动态显示表格,以及点击之后会根据点击的内容跳转到servlet,注意路径
<form action="post">
<div align="center" style="overflow:scroll;">
<table>
<thead>
<tr> <td>班级名称</td>
<td>教师</td>
<td>班级人数</td>
<td>添加日期</td>
<td colspan="5" align="center">班级操作</td>
</tr>
</thead>
<tbody>
<%
String realname=(String)session.getAttribute("realname");
String name=(String)session.getAttribute("username");
ClassDao classDao=new ClassDao();
ClassInfo classInfo=new ClassInfo();
List<ClassInfo> list=classDao.findClass(name, realname);
if(list == null || list.size() == 0){
%>
<h1>还没有创建班级</h1>
<%
}else{
for(int i=0;i<list.size();i++) {
%>
<tr>
<td><%=list.get(i).getClassName() %></td>
<td><%=list.get(i).getTeacherName() %></td>
<td><%=list.get(i).getStudentsNumber() %></td>
<td><%=list.get(i).getAddtime() %></td>
<td>
<a href="../ClassServlet?addid=<%=list.get(i).getId() %>" style="color:blue; text-decoration:underline; ">添加</a>  
<a href="../ClassServlet?upid=<%=list.get(i).getId() %>" style="color:blue; text-decoration:underline;">修改</a>  
<a href="../ClassServlet?delid=<%=list.get(i).getId() %>" style="color:blue; text-decoration:underline;">删除</a>  
</td>
</tr>
<%
}
}
%>
</tbody>
</table>
</div>
</form>
</div>
2.ClassServlet.java 页面上的url地址进行跳转之后处理 ,通过判断点击的超链接调用不同的方法,delete方法不需要单独的页面,其中更改和添加都需要单独的页面进行,重定向到其各自页面分别为addClass.jsp和updateClass.jsp
package 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 javax.servlet.http.HttpSession;
import dao.ClassDao;
public class ClassServlet extends HttpServlet {
String addid;
String upid;
String delid;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding(“UTF-8”))
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//设置请求以及响应的内容类型以及编码方式
response.setContentType("text/html;charset=UTF-8");
addid = request.getParameter("addid");
upid = request.getParameter("upid");
delid = request.getParameter("delid");
if(!(addid==null)){
add(request,response);
}else if(!(upid==null)){
update(request,response);
}else if(!(delid==null)){
delete(request,response);
}
}
public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//request.setAttribute("addid", addid);
//System.out.println("调用add方法");
//request.getRequestDispatcher("SQLgogo/teacher/addClass.jsp").forward(request, response);
response.sendRedirect("/SQLgogo/teacher/addClass.jsp");
}
public void update(HttpServletRequest request, HttpServletResponse response) throws IOException{
//request.setAttribute("upid", upid);
HttpSession session=request.getSession();
session.setAttribute("upid", upid);
response.sendRedirect("/SQLgogo/teacher/updateClass.jsp");
}
public void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
ClassDao classdao = new ClassDao();
classdao.deleteClass(delid);
response.sendRedirect("/SQLgogo/teacher/classAdmin.jsp");
}
}
3.addClass.jsp 添加页面的主要代码,表单提交,再次转到ClassManager.java进行连接数据库处理
<div class="container-fluid" style="position: absolute;top: 90px;left: 300px" >
<<<a href="/SQLgogo/teacher/classAdmin.jsp" style="color:black;text-decoration:underline;">返回 </a>
<br>
<div align="center" style="position: absolute;top: 90px;left: 400px">
<font size="5">班级信息添加</font>
<hr>
<form method="post" action="../ClassManager?method=addClass">
班级名称:<input type="text" name="classname" id="classname"><br><br>
教师:  <input type="text" name="teacher" id="teacher"><br><br>
班级人数:<input type="text" name="studentsnum" id="studentsnum"><br><br>
<input type="submit" value="确定">
</form>
</div>
</div>
4.updateClass.jsp 更改页面代码,表单同理提交到同一个servlet,通过进行判断路径进行区分
<div class="container-fluid" style="position: absolute;top: 90px;left: 300px" >
<<<a href="/SQLgogo/teacher/classAdmin.jsp" style="color:black;text-decoration:underline;">返回 </a>
<br>
<div align="center" style="position: absolute;top: 90px;left: 400px">
<font size="5">班级信息更改</font>
<hr>
<form method="post" action="../ClassManager?method="<%=request.getAttribute("upid") %>+updateClass"">
班级名称:<input type="text" name="classname" id="classname"><br><br>
教师:  <input type="text" name="teacher" id="teacher"><br><br>
班级人数:<input type="text" name="studentsnum" id="studentsnum"><br><br>
<input type="submit" value="确定" >
</form>
</div>
</div>
5.ClassManager.java 这个后端进行增,改的后台处理,其中包括值的判断,空值等判断,更改需要得到点击的参数进行更改,由于跳转了多个页面,且为重定向方式用的是session传值,如果是转发方式可以用request.setAttribute方式存取,但是那样只能servlet向jsp传值,jsp再次向servlet传值会丢失信息,关于传值各位可以看看一些大佬的博客。
此类中还有时间的处理方式
package service;
import java.io.IOException;
import java.io.PrintWriter;
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 javax.servlet.http.HttpSession;
import bean.ClassInfo;
import dao.ClassDao;
public class ClassManager extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding(“UTF-8”))
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//设置请求以及响应的内容类型以及编码方式
resp.setContentType("text/html;charset=UTF-8");
String method = req.getParameter("method");
if (method.equals("addClass")) {
String classname = req.getParameter("classname");
String teacher = req.getParameter("teacher");
String studentsnum =req.getParameter("studentsnum");
Date date= new Date();
SimpleDateFormat sd= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowtime = sd.format(date);
if (classname == null || classname.isEmpty()) {
resp.getWriter().print("<script>alert('班级名不能为空')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
if (teacher == null || teacher.isEmpty()) {
resp.getWriter().print("<script>alert('教师名不能为空')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
if (studentsnum == null || studentsnum.isEmpty()) {
resp.getWriter().print("<script>alert('班级人数不能为空')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
//将string类型studentsnum转化成int类型
int studentsNum=Integer.parseInt(studentsnum);
ClassInfo classinfo = new ClassInfo();
ClassDao classdao = new ClassDao();
//班级名称不能重复添加
if(classdao.isExistClass(classname)){
resp.getWriter().print("<script>alert('此班级名称已经存在')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
classinfo.setClassName(classname);
classinfo.setTeacherName(teacher);
classinfo.setStudentsNumber(studentsNum);
classinfo.setAddtime(nowtime);
classdao.addClass(classinfo);
resp.sendRedirect("/SQLgogo/teacher/classAdmin.jsp");
}else if(method.endsWith("updateClass")){
//upid是靠session传值
HttpSession session=req.getSession();
Object upid=session.getAttribute("upid");
String classname = req.getParameter("classname");
String teacher = req.getParameter("teacher");
String studentsnum =req.getParameter("studentsnum");
Date date= new Date();
SimpleDateFormat sd= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowtime = sd.format(date);
if (classname == null || classname.isEmpty()) {
resp.getWriter().print("<script>alert('班级名不能为空')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
if (teacher == null || teacher.isEmpty()) {
resp.getWriter().print("<script>alert('教师名不能为空')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
if (studentsnum == null || studentsnum.isEmpty()) {
resp.getWriter().print("<script>alert('班级人数不能为空')</script>");
resp.getWriter().print("<script>history.back()</script>");
return;
}
//将string类型studentsnum转化成int类型
int studentsNum=Integer.parseInt(studentsnum);
ClassInfo classinfo = new ClassInfo();
ClassDao classdao = new ClassDao();
classinfo.setClassName(classname);
classinfo.setTeacherName(teacher);
classinfo.setStudentsNumber(studentsNum);
classinfo.setAddtime(nowtime);
classdao.updateClass(classinfo,upid);
resp.sendRedirect("/SQLgogo/teacher/classAdmin.jsp");
}
}
}
6.这里是数据库的一些方法,没有整理,各位直接看上面的调用方法来看
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
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 bean.ClassInfo;
import bean.TeaUser;
import util.DBUtil;
public class ClassDao {
public void addClass(ClassInfo classInfo) {
//添加
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
// start number
String sql = "insert into classinfo(className,teacherName,studentsNumber,addtime) values(?,?,?,?)";
Object[] params = {classInfo.getClassName(),classInfo.getTeacherName(),classInfo.getStudentsNumber(),classInfo.getAddtime()};
/*
* BeanListHandler:将结果集封装为list集合
* BeanHandler:将结果集中的第一条记录封装为对象
* ScalarHandler: 处理单个值,比如记录的个数
*/
try {
queryRunner.update(connection, sql,params);
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
}
//删除
public void deleteClass(String id){
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
String sql = "delete from classinfo where id = ?";
Object[] params = {id};
try {
queryRunner.update(connection, sql,params);
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
}
//修改
public void updateClass(ClassInfo classinfo,Object upid){
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
String sql = "update classinfo set className=?,teacherName=?,studentsNumber=?,addtime=? where Id=?";
Object[] params = {classinfo.getClassName(),classinfo.getTeacherName(),classinfo.getStudentsNumber(),classinfo.getAddtime(),upid};
try {
queryRunner.update(connection, sql,params);
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
}
//查找所有班级
public List<ClassInfo> findClass(String name,String realname){
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
// start number
String sql = "select classinfo.Id,className,teacherName,studentsNumber,addtime from classinfo join teauser on classinfo.teacherName=teauser.realname where name=? and teacherName=?";
Object[] params = {name,realname};
/*
* BeanListHandler:将结果集封装为list集合
* BeanHandler:将结果集中的第一条记录封装为对象
*/
try {
List<ClassInfo> list = (List<ClassInfo>)queryRunner.query(connection, sql,new BeanListHandler(ClassInfo.class),params);
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
return null;
}
public List<ClassInfo> getClass(int start,int number){
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
String sql = "select * from classinfo limit ?,?";
Object[] pramas = {start,number};
/*
* BeanListHandler:将结果集封装为list集合
* BeanHandler:将结果集中的第一条记录封装为对象
*/
try {
List<ClassInfo> list = (List<ClassInfo>)queryRunner.query(connection, sql,new BeanListHandler(ClassInfo.class),pramas);
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
return null;
}
// 查询数据的总条数
public int getCount() {
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
// start number
String sql = "select count(id) from emp";
/*
* BeanListHandler:将结果集封装为list集合
* BeanHandler:将结果集中的第一条记录封装为对象
* ScalarHandler: 处理单个值,比如记录的个数
*/
try {
long count = (long)queryRunner.query(connection, sql,new ScalarHandler());
return (int) count;
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
return 0;
}
public boolean isExistClass(String classname){
QueryRunner queryRunner = new QueryRunner();
Connection connection = DBUtil.getConnection();
// start number
String sql = "select className from classinfo where className=?";
Object[] params = {classname};
/*
* BeanListHandler:将结果集封装为list集合
* BeanHandler:将结果集中的第一条记录封装为对象
* ScalarHandler: 处理单个值,比如记录的个数
*/
try {
List<ClassInfo> list = (List<ClassInfo>)queryRunner.query(connection, sql,new BeanListHandler(ClassInfo.class),params);
if(!(list==null)){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
DBUtil.release(null, null, connection);
}
return false;
}
}
7.这是dbutils,其中propertices是数据库信息,用户名密码啥的,关于数据库的连接我会单独写一篇来介绍
package util;
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;
/*
* JDBC工具类,负责注册驱动,获取连接,释放资源
*
* 注册驱动需要使用 com.mysql.jdbc.Driver MySQL驱动包中的Driver类,直接写在代码中,会使程序和
* MySQL的驱动耦合,以后如果更改数据库,也必须要更改代码,程序的扩展性不强
* 包括连接数据库时的账号密码,这些内容都可能会更改,因此最好将这些信息存储到一个配置文件中,通过在程序中
* 读取配置文件来注册驱动,获取连接
*
*
*/
public class DBUtil {
private static Properties properties;
//注册驱动
static{
//静态代码块当类被加载的时候会执行,只要DBUtil类被第一次用到,DBUtil类就会被加载到内存,
//静态代码块就会执行,驱动会被注册
try {
//通过类加载器读取src目录中的 properties文件
ClassLoader cl = DBUtil.class.getClassLoader();
InputStream is = cl.getResourceAsStream("db.properties");
//Properties有一个对应的类,可以用于读取文件信息
properties = new Properties();
//通过输入流加载properties文件
properties.load(is);
//通过key获取到properties文件中对应的值
String driver = properties.getProperty("driver");
//注册驱动
Class.forName(driver);
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection(){
//读取配置文件中的账号,密码等信息,用于连接数据库
String url = properties.getProperty("url");
String user = properties.getProperty("username");
String password = properties.getProperty("password");
Connection connection = null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//释放资源
public static void release(ResultSet resultSet,Statement statement,Connection connection){
//资源在finnaly中释放
if(resultSet != null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
小女不才,欢迎各位大佬的建议,另外里面可能会有一些无用代码,由于夜已经很深小女没有整理,将就看一下。
本文最大的特点在于多个页面之间进行跳转,涉及到2个servlet和3个jsp之间互相传递数据。