第一章 目的与意义
1.1 系统开发的背景
社团作为各高校的重要组成部分之一,是高校校园文化的重要体现,涉及到学院社团和成员等重要信息。从会员加入社团到退出社团,包含了很多信息,如活动信息,加分信息等等。从社团的建立到撤销,也是含有非常多的信息,如活动的举办,会员的管理等等重要信息。尤其是随着对大学生课外拓展,第二课堂的测评工作的改革,对社团的日常管理也变得现代化和数字化。如果在使用传统的人工管理方式,既繁琐、又不能实现数据共享,同时数据的安全性也没有保障。所以,开发一个功能较好、操作简单,同时又能规范准确的社团信息管理系统是非常有必要的。
1.2 系统设计的目的与意义
1.2.1 个人信息模块
在一个系统中,用户只要一注册,系统为了方便用户的下次登录,就会存有用户注册时填下的个人信息。但如果用户忘记了自己填写的个人信息,要如何查看呢?如果用户的个人信息发生的改变,又该如何及时的让系统知道呢?此时,个人信息模块的重要性就体现出来了。在个人信息这个模块里,用户可以随时的查看自己的个人资料,并可以个性化的进行更改。这样既可以提高用户的体验效果,又可以方便系统及时对用户的信息进行更新。很多完整且大型的系统都是会有用户信息的模块的,比如QQ、微信等等。想象一下,没有个人信息模块,就像是你无法查看和更改你在QQ里的个人信息,包括不可以修改你的用户名,生日或是个性签名。那样的感觉是不是很糟糕。所以,个人信息模块是一个系统里不可缺少的一部分。
1.2.2 社团信息模块
这个系统是社团信息管理系统,社团信息模块是系统里最基本的,也是最重要的模块之一,社团信息里有了社团的基本信息,包括社团编号、社团名称、社团资金、社团地址以及指导老师。普通用户可以通过查看社团的这些基本信息来了解社团,选择是否加入该社团。社团干部可以查看修改社团的这些基本信息,达到及时更新信息的目的,有利于建设更好的社团,协助社团管理。管理员不仅可以通过社团信息这个模块,对社团信息进行增删改查,还可以在这里对新申请的社团进行审核,或是对经营不善的社团进行撤销。
1.2.3 活动信息模块
每一个社团的创建都是因为有一群志趣相投的人聚在了一起,做一些他们都感兴趣的事情。社团活动就是他们对这个共同的兴趣做事情的体现。一个没有社团活动的社团,常常被称之为“没有灵魂的社团”。活动信息模块是附属于社团信息模块的一个部分,每一个社团都有它举办的活动,如舞蹈协会的舞蹈演出,魔术协会的魔术表演,电子协会的义修等等。在每学年的综测评比中,参加社团的活动的同学可以得到一定的技能加分,所以,一个管理这些信息的模块由此诞生,活动信息模块也是活动加分模块。
1.2.4 成员信息模块
要管理好一个社团,自然需要一定的层次分布,否则群龙无首,意见众多的时候,会乱成一团,所以在社团里往往会有社团会长、副会长、理事已经普通会员的分布。同样对于社团干部拥有社团成员的信息综合表是不可缺少的,除了更准确的把握成员信息,保障社团基本安全性之外,也是为了避免在后续管理中会出现各种各样的麻烦。如,社团干部需要对参加了活动的会员进行加分录入,如果不能及时拿到会员的基本信息会给工作带来极大的不便,此外管理员对系统的安全保障也会有所困难。
1.2.5 用户信息模块
用户信息模块是每个系统都必不可少的模块,它从用户注册时获取用户信息,在用户登录时为系统提供查询登录的作用,因为拥有用户信息,系统才能保障每个注册过的用户可以顺利登录,也保障登录的是注册过的用户。管理员拥有了用户信息才能更好的给予不同的用户一定的权限,管理好系统的进入人员,保障系统的基本安全。用户信息表还给各个用户的个人资料模块提供信息。
1.2.6 统计信息模块
经验证明,统计可以更集中、更系统、更清楚的反映客观实际,统计分析是为管理者提供更直观的信息,有助于更准确的决策和判断。统计信息模块,可以为管理员提供更直观的社团数据,成员数据以及男女比例,有助于更明了系统里的数据变化,及时了解情况。
第二章 理论基础及技术路线
2.1 Java Web设计模式
随着计算机软硬件技术的高速发展以及计算机网络的普及,软件应用已经从以往的单机软件扩展到了基于网络的软件,并随之产生了基于Internet的Web应用程序,Java作为业内重要的软件开发语言,也提供了Web应用的开发机制。Java Web 是用Java技术来解决相关Web互联网领域的技术总和。Web包括服务器和客户端两部分,Java在客户端的应用原本就有Java Applet,不过目前用得很少,而Java在服务器端的应用则非常丰富,比如Servlet、JSP和第三方框架等。Java技术对Web领域的发展注入了强大的动力。
在该社团信息系统的构建过程中,就运用了大量的Servlet和JSP。
2.2 MySQL设计模式
MySQL是一个关系型数据库管理系统,由瑞典的MySQL AB公司开发,目前属于Oracle旗下的公司。MySQL是最流行的关系型数据库管理系统,在WEB应用方面,MySQL是最好的RDBMS应用软件之一。MySQL是一种关联数据库将数据保存在不同的表中,而不是将所有的数据放在一个大仓库内,这样就加快了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,它分别为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版的性能卓越,搭配JSP、PHP和Apache可以组成良好的开发环境。
在社团信息管理系统中,运用了MySQL创建了四张表,分别是成员表:member、社团表:club、活动表:activity、用户表:user;通过数据查询语句创建了多个方法,尤其是在构建社团统计信息的方法的时候,运用了大量的MySQL语句。
2.3 XML设计模式
XML是可扩展标记语言,也是元标记语言,定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言,用户可以定义自己需要的标记。XML标记描述的是文档的结构和意义,它不描述页面元素如何显示。XML为基于Web的应用程序带来了强大的功能和灵活性,它为开发人员和用户提供了许多优点。总的来说,XML的应用可分为四类分别是:应用于客户需要与不同的数据源进行交互、应用于将大量运算负荷分布在客户端、应用于将同一数据以不同的面貌展现给不同的用户和应用于内容与配置管理。
在该社团信息管理系统中,就存在由XML文件,如,database.conf.xml和web.xml,是系统构建过程中非常重要的组成部分,每每构建一个servlet都需要去web.xml里面添加一些信息,xml元素必须遵循一些命名规则,比如,名称不能以数字或标点符号开始,不能以字符“xml”开始,不能包含空格等等。
2.4 Servlet 设计模式
2.4.1 Servlet
Servlet是在服务器上运行的小程序,这个词是在Java applet的环境中创造的,Java applet 是一种当作单独文件与网页一起发送的小程序,它通常在客户端运行,然后得到为用户进行运算或者根据用户互作用定位图形等服务。最早支持Servlet技术的是JavaSoft的Java Web Servlet。此后,一些其他基于Java的Web Servlet 开始支持标准的Servlet API。Servlet的主要功能是交互式的浏览和修改数据,生成动态Web内容。
Servlet的基本流程是:客户端通过HTTP提出请求、Web服务器接收该请求并将其发给Servlet、Servlet将接收该HTTP请求并执行某种处理、Servlet将向Web服务器返回应答、Web服务器将从Servlet收到的应答发送给客户端。
Servlet的特点是:平台无关性、持久性、可扩展性、安全性、可以在多种多样的客户机上使用。
在社团信息管理系统中,我一共构建了28个Servlet,每一个都带着不同的功能和作业,每每构建一个servlet就需要去web.xml中添加信息,尤其要注意最后的路径,极容易写错。在jsp页面中触发,在servlet页面中调用对应的函数,然后再返回jsp页面,必要时可以借助form的帮忙触发servlet。
2.4.2 Session
Session就是会话,是客户为实现应用目的与系统的多次请求交互。会话跟踪允许服务器跟踪同一个客户端作出的连续请求,使得服务器应用程序可以保持客户应用的相关信息。会话跟踪常用的方法包括使用Cookie、URL重写、隐藏表单域等技术。
其中会话跟踪API是本系统中使用最多的session,它的主要操作有:查看与当前请求关联的会话对象、查看与会话相关的信息、在会话对象中保存数据、废弃会话数据。
该社团信息管理系统在登录页面多次使用session获取用户信息,保存数据,将其在需用的地方输出,进行数据的获取输出,不断重复使用,只要保存一次,在不同的位置都可以获取得到。
2.4.3 Filter
Filter是小型的Web组件,用于拦截请求和响应,以便查看、提取或以某种方式操作正在给客户机和服务器之间交换的数据。过滤器是封装了一些功能的Web组件,这些功能虽然重要,但是对于处理客户机请求或发送响应来说不是决定性的。Filter结合了去多元素,从而使得过滤器成为独特、强大和模块化的Web组件。它有如下特点:声明的、动态的、灵活的、模块化的、可移植的、可重用的和可透明的。它的实现有三个步骤:编写一个过滤器实现类、把过滤器添加到Web应用程序中、把过滤器与应用程序一起打包并部署它。
在社团信息管理系统中,Filter文件有AuthorityFilter.java,主要是用于过滤掉非管理员,设置在admin文件夹下的jsp只有管理员才能访问,非管理员则没有权限访问。
2.5 JSP设计模式
JSP技术能够让程序开发人员建立起功能强大的动态网页内容,实现HTML、JavaScript等静态技术与Java代码等动态技术混合编码。在传统的HTML页面文件中加入Java程序片和JSP标签就构成了一个JSP页面文件。简单的说,一个JSP页面除了普通的HTML标记外,再使用标记符号“<%”和“%>”加入Java程序片。一个JSP页面可以由以下5种元素组合而成:普通的HTML标签、JSP标签、变量和方法的声明、Java程序片和Java表达式。
在社团信息管理系统中,运用了大量的jsp页面,几乎所有的界面使用的都是jsp,jsp可以使用java的程序语言给功能的实现带来了很大的便利。其中有一种处理汉字信息的代码十分的有用:
String str = request.getParameter(“girl”);
byte b[] = str.getBytes(“ISO-8859_1”);
str = new String(b);
2.6 JavaScript设计模式
JavaScript 是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它的特点有:简单性、安全性、动态性和跨平台性。JavaScript可以出现在HTNL的任意地方。使用标记,可以在HTML文档的任意地方插入JavaScript,甚至在之前插入也没有问题。不过如果要在声明框架的网页中插入,就一定要在”的标记把它嵌入到文档中即可。
在社团信息管理系统中,遇到一些需要填表的地方,有些会有js设置写入的格式,或者是不可以留空之类的,如果违反了,浏览器页面就会弹出对应的提示框。
2.7 MAV 设计模式
MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。它的优点是能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
第三章 模块总体设计
3.1 需求分析
岭南师范学院是国家教育局批准的全日制高等二本院校。学院涵盖有100多个不同的社团,是校园文化的重要体现。校社联机构在日常管理工作中,总需要处理有关社团信息的处理,如,社团信息的变更,活动内容的更新,活动加分的申请等等。岭南师范学院的社团在每年的11月份都要进行社团成员的更新,包括旧成员的退出,新成员的加入,社团的申请,以及社团经营不善被撤销等等问题。近年,随着国家对高校社团改革的要求,学院里社团信息管理工作中的数据量也迅速增加,如果能够拥有一个功能较好的社团信息管理系统来实现对社团信息的管理,将极大的减轻学院社团信息管理的负担,提高社团管理的效率。
3.1.1 用户具体需求分析
-
普通用户:能够随时查询和修改个人信息、申请新社团、查看社团信息、加入社团以及查看自己加入了社团的信息
-
社团干部(会长):能够查看和修改个人信息、可以增删改查所有社团的基本信息、审核普通用户申请加入社团、对社团所有会员信息进行增删改查、对社团所有活动进行增删改查
-
管理员:能够查看和修改个人信息,能够对所有社团的社团信息、成员信息、活动信息、以及系统用户信息进行增删改查,可以审核普通用户申请的新社团和申请加入社团的要求,还可以查看系统所有社团的统计信息情况表
3.1.2 功能需求分析
要对岭南师范学院的社团信息进行全面的管理,系统需要拥有良好的功能及界面。系统的主要数据操作还是增删改查,同时提供一个较为方便的平台,高效的实现对社团信息的管理,根据实际工作需求,系统需要具备的功能有:
-
界面设计合理,界面友好
-
权限要求:主要有普通用户、社团干部和管理员三个角色。管理员是系统的管理者,拥有最高权限,可以对所有数据进行设置,更改等操作。社团干部的权限仅次于管理员,拥有部分权限,仅可以修改查看自己权限范围内的信息。用户可以修改自己的信息,以及对管理员发出申请的请求等功能
3.2 功能结构设计
3.2.1 普通用户界面
普通用户拥有的功能模块:
3.2.2 社团干部(普通管理员)界面
社团干部拥有的功能模块:
3.2.3 高级管理员界面
管理员拥有的功能模块:
第四章 系统实现
4.1 整体情况
工程的全部文件夹截图
登录界面
注册界面
管理员用户界面
普通用户界面截图
4.2 用户模块
4.2.1 个人资料模块
个人资料模块的部分代码和截图
Servlet部分代码
用从登录页面得到的用户登录账号,调用user()方法得到该登录用户的用户信息,返回到jsp页面
//调用DAO查找
HttpSession s = req.getSession();
ServletRequest session = **null**;
String mid = (String)session.getAttribute("mid");
UserDAO ud = **new** UserDAO();
Vector<User> v1 = ud.user(mid);
s.setAttribute("personal",v1);
//返回到jsp页面并显示查找到的所有信息
resp.sendRedirect(req.getContextPath()+"/assets/personal.jsp");
Jsp部分代码
<form name="form" action="personal">
<table class="table">
<thead>
<tr>
<th>用户编号</th>
<th>用户名</th>
<th>密码</th>
<th>权限 </th>
<th></th>
</tr>
<%
Vector<User> v = (Vector<User>)session.getAttribute("personal");
Iterator<User> it = v.iterator();
User u = null;
while(it.hasNext()){
u = it.next();
if(!u.getmId().equals("01")){
%><!-- 切断循环 -->
<tr>
<td><%=u.getmId() %></td>
<td><%=u.getusername() %></td>
<td><%=u.getpassword() %></td>
<td><%=u.getssuper() %></td>
<td><a href="updatepersonal.jsp?mid=<%=u.getmId() %>">修改</a></td>
</tr>
<%
}}
%>
页面
- 页面截图:
4.2.2 申请社团模块
申请社团模块的部分代码和截图
- Servlet部分代码
获取页面得到的申请信息,通过管理员审核后插入到社团表中
String cid = req.getParameter("cid");
String cname = req.getParameter("cname");
byte cname2[] = cname.getBytes("ISO-8859-1");
cname = new String(cname2,"GBK");
String cplace = req.getParameter("cplace");
byte cplace2[] = cplace.getBytes("ISO-8859-1");
cplace = new String(cplace2,"GBK");
int cfree = Integer.parseInt(req.getParameter("cfree"));
String teacher = req.getParameter("teacher");
byte teacher2[] = teacher.getBytes("ISO-8859-1");
teacher = new String(teacher2,"GBK");
Club c = new Club();
ClubDAO cd = new ClubDAO();
c.setcId(cid);
c.setcName(cname);
c.setcPlace(cplace);
c.setcFree(cfree);
c.setTeacher(teacher);
int flag = cd.insertInfoToClub1(c);
if(flag == 1)
resp.sendRedirect(req.getContextPath()+"/cheak.jsp");
else
resp.sendRedirect(req.getContextPath()+"/error-404.html");
- Jsp部分代码
<form name="form" action="applyclub">
<div class="signin-form">
<div class="form-group">
<label for="signin_form">社团编号 </label>
<input type="text"class="form-control" id="cid"
name="cid" placeholder="社团编号">
</div>
<div class="form-group">
<label for="signin_form">社团名称</label> <input type="text" class="form-control" id="cname" name="cname"
placeholder="社团名称">
</div>
<div class="form-group">
<label for="signin_form">社团所在地</label>
<input type="text" class="form-control" id="cplace" name="cplace"
placeholder="社团所在地">
</div>
<div class="form-group">
<label for="signin_form">社团资金</label> <input type="text" class="form-control" id="cfree" name="cfree"
placeholder="社团资金">
</div>
<div class="form-group">
<label for="signin_form">指导老师</label> <input type="text" class="form-control" id="teacher" name="teacher"
placeholder="指导老师">
</div>
</div>
- 结果截图
4.2.3 社团报名模块
社团报名模块的部分代码和截图
- Servlet部分代码
查看所有社团信息
ClubDAO jd = new ClubDAO();
Vector<Club> v = jd.findAllClub();
HttpSession s = req.getSession();
s.setAttribute("allClub",v);
//返回到joinclub.jsp页面并显示查找到的所有用户信息
resp.sendRedirect(req.getContextPath()+"/assets/joinclub.jsp");
- Jsp部分代码
<form name="form" action="joinclub">
<table class="table">
<thead>
<tr>
<th><input id="btn1" type="button" value="全选" onclick="allcheck();"/></th>
<th>社团编号</th>
<th>社团名称</th>
<th>社团所在地</th>
<th>社团资金</th>
<th>指导老师</th>
<th>
</th>
</tr>
<%
Vector<Club> v = (Vector<Club>)session.getAttribute("allClub");
Iterator<Club> it = v.iterator();
Club c = null;
while(it.hasNext()){
c = it.next();
if(!c.getcId().equals("01")){
%><!-- 切断循环 -->
<tr>
<td><input type="checkbox" name="check" value=<%=c.getcId() %>></td>
<td><%=c.getcId() %></td>
<td><%=c.getcName() %></td>
<td><%=c.getcPlace() %></td>
<td><%=c.getcFree() %></td>
<td><%=c.getTeacher() %></td>
<td>
<a href="joinclub1.jsp?cid=<%=c.getcId()%>">加入</a> </td>
</tr>
<%
}
}
%>
</table>
</form>
(3)结果截图
4.2.4 社团记录模块
社团记录模块的部分代码和截图
- Servlet部分代码
根据从登录页面获取的用户信息,筛选出该用户的成员信息,调用方法得到数据后,返回jsp页面
//调用DAO查找
HttpSession s = req.getSession();
ServletRequest session = null;
String mid = (String)session.getAttribute("mid");
MemberDAO md = new MemberDAO();
Vector<Member> v1 = md.member(mid);
s.setAttribute("myclub",v1);
//返回到jsp页面并显示查找到的所有用户信息
resp.sendRedirect(req.getContextPath()+"/assets/myclub.jsp");
- Jsp部分代码
<table class="table">
<thead>
<tr>
<th>学号</th>
<th>姓名</th>
<th>性别</th>
<th>社团</th>
<th>职位</th>
<th>状态</th>
<th>
</th>
</tr>
<%
Vector<Member> v1 = (Vector<Member>)session.getAttribute("myclub");
Iterator<Member> it = v1.iterator();
Member m = null;
while(it.hasNext()){
m = it.next();
if(!m.getmId().equals("01")){
%><!-- 切断循环 -->
<tr>
<td><%=m.getmId() %></td>
<td><%=m.getmName() %></td>
<td><%=m.getmGender() %></td>
<td><%=m.getcName() %></td>
<td><%=m.getProf() %></td>
<td><%=m.getSign() %></td>
<td>
<a href="outclub?f=del&mid=<%=m.getmId() %>"
onclick = "return confirm('您确定要退出该社团吗?');">退出</a>
</td>
</tr>
<%
}}
%>
</table>
- 结果截图
4.3 管理员模块
4.3.1 个人资料模块
4.3.2 社团信息模块
社团信息模块的部分代码和截图
- Servlet部分代码
//调用DAO查找所有社团信息
ClubDAO cd = new ClubDAO();
Vector<Club> v = cd.findAllClub();
HttpSession s = req.getSession();
s.setAttribute("allClub",v);
//返回到club.jsp页面并显示查找到的所有用户信息 resp.sendRedirect(req.getContextPath()+"/admin/allClub.jsp");
- Jsp部分代码
<%
Vector<Club> v = (Vector<Club>)session.getAttribute("allClub");
Iterator<Club> it = v.iterator();
Club c = null;
while(it.hasNext()){
c = it.next();
if(!c.getcId().equals("01")){
%><!-- 切断循环 -->
<tr>
<td><input type="checkbox" name="check" value=<%=c.getcId() %>></td>
<td><%=c.getcId() %></td>
<td><%=c.getcName() %></td>
<td><%=c.getcPlace() %></td>
<td><%=c.getcFree() %></td>
<td><%=c.getTeacher() %></td>
<td><%=c.getSigns() %></td>
<td><a href="updateClub.jsp?cid=<%=c.getcId() %>">修改</a>
<a
href="updateClub?f=del&cid=<%=c.getcId() %>"
onclick = "return confirm('您确定要删除该条记录吗?');">删除</a></td>
</tr>
<%
}}
%>
- 结果截图
4.3.3 活动加分模块
活动加分模块的部分代码和截图
- Servlet部分代码
//所有活动信息
ActivityDAO ad = new ActivityDAO();
Vector<Activity> v = ad.findAllActivity();
HttpSession s = req.getSession();
s.setAttribute("allActivity",v); resp.sendRedirect(req.getContextPath()+"/admin/allActivity.jsp");
(2)Jsp部分代码
<%
Vector<Activity> v = (Vector<Activity>)session.getAttribute("allActivity");
Iterator<Activity> it = v.iterator();
Activity a = null;
while(it.hasNext()){
a = it.next();
if(!a.getmId().equals("01")){
%><!-- 切断循环 -->
<tr>
<td><input type="checkbox" name="check" value=<%=a.getmId() %>></td>
<td><%=a.getmId() %></td>
<td><%=a.getcId() %></td>
<td><%=a.getcAct() %></td>
<td><a href="updateActivity.jsp?mid=<%=a.getmId() %>">修改</a> <a
href="updateActivity?f=del&mid=<%=a.getmId() %>"
onclick = "return confirm('您确定要删除该条记录吗?');">删除</a></td>
</tr>
<%
}}
%>
(3)结果截图
4.3.4 成员信息模块
成员信息模块的部分代码和截图
- Servlet部分代码
MemberDAO md = new MemberDAO();
Vector<Member> v = md.findAllMember();
HttpSession s = req.getSession();
s.setAttribute("allMember",v);
//返回到member.jsp页面并显示查找到的所有用户信息 resp.sendRedirect(req.getContextPath()+"/admin/allMember.jsp");
- Jsp部分代码
//allmember.jsp的js代码
function allcheck(){
var oCheck = document.getElementsByName('check');
for(var i=0;i<oCheck.length;i++){
oCheck[i].checked=true;
}
}
function delAllMember(){
var allmid = new Array();
var flag = false;
var oCheck = document.getElementsByName('check');
for(var i=0;i<oCheck.length;i++){
if(oCheck[i].checked){
allmid.push(oCheck[i].value);
flag = true;
}
}
if(flag){
if(confirm("您确定要删除这些记录吗?")){
location.href="updateMember?f=delall&allmid="+allmid;
}
}else{
alert("您至少需要选择一条记录才能进行批量删除!");
}
}
- 结果截图
4.3.5 用户信息模块
用户信息模块的部分代码和截图
- Servlet部分代码
//用户模块的“添加”的代码
String mid = req.getParameter("mid");
String username = req.getParameter("username");
byte username1[] = username.getBytes("ISO-8859-1");
username = new String(username1,"GBK");
String password = req.getParameter("password1");
int ssuper = Integer.parseInt(req.getParameter("ssuper"));
User u = new User();
UserDAO ud = new UserDAO();
u.setmId(mid);
u.setusername(username);
u.setpassword(password);
u.setssuper(ssuper);
int flag = ud.insertInfoToUser(u);
if(flag == 1)
resp.sendRedirect(req.getContextPath()+"/admin/findalluser");
else
resp.sendRedirect(req.getContextPath()+"/error-404.html");
- Jsp部分代码
<%
Vector<User> v = (Vector<User>)session.getAttribute("allUser");
Iterator<User> it = v.iterator();
User u = null;
while(it.hasNext()){
u = it.next();
if(!u.getmId().equals("01")){
%><!-- 切断循环 -->
<tr>
<td><input type="checkbox" name="check" value=<%=u.getmId() %>></td>
<td><%=u.getmId() %></td>
<td><%=u.getusername() %></td>
<td><%=u.getpassword() %></td>
<td><%=u.getssuper() %></td>
<td>
<a href="updateUser.jsp?mid=<%=u.getmId() %>">修改</a>
<a href="updateUser?f=del&mid=<%=u.getmId() %>"
onclick = "return confirm('您确定要删除该条记录吗?');">删除</a></td>
</tr>
<%
}}
%>
- 结果截图
4.3.6 统计信息模块
统计信息模块的部分代码和截图
- Servlet部分代码
//调用DAO查找所有信息
tatalDAO td = new tatalDAO();
Vector<Member> v1 = td.tatal1();
HttpSession s = req.getSession();
s.setAttribute("tatal1", v1);
Vector<Member> v2 = td.tatal2();
s.setAttribute("tatal2", v2);
Vector<Member> v3 = td.tatal3();
s.setAttribute("tatal3", v3);
//返回到tatal.jsp页面并显示查找到的所有信息
resp.sendRedirect(req.getContextPath()+"/admin/tatal.jsp");
- DAO部分代码
conn = DataAccess.getConnection();
prep = conn.prepareStatement("select cName AS 社团,"
+ " COUNT(mName) AS 人数,"
+ " SUM(CASE mGender WHEN '男' THEN 1 ELSE 0 END) AS 男,"
+ " SUM(CASE mGender WHEN '女' THEN 1 ELSE 0 END) AS 女 "
+ " FROM member "
+ " GROUP BY cName");
rs = prep.executeQuery();
while(rs.next()){
Member m = new Member();
m.setcName(rs.getString("社团"));
m.setmName(rs.getString("人数"));
m.setmGender(rs.getString("男"));
m.setmGender1(rs.getString("女"));
v.add(m);
(3)结果截图
第五章 总结
该社团信息管理系统的构建,首先是在MySQL数据库里创建了一个数据库association,建了三张表:成员表、社团表和活动表,并将他们联系起来。但是后来在准备登录页面的时候,发现三张表可能不够用,所以我创建了第四张表用户表,专门来存储注册登录系统的用户信息。在构建好数据库之后,就开始在javaee中实现对数据库的表的增删改查,创建了定义的DTO,写方法的DAO,还有测试的TEST,还有工具类等等,保障每张表的增删改查都能顺利执行。这些文字写出来好像很顺利,但是在实际操作过程中,我们遇到了各种各样奇葩的错误,完全摸不着头脑。记得有一次就是,本来还好好的,但是系统突然就无法连接上数据库了,一直报错,控制器那里一大片一大片的红色错误,却找不到具体的指示,把错误复制去百度,但是提供的都是各种奇奇怪怪的解决方法,在试过之后也不能解决。真真的耗了整整一天在看一个错,但是后来,第二天打开电脑运行的时候,一点问题都没有。我到现在还是不知道当时是怎么回事,也尝试过关机重启,但是并没有用。在完成这些后,我们将程序复制到新建的web文件里面,开始javaweb的应用程序的构建。还记得,第一次使用http:localhost:8080页面显示出Hello World!的时候,我们是多么的兴奋,感觉拿到了一车子的棒棒糖。现在看来可能会觉得很简单,但事实是也出了很多错误,调了很久才成功的。切身的体会就是敲代码,做程序真的是很考验一个人的耐心和细心的,你必须要足够细心才能尽量不犯错,发现错误,必须要足够耐心才能一点点的调出错误的地方,解决它。在Javaweb工程中,我构建了WEB.XML等XML文件,还有就是控制只有管理员才能访问的Servlet过滤器filter,让只有管理员才能访问在admin文件目录下面的页面。相当于设置了权限,让普通用户不能访问。还有的就是各式各样的Servlet了,在这个系统里差不多有28个servlet,而且每创建一个servlet就要去web.xml里面配置一次,而且一点都不能有错,每次都写的小心翼翼的。后来我直接创建了Servlet让web.xml自己配置好,但是我之前写的注释会不见,但为了不写错,也只能这样了。Servlet是用来调用方法,把结果返回到jsp页面里面去的。但是我的servlet总会出问题,就是它无法获取到jsp触发的信息,而不能去调用方法,导致传到jsp的数据都是空值,后来和同学讨论了一下,我给每一个jsp需要触发servlet的地方配了一个form action 来调用对应的Servlet。但是还是会出问题,奇奇怪怪的问题,但是我自己一个人想总是找不到问题出在那里,和同学一起想的时候往往就能找到出问题的地方。我觉得我何其幸运。每写完一个servlet,我就会开始写它对应的jsp,有时还会有js。就这样大错小错不断,我慢慢完成了这四个表的对应的功能。我的系统主要分为两类用户,一个是普通用户,另一个就是管理员了。普通用户主要是有四个功能模块,一是个人资料,他登录之后就可以打开个人资料界面查看自己的个人资料,后面会有个修改的按钮,他可以修改自己的用户名和密码,但是个人信息的编号和权限被我设定了只读,所以他只能看,不能改。其实就是把他的用户信息从用户表了挑出来,他就是做了用户表的修改而已。二是申请社团,是一个表单,就是做社团表的增添,但是我设了一个标志位,所以需要通过管理员的审核才能实现。三是查看社团和加入社团,就是查看社团表和添加成员表而已,也是通过了标志位,只有通过管理员审核,才能成为会员。四是参看参加了社团的信息,就是把他的成员信息从表里挑出来,后面还有个退出社团的按钮,就是删除成员表一条记录的功能实现。关于管理员的功能模块,主要就是对所有表的增删改查,还有就是统计了。统计是后来新建了一个DAO做的,运用了数据库的语句整合了几张临时表,让系统信息能更直观的显示出来,方便管理员的操作。这些是系统功能的实现,关于页面,是从模板之家copy来的,改掉了标签,添加了一些自己的东西,借用了页面的按钮。然后,我找了个方法,从登录页面获取用户编号来获取用户名,然后把它显示在页面上,这样它就可以成为该用户的个人页面了。结果就是完成了还算符合要求的系统,虽然很多很多漏洞,但是在不断解决问题的过程中,我还是收获到了很多快乐,很感谢老师和我的朋友一直没有放弃我。结论就是以后还是要做这一行的,好好加油,坚持把书里的代码都敲它一边,理解一下,要不断的在成长才行。展望的话,我挺想在继续完善这个系统,让它变得更好一点。