涉及该模块文件分别为:register.jsp、 registeraction.java以及userdao.java。
4.1.2 文件设计
register.jsp文件:
按照下述内容设计register.jsp文件。
表单名:form1。
表单执行程序:register.jsp。
表单数据传输方法:post。
表单的要素如附录一表1所示。
在structs-config.xml中actionmappings中配置如下:
<action input="/register.jsp" name="registerform" path="/register"
type="my.action.registeraction" validate="true">
<forward name="register.ok" path="/index.jsp"/>
<forward name="register.error" path="/register.jsp"/>
</action>
//带表单验证类的action,input参数为表单证错误返回的页面,name是接受页面参数的表单类,path为页面请求到服务器的路径,type为处理请求的action类的路径,forward为验证成功与否的转发路径。
registeraction.java代码如下:
package my.action;
public class registeraction extends action {
public actionforward execute(actionmapping mapping, actionform form,
httpservletrequest request, httpservletresponse response) {
userbean user = new userbean();
//声明javabean
registerform rform = (registerform) form;
//从表单类中接过已验证过的表单信息
user.setusername(rform.getusername());
user.setpassword(rform.getpassword());
user.setsex(rform.getsex());
user.setborntime(rform.getyear() + "-" + rform.getmonth() + "-"
+ rform.getday());
user.setemail(rform.getemail());
user.setintroduce(rform.getintroduce());
user.setrealname(rform.getrealname());
user.settelnumber(rform.gettelnumber());
user.setstatus("0");
//赋值bean中所有属性
userbean database=new userdao().findone(user.getusername());
//注册之前检查用户名是否已经存在,若存在则生成错误信息,反馈到注册页面
if(database!=null){
request.setattribute("login.error", "对不起,您的用户名已经被人使用,请重新输入!");
return mapping.findforward("register.error");
}
//所有验证完成,将用户信息入库,成功则将成功信息反馈到首页
int n = new userdao().insertuser(user);
if (n == 0) {
return mapping.findforward("register.error");
} else {
request.setattribute("login.error", "注册成功,请等待审核!!");
return mapping.findforward("register.ok");
}
}
}
4.2 用户登陆模块 4.2.1 用户登陆流程分析
用户在正确注册之后,在后台经管理员审批,正式获得日志系统的使用权限。在首页输入用户名和密码登陆系统。若用户名和密码有误,将返回登陆页,并显示错误提示。用户名和密码无误则成功登入系统。后台系统中管理员登陆模块与该模块实现类似,本文不再叙述。用户登陆过程活动图如下图4-2。

图4-2 用户活动过程
4.2.2 用户登陆模块文件设计
用户登陆模块主要有三个文件。负责视图层的login.jsp和负责控制层的loginaction.java和负责模型层的userdao.java和userbean.java。
在structs-config.xml中actionmappings中配置如下:
<action input="/index.jsp" name="loginform" path="/login"
type="my.action.loginaction" validate="true">
<forward name="login.ok" path="/user_index.jsp"/>
<forward name="login.error" path="/index.jsp"/>
</action>
其中模块商业逻辑的主要部分loginaction.java的代码如下:
package my.action;
public class loginaction extends action {
public actionforward execute(actionmapping mapping, actionform form,
httpservletrequest request, httpservletresponse response) {
loginform userform=(loginform)form;
//获取页面表单信息
userbean bean=null;
bean=new userdao().finduser(userform.getusername(), userform.getpassword());
//将用户从登陆页面输入的用户名和密码与user表中用户名与密码核对,若不一致,生成错误信息,返回到登陆页面
if(bean==null){
request.setattribute("login.error", "您还没有注册,请先注册!");
return mapping.findforward("login.error");
}else{
string status=bean.getstatus();
if(status.equals("0")){
request.setattribute("login.error", "抱歉,您的帐户正在审批中,暂时无法登陆!");
//若用户名和密码一致,再次核对用户审批状态,未审批完成,生成提示信息并返回首页
return mapping.findforward("login.error");
}
list kind=new kinddao().findkind(userform.getusername());
list diary=new diarydao().finddiarybyuser(bean.getusername());
request.setattribute("diary", diary);
request.getsession().setattribute("kind", kind);
request.getsession().setattribute("user", bean);
return mapping.findforward("login.ok");
}
}
}
4.3 日志管理模块 4.3.1 日志管理功能模块图

4.3.2 设计思想及特点
注册用户登陆后进入日志管理页面能对日志进行相关操作。具体来说,若用户是第一次登陆,在添加日志之前系统会提示用户先添加日志分类,所有日志均建立在分类之下的。在分类添加完成之后,用户就能进入日志维护页面对日志进行添加,删除,修改操作了。值得注意的是在删除分类时,用户在删除类别的同时,也把该类别下的所有日志删除了。添加日志时用户能够通过设置日志状态是否公开来决定是否让日志被他人浏览,这样能将优秀的文章进行相互交流。
下面主要给出添加日志的活动图和文件设计:
活动图如下图4-4。

图4-4 添加日志活动图
在structs-config.xml中actionmappings中配置如下:
<action input="/adddiary.jsp" name="adddiaryform" path="/adddiary"
type="my.action.adddiaryaction" validate="true">
<forward name="adddiary.ok" path="/user_index.jsp"/>
<forward name="adddiary.error" path="/adddiary.jsp"/>
</action>
控制器层主要文件adddiaryaction.java源代码如下:
package my.action;
public class adddiaryaction extends action {
public actionforward execute(actionmapping mapping, actionform form,
httpservletrequest request, httpservletresponse response) {
httpsession session=request.getsession();
userbean user=(userbean)session.getattribute("user");
if(user==null){
return mapping.findforward("tohome.do");
}//验证用户是否已经登陆,若没登陆则为非法登入,返回首页
adddiaryform aform=(adddiaryform)form;
diarybean diary=new diarybean();
diary.setdiarytitle(aform.gettitle());
diary.setcontent(aform.getcontent());
diary.setkindid(aform.getkind());
diary.setuserid(user.getusername());
diary.setisopen(aform.getisopen());
if(aform.getisopen().equals("0")){
diary.setstatus("2");
}else{
diary.setstatus("0");
}
//接表单信息,并封装到jvabean中
int n=new diarydao().adddiary(diary);
//调用数据操作对象的add方法,将信息入库,成功则返回到成功页面
if(n!=0){
list list=new diarydao().finddiary(diary.getkindid());
request.setattribute("diary", list);
return mapping.findforward("adddiary.ok");
}else{
return mapping.findforward("adddiary.error");
}
}
}
4.4 后台用户管理模块 4.4.1 主要功能概述
该模块主要是由查询和显示两个子模块组合而成。管理能通过在查询模块输入用户名、性别、联系方式、真实姓名之后选择操作进行查询,在显示模块能根据用户选择的查询方式和操作显示不同的结果。管理员能在显示页面对用户进行相应操作。
选择“停用”后页面显示结果如下图4-5。

图4-5 选择“停用”后页面显示结果
4.4.2 查询与分页
在此模块中最为关键的就是查询与分页功能的实现。本系统在设计时将此过程分两步来实现的。第一步用searchuseraction.java来处理查询要求;首先接受页面查询参数生成查询所有记录的sql语句,然后运用java的string类的相关方法将sql语句字符串进行处理,等到查询总记录数目的countsql语句,再次通过得到的记录总数和每页应该显示记录条数计算得到显示总页数,然后将sql语句和页数传给第二步。第二步showuseraction.java负责显示个分页内容。通过接受第一步所传过来的sql语句和总页数生成新的光查该页记录数的sql语句,再一次从数据库中查询出具体记录并传到jsp页面将结果显示出来。
该过程活动图如图4-6。

图4-6 过程活动图
在structs-config.xml中actionmappings中配置如下:
<action path="/searchuser" type="my.action.searchuseraction">
<forward name="search.ok" path="/showuser.do?page=1"/>
</action>
<action path="/showuser" type="my.action.showuseraction">
<forward name="show.ok" path="/edit_user.jsp"/>
</action>
searchuseraction.java源代码:
package my.action;
public class searchuseraction extends action {
public actionforward execute(actionmapping mapping, actionform form,
httpservletrequest request, httpservletresponse response) {
httpsession session=request.getsession();
adminbean admin=(adminbean)session.getattribute("admin");
if(admin==null){
return mapping.findforward("tohome.do");
}
//管理员登陆验证,若为非法登陆,则返回首页
string sql = this.createsql(request, response);
//生成分页之前的sql语句
string countsql = this.getcountsql(sql);
//生成统计所有记录数的sql语句
int total = new userdao().getusernum(countsql);
//调用数据操作对象,统计所有记录数
int pagenumber = 1;
int perpagenumber = 7;
pagenumber = this.getpagenumber(total, perpagenumber);
//调用统计页数方法,获得总页数
request.getsession().setattribute("u.pagenumber", pagenumber);
request.getsession().setattribute("u.perpagenumber", perpagenumber);
request.getsession().setattribute("u.sql", sql);
return mapping.findforward("search.ok");
}
//将所有分页信息放入session对象,并分发至显示处理类
//生成统计记录数的sql语句的方法
private string getcountsql(string sql) {
string temp = sql.substring(sql.indexof("from") - 1);
temp = "select count(*) " + temp;
return temp;
}
//生成页数
private int getpagenumber(int total, int numperpage) {
int pagenumber = 0;
if (total % numperpage == 0) {
pagenumber = total / numperpage;
} else {
pagenumber = (total / numperpage) + 1;
}
return pagenumber;
}
}
showuseraction.java的源代码:
package my.action;
public class showuseraction extends action {
public actionforward execute(actionmapping mapping, actionform form,
httpservletrequest request, httpservletresponse response) {
httpsession session=request.getsession();
adminbean admin=(adminbean)session.getattribute("admin");
if(admin==null){
return mapping.findforward("tohome.do");
}