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框架的了。码农的道路艰辛又漫长,充满了趣味。

  • 17
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 59
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇雨歇_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值