基于Servlet、JSP的学生管理系统(附完整源码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Servlet、JSP的学⽣管理系统(附完整源码)起因
最近重温servlet,想到了⼤学时期⽤同⼀个“学⽣管理系统”⽔了⼏门课的课程设计,不免感慨万千。
周末简单的写了个界⾯,建了⼏张表,做了⼀个⼩系统(试图找⼀找当年划⽔的感觉,可惜没找到)。
写的⽐较简单,不过做个普通的课程设计应该够了,需要的可以⾃取。
源码地址
界⾯截图
主界⾯
管理员界⾯
学⽣管理(管理员视⾓)
添加系统⽤户(管理员视⾓)
学⽣主页
学⽣个⼈信息
⽬录结构
运⾏环境
tomcat9
jdk1.8
其他依赖jar包见WEB-INF下⾯的lib⽂件夹。
涉及技术:Servlet、JSP、BootStrap、Jquery(较少)
主要功能
系统有两个⾓⾊,管理员和学⽣。
做的⽐较简单,没有建额外的⾓⾊表、权限表,仅仅⽤了⼀个字段区分。
管理员可以管理学⽣信息、教师信息、可以添加系统⽤户,录⼊成绩,具有增删改查的⼀切权限。
学⽣只能查看⾃⼰的分数,个⼈档案等。
代码分析
⾸页数据统计
系统运⾏时常、当前在线⼈数,这两个功能⽤到了servlet的组件,监听器。
通过继承ServletContextListener, HttpSessionListener, HttpSessionAttributeListener等接⼝,可以完成对servlet上下⽂、session的创建销毁等关键节点的监听。
在线⼈数,必然是登录成功的⼈数。
⽽session是有⼈访问页⾯就会创建,所以我们不能根据session的创建和销毁来统计在线⼈数。
在登陆成功后,会在session⾥添加⼀个变量,我们可以监听这⼀⾏为。
当设置session变量的时候,在线⼈数+1
移除session变量的时候,在线⼈数-1。
当然这种做法还是有问题的,⽐如直接关闭浏览器,不点注销,数据统计就会失效,这⾥不做深⼊探究。
再来说说系统运⾏时长,我的思路是servlet上下⽂创建的时候,记录下那个时刻的时间戳。
后⾯⽤到的时候,直接⽤当前的时间戳减去保存的时间戳,就可以计算出相隔的毫秒数,也就可以得到天数。
@WebListener
public class CustomServerListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener { private volatile ServletContext application = null;
//上下⽂初始化,记录当前时间的时间戳,初始化⼈数统计变量
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("初始化开始---------");
int onlineNum = 0;
application = sce.getServletContext();
application.setAttribute("onlineNum", onlineNum);
application.setAttribute("startTime", new Date().getTime());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContextListener.super.contextDestroyed(sce);
}
//session创建的时候调⽤该⽅法。
但是我们计算在线⼈数指的是登录成功的⼈
@Override
public void sessionCreated(HttpSessionEvent se) {
}
//连接断开
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
//
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("有⼈登录了---------");
int onlineNum = (int) application.getAttribute("onlineNum");
application.setAttribute("onlineNum", ++onlineNum);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("有⼈退出了---------");
int onlineNum = (int) application.getAttribute("onlineNum");
application.setAttribute("onlineNum", --onlineNum);
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
}
}
计算统计数据的servlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { StudentService studentService = new StudentService();
CourseService courseService = new CourseService();
ScoreService scoreService = new ScoreService();
int studentNum = studentService.count();
int courseNum = courseService.count();
int onlineNum = (int) request.getServletContext().getAttribute("onlineNum");
long startTime = (long) request.getServletContext().getAttribute("startTime");
List<ScoreDto> scoreList = scoreService.getTopScoreList(10);
int days = (int)((new Date().getTime() - startTime) / (1000*3600*24)) + 1;
request.setAttribute("studentNum", studentNum);
request.setAttribute("courseNum", courseNum);
request.setAttribute("onlineNums", onlineNum);
request.setAttribute("days", days);
request.setAttribute("scores", scoreList);
request.getRequestDispatcher("/WEB-INF/pages/main.jsp").forward(request, response); }
⾝份校验
⾝份校验⾃然就⽤到了过滤器。
这边没有做复杂的⾓⾊权限校验,仅仅在⽤户表加上⼀个字段表⽰区分。
两个过滤器。
⼀个检查⽤户是否登录(有些页⾯需要登录,有些不需要的可以放⾏)
另⼀个检查权限够不够。
@WebFilter(value = "/*")
public class LoginFilter implements Filter {
private static List<String> passUrlList = Arrays.asList("login.jsp", "css"
, "js", "jpg", "loginUrl");
/**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String uri = req.getRequestURI();
// 登录页以及静态资源放⾏
boolean needLogin = true;
//页⾯名称
String pageName = "";
//后缀名
String endName = "";
if(stIndexOf("/") != -1 && stIndexOf("/") + 1 < uri.length()) {
pageName = uri.substring(stIndexOf("/") + 1);
}
if(stIndexOf(".") != -1 && stIndexOf(".") + 1 < uri.length()) {
endName = uri.substring(stIndexOf(".") + 1);
}
for (String passUrl : passUrlList) {
if(passUrl.equals(pageName) || passUrl.equals(endName)) {
//不需要登录
needLogin = false;
}
}
User user = (User) req.getSession().getAttribute("loginUser");
if(needLogin && user == null) {
//该资源需要登录,并且当前⽤户没有登录
resp.sendRedirect("/StudentManage/login.jsp");
}else {
//不需要登录
chain.doFilter(req, resp);
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
权限校验过滤器
@WebFilter(value = "/admin/*", filterName = "B")
public class AuthenticationFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
User user = (User) req.getSession().getAttribute("loginUser");
Byte type = user.getUserType();
if(type != 1) {
//不是管理员,跳转到错误页⾯
req.setAttribute("msg", "抱歉,您没有权限访问!");
req.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(req, response);;
}else {
chain.doFilter(req, response);
}
}
}
其他
整体上写的随⼼所欲,不是很规范。
查找以及分页界⾯做了,后台没做。
因为感觉没啥必要,原⽣的servlet知道基本原理和⽤法即可,写业务直接SpringBoot吧。