




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图2.2MVC设计模式的结构作为基于MVC设计模式的Web应用的一种典型体现,Struts架构实际上是建立在Model2基础上的,对Model,View和Controller都提供了现成的实现组建。Struts中的Controller控制器部分是通过专门的Servlet来实现的,该Servlet是一个StrutsAPI中提供的ActionServlet类型的实例,ActionServlet类继承了javax.servlet.http.HttpServlet类,因此该类的实例可以和普通的Servlet一样工作,其作用是接收客户端浏览器的请求,然后选择执行相应的业务逻辑,再把响应结果送回到客户端。Action对象是开发者定义的类(该类必须是StrutsAPI中提供的Action类的子类)的实例。在继承该类的过程中开发者可以加入具体业务逻辑或调用业务逻辑模块。Action对象在进行了业务逻辑或调用业务逻辑模块。Action对象在进行了业务逻辑的处理以后会将应用程序流程转到合适的View组件,最终将响应送回浏览器客户端。Struts中提倡Action对象只用来决定”做什么”,相当于一个低层面的控制器,因此也可以将Action归纳为Controller的组成部分。MVC系统中的Model模型部分从概念上可以分为两类:系统的内部状态和改变系统状态的动作.Struts中的Model部分一般由JavaBean以及EJB组成。在Struts架构中使用JavaBean来提供具体的业务逻辑,即”怎么做”,对于复杂的系统也可以使用EJB等组件来实现系统状态维护。这种业务逻辑的细分可以增强可以代码的可重用性。Struts中的View视图部分依然可以采用JSP来实现。此外,Struts还提供了丰富的自定义标记库,View部分使用这些自定义标签同样可以实现与Model部分的有效交互并能够增强显示功能。3企业信息管理系统设计系统设计是在系统分析的基础上由抽象到具体的过程,主要目标是将系统分析阶段所提出的反映到信息需求的系统逻辑方案并转换成可以实施的基于计算机与通信系统的物理(技术)方案,为下一阶段系统实施提供必要的技术资料,应符合系统性、灵活性、可靠性,经济性的要求。3.1数据库设计3.1.1数据库的需求分析依据项目的处理需求,对应数据表的设计及功能如下:·培训信息表:主要用于保存培训信息·奖惩表:主要用于保存奖惩信息·应聘信息表:主要用于保存应聘信息·薪金表:主要用于保存薪金信息·用户表:主要用于保存用户信息员工登记员工登记员工基本信息管理考勤信息管理员工工资设置员工考核管理结束基本信息录入员工工资管理考勤信息管理计算员工工资基本信息录入图3.1数据库需求分析流程图数据库设计数据库设计登陆统计查询存储数据页面应用显示数据退出判断选择存储数据数据录入统计查询一般查询图3.2数据库访问数据流图用户登记用户登记说明:输入用户信息数据流来源:用户输入数据流去向:数据库存储方式:人工操作存储员工基本信息管理员工基本信息管理说明:用于员工基本信息的修改,删除,添加数据流的输入:当前登录用户数据流的输出:操作界面存储方式:数据库直接存储员工考勤信息管理员工考勤信息管理说明:用于对员工考勤的管理数据流的输入:当前登录用户数据流的输出:操作界面存储方式:数据库直接存储员工考核信息管理员工考核信息管理说明:用于对员工考核的管理数据流的输入:当前登录用户数据流的输出:操作界面存储方式:数据库直接存储员工工资信息管理员工工资信息管理说明:用于对员工工资信息的管理数据流的输入:当前登录用户数据流的输出:操作界面存储方式:数据库直接存储图3.3系统模块数据字典3.1.2数据库表的具体设计表3.2.2培训信息表字段名数据类型长度是否主键描述idint4是数据库流水号namevarchar100培训名称purposevarchar500培训目的begintimedatetime8开始培训时间endtimedatetime8结束培训时间datumvarchar2000培训人员teachervarchar50培训讲师studentvarchar50学生createtimedatetime8创建时间educatebit1培训级别effectvarchar500培训影响度summarizevarchar2000培训材料表3.2.字段名数据类型长度是否主键描述Idint4是数据库流水号Namevarchar2000奖惩名称Reasonvarchar50奖惩原因explainvarchar50描述createtimedatetime8创建时间表3.2.4字段名数据类型长度是否主键描述idint4是数据库流水号namevarchar50姓名sexbit1性别ageint4年龄jobvarchar50应聘职位specialtyvarchar50所学专业experiencevarchar50工作经验studyeffortvarchar50在校所学专业schoolvarchar50毕业学校telvarchar50电话emailvarchar50电子邮件createtimedatetime8创建时间contentntext16详细经历isstockbit1标识表3.2.字段名数据类型长度是否主键描述idint4是数据库流水号namevarchar50员工姓名basicfloat8基本薪资eatfloat8饭补housefloat8房补dutyfloat8全勤奖scotfloat8赋税punishmentfloat8额外补助otherfloat8罚款granttimedatetime8发放时间totalizefloat8总计表3.2.字段名数据类型长度是否主键描述idint4是数据库流水号usernamevarchar50用户名称passwordvarchar50用户密码sexbit1用户性别birthdaydatetime8用户出生年月日createtimedatetime8用户创建的时间isadminbit1是否超级管理员contentvarchar2000管理员级别3.2系统功能模块详细设计3.2.1功能设计本系统主要用于对企业中的“人”进行管理。具体地讲,企业员工信息管理系统就是通过企业员工信息规划、员工考核、薪酬管理、员工激励、人才培训和开发等一系列手段来提高劳动生产率,最终达到发展目标的一种管理行为。具体实现目标如下。实现对员工信息进行全面管理的功能。设置企业员工基础信息管理功能。设置员工考勤管理功能模块。员工薪酬信息管理。实现企业员工培训信息全程跟踪的功能。实现企业的招聘信息、应聘信息的管理功能。企业人才库管理功能。系统用户信息的管理。系统最大限度地实现了易安装性、易维护性和易操作性。系统运行稳定、安全可靠。3.2.2模块企业员工信息管理系统是针对中小企业对现有员工和新聘员工的一个WEB管理平台。主页功能模块主要包括以下功能模块:人员管理:主要包括浏览人员信息、添加人员信息、人员信息的添加、人员信息的修改。招聘管理:主要包括应聘人员信息的详细查看、删除、添加以及信息入库。培训管理:主要包括培训计划的详细信息、信息删除、添加培训计划和填写培训总结。奖惩管理:主要包括奖惩详细信息、删除详细信息、添加详细信息、修改详细信息。薪金管理:主要包括薪金的修改、添加、删除。基本信息管理功能集合包括部门信息管理和员工信息管理等功能模块。此集合中功能模块的关系如图3.4所示。员工基本管理员工基本管理员工业绩信息管理员工工作经历管理员工基本信息管理部门信息管理图3.4员工基本信息管理模块关系图员工基本信息管理模块是整个系统的核心。除了部门管理模块外,其他各个模块都针对每一个员工的一个方面进行管理,都需要提供员工编号等基本信息作为索引。考核与待遇管理功能集合包括考勤管理,工作考评管理和工资管理模块。此集合中功能模块的关系如图3.5所示。员工基本信息管理员工基本信息管理员工工资管理员工考评管理员工考勤管理图3.5考核与待遇管理功能集合模块关系图用户管理及权限控制功能集合包括用户信息管理、权限控制等模块。权限控制对于企业员工信息系统来说是非常必要的。部门与员工基本信息数据,包括考勤,考核工作和工资等信息都不是一般的员工可以随意添加和改动的。这些操作只有人力资源主管才有此权限。在本系统中,我们将系统用户划分了3大类:人力资源主管:此类型用户是本系统中权限最高的用户。在本系统中的任何模块中,都可以进行添加,删除,修改等记录,并对所有数据进行查询显示的权限。系统管理员:是为了维护本系统而创建的用户,可以对除“人力资源主管”用户以外的其他类型用户进行管理。普通用户:权限最低的一类用户,除了可以修改自身的用户名和密码外,几乎没有其他数据库操作权限。在其他的模块中,此类用户只能浏览到与自己或自己的下属相关的数据,但是不能对数据进行修改或删除操作。在员工工作考评模块中,普通用户可以输入对自己下属员工的工作评价和资金系数等数据。此集合中功能模块的关系如图3.6所示超级超级HR主管用户普通HR主管用户修改自身用户名和密码普通系统管理员用户创建和管理普通HR主管用户超级系统管理员用户创建和管理普通用户创建和管理普通用户修改超级HR主管的密码修改自身的用户名和密码创建和管理普通系统管理员修改自身的用户名和密码系统用户信息系统创建和管理普通用户图3.6用户管理功能集合模块关系图用户登录模块开始,对系统的身份进行认证。身份认证可以分为以下两个过程:确认用户是否为有效的系统用户;确定用户的类型;第一个过程决定用户能否进入系统。第二个过程根据用户的类型决定用户的操作权限,从而决定用户的工作界面。开始开始退出系统登录进入系统主界面错误3次NY图3.7系统登录验证流程图在图3.7中可以看到,每个用户有3次机会进行身份认证。如果3次输入的用户名和密码都无法与数据库中的数据匹配,则强制退出系统。进入系统后,不同类型的用户所能进行的操作也不一样。这些操作笼统可以分为用户管理模块和人事管理模块。由于篇幅所限,五法完整地描述人事管理模块的系统流程,只是把它分为两个部分:考评信息的高级管理和查询;普通用户考评信息管理查询。普通用户对考评管理和查询。普通用户人事考评信息管理和查询部分非常简单,,因此在很读模块中,普通用户只有查询功能。系统流程见图3.8所示:进入系统进入系统工作考评管理部门信息管理员工信息管理下属工作考评信息管理查询部门信息查询员工新名列表图3.8考评管理和查询流程图“人事主管”用户对考评信息的高级管理和查询。系统流程如图3.9所示:员工信息员工信息部门信息管理进入系统进入系统删除考评信息添加考评信息查询考评信息修改考评信息工作经历信息家庭成员信息查询部门信息员工照片管理员工基本信息删除用户信息修改用户信息添加用户信息部门信息管理员工信息是否存在员工部门是够存在图3.9考评模块查询流程图4系统实现4.1用户操作文件总体架构用户操作模块主要包括用户登录和人员管理模块,具体功能如下:用户登录模块:用于登录系统。人员管理模块:用于浏览、添加和修改人员信息。4.1.1用户登录模块设计用户登录模块是用户进入主页面的入口,其运行结果如图4.1所示。图4.1用户登录模块运行结果系统登陆是企业员工信息管理中最先使用的功能,因为用户登陆在数据库中使用的是人员表,人员表中有一个isadmin字段,是来标识是否是管理员的。在登陆时要根据数据库的这个字段来判断此用户是否具有管理员的权限。在网页里添写用户名和密码后点击【登陆】按钮,网页会访问一个URL,这个URL是“logon.do?action=logon”,代码如下: <formname="usersForm"method="post"action="logon.do?action=logon"><tr><tdwidth="170"height="40"align="center">用户名:</td><tdwidth="230"height="40"><inputname="username"type="text"class="input"></td></tr><tr><tdheight="40"align="center">密 码:</td><tdheight="40"><inputname="password"type="password"class="input"></td></tr><tr><tdheight="40"colspan="2"align="center"><inputtype="submit"name="Submit"value="登陆"class="button"> <inputtype="reset"name="Submit2"value="重置"class="button"></td></tr> </form>在这个表单的name的值是usersForm,它是Struts的ActoinForm的实现类在配置文件中的名字,如下所示:<form-beanname="userForm"type="com.bOS.bPRO_PersonManage.actionform.UsersForm"/>action是Struts的Action的URL,他们在Struts的配置文件中都是已经配好的,如下所示:<actionpath="/logon"type="com.bOS.bPRO_PersonManage.action.UsersAction"name="userForm"scope="request"><forwardname="success"path="/manage.jsp"/><forwardname="failed"path="/failed.jsp"/></action>在这个配置文件中,可以了解到如下信息:根据name="userForm"可以找到与之相对应的ActionForm的实现类“com.bOS.bPRO_PersonManage.actionform.UsersForm”。根据type="com.bOS.bPRO_PersonManage.action.UsersAction"可以找到处理用户数据的Action类。根据<forwardname="success"path="/manage.jsp"/>和<forwardname="failed"path="/failed.jsp"/>可以了解,这个Action返回success时,页面会被转到manage.jsp文件,这就是登陆成功的页面。如果当Action返回failed时,页面会被转到failed.jsp文件,这个文件是当用户登陆失败将要转到的页面。Struts的Action实现类的execute()方法是最先被执行的,这个方法本身也没有具体的事务,而是根据action的参数不同执行相应的方法。在登陆页里面可以找到有一个“action=logon”的字样,它的目的就是在这里做逻辑判断。当action=logon时调用logon()方法。logon()方法从UsersForm中得到用户提交的数据,然后在调用UsersDao()的logonUsers()方法。并且把UsersForm转成Users类做为logonUsers()方法的参数。调用后会返回一个boolean型的值。如果为真,则返回“mapping.findForward("success");”否则返回“mapping.findForward("failed");”也就是当用户登陆成功后,返回给用户登陆成功的页面,登陆失败后返回用户一个登陆失败的页面。那么UsersDao的logonUsers()方法是根据什么得到的返回值呢,现在就让我们看看这个方法。这个方法先通过HibSessionFactory得到一个Hibernate的Session并且开始一个事务,Session再像使用一个欲编译似的命令似的东西,设定参数、提交事务和最后在关闭Session.。得到一个List里面就存储着所有查询出的结果。根据这个结果就可以判断出该用户是否有登陆的权根了,在返回true或者false。就这样合法的用户就可以顺利的登陆了。那刚才那些有些类似于欲编译的东西是什么呢,这些就是Hibernate特有的查询语言,被称为Hibernate查询语言(HQL),而它本身也就是使用的JDBC的欲编译技术。4.1.2人员管理模块设计人员管理模块主要包括浏览人员信息、添加人员信息、人员信息的添加、人员信息的修改。此模块文件架构如图4所示。各项管理工作都是在用户成功登陆后的管理页面进行的,在管理控制页面的左侧是各项的相关链接,右侧是操作平台。管理控制页面右侧实际上是一个iframe,如下所示:<tdheight="550"valign="top"><iframename="frame"src="main.do"width="100%"height="100%"frameborder="0"hspace="0"></iframe></td>在左侧的链接中使用target="frame"就可以在这个iframe中打开新的链接了。单击“添加人员信息”,即打开添加人员信息的页面如图4.2所示。图4.2添加人员信息页面添加人员信息的链接是这样的,如下所示:<tdheight="22"align="center"><ahref="adduser.do"target="frame">添加人员信息</a></td>在Struts配置文件中,添加人员信息的链接没有使用ActionForm类,也没有使用Action的实现类,如下所示:<actionpath="/adduser"forward="/adduser.jsp"/>adduser.jsp文件,只是一个普通的JSP文件,但是它的表单元素都是与UsersForm相对应的,UsersForm如下所示:packagecom.bOS.bPRO_PersonManage.actionform;importcom.bOS.bUtil.DateUtil;importjavax.servlet.http.HttpServletRequest;importorg.apache.struts.action.ActionErrors;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionMapping;importcom.bOS.bPRO_PersonManage.en.Users;publicclassUsersFormextendsActionForm{publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this.content=content;}privateLongid;privateStringusername;privateStringpassword;privateBytesex;privateStringbirthday;privateStringcreatetime;privateByteisadmin;privateStringcontent;publicStringgetCreatetime(){returncreatetime;}publicvoidsetCreatetime(Stringcreatetime){this.createtime=createtime;}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicBytegetIsadmin(){returnisadmin;}publicvoidsetIsadmin(Byteisadmin){this.isadmin=isadmin;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicvoidreset(ActionMappingarg0,HttpServletRequestarg1){this.id=null;this.username=null;this.password=null;this.isadmin=null;this.createtime=null;this.content=null;this.sex=null;this.birthday=null;}publicActionErrorsvalidate(ActionMappingarg0,HttpServletRequestarg1){returnnull;}publicStringtoString(){StringBuffertoStr=newStringBuffer();toStr.append("[UsersForm]=[\n");toStr.append("id="+this.id+";\n");toStr.append("username="+this.username+";\n");toStr.append("password="+this.password+";\n");toStr.append("sex="+this.sex+";\n");toStr.append("birthday="+this.birthday+";\n");toStr.append("createtime="+this.createtime+";\n");toStr.append("isadmin="+this.isadmin+";\n");toStr.append("content="+this.content+";\n");toStr.append("];\n");returntoStr.toString();}publicStringgetBirthday(){returnbirthday;}publicvoidsetBirthday(Stringbirthday){this.birthday=birthday;}publicBytegetSex(){returnsex;}publicvoidsetSex(Bytesex){this.sex=sex;}publicUserspopulate(){Usersu=newUsers();u.setId(getId());u.setIsadmin(getIsadmin());u.setContent(getContent());u.setUsername(getUsername());u.setPassword(getPassword());u.setSex(getSex());u.setBirthday(DateUtil.parseToDate(getBirthday(),DateUtil.yyyyMMdd));u.setCreatetime(DateUtil.parseToDate(getCreatetime(),DateUtil.yyyyMMddHHmmss));returnu;}}UsersForm类中的reset()方法作用是当用户点击“重置”按钮时,清空input输入框的内容,toString()方法覆盖了Object和toString()方法,populate()方法很有,它把UsersForm转化成Users实体类,大大方便了程序在对数据库操作时使用的方便。而且这个方法中还把用户的生日等表单元素的值由字符型转成日期类型。在adduser.jsp页面中的action上可以看到它要提交的URL,如下所示:<formname="userForm"method="post"action="modifyuser.do?action=adduser"onSubmit="returnuserValidate();">配置文件中modifyuser的Action实现类是“com.bOS.bPRO_PersonManage.action.UsersAction”,如下所示:<actionpath="/modifyuser"type="com.bOS.bPRO_PersonManage.action.UsersAction"name="userForm"scope="session"> <forwardname="success"path="/user.do?action=listuser"/></action>在UsersAction找到参数action等于adduser时所调用的方法addUsers(),它只是把从UserForm表单转化成的User类做为参数传给了UsersDao的addUsers()方法。在由这个方法向数据库添加人员信息,如下所示:publicvoidaddUsers(Usersusers)throwsHibernateException{users.setCreatetime(newjava.util.Date());Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();session.save(users);mit();HibSessionFactory.closeSession();}如果添加成功页面会被发转到user.do?action=listuser的URL。user.do的配置文件如下所示:<actionpath="/user"type="com.bOS.bPRO_PersonManage.action.UsersAction"name="userForm"scope="request"><forwardname="success"path="/listuser.jsp"/></action>这样就在页面做一次提交时它访问了二次UsersAction,第一次的作用是向数据库中添加信息,随后又把所有人员信息取出来显示给用户,同样UsersAction还只是调用UsersDao,取数据库的具体操作在UsersDao文件中,他这次调用的是listUser()方法,如下所示:publicListlistUser()throwsHibernateException{Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery("selectufromUsersasuorderbycreatetime");Listlist=query.list();mit();HibSessionFactory.closeSession();returnlist;}UsersAction取出从UsersDao中数据,在把它存到request里,然后返回returnmapping.findForward("success");在Strutsr的配置文件里返回页是listuser.jsp。所有用户的信息都在这个页中显示出来。如下所示:<tr><tdheight="22"colspan="7"align="left"><strongclass="text13">浏览人员信息</strong></td></tr><trclass="tdhui"><tdheight="22"align="center">人员姓名</td><tdalign="center">登陆密码</td><tdheight="22"align="center">性别</td><tdheight="22"align="center">出生日期</td><tdheight="22"align="center">是否管理员</td><tdheight="22"align="center">简介</td><tdalign="center">执行操作</td></tr><%Listlist=(List)request.getAttribute("list"); if(list!=null&&list.size()>0){ Iteratorit=list.iterator();while(it.hasNext()){Usersu=(Users)it.next();%><tr><tdheight="22"align="center"><%=StringUtil.notNull(u.getUsername())%> </td><tdheight="22"align="center"><%=StringUtil.notNull(u.getPassword())%> </td><tdheight="22"align="center"><%=newByte("1").equals(u.getSex())?"男":"女"%></td><tdheight="22"align="center"><%=StringUtil.notNull(DateUtil.parseToString(u.getBirthday(),DateUtil.yyyyMMdd))%> </td><tdheight="22"align="center"><%=newByte("1").equals(u.getIsadmin())?"是":"否"%></td><tdheight="22"align="center"><%=StringUtil.notNull(u.getContent())%> </td><tdheight="22"align="center"><ahref="selectuser.do?action=selectuser&id=<%=u.getId()%>">修改</a> <ahref="modifyuser.do?action=deleteuser&id=<%=u.getId()%>">删除</a></td></tr><% }}else{%><tr><tdheight="22"colspan="7"align="center">对不起,没有添加人员信息!!!</td></tr><%}%>在显示页中,从request里面的取出数据,如果有则显示在页面上,使用“list!=null&&list.size()>0”判断如果在没有数据的情况下,将对用户提示说“对不起,没有添加人员信息!!!”这是添加人员信息的整个过程,在这个过程中,有一部分是用于显示人员信息的,就是“user.do?action=listuser”,它是显示人员信息的地址。如果在网页中直接点击这个链接地址,同样也会调用出所有用户的信息。这就是“浏览人员信息”的链接。页面执行后如图4.4所示。图4.4浏览人员信息页面人员信息的列表的最后一列可以对该条记录做删除和修改。删除的链接地址是“modifyuser.do?action=deleteuser&id=<%=u.getId()%>”它向Action的实现类提交了两个参数,一个是action=deleteuser是固定不变的,另一个是该用户的id这是根据不同记录取出来的。在UsersAction类中根据action的值可以找到与其相对的方法,如下所示:privateActionForwarddeleteUser(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsHibernateException{Longid=newLong(request.getParameter("id"));Usersusers=newUsers();users.setId(id);dao.deleteUsers(users);returnmapping.findForward("success");}在这个方法里得到页面提交过来的用户ID,把这个id存在Users表中的实例中,传给dao的deleteUsers()方法,我们可以看到关于数据库方面的操作都被封装在Dao中。具体的删除操作的代码如下所示:publicvoiddeleteUsers(Usersusers)throwsHibernateException{Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();session.delete(users);mit();HibSessionFactory.closeSession();}删除用户时和添加用户一样都是先得到一个Hibernate的Session,后调用它的delete()方法就可以了,操作完成后千万记得要提交事务,即调用commit()方法,和关闭Session。修改人员的信息时必须先把要修改的人员信息先查找出来,让用户可以直观的根据以前的信息修改。这样在点击修改时也要传给Action一个用户ID,用来查询出用户信息,如下所示:<ahref="selectuser.do?action=selectuser&id=<%=u.getId()%>">修改</a>根据页面的链接可以在Struts的配置文件里找到相应的配置信息,如下所示:<actionpath="/selectuser"type="com.bOS.bPRO_PersonManage.action.UsersAction"scope="request"><forwardname="success"path="/updateuser.jsp"/></action>它调用了UsersAction类,返回到updateuser.jsp文件,在UsserAction中同前面一样也是根据action的参数来识别出调用selectUser()方法的,方法实现如下所示:privateActionForwardselectUser(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsHibernateException{Longid=newLong(request.getParameter("id"));Usersu=dao.loadUsers(id.longValue());request.setAttribute("user",u);returnmapping.findForward("success");}这个方法使在调用Dao的loadUsres()的方法后,得到一个Users的返回值,里面存着与此id相对应的人员信息,然后在把它存在request里。loadUsres()方法实现如下所示:publicUsersloadUsers(longid)throwsHibernateException{Sessionsession=HibSessionFactory.currentSession();Transactiontx=session.beginTransaction();Usersu=(Users)session.load(Users.class,newLong(id));mit();HibSessionFactory.closeSession(); returnu;}Hibernate在使用这个load()方法时比较特别,需要传入实体类的class,和要查询的用户ID。得到的返回值需要做一下强制类型转换。显示用户信息的页面在updateuser.jsp中,如图4.5所示。图4.5修改用户信息页面首先要从request中取出人员信息,在转化成Users类型,然后显示在页面中。在显示是否是管理员的项时比较人特别。如下所示:<tdwidth="33%"height="22"align="center">是否管理员:</td><tdwidth="67%"height="22"align="left"><inputname="isadminhelp"type="checkbox"<%=newByte("1").equals(u.getIsadmin())?"checked":""%>onClick="javascript:adminChecked();"value="<%=u.getIsadmin()%>"></td> <inputtype="hidden"name="isadmin"value="<%=u.getIsadmin()%>">>实际想要提交的表单的名字是isadmin,而在显示checkbox时用的name是isadminhelp。Isadmin确使用hidden类型做为表单提交名字,这和checkbox的特性有关。在使用javascrip对checkbox的value控制时。当value的值如果像这样“value="<%=u.getIsadmin()%>"”被写死时,使用javascrip是对value的值改变后,在提交表单时是无效的。于是我们就用hidden做为表单提交项,而<inputname="isadminhelp"type="checkbox"<%=newByte("1").equals(u.getIsadmin())?"checked":""%>onClick="javascript:adminChecked();"value="<%=u.getIsadmin()%>">只是在显示给用户的看的。在表单不接收isadminhelp的value,只接收isadmin的value。4.2技术难点4.3.1参数传递中的中文乱码由于浏览器中的参数传递是按字节传送,因此英文和数字不会有任何的问题,而中文汉字则由两个字节组成。为了解决这个问题,使用了下面的两种方法:①<%request.setCharacterEncoding(“gb2312”);%>②request.getParameter("Password").getBytes("ISO-8849-1"),"GB2312");4.3.2图片处理在SQLServer2000的数据库中可以存放任何格式的图片,但是要将其转换为二进制的数据存入数据库,在调用时再将二进制数据转换为图片,这样虽然便于管理,但是在当前国内的网速来看,这样的方法是在是不可取。因此本系统的图片均是存放的相对路径,将图片放在系统根目录下的image文件夹中,按类分好,然后将其相对路径存入数据库的对应列中,这样可以大大提高网页浏览的速度。4.3.3HQL语言本系统中,所有对数据库的操作都由Hibernate来完成,因此用到了大量的HQL语言。HQL是Hibernate设计的一套完整而实用高效的查询语言,它通过面向对象的语句结构实现了和SQL语言类似的功能。如果向表里插入一条数据的话,直接调用save()方法即可,但如果要使用查询功能的话,我按照一般的SQL语句的方法:from表名where条件,却总是找不到预期的数据,后来看书中发现,from后跟的是表对应映射的类文件名,而非表名,比如招聘表为invite,它对应的类为Invite.java,所以在from后要根Invite而不是invite。4.3.4安全性将项目发布到互联网上后,有些用户不是点击超链接打开网站的某个页面,而是在地址栏中直接写,而后进入,试图避开身份验证,处于对安全性的考虑,本项目在用户登陆后才能进入的页面中,加入了一行判断,如果用户非法进入,则看到的将是一片空白页。5系统测试在完成了程序的编写工作后,接下来将进行软件的测试,这里说的软件,并不单单是指程序本身,还包括其他方面。测试和开发一样,也是一项技术性很强的工作,有着很多的技巧。软件测试是软件质量保证的主要活动之一,因此,测试的质量直接影响软件的质量。依据前面所说的测试对象,我们把测试划分为几个方面来进行测试。5.1界面测试界面测试是测试过程中比较简单直观的一种测试方法,只要细心地按界面要求核对就行了。可这快往往是程序开发人员容易忽视和遗漏的地方。也是常常出Bug的地方。下面是界面测试中经常出现的几种Bug:错别字,即界面中的标题或者文本内容中出现了错别字。这种Bug如果测试人员不细心,和难找出来,可能会出现在提示信息或界面中。出现了一些根本读不懂的内容,一般多出现在程序的提示信息和一些较长的文本中。这种情况基本上出现在拼起来显示的提示中,页面的简单陈述是通过变量拼组起来的,通过程序将字一个一个地输出出来。通常是因为程序中的控制错误或是程序开发人员对程序没有进行认真的自测,导致出现这种Bug。程序员自创的词语,虽然意思对,但不符合界面的标准及需求。这种情况基本上是由于开发人员使用一些专业术语,并且混杂着自己的理解出现Bug,主要是由于开发过程中团队合作没又明确的分工,没有统一的规范用语。页面类似的内容中,明显有字体,字号不同的情况,使界面整体风格看上去不一致,这种情况只出现在没有CSS定义的情况下,或是已经定义的CSS,开发人员在开发过程中没有调用。标题相近的程序及模块,把标题弄混。这种情况多是因为业务方面的定义名称很相似或很类似,并且业务实体方面也很类似,开发人员在开发过程中忽略了开发名称和模块,只单独地实现其功能。5.2功能测试顾名思义,功能测试主要是测试程序模块是否实现了设计中所有要求的功能。功能测试中需要注意的有:查询功能中,有按单一查询条件进行查询的,也有按多个查询条件组合查询的,这里要注意多个查询条件之间的关系,还有一些常识性的问题,比如按月查询,闰年中二月的天数。录入功能中,需要注意的是前台设置的数值长度是否大于后台数值长度,以及前台与后台的数据结构是否相符,很多时候录入功能无法实现是由于这些原因。还有就是必须录入的字段的设置是否有误。测试删除功能中需要注意的是单击”删除”按钮后,一般会出现提示信息,询问是否确定删除。通常情况下,我们单击”确认”按钮查看信息是否被删除掉了,而忽略了单击“取消”按钮后程序的反应,这时有可能的是没有删除,还有一种可能是即便单击了“取消”按钮,也一样删除了数据。另外,在删除多条记录的时候,要注意连续选中的几条记录是否真正都被删除了,即如果再按照这种查询方式查询,是否还能查询出来。有的时候需要在数据库中设一个标志位,而不是真正的物理删除。所以在下一次查询中,可能还会被查询出来,这主要是因为在查询条件中没有将标志位考虑在内。关于修改功能的测试,主要是看修改确认后是否数据真正已被修改了。这是最基本的功能,需要注意的是看是否能把不应该修改的数据也修改成功了。5.3需求测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB32/T 4516-2023生态河湖建设规范
- DB32/T 4056-2021优良食味半糯粳稻品质
- DB32/T 3994-2021进境水生动物隔离场检验检疫操作规程
- DB32/T 3925-2020白斑综合征病毒(WSSV)环介导等温扩增(LAMP)检测技术规范
- DB32/T 1356-2020鲜食糯玉米青穗(棒)早春栽培技术规程
- DB31/T 822-2014饲料中棉酚的测定高效液相色谱法
- DB31/T 550-2011市级机关办公建筑合理用能指南
- DB31/T 507-2021燃煤凝汽式汽轮发电机组单位产品能源消耗指标
- DB31/T 1391-2022犬伤人事件防疫处置技术规范
- DB31/T 1358-2022导盲犬培训机构建设与服务规范
- GB/T 21618-2008危险品易燃固体燃烧速率试验方法
- 西安市非学历培训机构公示表
- QTZ1000塔机总体方案和平头式平衡臂结构设计及起升机构校核计算
- 盖梁穿心钢棒法受力分析计算书
- T∕CAME 27-2021 医院物流传输系统设计与施工规范
- YY∕T 1849-2022 重组胶原蛋白
- 三平寺签诗解全75首上
- (高清版)《预应力筋用锚具、夹具和连接器应用技术规程》JGJ85-2010
- 后张法预应力空心板梁施工方案
- 师德师风年度考核表
- 健康险产说会课件
评论
0/150
提交评论