SSM项目实战(SSM商城 Maven项目 商品、评论、回复)

前言

SSM框架(spring+springMVC+mybatis),是目前比较主流的Java EE企业级框架,适用于搭建各类大型的企业级应用系统。 该SSM整合开发项目,先后花了十几天完成,一路入坑不断,差点从入坑到放弃,最后总算成功完成了。面对各类bug,心态很重要,要有毅力,跟bug刚着刚着就解决了。下面是该项目的介绍,但愿你们多多支持,若有不妥之处,望你们斧正。css

主要功能

功能具体实现见项目源代码前端

  • 防盗链功能(经过过滤器拦截请求实现)
  • 用户登陆、注册(登陆、注册表单校验)
  • 用户我的信息管理(我的中心,能够修改我的信息,查看全部评论,删除评论)
  • 对商品进行模糊查询
  • 对商品进行了简单的分类,能够经过左侧导航条获取分类商品数据。
  • 管理员对商品进行增删改查操做
  • 用户对商品进行评论以及查看商品全部评论
  • 用户回复评论、查看评论的全部回复。

开发环境

软件 版本
JDK 1.8
Tomcat 8.5.55
开发工具 Eclipse 4.6.3
数据库 MySQL

数据库设计

  • E-R图
    在这里插入图片描述
  • 各表介绍
    user表:存放用户信息,userRole用户角色(分为管理员和普通用户),userImage用户头像。
    product表:存放商品信息。
    message表:存放对商品的评论信息。
    revert表:存放评论的回复信息。
  • 数据库建立脚本
create table product(
productID int(8) auto_increment comment '商品ID' primary key,
productName varchar(20) comment '名称',
productBrand varchar(20) comment '品牌',
productModel varchar(20) comment '型号',
productPrice decimal(10,2) comment '价格',
productImage varchar(30) comment '图片',
productDes varchar(100) comment '商品描述'
);

create table message(
messageID int(8) auto_increment comment '留言ID' primary key,
messageContent varchar(300) comment '内容',
writeDate DateTime comment '发布时间',
count int comment '回复数' ,
productID int(8)  comment '商品ID' ,
userID char(10) comment '留言人'
);

create table revert(
revertID int(8) auo_increment comment '回复ID' primary key,
revertContent varchar(300) comment '内容',
writeDate datetime comment '发布时间',
messageID int(8) comment '留言ID',
uesrID char(10) comment '留言人'
);

create table user(
userID char(10) comment '用户ID' primary key,
userName char(50) comment '用户名',
userPassword char(10) comment '密码',
userImage varchar(50) comment '头像',
userRole int(8) comment '用户角色'
);

项目架构

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 持久层:该层由若干持久化类(实体类)组成。
  • 数据访问层(DAO层):该层由若干DAO接口和MyBatis映射文件组成。
  • 业务逻辑层(Service层):该层由若干Service接口和实现类(Impl)组成;
  • Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。
  • Controller的实现类的任务:接收请求,接收参数,验证参数,处理请求封装参数,调 用业务方法,返回处理结果数据。

层次结构图
在这里插入图片描述java

项目技术介绍

  • 逆向工程:根据数据库中的表生成对应的实体类,mapper映射文件,接口。
  • 文件上传:商品图片、用户头像上传至服务器。sringMVC文件上传
  • Mybatis PageHelp插件:处理商品、评论、回复的分页。
  • JQuery:事件处理,发送Ajax请求动态获取数据、完成表单的校验等。
  • Bootstrap:使用bootstrap框架快速完成前端的开发。

运行效果展现

登陆界面(经过发送Ajax请求实现用户ID和密码的校验)
在这里插入图片描述
注册界面(对用户ID是否能够用、用户名是否为空、密码是否为空进行校验)
在这里插入图片描述
商品首页(点击左侧导航条可获取商品分类数据,经过搜索框模糊查询商品)
在这里插入图片描述mysql

商品详情界面(用户能够查看商品的评论、发表评论,也能够经过搜索框查询商品)
在这里插入图片描述
评论详情界面(能够查看评论的全部回复,也能够回答评论)在这里插入图片描述
我的中心界面(能够查看和删除评论、修改我的信息、回到首页、退出等)
在这里插入图片描述
管理员界面(对商品进行增删改查操做)
在这里插入图片描述
在这里插入图片描述
管理员修改、添加商品(使用bootstrap模态框完成)
在这里插入图片描述
在这里插入图片描述git

配置文件

  • 防盗链功能(web.xml)
<filter>
     <filter-name>loginFilter</filter-name>
     <filter-class>jmu.hkx.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 文件上传(springMVC.xml)
<!--配置文件解析器,处理文件,将客户端上传的File文件,处理为MultipartFile-->
   <bean id ="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置文件解析的编码,注意:必定要和页面的pageEncoding保持一致 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设置最大上传文件大小 -->
        <property name="maxUploadSize" value="999999999"></property>
   </bean>
  • PageHelp插件(mybatis-config.xml)
<!-- mybatis PageHelper插件 -->
<plugins>
	<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
  • 逆向工程(mbg.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

   <context id="DB2Tables" targetRuntime="MyBatis3">
   
    <commentGenerator>
      <property name="suppressAllComments" value="true"></property>
    </commentGenerator>
    
	<!-- 设置链接数据库的信息 -->
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true&amp;allowPublicKeyRetrieval=true"
        userId="root"
        password="******">
        <property name="nullCatalogMeansCurrent" value="true"/>
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

	<!-- javabean的生成策略 -->
    <javaModelGenerator targetPackage="jmu.hkx.vo" targetProject="./src/main/java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>


	<!-- 映射文件的生成策略 -->
    <sqlMapGenerator targetPackage="mapper"  targetProject="./src/main/resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

	<!-- mapper接口的生成策略 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="jmu.hkx.dao"  targetProject="./src/main/java">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

	<!-- 设置要将数据库中的哪张表逆向生成哪个javabean -->
	<table tableName="user" domainObjectName="User"></table>
	<table tableName="product" domainObjectName="Product"></table>
	<table tableName="message" domainObjectName="Message"></table>
	<table tableName="revert" domainObjectName="Revert"></table>
	
  </context>
</generatorConfiguration>

web.xmlgithub

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ssm</display-name>
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
     <filter-name>loginFilter</filter-name>
     <filter-class>jmu.hkx.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  <absolute-ordering/>
</web-app>

applicationContext.xmlweb

<?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:mvc="http://www.springframework.org/schema/mvc"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 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-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 扫描组件 -->
	<context:component-scan base-package="jmu.hkx">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
	</context:component-scan>

	<!-- 引入资源文件 -->
	<context:property-placeholder location="classpath:jdbcConfig.properties" />
	    <!--spring整合MyBatis-->
    <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>



	<!-- 管理mybatis操做数据库的会话对象sqlsession -->
	<bean  id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	   <!-- 设置mybatis核心配置文件的路径 -->
	   <property name="configLocation" value="classpath:mybatis-config.xml"></property>
	   <!-- 设置数据源 -->
	   <property name="dataSource" ref="pooledDataSource"></property>
	   <!-- 设置映射文件路径 -->
	   <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
	</bean>
	<!-- 对应几个接口,就有几个动态代理实现类,并由spring容器管理 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	    <property name="basePackage" value="jmu.hkx.dao"></property>
	</bean>
	
     	<!-- 声明事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="pooledDataSource"></property>
	</bean>

	<!-- 开启事务注解驱动 -->
	<tx:annotation-driven />
    <!--    配置AOP加强-->
    <aop:config>
        <!-- 切入点表达式 -->
        <aop:pointcut expression="execution(* jmu.hkx.service..*(..))" id="txPoint"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
    </aop:config>
    
    <tx:advice id="txAdvice">
         <tx:attributes>
         <!-- 全部切入方法都是事务方法 -->
             <tx:method name="*"/>
             <tx:method name="get*" read-only="true"/>
         </tx:attributes>
    </tx:advice>
</beans>

springmvc.xmlspring

<?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:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 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-4.3.xsd">

      <context:component-scan base-package="jmu.hkx">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <!--这句不加事务不能回滚-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

   <!-- 配置视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

   <!--配置文件解析器,处理文件,将客户端上传的File文件,处理为MultipartFile-->
   <bean id ="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置文件解析的编码,注意:必定要和页面的pageEncoding保持一致 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设置最大上传文件大小 -->
        <property name="maxUploadSize" value="999999999"></property>
   </bean>

    <mvc:default-servlet-handler/> 
    <mvc:annotation-driven/>
</beans>

mybatis-config.xmlsql

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<settings>
		<!-- 将下划线映射成驼峰,user_name映射为userName -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
		<!-- 开启延迟加载 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<!-- 是否查询全部数据 -->
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>
	<typeAliases>
	    <package name="jmu.hkx.vo"/>
	</typeAliases>
	<!-- mybatis PageHelper插件 -->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
	</plugins>
</configuration>

项目源代码

项目源代码数据库

总结

纸上得来终觉浅,觉知此事要躬行,从实践中发现问题,解决问题,最后提高本身。本项目也有不少功能没有实现,后续有待完善。但愿你们多多支持!