学生管理系统总结
经过为期一个多星期的时间,总算是大体上完成了项目学生管理系统,下面就把整个项目的各个功能的具体实现总结一下与大家分享,顺便让自己加深一下印象。
首先让我们对整个项目的层次结构进行一个划分
首先把整个项目分为以上几个层,dao层,实体层,service层,servlet层和util工具类五大块。
一,dao层
dao层主要是用来对实体类进行操作,封装一些类和方法来让前台调用,
二,实体层
主要用来存放你的实体类
三,service层
引用对应的dao数据库操作,在这里可以编写自己需要的代码,比如一些逻辑的实现。
四,servlet层
引用对应的Service层,在这里结合Struts的配置文件,跳转到指定的页面,当然也能接受页面传递的请求数据,也可以做些计算处理。
五,util工具类
主要存放一些我们自己封装的工具,方便我们使用
整个项目的层次结构大概就是这样,下面来分析一下每个功能点实现需要的知识和技术。
1.登陆界面
首先这次学生管理系统前端框架我们用到的是bootstrap框架
一,登陆界面的实现
首先我们想一下如何实现登陆?需要哪些知识?
首先我们需要数据库,javabean,servlet路由,jsp页面。首先我们得写一个servlet,通过servlet请求来获取到前端页面input框里的值来和我们数据库里存储的信息进行比较,如果相等则允许登陆并跳转到主页面,否则登陆失败停留在登陆界面。然后我们有时候为了省事就会选择记住密码,记住密码功能的实现其实也很简单,首先我们判断复选按钮是否是被选中状态,如何是被选中状态,我们就把帐号和密码存入Cookie,然后返回,否则的话,就把Cookie赋值为空在返回,这样就可以简单实现登陆功能。
接下来我们需要实现注册,注册其实就是我们数据库里没有这个信息然后我们把这个新信息存入数据库,那么这就很好想了,首先我们写一个servlet来获取到注册表单里的input框里的信息,然后和数据库里的信息进行比对,如果存在,则给一个友好提示该帐号存在或者其他,实现这个功能,我们可以通过ajax异步请求来判断注册信息是否存在然后在jsp里给一个标签显示,这样用户就能知道什么原因了。如果数据库里没有注册的信息,则把信息存入数据库,并且返回登陆界面给一个提示注册成功,这样注册的功能就实现了。
然后,有了帐号和密码,我们肯定也会有忘记的时候,这时候我们就需要一个忘记密码的功能,忘记密码的话,我们可以通过向邮箱
发送验证码来重置密码。
这时候我们需要引入两个jar包
这是java封装好的,我们只需要拿来用就好了,这时候我们需要获取输入的邮箱是否存在,如果存在调用封装好的email类向邮箱发送验证码,然后获取输入的验证码和邮箱里输入的验证码是否相等,如果相等则把重置的新密码发送给邮箱,否则用ajax同步请球给用户一个弹框提示邮箱不存在或者邮箱错误,验证码错误等信息
这样整个一个登陆界面就实现了。
二,实现对表格数据的增删查改
这是登陆进来的主界面
首先我们需要实现左边菜单栏
左边是一个三级菜单的实现,并且要设置权限,因为当是学生,老师,管理员登陆的时候,能查看的内容和进行的操作是不一样的,
这时候我们需要在jsp里引入jstl里的c:if和c:forserch来进行权限的判断,下图是实现的代码
<!-- 管理员,教师,班主任可以看到的菜单 -->
<c:if test="${loginSysUser.roleid==0||loginSysUser.roleid==1||loginSysUser.roleid==2}">
<li>
<a href="#" class="dropdown-toggle">
<i class="icon-fire"></i>
<span class="menu-text">教学管理</span>
<b class="arrow icon-angle-down"></b>
</a>
<ul class="submenu">
<li>
<a href="#" class="dropdown-toggle">
<i class="icon-double-angle-right"></i>
学生管理
<b class="arrow icon-angle-down"></b>
</a>
<ul class="submenu">
<!-- 显示班主任所管理的班级 -->
<c:if test="${loginSysUser.roleid==1}">
<c:forEach items="${classesList }" var="classes">
<c:if test="${loginSysUser.userid==classes.headmasterid}">
<li>
<a href="${pageContext.request.contextPath }/getclassidservlet?name=studentList&classid=${classes.id}">
<i class="fa fa-child" aria-hidden="true"></i>
<span class="menu-text"><c:out value="${classes.name }"></c:out></span>
</a>
</li>
</c:if>
</c:forEach>
</c:if>
<!-- 显示教师所管理的班级 -->
<c:if test="${loginSysUser.roleid==2 }">
<c:forEach items="${classesList }" var="classes">
<c:if test="${loginSysUser.userid==classes.lecturerid}">
<li>
<a href="${pageContext.request.contextPath }/getstuidservlet?name=studentList&classid=${classes.id}">
<i class="fa fa-child" aria-hidden="true"></i>
<span class="menu-text"><c:out value="${classes.name }"></c:out></span>
</a>
</li>
</c:if>
</c:forEach>
</c:if>
<!-- 显示管理员所管理的班级 -->
<c:if test="${loginSysUser.roleid==0}">
<c:forEach items="${classesList }" var="classes">
<li>
<a href="${pageContext.request.contextPath }/getstuidservlet?name=studentList&classid=${classes.id}">
<i class="fa fa-child" aria-hidden="true"></i>
<span class="menu-text"><c:out value="${classes.name}"></c:out></span>
</a>
</li>
</c:forEach>
</c:if>
</ul>
</li>
<li>
<a href="#" class="dropdown-toggle">
<i class="icon-double-angle-right"></i>
积分管理
<b class="arrow icon-angle-down"></b>
</a>
<ul class="submenu">
<!-- 显示班主任所管理的班级 -->
<c:if test="${loginSysUser.roleid==1}">
<c:forEach items="${classesList }" var="classes">
<c:if test="${loginSysUser.userid==classes.headmasterid}">
<li>
<a href="${pageContext.request.contextPath }/getclassidservlet?name=score&classid=${classes.id}">
<i class="fa fa-child" aria-hidden="true"></i>
<span class="menu-text"><c:out value="${classes.name }"></c:out></span>
</a>
</li>
</c:if>
</c:forEach>
</c:if>
<!-- 显示教师所管理的班级 -->
<c:if test="${loginSysUser.roleid==2 }">
<c:forEach items="${classesList }" var="classes">
<c:if test="${loginSysUser.userid==classes.lecturerid}">
<li>
<a href="${pageContext.request.contextPath }/getclassidservlet?name=score&classid=${classes.id}">
<i class="fa fa-child" aria-hidden="true"></i>
<span class="menu-text"><c:out value="${classes.name }"></c:out></span>
</a>
</li>
</c:if>
</c:forEach>
</c:if>
<!-- 显示管理员所管理的班级 -->
<c:if test="${loginSysUser.roleid==0}">
<c:forEach items="${classesList }" var="classes">
<li>
<a href="${pageContext.request.contextPath }/getclassidservlet?name=score&classid=${classes.id}">
<i class="fa fa-child" aria-hidden="true"></i>
<span class="menu-text"><c:out value="${classes.name}"></c:out></span>
</a>
</li>
</c:forEach>
</c:if>
</ul>
</li>
<li>
<a href="${pageContext.request.contextPath }/controller?name=scorerules">
<i class="icon-double-angle-right"></i>
积分规则管理
</a>
</li>
<li>
<a href="controller?name=team" class="dropdown-toggle">
<i class="icon-double-angle-right"></i>
小组管理
</a>
</li>
</ul>
</li>
</c:if>
<!-- 只有管理员才可以显示的菜单 -->
<c:if test="${loginSysUser.roleid==0 }">
<li>
<a href="#" class="dropdown-toggle">
<i class="icon-desktop"></i>
<span class="menu-text">系统管理 </span>
<b class="arrow icon-angle-down"></b>
</a>
<ul class="submenu">
<li>
<a href="${pageContext.request.contextPath }/controller?name=classes">
<i class="icon-double-angle-right"></i>
班级管理
</a>
</li>
<li>
<a href="${pageContext.request.contextPath }/controller?name=userManager">
<i class="icon-double-angle-right"></i>
用户管理
</a>
</li>
<li>
<a href="${pageContext.request.contextPath }/controller?name=teacher">
<i class="icon-double-angle-right"></i>
教师管理
</a>
</li>
<li>
<a href="#" class="dropdown-toggle">
<i class="icon-double-angle-right"></i>
字典管理
<b class="arrow icon-angle-down"></b>
</a>
<ul class="submenu">
<li>
<a href="${pageContext.request.contextPath }/controller?name=dataType">
<i class="icon-leaf"></i>
字典类型
</a>
</li>
<li>
<a href="${pageContext.request.contextPath }/controller?name=dataItem" class="dropdown-toggle">
<i class="icon-pencil"></i>
字典条目
</a>
</li>
</ul>
</li>
</ul>
</li>
</c:if>
</ul><!-- /.nav-list -->
然后我们需要通过表格显示我们的数据库里的信息,这时候我们可以用老师封装好的jqgird,首先我们需要写对应的servlet来获取表格的行和列和页数还有对应数据库里的信息,然后通过ajax请求和js动态加载表格把数据显示出来,然后我们需要对数据进行增删查改,首先我们需要获得对应jsp页面里的input标签里的值然后通过servlet和dbutil获取数据库里的值进行比对,如果没有,则通过sql语句写入数据库。增删查改的实现方法基本一致。这样就实现了对数据库表格的增删查改和显示了。
三,个人信息的显示和修改密码功能
要实现这个功能其实和表格的查的操作差不多,首先我们在登陆的时候需要判断用户的身份来显示不同的用户信息,这时候我们需要也一个servlet进行判断
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Student stu = new Student();
SysUser sys = (SysUser) request.getSession().getAttribute("loginSysUser");
Integer roleid = sys.getRoleid();
Integer userId = sys.getUserid();
//roleid角色id:1:班主任、2:讲师、3、学生
List<Map<String, Object>> map =new ArrayList<Map<String, Object>>();
SysUser sysUser = new SysUser();
sysUser.setId(sys.getId());
sysUser.find();
request.setAttribute("imgUrl", sysUser.getImgurl());
if(roleid==0){
map = sys.db.query("select * from sys_user where id=?",userId);
request.getSession().setAttribute("showPerson", map);
request.getRequestDispatcher("sysuser.jsp").forward(request, response);
}else if(roleid == 1||roleid == 2){
map = stu.db.query("select * from t_teacher where id=?",userId);
request.getSession().setAttribute("showPerson", map);
request.getRequestDispatcher("teacher.jsp").forward(request, response);
}else if (roleid == 3) {
map = stu.db.query("select * from t_student where id=?",userId);
request.getSession().setAttribute("showPerson", map);
request.getRequestDispatcher("person.jsp").forward(request, response);
}
}
然后通过sql查询把查询到的结果存在一个map集合里然后存到session域里,用来让我们在jsp里调用
通过重定向跳转到不同的jsp页面。
在jsp页面通过${sessionScorp.属性名}显示对应的信息。
然后是修改密码
首先我们写一个servlet来判断原密码是否正确和新密码的两次输入是否相同
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
SysUser sys = (SysUser) request.getSession().getAttribute("loginSysUser");
String password=sys.getPassword();//获取的登录密码
System.out.println(password);
String password0 = request.getParameter("oldPassword");//旧密码
String password1 = request.getParameter("password1");//新密码
String password2 = request.getParameter("password2");//确认密码
password0=MD5Util.MD5(password0);
Map<String, Object> map =new HashMap<String, Object>();
if(password0.equalsIgnoreCase(password)){
if(StringUtil.isNotEmpty(password1)&&password1.equalsIgnoreCase(password2)){
map.put("state", 3);
response.getWriter().print(JSON.toJSON(map));
}else{
map.put("state", 1);
response.getWriter().print(JSON.toJSON(map));
}
}else{
map.put("state", 0);
response.getWriter().print(JSON.toJSON(map));
}
}
判断结束后以json的形式返回,通过ajax同步请求和表单提交来判断是否正确和给出提示。
四,头像上传
package club.itstu.web.servlet;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import club.itstu.util.DBUtil;
import com.alibaba.fastjson.JSON;
public class UploadUtilServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String imgName = "";
try {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
if(upload.isMultipartContent(request)){
List<FileItem> list = upload.parseRequest(request);
for(FileItem item:list){
//判断是普通文本框,还是文件框
if(item.isFormField()){
//普通的
String fileName = item.getFieldName();//输入框name的名
String str = item.getString();//文本框值
if("id".equals(fileName)){
System.out.println(str);
}
}else{
//文件表单
String contentType = item.getContentType();//上传的文件类型
String fileName = item.getFieldName();
InputStream in = item.getInputStream();
String name = item.getName();//上传的文件名
imgName = name;
//获取上传文件保存的绝对路径
String uploadUrl = getServletContext().getRealPath("/upload");
File file = new File(uploadUrl,name);
item.write(file);
item.delete();
in.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
List<Map<String,Object>> resList = new ArrayList<Map<String,Object>>();
Map<String,Object> map = new HashMap<String,Object>();
map.put("status", "OK");
String urlPath = request.getContextPath();
map.put("url", urlPath+"/upload/"+imgName);
DBUtil.getInstance().update("update sys_user set imgurl=? where id=?", urlPath+"/upload/"+imgName,request.getParameter("id"));
map.put("message", "头像上传成功");
resList.add(map);
response.getWriter().print(JSON.toJSON(resList));
}
}
需要导入的jar包
首先获取工厂类对象FileItemFactory,然后获取ServletFileUpload,判断是普通文本框还是文本表单,获取上传文件保存的绝对路径,然后字节流写上去。
五 excel表格导入导出
六 日报功能
五六两个功能我还没有完全明白怎么实现,后期写完了,在补上代码和实现思路。这就是我自己对整个项目流程的实现的理解,写完这个项目之后,自己从头在总结一翻,你会发现自己真的收获了很多,以前看不懂的代码,现在在看会豁然开朗。我觉得老师说的很对,总结真的很重要,之前我没总结,只靠回想的话,我真的能记住的很少很少,我觉得这个项目过段时间在总结一次的话,就可以真正理解整个项目的实现流程,自己下次做在类似的项目就会得心应手,不会不知道怎麽下手了,几个小时的总结写完了,觉得自己写的很充实,理解的也更清楚了,以后也要经常做这样的总结,我相信自己慢慢的就会成长起来的。加油把,继续努力。
附上源码下载地址:
链接:http://pan.baidu.com/s/1kVqUA6V 密码:cqgs