开头:
个人的第一篇博客,同时也是第一个完整的实战项目,由于经验不足,只能做出简单级别的当做练手.
第一篇博客!!!
第一个项目!!!
一、开发背景:
软件名称:学生成绩管理系统(SSMS)
使用对象:大学
二、需求分析
1. 系统分析
该学生信息管理系统涉及到学生、教师、学号、学生成绩、课程。所有用户需输入账号、密码登录进入系统;管理员进入系统后可对学生、老师、班级、课程进行增删改查操作;学生进入系统,查看成绩、查看和修改自己的信息;老师进入系统后,对自己这门课程的学生设置课程成绩、查看和修改自己的信息,查看学生的信息和成绩、以及统计分析学生的成绩;
学生成绩分为两种, 一种是考试成绩占总成绩的百分之60, 一种是平时成绩占总成绩的百分之40.考试成绩出来后,老师进入系统选择该次考试为学生登记成绩。平时考试则是班级平时的考试,老师添加考试信息,登记成绩。成绩统计分析则是针对年级统考进行分析,主要涉及各学科分数名次,总分名次.
三、开发环境
系统环境:Windows10
开发工具:Idea
Java版本:JDK 1.8
服务器:tomcat 9.0.36
数据库:MySQL 8.0
系统采用技术:Servlet+Jsp+Jdbc+jQuery+Ajax
四、代码实现
1、登陆界面 login:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登陆页面-学生成绩管理系统-javaweb</title> <style> #cont div { text-align: center; padding: 15px; } #cont div:last-child input:first-child { margin-right: 30px; } #cont div:last-child input:first-child { margin-left: 30px; } #cont div:last-child input:first-child { margin-right: 30px; } </style> </head> <body> <div style="margin-top: 150px"> <jsp:include page="top.jsp"/> <div id="cont"> <% String message = (String) request.getAttribute("message"); if (message!=null){ %> <h3 style="color: #ff0000" align="center">出错信息${message}</h3> <% } %> <form action="<%= request.getContextPath()%>/loginServlet?type=trueLogin" method="post"> <div> <label for="userName"> 用户名: </label> <input type="text" name="userName" id="userName"/> </div> <div> <label>    密码: <input type="password" name="pwd"/> </label> </div> <div> <label> 验证码: <input type="yangzheng" name="yanzheng"/> <img src="${pageContext.request.contextPath}/main/webapp/WEB-INF/img.jpg"/> </label> </div> <div> <input type="submit" value="登陆"/> <input type="button" onclick="resetForm()" value="重置"/> </div> </form> </div> <jsp:include page="bottom.jsp"/> </div> <script> function resetForm(){ document.forms[0].reset() } </script> </body> </html>
2、登陆成功界面
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>学生管理-学生成绩管理系统-javaweb</title> 5 <style> 6 table { 7 border-collapse: collapse; 8 border-spacing: 0; 9 border: 1px solid black; 10 } 11 12 tr { 13 line-height: 2; 14 } 15 16 th, td { 17 border: 1px solid black; 18 padding: 0 10px; 19 } 20 21 #cont { 22 text-align: left; 23 margin-left: 540px; 24 margin-top: 50px; 25 line-height: 1.5; 26 } 27 28 .nav, .search, .page { 29 line-height: 2; 30 } 31 </style> 32 </head> 33 <body> 34 <div> 35 <jsp:include page="../top.jsp"/> 36 <div id="cont"> 37 <%-- <section class="nav">--%> 38 <%-- <a href="#">学生管理</a>--%> 39 <%-- <a href="#">成绩管理</a>--%> 40 <%-- </section>--%> 41 <section class="search"> 42 <% 43 TableResult<StudentDO> tableResult = (TableResult) request.getAttribute("tableResult"); 44 45 %> 46 47 <a href="<%=request.getContextPath()%>/studentServlet?type=toAdd">新增学生</a> 48 <form method="post" action="<%=request.getContextPath()%>/studentServlet?type=toStudentManage"> 49 <%-- <input type="text" name="studentName" value="<%= tableResult.getStudentName()%>"/>--%> 50 <!--value在没有被别人修改的情况下就是1, 51 由于不是ajax局部刷新,页面是整体刷新的,所以即便pageNow被就改了,查询结果出来的页面中的pageNow仍然还是1 52 --> 53 <input type="hidden" name="pageNow" id="pageNow" value="1"/> 54 <%-- <input type="submit" value="查询">--%> 55 </form> 56 </section> 57 <section> 58 <table> 59 <thead> 60 <tr> 61 <th>编号</th> 62 <th>姓名</th> 63 <th>学号</th> 64 <th>科目名称</th> 65 <th>考勤成绩</th> 66 <th>作业成绩</th> 67 <th>考试成绩</th> 68 <th>操作</th> 69 70 71 72 73 </tr> 74 </thead> 75 <tbody> 76 <% 77 List<StudentDO> data = tableResult.getData(); 78 79 for (int i = 0; i < data.size(); i++) { 80 StudentDO studentDO = data.get(i); 81 %> 82 <tr> 83 <td><%= studentDO.getId()%> 84 </td> 85 <td><%= studentDO.getName()%> 86 </td> 87 <td><%= studentDO.getNo()%> 88 </td> 89 <td><%= studentDO.getTask()%> 90 </td> 91 <td><%= studentDO.getKaoqin()%> 92 </td> 93 <td><%= studentDO.getZuoye()%> 94 </td> 95 <td><%= studentDO.getChengji()%> 96 <td><a href="<%=request.getContextPath()%>/studentServlet?type=delete&id=<%= studentDO.getId()%>">删除</a> 97 <a href="<%=request.getContextPath()%>/studentServlet?type=toUpdate&id=<%= studentDO.getId()%>">更新</a> 98 </td> 99 </tr> 100 <% 101 } 102 %> 103 </tbody> 104 </table> 105 <div class="page"> 106 <% 107 //只要不是第一页就显示 108 if (tableResult.getPageNow() != 1) { 109 %> 110 <a href="#" onclick="goFirst()">首页</a> 111 <a href="#" onclick="goPre()">上一页</a> 112 <% 113 } 114 %> 115 <% 116 //只要不是最后一页就显示 117 if (tableResult.getPageNow() != tableResult.getPageCount()) { 118 %> 119 <a href="#" onclick="goNext()">下一页</a> 120 <a href="#" onclick="goLast()">尾页</a> 121 <% 122 } 123 %> 124 <span>共<%=tableResult.getPageCount()%>页</span> 125 <span>,共<%=tableResult.getTotalCount()%>条</span> 126 <span>,当前是第<%=tableResult.getPageNow()%>页</span> 127 </div> 128 </section> 129 </div> 130 <jsp:include page="../bottom.jsp"/> 131 132 </div> 133 <script> 134 function goFirst() { 135 document.forms[0].submit(); 136 } 137 138 //上一页 139 function goPre() { 140 //1、拿到当前页 141 var currentPageStr = "<%=tableResult.getPageNow()%>"; 142 var prePage = parseInt(currentPageStr) - 1; 143 //2、修改搜索里面提交的pageNow 144 document.getElementById("pageNow").value = prePage; 145 document.forms[0].submit(); 146 } 147 function goNext(){ 148 //1、拿到当前页 149 var currentPageStr = "<%=tableResult.getPageNow()%>"; 150 var nextPage = parseInt(currentPageStr) + 1; 151 //2、修改搜索里面提交的pageNow 152 document.getElementById("pageNow").value = nextPage; 153 document.forms[0].submit(); 154 } 155 //尾页 156 function goLast(){ 157 //1、拿到当尾页 158 var pageCountStr = "<%=tableResult.getPageCount()%>"; 159 //2、修改搜索里面提交的pageNow 160 document.getElementById("pageNow").value = parseInt(pageCountStr); 161 document.forms[0].submit(); 162 } 163 164 </script> 165 </body> 166 </html>
成功则进入系统界面
失败则进行提示用户名或密码验证码不正确(验证码不知道是浏览器的问题还是怎么回事就是加载不出来)
3、增加学生
<html> <head> <title>添加学生页面-学生成绩管理系统-javaweb</title> <style> #cont{ text-align: center; margin-top: 100px; } #cont div{ padding: 15px; } </style> </head> <body> <div> <jsp:include page="../top.jsp"/> <div id="cont"> <form action="<%= request.getContextPath()%>/studentServlet?type=add" method="post"> <div> <label> 学生姓名: <input type="text" name="studentName" /> </label> </div> <div> <label>       学号: <input type="text" name="no"/> </label> </div> <div> <label>       科目: <input type="text" name="task"/> </label> </div> <div> <label> 考勤成绩: <input type="text" name="kaoqin"/> </label> </div> <div> <label> 作业成绩: <input type="text" name="zuoye"/> </label> </div> <div> <label> 考试成绩: <input type="text" name="chengji"/> </label> </div> <div> <input type="submit" value="增加"/> </div> </form> </div> <jsp:include page="../bottom.jsp"/> </div> </body> </html>
4、更新学生信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>更新学生页面-学生成绩管理系统-javaweb</title> <style> #cont{ text-align: center; margin-top: 100px; } #cont div{ padding: 15px; } </style> </head> <body> <div> <jsp:include page="../top.jsp"/> <div id="cont"> <form action="<%= request.getContextPath()%>/studentServlet?type=update" method="post"> <% StudentDO studentDO = (StudentDO)request.getAttribute("studentDO"); %> <div> <label> 学生编号: <!--disabled的不能提交,如果用了disabled又想提交,就要再加个hiddent的input来提交--> <input type="text" readonly name="studentId" value="<%= studentDO.getId()%>"/> </label> </div> <div> <label> 学生姓名: <input type="text" name="studentName" value="${studentDO.name}" /> </label> </div> <div> <label>       学号: <input type="text" name="no" value="${requestScope.studentDO.no}"/> </label> </div> <div> <label>       科目: <input type="text" name="task" value="${studentDO.task}"/> </label> </div> <div> <label> 考勤成绩: <input type="text" name="kaoqin" value="${studentDO.kaoqin}" /> </label> </div> <div> <label> 作业成绩: <input type="text" name="zuoye" value="${requestScope.studentDO.zuoye}"/> </label> </div> <div> <label> 考试成绩: <input type="text" name="chengji" value="${studentDO.chengji}"/> </label> </div> <div> <input type="submit" value="更新"/> </div> </form> </div> <jsp:include page="../bottom.jsp"/> </div> </body> </html>
5、数据库设计
数据库连接与网页与数据库的交互
public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/student_javaweb?serverTimezone=UTC&characterEncoding=utf-8"; private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String USER_NAME = "root";//Mysql配置时的用户名 private static final String PWD = "123456";//密码 static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取连接 * @return */ public static Connection getConn() { try { return DriverManager.getConnection(URL, USER_NAME, PWD); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 关闭结果集 * @return */ public static void closeResultSet(ResultSet resultSet) { try { if (resultSet != null){ resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 关闭ps * @return */ public static void closePs(PreparedStatement ps) { try { if (ps != null){ ps.close(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 关闭连接 * @return */ public static void closeConn(Connection conn) { try { if (conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
package com.roadjava.javaweb.student.dao.imol;
import com.roadjava.javaweb.student.beans.entity.AdminDO;
import com.roadjava.javaweb.student.beans.entity.StudentDO;
import com.roadjava.javaweb.student.beans.req.StudentRequest;
import com.roadjava.javaweb.student.beans.res.TableResult;
import com.roadjava.javaweb.student.dao.StudentDao;
import com.roadjava.javaweb.student.util.DBUtil;
import com.roadjava.javaweb.student.util.StringUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class StudentDaoImpl implements StudentDao {
@Override
public int addStudent(StudentDO studentDO) {
Connection conn = DBUtil.getConn();
if (conn == null){
return 0;
}
PreparedStatement ps = null;
StringBuilder sb = new StringBuilder();
sb.append(" insert into student(name,no,task,kaoqin,zuoye,chengji) ");
sb.append(" values(?,?,?,?,?,?) ");
try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1,studentDO.getName());
ps.setObject(2,studentDO.getNo());
ps.setObject(3,studentDO.getTask());
ps.setObject(4,studentDO.getKaoqin());
ps.setObject(5,studentDO.getZuoye());
ps.setObject(6,studentDO.getChengji());
//打印最终执行的sql语句
System.out.println("addStudent执行的sql:"+ps.toString());
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
}
return 0;
}
@Override
public TableResult<StudentDO> queryStudentByPage(StudentRequest studentRequest) {
TableResult<StudentDO> tableResult = new TableResult<>();
Connection conn = DBUtil.getConn();
if (conn == null){
return null;
}
PreparedStatement ps = null;
ResultSet rs = null;
//查询学生列表
StringBuilder sb = new StringBuilder();
sb.append(" select * from student ");
appendWhere(studentRequest,sb);
sb.append(" order by id desc limit ").append(studentRequest.getStart())
.append(",").append(studentRequest.getPageSize());
try {
ps = conn.prepareStatement(sb.toString());
if (StringUtil.isNotBlank(studentRequest.getStudentName())){
ps.setObject(1,studentRequest.getStudentName());
}
//打印最终执行的sql语句
System.out.println("queryStudentByPage查询学生的sql:"+ps.toString());
rs = ps.executeQuery();
List<StudentDO> list = new ArrayList<>();
while (rs.next()){
StudentDO studentDO = buildStudent(rs);
list.add(studentDO);
}
tableResult.setData(list);//设置数据
/*
查询总条数
*/
sb.setLength(0);
sb.append(" select count(*) from student ");
appendWhere(studentRequest,sb);
ps = conn.prepareStatement(sb.toString());
if (StringUtil.isNotBlank(studentRequest.getStudentName())){
ps.setObject(1,studentRequest.getStudentName());
}
//打印最终执行的sql语句
System.out.println("queryStudentByPage查询学生总条数的sql:"+ps.toString());
rs = ps.executeQuery();
if (rs.next()){
int totalCount = rs.getInt(1);
tableResult.setTotalCount(totalCount);//设置总条数
}
return tableResult;
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
DBUtil.closeResultSet(rs);
}
return null;
}
@Override
public StudentDO getStudentById(long studentId) {
Connection conn = DBUtil.getConn();
if (conn == null){
return null;
}
PreparedStatement ps = null;
ResultSet rs = null;
StringBuilder sb = new StringBuilder();
sb.append(" select * from student where id = ? ");
try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1,studentId);
//打印最终执行的sql语句
System.out.println("getStudentById执行的sql:"+ps.toString());
rs = ps.executeQuery();
if(rs.next()){
return buildStudent(rs);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
DBUtil.closeResultSet(rs);
}
return null;
}
@Override
public int updateStudent(StudentDO studentDO) {
Connection conn = DBUtil.getConn();
if (conn == null){
return 0;
}
PreparedStatement ps = null;
StringBuilder sb = new StringBuilder();
sb.append(" update student set name=?,no=?,task=?,kaoqin=?,zuoye=?,chengji=? ");
sb.append(" where id = ? ");
try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1,studentDO.getName());
ps.setObject(2,studentDO.getNo());
ps.setObject(3,studentDO.getTask());
ps.setObject(4,studentDO.getKaoqin());
ps.setObject(5,studentDO.getZuoye());
ps.setObject(6,studentDO.getChengji());
ps.setObject(7,studentDO.getId());
//打印最终执行的sql语句
System.out.println("updateStudent执行的sql:"+ps.toString());
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
}
return 0;
}
@Override
public int deleteStudentById(long studentId) {
Connection conn = DBUtil.getConn();
if (conn == null){
return 0;
}
PreparedStatement ps = null;
StringBuilder sb = new StringBuilder();
sb.append(" delete from student where id = ? ");
try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1,studentId);
//打印最终执行的sql语句
System.out.println("deleteStudentById执行的sql:"+ps.toString());
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
}
return 0;
}
private StudentDO buildStudent(ResultSet rs) throws SQLException{
long id = rs.getLong("id");
String name = rs.getString("name");
String no = rs.getString("no");
String task = rs.getString("task");
String kaoqin = rs.getString("kaoqin");
String zuoye = rs.getString("zuoye");
String chengji = rs.getString("chengji");
StudentDO studentDO = new StudentDO();
studentDO.setId(id);
studentDO.setName(name);
studentDO.setTask(task);
studentDO.setNo(no);
studentDO.setZuoye(zuoye);
studentDO.setKaoqin(kaoqin);
studentDO.setChengji(chengji);
return studentDO;
}
private void appendWhere(StudentRequest studentRequest, StringBuilder sb) {
String studentName = studentRequest.getStudentName();
if(StringUtil.isNotBlank(studentName)){
sb.append(" where name = ? ");
}
}
}
package com.roadjava.javaweb.student.dao.imol;
import com.roadjava.javaweb.student.beans.entity.AdminDO;
import com.roadjava.javaweb.student.dao.AdminDao;
import com.roadjava.javaweb.student.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class AdminDaoImpl implements AdminDao {
@Override
public AdminDO validateLogin(String userName) {
Connection conn = DBUtil.getConn();
if (conn == null){
return null;
}
PreparedStatement ps = null;
ResultSet rs = null;
StringBuilder sb = new StringBuilder();
sb.append(" select * from admin where user_name = ? ");
try {
ps = conn.prepareStatement(sb.toString());
ps.setObject(1,userName);
//打印最终执行的sql语句
System.out.println("balidateLogin执行的sql:"+ps.toString());
rs = ps.executeQuery();
if(rs.next()){
long id = rs.getLong("id");
String pwd = rs.getString("pwd");
AdminDO adminDO = new AdminDO();
adminDO.setId(id);
adminDO.setUser_name(userName);
adminDO.setPwd(pwd);
return adminDO;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.closePs(ps);
DBUtil.closeConn(conn);
DBUtil.closeResultSet(rs);
}
return null;
}
}
未完待续.......