项目 4:学生信息管理系统
1、 项目概述
1.1 项目目标和主要内容
实现一个简单的学生信息管理的程序StudentInfo。
开发平台:eclipse、SQLyog
简述本项目实现的主要内容和目标,使用的开发平台,采用的主要工具。
1.2 项目的主要功能
- 教学管理人员能够使用StudentInfo程序对学生基本信息、课程信息进行管理,包括数据的添加、修改、删除和浏览;
- 能够对学生选课进行管理,包括添加学生选课信息、录入成绩;
- 能够使用查询功能,快速查看到指定学生或指定课程的基本信息以及所指定学生的选课信息;
- 能够对学生选课情况进行简单的统计,包括所选的总的课程数、总学分数及平均成绩。
- 要注意添加学生基本信息、课程信息相关数据时,学号和课程号不能重复;还有在添加学生选课信息时,要求该学生和课程必须是存在的,而且不能添加重复的选课信息。
- 提供友好的交互界面,可以方便用户进行功能选择,实现信息的管理和查询,并可清晰地显示相关信息。
2、 项目设计
2.1 项目总体框架
首先我们需要数据库,javabean,servlet路由,jsp页面。首先我们得写一个servlet,通过servlet请求来获取到前端页面input框里的值来和我们数据库里存储的信息进行比较,如果相等则允许登陆并跳转到主页面,否则登陆失败停留在登陆界面。然后我们有时候为了省事就会选择记住密码,记住密码功能的实现其实也很简单,首先我们判断复选按钮是否是被选中状态,如何是被选中状态,我们就把帐号和密码存入Cookie,然后返回,否则的话,就把Cookie赋值为空在返回,这样就可以简单实现登陆功能。
包括系统框架图或层次逻辑图,设计思想等。
2.2 系统详细设计
【1】 模块划分图及描述
【2】 类关系图及描述
【3】 程序流程图及描述
在一开始登录的时候检查用户是否正确,如果正确就建立一个session的会话,每个页面在进行操作之前都需要检查session会话是否为空,若为空则使用JavaScript提示需要登录并且强制跳转回登录界面。
在DaoCheckLogin.jsp中检查输入的账号和密码是否正确,如果正确就执行一条语句session.setAttribute(“user”, user);,这条语句的意思是将user这个对象保存在session作用域中,而Session的生命周期是Session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当Session超过时间限制后,Session注销而失效。
然后在每个页面的在执行JSP语句之前先检查user这个对象是否为空
【4】 存储结构、内存分配
2.3 关键算法分析
算法 1:getCon()
【1】 算法功能
获取数据库连接
【2】 算法基本思想
利用driver的实例可以创建一个连接对象 参数是 数据库所在的路径 jdbc:mysql://localhost:3306:数据库库的名称,另一个参数是: 数据库的账号和密码
package com.java1234.util;
import java.sql.Connection;
import java.sql.DriverManager;
public class DbUtil {
private String dbUrl="jdbc:mysql://localhost:3306/db_studentInfo";
private String dbUserName="root";
private String dbPassword="123456";
private String jdbcName="com.mysql.jdbc.Driver";
/**
* 获取数据库连接
* @return
* @throws Exception
*/
public Connection getCon() throws Exception{
Class.forName(jdbcName);
Connection con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
return con;
}
/**
* 关闭数据库连接
* @param con
* @throws Exception
*/
public void closeCon(Connection con) throws Exception{
if(con!=null){
con.close();
}
}
public static void main(String[] args) {
DbUtil dbUtil=new DbUtil();
try {
dbUtil.getCon();
System.out.println("数据库连接成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
算法 2:doPost(HttpServletRequest, HttpServletResponse)
【1】 算法功能
获取数据库连接
【2】 算法基本思想
doGet()和doPost()函数的两个参数为HttpServletRequest和HttpServletResponse对象。HttpServletRequest接口表示浏览器请求,你可以通过这个类获取浏览器发送到服务器的任何信息。
package com.java1234.web;
import java.io.IOException;
import java.sql.Connection;
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 com.java1234.dao.UserDao;
import com.java1234.model.User;
import com.java1234.util.DbUtil;
import com.java1234.util.StringUtil;
public class LoginServlet extends HttpServlet{
DbUtil dbUtil=new DbUtil();
UserDao userDao=new UserDao();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName=request.getParameter("userName");
String password=request.getParameter("password");
request.setAttribute("userName", userName);
request.setAttribute("password", password);
if(StringUtil.isEmpty(userName)||StringUtil.isEmpty(password)){
request.setAttribute("error", "用户名或密码为空!");
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
}
User user=new User(userName,password);
Connection con=null;
try {
con=dbUtil.getCon();
User currentUser=userDao.login(con, user);
if(currentUser==null){
request.setAttribute("error", "用户名或密码错误!");
// 服务器跳转
request.getRequestDispatcher("index.jsp").forward(request, response);
}else{
// 获取Session
HttpSession session=request.getSession();
session.setAttribute("currentUser", currentUser);
// 客户端跳转
response.sendRedirect("main.jsp");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
算法 3:GradeSaveServlet
【3】 算法功能
保存班级信息
【4】 算法基本思想
通过java语言对MySQL数据库进行操作。
package com.java1234.web;
import java.io.IOException;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import com.java1234.dao.GradeDao;
import com.java1234.model.Grade;
import com.java1234.model.PageBean;
import com.java1234.util.DbUtil;
import com.java1234.util.JsonUtil;
import com.java1234.util.ResponseUtil;
import com.java1234.util.StringUtil;
public class GradeSaveServlet extends HttpServlet{
DbUtil dbUtil=new DbUtil();
GradeDao gradeDao=new GradeDao();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String gradeName=request.getParameter("gradeName");
String gradeDesc=request.getParameter("gradeDesc");
String id=request.getParameter("id");
Grade grade=new Grade(gradeName,gradeDesc);
if(StringUtil.isNotEmpty(id)){
grade.setId(Integer.parseInt(id));
}
Connection con=null;
try{
con=dbUtil.getCon();
int saveNums=0;
JSONObject result=new JSONObject();
if(StringUtil.isNotEmpty(id)){
saveNums=gradeDao.gradeModify(con, grade);
}else{
saveNums=gradeDao.gradeAdd(con, grade);
}
if(saveNums>0){
result.put("success", "true");
}else{
result.put("success", "true");
result.put("errorMsg", "保存失败");
}
ResponseUtil.write(response, result);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2.4 其他
系统采用B/S架构,开发同时通过IE、FireFox和Chrome等主流浏览器测试,使系统UI具备较强的兼容性。Web前台使用到的技术包括HTML、CSS、Ajax、Jquery等。
系统采用Jsp+Servlet+JavaBean架构进行开发,沿用MVC思想,使得项目层次更加清晰。
系统除了基本系统业务功能外,还包含了Log4j日志功能、dbcp数据连接池功能、验证码功能、图片文件上传等,相比一般的信息系统具有更完善的功能。
涉及到了HTML的框架布局,设计好框架后把相应的网页放进框架中,导航栏那里的超链接的target属性记得是要填你想要显示框架的name属性的属性值。不然他会默认刷新超链接所在的当前框架。
3、 程序运行结果分析
登陆界面:
主界面:
可以进行增删改查功能。
4、 总结
4.1 项目的难点和关键点
涉及到了HTML的框架布局,设计好框架后把相应的网页放进框架中,导航栏那里的超链接的target属性记得是要填你想要显示框架的name属性的属性值。不然他会默认刷新超链接所在的当前框架。
一般来说,如果元素在框架中,如果不设置某些属性,当超链接跳转的时候只会在当前框架刷新,不会整个页面刷新,如果需要实现整个网页刷新,对应不同的情况有不同方法。
问题:明明html页面修改后提交到Tomcat,但是页面还是没有改变
解决: 这是由于浏览器里面优先读取了缓存,即记录下你之前登录过这个系统的样式,浏览器这样做是为了能让网页访问速度更快,但是在这里却变成了绊脚石。解决方法有两个
(1)设置HTML页面不缓存
可以在HTML开头使用以下语句使HTML不缓存
(2)每次进入更新HTML页面的时候使用CTRL+F5进行刷新,这样能不通过缓存进行刷新。
4.2 项目的评价
此项目作为一个管理系统,第一次上手,进度比较缓慢。老师提出的需求也仅仅实现了一小部分,而且我的程序界面不够美观。因为第一次做项目,时间上还是很紧的。界面比较简单,毕竟理科生没有艺术细胞。在这里打个广告需要前端美工一名。开发过于随意,没有计划性。不管三七二十一先写了再说。写完这个项目之后,自己从头在总结一翻,你会发现自己真的收获了很多,以前看不懂的代码,现在在看会豁然开朗。我觉得老师说的很对,总结真的很重要,之前我没总结,只靠回想的话,我真的能记住的很少很少,我觉得这个项目过段时间在总结一次的话,就可以真正理解整个项目的实现流程,自己下次做在类似的项目就会得心应手,不会不知道怎麽下手了,几个小时的总结写完了,觉得自己写的很充实,理解的也更清楚了,以后也要经常做这样的总结,我相信自己慢慢的就会成长起来的。加油把,继续努力。
4.3 心得体会
编码是软件开发过程中最基本、最底层的技艺,然而也是最重要的技艺。任何一个领域的专家都需要花费大量的时间来进行基本技艺的锻炼,木匠需要花费大量的时间来锻炼他们对各种工具的掌握,厨师则需要练习刀工和火候。程序员也是一样的,对我们来说,语言的各种特性必须要了然于胸。而对软件的管理也需要从代码做起。
软件的开发过程就象是一部精密的机器,任何一个环节的变化,都会对其它的环节产生影响。把软件过程按照瀑布的形式进行划分是一种分解的处理思路,但同时我们还应该看到不同活动之间的相互影响。软件开发中的生命周期模型也是一个层次模型,从业务建模一直到软件实现,需要跨越数个层次,同样会出现执行不力的情况,例如,代码设计偏离需求、偏离设计的情况比比皆是。
5、 参考文献
《JSP程序设计》作者:张跃平
《JAVA web开发详解》作者:孙鑫
《Head First Java》作者:Kathy Sierra