SSH项目实战---图书销售及后台管理系统
Posted 潇潇雨歇_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH项目实战---图书销售及后台管理系统相关的知识,希望对你有一定的参考价值。
1.项目结构
2.配置文件
Spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- spring注解搜寻范围 -->
<context:component-scan base-package="action"/>
<context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/>
<!-- 引用数据库配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -使用c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="$jdbc.driver" />
<property name="jdbcUrl" value="$jdbc.url" />
<property name="user" value="$jdbc.username" />
<property name="password" value="$jdbc.password" />
<!-- c3p0连接池参数配置 -->
<property name="initialPoolSize" value="$c3p0.initialPoolSize" /><!-- 初始化连接数 -->
<property name="minPoolSize" value="$c3p0.minPoolSize" /><!-- 最小连接数 -->
<property name="maxPoolSize" value="$c3p0.maxPoolSize" /><!-- 连接池中保留的最大连接数 Default: 15 -->
<property name="maxIdleTime" value="$c3p0.maxIdleTime" /><!-- 连接的过期时间(秒)(<mysql 28800) Default: 0 -->
<property name="idleConnectionTestPeriod" value="$c3p0.idleConnectionTestPeriod" /><!-- 检查连接池里的空闲连接(秒)(<mysql 28800) Default: 0 -->
</bean>
<!-- 配置hibernate - sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 实体类所在的包 对包中每个类进行注解扫描 省去逐一配置-->
<property name="packagesToScan">
<list><value>model</value></list>
</property>
<!-- 配置Hibernate属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">$hibernate.dialect</prop><!-- 数据库方言 -->
<prop key="hibernate.show_sql">$hibernate.show_sql</prop><!-- 打印sql语句 -->
<prop key="hibernate.format_sql">$hibernate.format_sql</prop><!-- 是否格式化sql -->
</props>
</property>
</bean>
<!-- 配置hibernate事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 使用注解-注册事务管理类或方法 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
jdbc.properties(数据库连接池配置文件)
########################################
######## database configuration #######
#######################################
##\\u6570\\u636E\\u5E93\\u9A71\\u52A8
jdbc.driver=com.mysql.jdbc.Driver
##\\u8FDE\\u63A5\\u5B57\\u7B26\\u4E32
jdbc.url=jdbc:mysql://localhost:3306/book
##\\u6570\\u636E\\u5E93\\u7528\\u6237\\u540D
jdbc.username=root
##\\u6570\\u636E\\u5E93\\u6570\\u636E\\u5E93\\u5BC6\\u7801
jdbc.password=123456
########################################
######## c3p0 configuration #######
#######################################
##\\u521D\\u59CB\\u5316\\u8FDE\\u63A5\\u6570 Default: 3
c3p0.initialPoolSize=3
##\\u6700\\u5C0F\\u8FDE\\u63A5\\u6570
c3p0.minPoolSize=2
##\\u8FDE\\u63A5\\u6C60\\u4E2D\\u4FDD\\u7559\\u7684\\u6700\\u5927\\u8FDE\\u63A5\\u6570 Default: 15
c3p0.maxPoolSize=10
##\\u8FDE\\u63A5\\u7684\\u8FC7\\u671F\\u65F6\\u95F4(\\u79D2), (<mysql 28800) Default: 0-\\u6C38\\u4E0D\\u4E22\\u5F03
c3p0.maxIdleTime=28000
##\\u9694\\u591A\\u5C11\\u79D2\\u68C0\\u67E5\\u6240\\u6709\\u8FDE\\u63A5\\u6C60\\u4E2D\\u7684\\u7A7A\\u95F2\\u8FDE\\u63A5, (<mysql 28800) Default: 0-\\u4E0D\\u68C0\\u67E5
c3p0.idleConnectionTestPeriod=3600
########################################
######## hibernate configuration #######
#######################################
##\\u6570\\u636E\\u5E93\\u65B9\\u8A00
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#hibernate.dialect=org.hibernate.dialect.SQLServerDialect
#hibernate.dialect=org.hibernate.dialect.OracleDialect
##\\u662F\\u5426\\u6253\\u5370sql\\u8BED\\u53E5
hibernate.show_sql=true
##\\u662F\\u5426\\u683C\\u5F0F\\u5316sql\\u8BED\\u53E5(\\u5206\\u884C\\u663E\\u793A)
hibernate.format_sql=false
##session\\u6BCF\\u6B21\\u4ECE\\u6570\\u636E\\u5E93\\u4E2D\\u8BFB\\u53D6\\u6570\\u636E\\u6570\\u91CF
#hibernate.jdbc.fetch_size=10
##\\u6BCF\\u6B21\\u6279\\u91CF\\u5904\\u7406\\u63D2\\u5165\\u6216\\u66F4\\u65B0\\u7684\\u6570\\u91CF
#hibernate.jdbc.batch_size=10
##\\u662F\\u5426\\u4F7F\\u7528JDBC\\u53EF\\u6EDA\\u52A8\\u7684\\u7ED3\\u679C\\u96C6, \\u5BF9\\u5206\\u9875\\u6709\\u5E2E\\u52A9
#hibernate.jdbc.use_scrollable_resultset=true
##create\\uFF1A\\u8868\\u793A\\u542F\\u52A8\\u7684\\u65F6\\u5019\\u5148drop\\uFF0C\\u518Dcreate
##create-drop: \\u4E5F\\u8868\\u793A\\u521B\\u5EFA\\uFF0C\\u53EA\\u4E0D\\u8FC7\\u518D\\u7CFB\\u7EDF\\u5173\\u95ED\\u524D\\u6267\\u884C\\u4E00\\u4E0Bdrop
##update: \\u8FD9\\u4E2A\\u64CD\\u4F5C\\u542F\\u52A8\\u7684\\u65F6\\u5019\\u4F1A\\u53BB\\u68C0\\u67E5schema\\u662F\\u5426\\u4E00\\u81F4\\uFF0C\\u5982\\u679C\\u4E0D\\u4E00\\u81F4\\u4F1A\\u505Ascheme\\u66F4\\u65B0
##validate: \\u542F\\u52A8\\u65F6\\u9A8C\\u8BC1\\u73B0\\u6709schema\\u4E0E\\u4F60\\u914D\\u7F6E\\u7684hibernate\\u662F\\u5426\\u4E00\\u81F4\\uFF0C\\u5982\\u679C\\u4E0D\\u4E00\\u81F4\\u5C31\\u629B\\u51FA\\u5F02\\u5E38\\uFF0C\\u5E76\\u4E0D\\u505A\\u66F4\\u65B0
#hibernate.hbm2ddl.auto=validate
##\\u8FDE\\u63A5\\u6570\\u636E\\u5E93\\u65F6\\u662F\\u5426\\u4F7F\\u7528Unicode\\u7F16\\u7801
#hibernate.connection.useUnicode=true
##\\u8FDE\\u63A5\\u6570\\u636E\\u5E93\\u65F6\\u6570\\u636E\\u7684\\u4F20\\u8F93\\u5B57\\u7B26\\u96C6\\u7F16\\u7801\\u65B9\\u5F0F
#hibernate.connection.characterEncoding=utf8
Struts.xml(注:这里的许多action都采用注解的方式进行配置,所以极大简化了xml文件的内容)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->
<constant name="struts.action.extension" value="action,do" />
<!-- 当struts.xml改动后,是否重新加载。默认值为false,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 是否使用struts的开发模式。开发模式会有更多的调试信息 -->
<constant name="struts.devMode" value="false" />
<!-- 设置浏览器是否缓存静态内容。默认值为true,开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 是否开启动态方法调用 - 允许使用! 匹配请求 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring" /> -->
</struts>
3.部分代码(项目代码比较庞大,就发一部分即可这里以用户操作为例)
UserAction.java
package action;
import javax.annotation.Resource;
import model.User;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import service.UserService;
@Action("user")
@Namespace("/book")
@Results(
@Result(name="login",location="/book/login.jsp"),
@Result(name="register",location="/book/register.jsp"),
@Result(name="index",location="index.action",type="redirect"),
)
public class UserAction extends BaseAction
private static final long serialVersionUID = 1L;
private User user;
@Resource
private UserService userService;
/**
* 注册用户
* @return
*/
public String register()
if (user.getUsername().isEmpty())
addActionMessage("用户名不能为空!");
return "register";
else if (userService.isExist(user.getUsername()))
addActionMessage("用户名已存在!");
return "register";
else
userService.add(user);
addActionMessage("注册成功, 请登录!");
return "login";
/**
* 用户登录
* @return
* @throws Exception
*/
public String login()
if(userService.checkUser(user.getUsername(), user.getPassword()))
getSession().put("username", user.getUsername());
return "index";
else
addActionMessage("用户名或密码错误!");
return "login";
/**
* 注销登录
* @return
*/
public String logout()
getSession().remove("username");
getSession().remove("indent");
return "login";
public User getUser()
return user;
public void setUser(User user)
this.user = user;
UserDao.java
package dao;
import java.util.List;
import model.User;
import org.springframework.stereotype.Repository;
@Repository // 注册dao层bean等同于@Component
public class UserDao extends BaseDao
/**
* 通过用户名查找用户
* @return 无记录返回null
*/
public User getByUsername(String username)
return (User) getSession().createQuery("from User where username=:username")
.setString("username", username).uniqueResult(); // HQL语句方式
/**
* 通过用户名和密码查找
* @param username
* @param password
* @return 无记录返回null
*/
public User getByUsernameAndPassword(String username, String password)
return (User)getSession().createSQLQuery("select * from user where username=? and password=?")
.addEntity(User.class).setString(0, username).setString(1, password).uniqueResult(); // SQL语句方式
/**
* 获取列表
* @param page
* @param rows
* @return 无记录返回空集合
*/
@SuppressWarnings("unchecked")
public List<User> getList(int page, int rows)
return getSession().createQuery("from User").setFirstResult(rows*(page-1)).setMaxResults(rows).list();
/**
* 总数
* @return
*/
public long getTotal()
return (long) getSession().createQuery("select count(*) from User").uniqueResult();
User.java
package model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity // 注解为hibernate实体 对应数据库中user表
public class User
@Id // 注解主键
@GeneratedValue //id生成策略 默认auto 相当于hibernate的native - 自增字段
private int id;
private String username;
private String password;
private String address;
private String phone;
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getUsername()
return username;
public void setUsername(String username)
this.username = username;
public String getPassword()
return password;
public void setPassword(String password)
this.password = password;
public String getAddress()
return address;
public void setAddress(String address)
this.address = address;
public String getPhone()
return phone;
public void setPhone(String phone)
this.phone = phone;
UserService.java
package service;
import java.util.List;
import javax.annotation.Resource;
import model.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import util.SafeUtil;
import dao.UserDao;
@Service // 注解为service层spring管理bean
@Transactional // 注解此类所有方法加入spring事务, 具体设置默认
public class UserService
@Resource //spring注入类对象
private UserDao userDao;
/**
* 验证用户密码
* @param username
* @param password
* @return
*/
public boolean checkUser(String username, String password)
return userDao.getByUsernameAndPassword(username, SafeUtil.encode(password)) != null;
/**
* 用户是否存在
* @param username
* @return
*/
public boolean isExist(String username)
return userDao.getByUsername(username) != null;
/**
* 添加
* @param user
* @return
*/
public boolean add(User user)
user.setPassword(SafeUtil.encode(user.getPassword()));
return userDao.save(user) > 0;
/**
* 通过id获取
* @param userid
* @return
*/
public User get(int userid)
return userDao.get(User.class, userid);
/**
* 通过username获取
* @param username
* @return
*/
public User get(String username)
return userDao.getByUsername(username);
/**
* 列表
* @param page
* @param rows
* @return
*/
public List<User> getList(int page, int rows)
return userDao.getList(page, rows);
/**
* 总数
* @return
*/
public long getTotal()
return userDao.getTotal();
/**
* 更新
* @param user
*/
public boolean update(User user)
return userDao.update(user);
/**
* 删除
* @param user
*/
public boolean delete(int id)
User user = new User();
user.setId(id);
return userDao.delete(user);
从上代码可以看出,用SSH框架架构的项目层次比较分明,逻辑清晰,代码比较简洁,可读性好
4.截图:
(1)客户端用户界面
图4.1.1 书店首页
图4.1.2 书店简介
图4.1.3 精品推荐
图4.1.4 最新出版
图4.1.5 优惠促销
图4.1.6 用户注册
图4.1.7 用户登录
图4.1.8 用户登录后页面
(2)后台管理界面
图4.2.1 后台管理首页
图4.2.2 后台管理登录页面
图4.2.3 订单管理
图4.2.4 顾客管理
图4.2.5 图书管理
图4.2.6 类目管理
图4.2.7 用户管理
总结: 参考别人的代码,一步一步地自己写出了这个项目,中间Bug很多,改了两天,幸好有大神指点,才得以如此顺利。以后还得多做项目,多多积累经验。SSH完成了一个,接下来就是SSM框架的了。码农的道路艰辛又漫长,充满了趣味。
以上是关于SSH项目实战---图书销售及后台管理系统的主要内容,如果未能解决你的问题,请参考以下文章
SSH网上商城项目实战29使用JsChart技术在后台显示商品销售报表
Java全栈web网页技术:15.书城项目实战四:管理端图书的增删改查(后台)
Java全栈web网页技术:15.书城项目实战四:管理端图书的增删改查(后台)