struts2+hibernate项目实战:图书管理系统-研发项目管理

>>struts2+hibernate项目实战:图书管理系统-研发项目管理

struts2+hibernate项目实战:图书管理系统-研发项目管理

引言:当今社会市场竞争激烈,软件开发企业想要占据前列需要在研发管理上下功夫,“向管理要效益”已经成为软件开发企业的共识,研发项目管理在软件企业中的普及也是大势所趋。国内做软件项目管理工具的开发商翼发云近几年发展十分迅速,越来越多的软件开发企业认识到研发项目管理的重要性,能切实有效降低成本,规范软件开发流程,提高软件产品质量。国内研发项目管理系统、敏捷开发管理工具的领导品牌翼发云敏捷项目管理系统采用可视化业务流程技术,支持瀑布模型等传统软件研发项目管理,同时也支持scrum等敏捷开发流程,是理想的敏捷开发管理工具,涵盖软件项目管理工作的整个生命周期。为提高国内软件开发企业的项目管理水平,分享一篇企业管理相关的知识文章。

经典项目,练手必备。

  • 图书管理系统

    需求分析(大致,并不专业):1.需要有用户管理; scrum

                    1.1 用户注册;

                    1.2 用户登录; 软件项目管理

                    1.3 用户信息修改;

                    1.4 用户修改密码; 敏捷开发流程

                  2.需要有书本管理;

                    2.1 添加书籍; 研发项目管理

                    2.2 借出书籍;

                    2.3 归还书籍;

                    2.4 修改/更新书籍信息;

                  3.需要权限管理;

                    3.1 普通用户与管理员的区别;

                    3.2 拥有不同权限可浏览不同的页面;

    实现技术:1.struts2表现层框架;

         2.hibernate持久层框架;

         3.tomcat web容器;

         4.c3p0数据库连接池;

         5.msql数据库;

         6.jquery开源包;

         7.ajax技术;

         8.css/html页面设计。

  • 准备阶段

配置:配置Struts2、Hibernate环境环境,匹配的Tomcat服务器和安装MySQL服务器。

表设计:为这个项目设计了四个表:用户、图书、借阅、描述

struts2+hibernate 项目实战:图书管理系统

系统总体设计:

struts2+hibernate 项目实战:图书管理系统

页面设计:

struts2+hibernate 项目实战:图书管理系统

  • 实现

使用MVC设计模式,页面请求操作,动作打开服务服务,服务调用DAO操作数据库。最后,结果返回到要呈现的页面。

struts2+hibernate 项目实战:图书管理系统

小贴士:1。连接池由监听器启动,因为它最早开始,而Spring使用监听器初始化bean工厂;

用于进行权限控制;

3.action实现模型驱动的接口,需要形成新的类的映射;

4。生意更无聊,逻辑也一样,所以我只选择了一半;

页图:

index.jsp

struts2+hibernate 项目实战:图书管理系统

register.jsp

struts2+hibernate 项目实战:图书管理系统

findpassword.jsp

struts2+hibernate 项目实战:图书管理系统

消息页,统一样式

struts2+hibernate 项目实战:图书管理系统

    main.jsp

struts2+hibernate 项目实战:图书管理系统

    userBook.jsp

struts2+hibernate 项目实战:图书管理系统

     就实现了这些功能,写业务比算法无聊很多,所以大致掌握了就行了,反正练手。

  • 技术说明

页延迟秒跳

功能delayurl /自动跳转轮(URL,时间){ setTimeout(“顶。位置。href =”+“”+“URL,时间);}

      在html中加入

<script type=“text/javascript”>delayurl(“findpasswd .jsp”,3000);<script&gt /;

    始化请求

加载页面后,请求服务器接受初始化数据并生成表单。

/ / –当前页面初始化请求和页面初始化列表$(文件)。Ready(功能(pagerrequest){(currentpage)};);

      使用数据生成表格。

/ / put the data in the page of function putOnTable (list) {var table = $(‘#content’); $(“#content (tr:not: first) (.Remove)”); for (VaR K in list) {var tr = $(“< tr> < /tr> tr.appendTo (table”); VaR; book) = new (Object); VAR TD; book.bookid = list[k][‘bookid’]; book.bookname = list[k][‘bookname’]; book.authorname = list[k][‘authorname’]; book.publisher = list[k][‘publisher’]; book.pub_date = list[k][‘pub_date’]; td = $(“& lt; td>” + book.bookid + “< /td>”); td.appendTo (TR); td = $(< td> “+ book.bookname +” < /td> “); td.appendTo (TR); td = $(” < td> “+ book.authorname +” < /td>” ); td.appendTo(tr); td = $(“<td>” + book.publisher + “</td>”); td.appendTo(tr);TD = $(“&lt;TD &gt;“+ book.pub_date +”& lt;/ TD &gt;”);TD。appendto(TR);TD = $(“&lt;TD &gt;&lt;按钮ID =按钮“+ book.bookid +“&gt;借书& lt;/按钮& gt;| &lt;按钮值=“&gt;查看详情& lt;/按钮& gt;”);TD。appendto(TR);AddEvent(’btn +书。bookid,书。bookid);/ /此处添加事件} }

    分页查询

点击按钮发送Ajax请求/功能pagerrequest(需要){ $。后(“寻呼机”,需要“=”+需要(结果,功能){大小=结果[ ‘size ];数=结果[计数];书目=结果[ ‘booklist ]美元(’ #电流;“)。文本(currentpage);var N1;var n2;N1 =计数/ N2 =尺寸;计数%大小;N1 = math.floor(N1);书页数= N1;如果(N2!= = 0)书页数=书页数+ 1;(“总”#美元)。正文(四);putontable(书目);} });
和LT;!——分页查询行动——&gt;&lt;动作名称=“寻呼机”class=“行动。bookpageselectaction”method=“寻呼机”& gt;& lt结果;type=“json”& gt;& lt;!这里指定的属性–将Struts2的序列化,- & gt属性必须在行动上有相应的getter方法;&lt;参数名称=“根”&gt;DataMap & lt;/参数&gt;&lt;/结果&gt;&lt;/行动& gt;
包装的作用;进口java.util.hashmap;进口java.util.list;进口org.apache.struts2.servletactioncontext;进口com.opensymphony.xwork2.actionsupport;进口model.book;进口service.bookservice;公共课bookpageselectaction扩展ActionSupport {私人HashMap &lt;字符串对象&gt;DataMap私人;列表&lt;书& gt;书目;私人尺寸= 10;公共列表&lt;图书gt;获得用户信息列表的存储过程(返回){书目};public void setuserlist(表& lt;书& gt;书目){ } =书目。书目;公共HashMap &lt;字符串对象&gt;getdatamap(返回){ DataMap };public void setdatamap(HashMap &lt;字符串对象& gt;DataMap){ this.datamap =数据映射;/ / Ajax页面请求字符串寻呼机}(新){ DataMap = HashMap &lt;字符串对象gt;(bookservice);寻呼机=新;数= int(bookservice)(寻呼机。getbookcount);字符串req = servletactioncontext.getrequest(GetParameter)(“需要”);整数值=新的整数(REQ)value.intvalue(需要= int;);列表pager.pageselectservice(需要datamap.put(大小);书目,列出);datamap.put(尺寸,大小);datamap.put(计数,计数);返回成功;} }
上市pageselectservice /分页查询(起始,int的大小){会话(session);交易= sfactorygenerator.getsession Tx = session.begintransaction(名单);列表= null;尝试{ = int需要(START-1)*尺寸;列表= bookdao.pageselect(会话,需要大小);} catch(Exception e){ / /待办事项:处理异常tx.rollback(}最后{)(会话关闭);返回列表;} };
公共静态列表& lt /分页查询;书& gt;pageselect(会话的会话,起始,int的大小){字符串HQL =“书”;查询&lt;&gt;查询吗?= session.createquery(HQL);query.setfirstresult(开始);/ /的query.setmaxresults指数(大小);//把几个列表= query.list(名单)返回列表;};

    删除所有表条目,只保留表的顶部

$(“#内容翻译:不(:一)”)删除();

    结合事件

$(“# + btnid)。Bind(“点击”),功能({ });

    添加通知栏

他人的车轮

/ / add notification box function pop_init (title, content) {/ / take the current browser window size var windowWidth=document.body.clientWidth; VAR windowHeight=document.body.clientHeight; / / Pop size var weight=250; VAR height=132; $(“body”).Append (“< div id=’pop_div’style=’display:none; position:absolute border:1px; solid #e0e0e0; z-index:99; width:” +weight+ “PX height:;” +height+ “PX; top:” + + “(windowHeight-height-132) PX; left: (windowWidth-weight)” + + “px’>” + “< div style=’line-height:32px; background:#F4A460 border-bottom:1px; solid #e0e0e0; font-size:14px padding:0 00; 10px;’>” + “&lt div; style=’flOAt:left;’> < b> +title+ < /b> < /div> < div style=’flOAt:right; cur Sor:pointer;’> < B(onclick= ‘pop_close)“& gt * & lt;/ B & gt;& lt;/ DIV &gt;&lt;div;“+”风格= ‘清:“&gt;&lt;/ DIV &gt;&lt;/ DIV &gt;”+“”+“&lt;div ID = ‘content’style =背景:# eed8ae;身高:100px;“&gt;&lt;/ DIV &gt“内容+ +“”+“;&lt;/ DIV &gt;功能(pop_close”);}){ $(’ # pop_div”FadeOut)。(400);}

    前端结帐

      非空校验,长度校验,用户名是否存在校验等等

As a registered check and Ajax / * * * * / / / server check non empty check check function verificationUsername (length) {var data = $(‘#username’) (.Val); if (data.length = 0) {$(‘#registerErrorMsg1’).Text (“user name cannot be empty”); return false;} else if (data.length < 3 || data.length> 12) {$(‘#registerErrorMsg1’).Text (“length in 3-12”); return false;} return true;} / / passwordVer1 = false password checking var VaR; passwordVer2 = false; function (verificationPassword) {var data = $(‘#password’).Val (VaR); again = $(‘#password1′(.Val)); if (data.length = 0) {$(‘#registerErrorMsg2’).Text (“password can not be empty”); else (d if return;} Ata.length &lt ||; 6 data.length> 20) {$(‘#registerErrorMsg2’).Text (“length in 6-20”); return passwordVer1;} = true;} function (ServerVerification) //ajax check {var data = $(‘#username’) (.Val); $.get (“userExist”, “username=” (+data, function result) {if (result = true) {$(‘#registerErrorMsg1’).Text (“username already exists”); return false;} else {$(‘#registerErrorMsg1’).Text (“the user can register”); return true;}});} / / check username $(document).Ready (function () {$(‘#username’).Blur (function () {if (verificationUsername) (ServerVerification) ();});}); (document).Ready ($ (function) {$(‘#username’).Focus (function () {$(‘#registerErrorMsg1’) (“.Text”);});}); / / password check of $(document).Ready (function () {$(‘#password’).Blur ((function));} ({verificationPassword}); $); (document).Ready (function () {$(‘#pas剑)。焦点(函数(){ $(’ # registererrormsg2 ‘)(“文本”);});});//两输入密码检查$(document)。Ready(function(){ $(’ # password1”)。Blur(function(){ if($(“# password1”)(。Val)!= = $(“#密码”)(瓦迩)){ $(’ # registererrormsg2”)。文本(“密码”);返回;}别人{ $(’ # registererrormsg2”)。文本(“”);} } passwordver2 = true;);});/ /提交需要验证$(文档(准备)(功能){ $(“# registerform”)(。提交(功能){ verificationpassword();console.log(“—– 3 ——”);如果(verificationusername)(&amp;passwordver1 &amp;&amp;&amp;passwordver2){ return真的;}否则返回false;});});

    找书

      使用hql的都是这样写,被划了横线了好像是过期方法

公共静态的书findbyname /书(会话的会话,字符串名称){字符串HQL =书=文本图书名?”查询和查询;= session.createquery(HQL);query.setparameter(0名);列表query.list(书);书= null;如果(list.size()!= 0)=书(书)list.get(0);还书;}

    使用计数计算条目

公共静态/ getbookcount int数(Session)的书“选择HQL = {串数(*)从书;查询&lt;&gt;查询吗?= session.createquery(HQL);返回((数))(查询。UniqueResult)(。intvalue);}

    自定义类联合查询

      不会join,用的where and。新建一个类不需要添加mapping也能封装成object。

得到一个公共静态列表库/ user_booklist(会话的会话,int userid){字符串HQL =“选择新的model.user_book(b.bookid,b.bookname,b.publisher,博。日期)从B书,借博,bo.user_id =,= b.bookid bo.book_id?”;查询查询= session.createquery(HQL);query.setparameter(0用户);列表(查询表);如果(列表。大小)返回(空= = 0);返回列表;}

    请求

请求的属性和参数是两件事。参数是请求后面的参数。属性类似于存储在请求范围内的会话属性。

标准收购的形式是

得到/请求响应请求= servletactioncontext.getrequest(消息);HttpServletResponse(反应= servletactioncontext。GetResponse);
  • 总结

一个人很容易觉得写之前不写,写后很简单。但是写作的过程还没有被理解,所以项目还是要做,或者不知道如何使用演示。因为S和H框架很少使用,所以他们不关注于编写项目。关键是如何构建Web站点的大部分功能,这与框架和数据库的功能相同。自己做一个小项目会增长很多。代码也应该总结。例如,当你只写CSS时,你会觉得你写的功能越来越多,因为你不攻击前端,所以让它变成一个烂鸡蛋。

动作配置对我来说很方便。相反,它是注释开发。它似乎不能同时读取所有控制器。然而,行动过于干预,所以它过时了。Hibernate使用后,我觉得有优点也有缺点,我还是喜欢JDBC的感觉。然后是时候仔细写Spring项目了。

    

    

文章从互联网整理而来,旨在传播scrum、软件项目管理、研发项目管理、敏捷开发管理工具的知识与应用,帮助软件开发企业真正了解研发项目管理的价值和意义,如果本文侵犯了您的权益或者您需要具体了解更多国内做研发项目管理系统的公司翼发云敏捷项目管理系统的相关信息,欢迎和我们联络:

【网址】www.effapp.com

2018-02-24T07:31:23+08:002018-02-24 07:31:23|Categories: scrum项目管理|