struts2+hibernate 项目实战:图书管理系统
经典项目,练手必备。
- 图书管理系统
需求分析(大致,并不专业):1.需要有用户管理;
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服务器;
表设计:本项目设计四张表:user,book,borrow,description
系统总体设计:
页面设计:
- 实现
采用mvc的设计模式,页面请求到action,action开启服务service,service调用dao来操作数据库。最后将结果返回到页面上呈现。
tips:1.连接池使用listener启动,因为它启动得最早,而且spring也是使用listener来初始化bean工厂;
2.filter用来做权限控制;
3.action实现modeldriven接口,需要新建一些映射表单的类;
4.业务写多了会无聊,并且逻辑都一样,所以我选择只实现了一半;
页面图:
index.jsp
register.jsp
findpassword.jsp
message页面,统一样式
main.jsp
userBook.jsp
就实现了这些功能,写业务比算法无聊很多,所以大致掌握了就行了,反正练手。
- 技术笔记
页面延迟n秒跳转
//自动跳转的轮子
function delayURL(url, time) {
setTimeout("top.location.href='" + url + "'", time);
}
在html中加入
<script type="text/javascript">
delayURL("findPasswd.jsp", 3000);
</script>
初始化请求
在页面载入成功后请求服务器拿初始化数据,并生成表格。
//初始化请求--将当前页和总页面初始化 和 list
$(document).ready(function(){
pagerRequest(currentPage);
});
使用数据生成表格。
//将数据放在页面上
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 = $("<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 = $("<td>" + book.pub_date + "</td>");
td.appendTo(tr);
td = $("<td><button id=btn"+book.bookid +">借书</button>|<button value=''>查看详情</button>");
td.appendTo(tr);
addEvent('btn'+book.bookid,book.bookid);//此处添加事件 } }
分页查询
//点击按钮发送ajax请求
function pagerRequest(need) {
$.post("pager", "need=" + need , function(result) { size = result['size'];
count = result['count'];
booklist = result['booklist'];
$('#current').text(currentPage);
var n1;
var n2;
n1 = count / size;
n2 = count % size;
n1 = Math.floor(n1);
pageNumber = n1; if (n2 !== 0)
pageNumber = pageNumber + 1; $('#total').text(pageNumber);
putOnTable(booklist);
});
}
<!-- 分页查询动作-->
<action name="pager" class="Action.BookPageSelectAction" method="Pager">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
<param name="root">dataMap</param>
</result>
</action>
package Action; import java.util.HashMap;
import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import Model.book;
import Service.bookService; public class BookPageSelectAction extends ActionSupport{
private HashMap<String,Object> dataMap;
private List<book> bookList;
private int size=10;
public List<book> getUserList() {
return bookList;
}
public void setUserList(List<book> bookList) {
this.bookList = bookList;
}
public HashMap<String, Object> getDataMap() {
return dataMap;
} public void setDataMap(HashMap<String, Object> dataMap) {
this.dataMap = dataMap;
}
//ajax请求页
public String Pager(){
dataMap = new HashMap<String,Object>();
bookService pager = new bookService();
int count = pager.getBookCount();
String req = ServletActionContext.getRequest().getParameter("need");
Integer value = new Integer(req);
int need = value.intValue();
List list = pager.pageSelectService(need, size);
dataMap.put("booklist",list);
dataMap.put("size", size);
dataMap.put("count", count);
return SUCCESS;
} }
//分页查询
public List pageSelectService(int start,int size){
Session session = SFactoryGenerator.getSession();
Transaction tx = session.beginTransaction();
List list = null;
try{
int need = (start-1)*size;
list = bookDAO.pageSelect(session,need, size);
}catch (Exception e) {
// TODO: handle exception
tx.rollback();
}finally{
session.close();
}
return list;
}
//分页查询
public static List<book> pageSelect(Session session,int start,int size){
String hql = "from book";
Query<?> query = session.createQuery(hql);
query.setFirstResult(start);//开始索引
query.setMaxResults(size);//取几条
List list = query.list();
return list;
}
删除所有表格条目,只留下表头
$("#content tr:not(:first)").remove();
绑定事件
$('#'+btnid).bind("click",function(){});
添加通知栏
别人的轮子
//添加通知框
function pop_init(title,content) {
//取当前浏览器窗口大小
var windowWidth=document.body.clientWidth;
var windowHeight=document.body.clientHeight;
//弹窗的大小
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 0 0 10px;'>" +
"<div style='float:left;'><b>"+title+"</b></div><div style='float:right;cursor:pointer;'><b onclick='pop_close()'>×</b></div>" +
"<div style='clear:both'></div>"+
"</div>" +
"<div id='content' style='background:#EED8AE;height:100px;'>" +
content+
"</div>"+
"</div>"
);
}
function pop_close(){
$('#pop_div').fadeOut(400);
}
前端校验
非空校验,长度校验,用户名是否存在校验等等
/**
* 用作注册校验以及ajax服务端校验
*/
//非空校验 长度校验
function verificationUsername(){
var data = $('#username').val();
if(data.length === 0)
{
$('#registerErrorMsg1').text("用户名不能为空");
return false;
}
else if(data.length <3 || data.length>12)
{
$('#registerErrorMsg1').text("长度需要在3-12位");
return false;
}
return true;
}
//密码校验
var passwordVer1 = false;
var passwordVer2 = false;
function verificationPassword(){
var data = $('#password').val();
var again = $('#password1').val();
if(data.length === 0)
{
$('#registerErrorMsg2').text("密码不能为空");
return ;
}
else if(data.length <6 || data.length>20)
{
$('#registerErrorMsg2').text("长度需要在6-20位");
return ;
}
passwordVer1 = true;
}
//ajax校验
function ServerVerification(){
var data = $('#username').val();
$.get("userExist","username="+data,function(result){
if(result === "true"){
$('#registerErrorMsg1').text("用户名已存在");
return false;
}
else
{
$('#registerErrorMsg1').text("此用户名可以注册");
return true;
}
});
}
//用户名校验
$(document).ready(function(){
$('#username').blur(function(){
if(verificationUsername())
ServerVerification();
});
});
$(document).ready(function(){
$('#username').focus(function(){
$('#registerErrorMsg1').text("");
});
});
//密码校验
$(document).ready(function(){
$('#password').blur(function(){
verificationPassword();
});
});
$(document).ready(function(){
$('#password').focus(function(){
$('#registerErrorMsg2').text("");
});
});
//两次输入密码校验
$(document).ready(function(){
$('#password1').blur(function(){
if($('#password1').val() !== $('#password').val())
{
$('#registerErrorMsg2').text("密码输入不一致");
return ;
}else
{
$('#registerErrorMsg2').text("");
passwordVer2 = true;
}
});
}); //提交时候需要验证
$(document).ready(function(){
$("#registerform").submit(function(){
verificationPassword();
console.log("-----3------");
if(verificationUsername() && passwordVer1 && passwordVer2)
{
return true;
}else
return false;
});
});
查找书本
使用hql的都是这样写,被划了横线了好像是过期方法
//查找书本
public static book findByName(Session session,String name){
String hql = "from book where bookname = ?";
Query<?> query = session.createQuery(hql);
query.setParameter(0, name);
List list = query.list();
book book = null;
if(list.size() != 0)
book =(book) list.get(0);
return book;
}
使用count计算条目
//获取书本的条数
public static int getBookCount(Session session){
String hql="SELECT COUNT(*) FROM book";
Query<?> query = session.createQuery(hql);
return ((Number)query.uniqueResult()).intValue();
}
自定类联合查询
不会join,用的where and。新建一个类不需要添加mapping也能封装成object。
//获取借书列表
public static List user_bookList(Session session,int userid){
String hql = "select new Model.user_book(b.bookid,b.bookname,b.publisher,bo.date) from book b,borrow bo where bo.user_id = ? and bo.book_id = b.bookid";
Query query =session.createQuery(hql);
query.setParameter(0, userid);
List list = query.list();
if(list.size() == 0)
return null;
return list;
}
request
request的attribute和parameter是两个东西,已parameter是跟在请求后面的参数,attribute是类似于session这种存储在request范围内的属性。
标准的获取形式为
//获取请求响应
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
- 总结
个人觉得不写之前很简单,写了之后也很简单。但是写的过程有很多的不懂,所以项目还是要做一下不然抱着demo不知道怎么用。因为s和h框架很少用了,所以不专注于写这个项目了。关键是网站的大部分的功能如何构建,换了框架和数据库一样是这样实现。自己做一做小项目会增长很多的本事。写了代码也要多多总结,比如刚写css的时候就感觉越写越多,很多重复功能,因为不主攻前端,所以让它变成臭鸡蛋吧,这样的感觉。
action的配置我觉得挺方便的,反而是注释开发,好像不能一眼看完所有的controller,然而action太侵入性,所以已经有些过时。hibernate用了之后我觉得各有利弊吧,我还是喜欢jdbc的感觉。接下来就该细致地写spring的项目了。
struts2+hibernate 项目实战:图书管理系统的更多相关文章
- C项目实践--图书管理系统(3)
接下来将要实现用户管理模块的相关功能,用户管理模块的主要功能包括增加用户,查找用户以及保存用户等功能,查找用户时,如果查找成功,充许对查找到用户进行更新或删除操作.如果查找不成功,则给出相应的提示信息 ...
- C项目实践--图书管理系统(1)
1.功能需求分析 图书管理系统主要用于对大量的图书信息,包括书名.作者.出版社.出版日期.ISBN(书号)等进行增.删.改.查以及保存等操作.同时也包括对用户的管理,用户包括管理员和普通用户两种权限, ...
- C项目实践--图书管理系统(2)
前面在<<C项目实践-图书管理系统(1)>>中把系统中的三大功能模块中可能涉及到的常量,结构体及相关函数进行了声明定义,下来就来实现它们. 执行系统首先从登录到系统开始,所以首 ...
- Spring Boot → 11:项目实战-账单管理系统完整版
Spring Boot → 11:项目实战-账单管理系统完整版
- Spring Boot → 06:项目实战-账单管理系统
Spring Boot → 06:项目实战-账单管理系统
- javaWeb项目之图书管理系统(附视频讲解)
视频播放地址:javaWeb图书系统 本系统为"Swing项目之图书管理系统"(此源码已共享)的Web版,网页框架用采用EasyUI 数据库为MysqL,写Web项目摒弃了火狐浏览 ...
- C项目实践--图书管理系统(4)
前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...
- 新建Django项目示例--图书管理系统
知识点: Django 1. 安装 1. Django版本 1.11.xx 2. 安装方式 1. 命令行 --> Python环境(双版本,pip的使用) 2. PyCharm安装 2. 创建D ...
- [ABP项目实战]-后台管理系统-目录
学习ABP也有一段时间了,但是总是学习了后面的忘记了前面的,为了巩固所学到的知识以及记录所学到的东西,因此有了本系列的诞生. ABP ASP.NET Boilerplate Project(ABP.N ...
随机推荐
- 分布式架构中一致性解决方案——Zookeeper集群搭建
当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...
- php应用jquery做ajax操作
以下是全部代码: <html> <head> <title>jQuery Ajax 实例演示</title> </head> <scr ...
- 使用GDB调试程序
GDB(GNU Debuger)是Linux中的一个功能强大的调试器.GDB可以让你查看程序的内部结构,打印变量值,设置断点,单步调试源码,运行时修改变量值,路径跟踪,线程切换,显示汇编代码等. 编译 ...
- Ubuntu安装Svn,提供http访问
安装相关package sudo apt-get install subversion subversion-tools apache2 libapache2-svn apache2-utils 创建 ...
- [Django]Django1.8修改MySQL已存在表的问题?
前言:django1.8版本出现这种问题,关于标题不好命令,直接看正文问题描述! 问题描述: 在已经生成了models.py中表的情况下,更改了modes.py中的表,但是syncdb不起作用报错.于 ...
- java设计模式之策略模式
策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图 策略模式代码 古代的各种计谋都是一种策略,这次我们 ...
- Tomjson - 一个"短小精悍"的 json 解析库
Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...
- ORACLE数据库存储空间使用情况查询
使用系统sys或者dba权限的账户创建视图如下: 1. 主要从数据库的表dba_data_files,dba_segments两张表中获取.2. 默认数据库保存的是byte单位,转换关系如下: 102 ...
- IIS7.5使用web.config设置伪静态的二种方法(转)
近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两种方法各有优势:第一种比较灵活,只要把文件拷到根目录下,即可直接显示所有伪静态页面(适用于 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 区域管理功能增强(电子商务方向)
由于公司是面向全国服务的.全国各地都有分公司,需要管理到覆盖全国的各种业务,各种业务系统信息系统的数据都需要规范化. 公司开展网络订单功能,在全国范围内实现网络下单.提高工作效率,提高各公司之间的数据 ...