跳至主要內容

2.框架搭建

holic-x...大约 26 分钟项目商城系统

[taotao]-框架搭建

1.项目框架构建

【1】开发环境构建

选用技术

  • Spring、SpringMVC、Mybatis

  • JSP、JSTL、jQuery、jQuery plugin、EasyUI、KindEditor(富文本编辑器)、CSS+DIV

  • Redis(缓存服务器)

  • Solr(搜索)

  • httpclient(调用系统服务)

  • Mysql

  • Nginx(web服务器)

开发工具和环境

  • Eclipse(jee)

  • apache-maven-3.5.2(开发工具自带)

  • Tomcat 7.0.52(Maven Tomcat Plugin)

  • JDK1.8

  • Mysql 5.6

Nginx 1.8.0

Redis 3.0.0

  • Win7 操作系统

  • Git(版本管理)

【2】后台管理系统

🔖系统工程结构

系统介绍

​ 淘淘网上商城是一个综合性的B2C平台,类似京东商城、天猫商城。会员可以在商城浏览商品、下订单,以及参加各种活动。

​ 管理员、运营可以在平台后台管理系统中管理商品、订单、会员等;

​ 客服可以在后台管理系统中处理用户的询问以及投诉;

功能描述

​ 后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能

​ 前台系统:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作

​ 会员系统:用户可以在该系统中查询已下的订单、收藏的商品、我的优惠券、团购等信息

​ 订单系统:提供下单、查询订单、修改订单状态、定时处理订单

​ 搜索系统:提供商品的搜索功能

​ 单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息

系统架构:传统架构、分布式架构

1)传统架构

​ ⚡传统的架构是基于单体应用概念进行构建,所有的系统功能均在一个项目中完成,并通过持久层访问数据库

  • 存在问题

    • 模块之间耦合度太高,其中一个升级其他都得升级
    • 开发困难,各个团队开发最后都要整合一起
    • 系统的扩展性差
    • 不能灵活的进行分布式部署
  • 解决方法

​ 把模块拆分成独立的工程,单点运行。如果某一个点压力大可以对这一个点单独增加配置。其他的点不受影响。但系统之间交互需要额外的工作量来进行接口的开发

2)分布式架构

​ ⚡分布式的概念指的是把系统拆分成多个工程,要完成系统的工程需要多个工程协作完成,如上图所示,将系统功能模块按照指定规则拆分为多个子系统

  • 优点

    • 把模块拆分,使用接口通信,降低模块之间的耦合度
    • 把项目拆分成若干个子项目,不同的团队负责不同的子项目
    • 增加功能时只需要再增加一个子项目,调用其他系统的接口就可以
    • 可以灵活的进行分布式部署
  • 缺点

    • 系统之间交互需要使用远程通信,接口开发增加工作量

⚡系统工程搭建

(1)工程结构说明

工程结构说明(传统工程结构、基于maven管理的工程结构)

1)传统工程结构

2)基于maven管理的工程结构

​ 传统工程构建时需要手动复制jar包等完成工程构建,过程较为繁琐;通过引入maven可以实现一步构建工程结构,maven在项目工程管理中具备如下优势:

  • 可以进行依赖管理,管理jar包、工程之间的依赖

  • 可通过核心配置文件实现项目的一步构建。

  • 方便管理工程聚合、继承、依赖

​ maven的工程类型包括:war包工程、jar包工程、pom工程,在本项目中对应功能模块的结构可拆分为如下内容

后台管理系统工程结构:
taotao-parent -- 管理依赖jar包的版本,全局,公司级别
|--taotao-common  --- 通用组件、工具类
|--taotao-manage  -- 后台系统(其下包含多个子模块)
  |--com.taotao.manage.web
  |--com.taotao.manage.service
  |--com.taotao.manage.mapper
  |--com.taotao.manage.pojo

(2)taotao-parent父工程

​ 父工程是一个pom工程,在父工程中定义依赖的jar包的版本信息、管理Maven插件的版本等内容,其核心构建步骤说明如下

1)创建maven工程
2)修改pom.xml文件
3)将taotao-parent安装到本地的仓库
1)创建maven工程

2)修改pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.taotao</groupId>
	<artifactId>taotao-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<!-- 集中定义依赖版本号 -->
	<properties>
		<junit.version>4.12</junit.version>
		<spring.version>4.1.3.RELEASE</spring.version>
		<mybatis.version>3.2.8</mybatis.version>
		<mybatis.spring.version>1.2.2</mybatis.spring.version>
		<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
		<mysql.version>5.1.32</mysql.version>
		<slf4j.version>1.6.4</slf4j.version>
		<jackson.version>2.4.2</jackson.version>
		<druid.version>1.0.9</druid.version>
		<httpclient.version>4.3.5</httpclient.version>
		<jstl.version>1.2</jstl.version>
		<servlet-api.version>2.5</servlet-api.version>
		<jsp-api.version>2.0</jsp-api.version>
		<joda-time.version>2.5</joda-time.version>
		<commons-lang3.version>3.3.2</commons-lang3.version>
		<commons-io.version>1.3.2</commons-io.version>
		<commons-net.version>3.3</commons-net.version>
		<pagehelper.version>5.1.8</pagehelper.version>
		<jsqlparser.version>0.9.1</jsqlparser.version>
		<commons-fileupload.version>1.3.1</commons-fileupload.version>
		<jedis.version>2.7.2</jedis.version>
		<solrj.version>4.10.3</solrj.version>
	</properties>
	<!-- 只定义依赖的版本,并不实际依赖 -->
	<dependencyManagement>
		<dependencies>
			<!-- 时间操作组件 -->
			<dependency>
				<groupId>joda-time</groupId>
				<artifactId>joda-time</artifactId>
				<version>${joda-time.version}</version>
			</dependency>
			<!-- Apache工具组件 -->
			<dependency>
				<groupId>org.apache.commons</groupId>
				<artifactId>commons-lang3</artifactId>
				<version>${commons-lang3.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.commons</groupId>
				<artifactId>commons-io</artifactId>
				<version>${commons-io.version}</version>
			</dependency>
			<dependency>
				<groupId>commons-net</groupId>
				<artifactId>commons-net</artifactId>
				<version>${commons-net.version}</version>
			</dependency>
			<!-- Jackson Json处理工具包 -->
			<dependency>
				<groupId>com.fasterxml.jackson.core</groupId>
				<artifactId>jackson-databind</artifactId>
				<version>${jackson.version}</version>
			</dependency>
			<!-- httpclient -->
			<dependency>
				<groupId>org.apache.httpcomponents</groupId>
				<artifactId>httpclient</artifactId>
				<version>${httpclient.version}</version>
			</dependency>
			<!-- 单元测试 -->
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
			<!-- 日志处理 -->
			<dependency>
				<groupId>org.slf4j</groupId>
				<artifactId>slf4j-log4j12</artifactId>
				<version>${slf4j.version}</version>
			</dependency>
			<!-- Mybatis -->
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis</artifactId>
				<version>${mybatis.version}</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis-spring</artifactId>
				<version>${mybatis.spring.version}</version>
			</dependency>
			<dependency>
				<groupId>com.github.miemiedev</groupId>
				<artifactId>mybatis-paginator</artifactId>
				<version>${mybatis.paginator.version}</version>
			</dependency>
			<dependency>
				<groupId>com.github.pagehelper</groupId>
				<artifactId>pagehelper</artifactId>
				<version>${pagehelper.version}</version>
			</dependency>
			<!-- MySql -->
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>${mysql.version}</version>
			</dependency>
			<!-- 连接池 -->
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid</artifactId>
				<version>${druid.version}</version>
			</dependency>
			<!-- Spring -->
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-webmvc</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-jdbc</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-aspects</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<!-- JSP相关 -->
			<dependency>
				<groupId>jstl</groupId>
				<artifactId>jstl</artifactId>
				<version>${jstl.version}</version>
			</dependency>
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>servlet-api</artifactId>
				<version>${servlet-api.version}</version>
				<scope>provided</scope>
			</dependency>
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>jsp-api</artifactId>
				<version>${jsp-api.version}</version>
				<scope>provided</scope>
			</dependency>
			<!-- 文件上传组件 -->
			<dependency>
				<groupId>commons-fileupload</groupId>
				<artifactId>commons-fileupload</artifactId>
				<version>${commons-fileupload.version}</version>
			</dependency>
			<!-- Redis客户端 -->
			<dependency>
				<groupId>redis.clients</groupId>
				<artifactId>jedis</artifactId>
				<version>${jedis.version}</version>
			</dependency>
			<!-- solr客户端 -->
			<dependency>
				<groupId>org.apache.solr</groupId>
				<artifactId>solr-solrj</artifactId>
				<version>${solrj.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<!-- 资源文件拷贝插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<version>2.7</version>
				<configuration>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
		<pluginManagement>
			<plugins>
				<!-- 配置Tomcat插件 -->
				<plugin>
					<groupId>org.apache.tomcat.maven</groupId>
					<artifactId>tomcat7-maven-plugin</artifactId>
					<version>2.2</version>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>
3)将taotao-parent安装到本地的仓库

​ 右键taotao-parent工程,选择Run As --> maven install;或者是直接进入后台Terminal,进入到相应的工程目录下,执行maven指令:mvn clean install

​ 指令执行完成,可以看到当前工程被加载到本地仓库对应的路径下

(3)taotao-common工程搭建

​ taotao-common主要用于公共工具类等内容定义,其核心构建步骤说明如下

1)创建maven工程继承taotao-parent
2)修改pom.xml文件
3)更新工程
1)创建maven工程继承taotao-parent

​ taotao-common工程需要继承taotao-parent工程

2)修改pom.xml文件

​ 修改taotao-common工程的pom文件,在文件中添加对taotao-parent的继承

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.taotao</groupId>
		<artifactId>taotao-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<groupId>com.taotao</groupId>
	<artifactId>taotao-common</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<!-- jar包的依赖 -->
	<dependencies>
		<!-- 时间操作组件 -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
		</dependency>
		<!-- Apache工具组件 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
		</dependency>
		<!-- Jackson Json处理工具包 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
		</dependency>
		<!-- httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
		</dependency>
		<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- 日志处理 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
		</dependency>
	</dependencies>
</project>
3)更新工程

​ 右键taotao-common更新工程,maven-->update Project,等待工程配置更新完成

(4)taotao-manager工程搭建

​ taotao-manager是一个多模块工程,其主要依据MVC模式将工程拆分为多个子模块,每个模块有着各自的逻辑处理职责范围,其核心构建步骤说明如下

1)创建taotao-manager,拆分taotao-manager各个子模块之间的依赖关系
2)创建子模块taotao-manager-pojo、taotao-manager-mapper、taotao-manager-service、taotao-manager-web
3)tomcat插件配置

模块间的依赖关系说明如下

1)创建taotao-manager

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.taotao</groupId>
		<artifactId>taotao-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<groupId>com.taotao</groupId>
	<artifactId>taotao-manager</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<!-- 依赖管理 -->
	<dependencies>
		<dependency>
			<groupId>com.taotao</groupId>
			<artifactId>taotao-common</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>
</project>
2)子模块创建

taotao-manager-pojo

​ taotao-manager-pojo不需要依赖任何jar报,因此此处不做修改

taotao-manager-mapper

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.taotao</groupId>
    <artifactId>taotao-manager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>taotao-manager-mapper</artifactId>
	<!-- 依赖管理 -->
	<dependencies>
		<dependency>
			<groupId>com.taotao</groupId>
			<artifactId>taotao-manager-pojo</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
		</dependency>
		<dependency>
			<groupId>com.github.miemiedev</groupId>
			<artifactId>mybatis-paginator</artifactId>
		</dependency>
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
		</dependency>
		<!-- MySql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- 连接池 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
		</dependency>
	</dependencies>
</project>

taotao-manager-service

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.taotao</groupId>
    <artifactId>taotao-manager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>taotao-manager-service</artifactId>
	<!-- 依赖管理 -->
	<dependencies>
		<dependency>
			<groupId>com.taotao</groupId>
			<artifactId>taotao-manager-mapper</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
		</dependency>
	</dependencies>
</project>

taotao-manager-web

  • pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.taotao</groupId>
    <artifactId>taotao-manager</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>taotao-manager-web</artifactId>
  <packaging>war</packaging>
	<!-- 依赖管理 -->
	<dependencies>
		<dependency>
			<groupId>com.taotao</groupId>
			<artifactId>taotao-manager-service</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
		<!-- JSP相关 -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<scope>provided</scope>
		</dependency>
		<!-- 文件上传组件 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
		</dependency>
	</dependencies>
</project>
  • web.xml配置

​ 进入taotao-manager-web下,在相应目录创建一个WEB-INF文件夹,在其下创建一个web.xml,随后可在相应webapp目录下创建一个index.jsp文件进行测试

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="taotao" version="2.5">
	<display-name>taotao-manager</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>
3)tomcat插件配置

​ web工程可通过tomcat组件进行发布,还可借助tomcat插件运行。在taotao-manager中加载配置tomcat插件,其与taotao-parent中加载的插件版本对应一致(且此处taotao-manager是聚合工程,在运行时需要把子工程聚合到一起才能运行)

taotao-manager配置如下

<build>
		<plugins>
			<!-- 配置Tomcat插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8080</port>
					<path>/</path>
				</configuration>
			</plugin>
		</plugins>
	</build>

​ 启动tomcat命令:tomcat7:run,是maven自带的tomcat插件,其使用说明如下:右键taotao-manager,Run As-->maven builder(第2个),执行指令clean tomcat7:run

常见问题

​ 如果运行错误,则查看相应日志文件:(考虑可能是相关工程没有导入本地仓库),此处由于工程间存在依赖关系,在执行mvn clean install需将taotao-parent、taotao-common安装到本地仓库

​ 下述问题是由于mvn引入的jar包失效引起,由于taotao-parent中虽然修改了之前报错的插件,但没有重新将taotao-parent打包到本地仓库,实际上运行时工程访问的是本地仓库打包的内容,此处要注意这一点,每次修改工程,必须重新install,从而避免“信息不同步”导致的问题(建议不要修改插件版本,会导致后续分页出错,因为使用的pagehelper插件引入的是修改后的fix版本,把相关的版本导入即可,如果更改成更高的版本,处理方式不同)

​ 通过终端启动,启动成功显示下列信息

​ 随后通过网页访问:localhost:8080/,如果出现乱码问题,则可能是jsp编码格式(默认系统设置则需要修改成UTF-8)

2.SSM框架整合

​ SSM框架整合步骤说明如下:

基本内容:
1.创建taotao数据库,引入数据库信息
2.使用mybatis逆向工程生成相应的pojo、dao(mapper)
3.分别整合dao、service、controller层
4.整合项目测试分析

【1】SSM整合

🔖数据库创建

​ 创建taotao数据库,引入数据库信息:引入taotao.sql,查看每个表的关联关系

⚡逆向工程生成pojo、mapper

​ 使用mybatis逆向工程生成相应的pojo、dao(mapper),在使用mybatis逆向工程生成代码时,如果是已经生成的内容需要重新生成,则需要将原有的代码内容删除,否则第二次生成时其并不会在原有的文件进行覆盖,而是在原有的文件基础上追加内容,但并不报错,如此导致项目执行失败

⚡dao、service、controller层整合

(1)整合思路

​ 考虑配置文件存放的位置,则需要对相关的工程结构进行分析,pom、jar类型的maven工程中存放配置文件没有办法进行读取,因此考虑需要把配置文件放到taotao-manager-web工程下,因为此工程为war工程。换个角度思考,如果将配置文件放在某个jar类型的maven工程中,其他项目在依赖的时候是通过lib引入该jar包,因此无法访问其内部的配置文件

dao层

​ 使用mybatis框架:创建SqlMapConfig.xml,并创建一个applicationContext-dao.xml完成下述配置

a.配置数据源
b.让spring容器管理SqlsessionFactory
c.将mapper的代理对象放到spring容器中(使用扫描包的方式加载mapper的代理对象)

service层

a.事务管理
b.把service实现类对象放到spring容器中管理

controller层

a.配置注解驱动
b.配置视图解析器
c.扫描controller

web.xml

a.spring容器的配置
b.Springmvc前端控制器的配置
c.Post乱码过滤器
(2)整合参考

​ 在taotao-manager-web下对应src/main/resource下创建3个文件夹分别存放相应的配置文件,

src/main/resource
- mybatis:存放mybatis整合相关的配置文件
- resource:存放基本的配置文件,例如数据库连接文件db.properties
- spring:存放spring整合相关的配置文件
1)mybatis整合

​ 在mybatis文件夹下添加“SqlMapConfig.xml”文件(可在该文件中设置mapper配置相关的内容)

<?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>
  <!-- 别名配置(结合实际工程进行配置) -->
  <typeAliases>
  	<package name="com.taotao.pojo"/>
  </typeAliases>
</configuration>

​ 在spring文件夹下创建applicationContext-dao.xml,配置数据库连接、mapper代理

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<!-- 数据库连接池 -->
	<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:resource/db.properties" />
	<!-- 数据库连接池 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="maxActive" value="10" />
		<property name="minIdle" value="5" />
	</bean>
	<!-- 配置sqlsessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 配置扫描包,加载mapper代理对象 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.taotao.mapper"></property>
	</bean>
</beans>
2)service整合

​ 在spring文件夹下创建applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<!-- 扫描包加载Service实现类 -->
	<context:component-scan base-package="com.taotao.service"></context:component-scan>
</beans>

​ 在spring文件夹下创建applicationContext-transaction.xml(事务管理机制)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<!-- 事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 传播行为 -->
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="create*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>
	<!-- 切面 -->
	<aop:config>
		<aop:advisor advice-ref="txAdvice"
			pointcut="execution(* com.taotao.service.*.*(..))" />
	</aop:config>
</beans>
3)controller整合

​ 在service文件夹中添加springmvc.xml文件:controller包扫描、注解驱动配置、视图解析器、静态资源映射

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

	<!-- 配置包扫描器 -->
	<context:component-scan base-package="com.taotao.controller" />
	<!-- 配置注解驱动 -->
	<mvc:annotation-driven />
	<!-- 配置视图解析器 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<!-- 配置资源映射(针对静态资源,防止被拦截) -->
	<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
	<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
</beans>
4)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="taotao" version="2.5">
	<display-name>taotao-manager</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<!-- 加载spring容器 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext-*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- 解决post乱码 -->
	<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>
	<!-- springmvc的前端控制器 -->
	<servlet>
		<servlet-name>taotao-manager</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springmvc.xml</param-value>
		</init-param>
		<!-- load-on-startup元素标记容器是否应该在web应用程序启动的时候就加载这个servlet -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 配置拦截url的请求:/表示拦截所有的请求(包括静态资源) -->
	<servlet-mapping>
		<servlet-name>taotao-manager</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

​ /:会拦截所有请求包括静态资源。需要在springmvc.xml中添加静态资源的映射,否则无法直接访问

	<!-- 配置资源映射 -->
	<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
	<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
(3)添加静态资源

​ 将相关的静态文件资料添加到taotao-manager-web工程的对应的src/main/webapp/WEB-INF文件夹下

(4)测试整合结果

需求分析:跟据商品id查询商品信息(商品id为536563)

​ Sql语句:SELECT * from tb_item WHERE id=536563

​ 在对应的工程添加相应的dao、service、controller内容,添加完成选择Maven更新主工程进行测试(taotao-manager-dao对应dao层、taotao-manager-service/impl对应service层、taotao-manager-web对应controller层)

dao层

​ dao层:可以使用逆向工程生成的mapper文件

service层

​ service层:接收商品id调用dao查询商品信息。返回商品pojo对象

@Service
public class ItemServiceImpl implements ItemService {

	@Autowired
	private TbItemMapper itemMapper;
	
	@Override
	public TbItem getItemById(long itemId) {
		
		//TbItem item = itemMapper.selectByPrimaryKey(itemId);
		//添加查询条件
		TbItemExample example = new TbItemExample();
		Criteria criteria = example.createCriteria();
		criteria.andIdEqualTo(itemId);
		List<TbItem> list = itemMapper.selectByExample(example);
		if (list != null && list.size() > 0) {
			TbItem item = list.get(0);
			return item;
		}
		return null;
	}

}
controller层

​ controller层:接收页面请求商品id,调用service查询商品信息。直接返回一个json数据(使用@ResponseBody注解)

@Controller
public class ItemController {

	@Autowired
	private ItemService itemService;
	
	@RequestMapping("/item/{itemId}")
	@ResponseBody
	public TbItem getItemById(@PathVariable Long itemId) {
		TbItem tbItem = itemService.getItemById(itemId);
		return tbItem;
	}
}

【2】扩展说明

springmvc、spring的父子容器关系说明

​ ❓扩展问题:**为什么不使用全局扫描?**例如在service扫描的时候直接配置com.taotao,理论上实现service、controller及相关所有内容的扫描。

​ 例如:在applicationContext-service.xml中配置全局扫描:而springmvc.xml中不配置扫描

<!-- 扫描包加载Service实现类 -->
<context:component-scan base-package="com.taotao"></context:component-scan>

​ 基于上述配置会扫描@Controller、@Service、@Repository、@Compnent

​ 通过测试可得springmvc不能提供服务,因为springmvc子容器中没有controller对象。因此如此配置会导致在访问数据的时候报404错误!可以在springmvc.sml中配置如下:

<!-- 定义扫描包的路径 -->
<context:component-scan base-package="com.taotao.controller,com.taotao.service.impl">
</context:component-scan>

​ 在spring+springMVC架构下,如果要将事务配置到Controller层是无法实现的(事务管理器无法访问controller),必须把事务配置到service层。

❓整合测试常见问题

问题1:tomcat启动

问题说明

​ 在启动tomcat报错,由于maven依赖没有解决,除了taotao-parent、taotao-common之外,还需要依次将依赖的工程taotao-manager、taotao-manager-pojo、taotao-manager-mapper、taotao-manager-service依次加载到本地仓库中(被taotao-manager-web依赖调用),随后再在taotao-manager-web下执行mvn clean install进行测试。

即运行聚合工程时必须先将依赖相关的工程install到本地仓库

解决思路

​ 进入到taotao-manager所在目录,执行mvn clean install指令查看问题,如果重复启动出现如下问题:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project taotao-rest: Failed to clean project: Failed to delete C:\Users\eclipsework-space\taotao-rest\target\tomcat\logs\access_log.2017-08-14 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

解决方法

​ 原因是maven工程重复操作,资源被占用导致部分数据无法删除,第二次运行项目的时候记得一定要把前一次运行的状态关掉,再重新运行,不然就会报这个错误

问题2:访问controller报500错误

问题说明

​ 找不到相应的mapper映射文件:

解决思路

​ 没有mapper映射文件:查看对应工作路径下的taotao-manager-mapper下target/classess/...对应文件夹查看是否生成xxxExample.class

​ 参考路径:工作目录\taotao-manager\taotao-manager-mapper\target\classes\com\taotao\mapper

解决方法

​ 默认是不会编译该类型文件的,因此需要指定编译内容目录,修改taotao-manager-mapper工程的pom文件,在pom文件中添加如下内容:

	<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
	<build>
		<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
	</build>

​ 重新启动项目,再次测试OK:

⚡使用maven的tomcat进行debug操作

​ 弹出提示框点击yes进入debug模式:

​ 点击“edit Source Lookup Path...”,移除默认的项目,添加指定的project,此处最好选择“Java Project”(Project所有的工程列出,不便筛选,且有些工程是pom属性),配置完成下次启动生效

​ 也可在debug调试之前进行配置,debug下拉项有个“debug configuration”,进入相应工程的配置项,此处为taotao-manager,在source选项卡下配置相关内容

3.商品列表的实现

【1】跳转后台管理工程的首页

​ 分析:先写一个controller进行页面跳转展示首页(首页是使用easyUI开发)

​ 由于此前测试的时候已经有一个默认的index.jsp测试,如果直接访问会访问到该index.jsp,测试完成,此处先删除index.jsp测试文件,按照以下的配置访问后台管理首页

@Controller
public class PageController {

	/**
	 * 打开首页
	 */
	@RequestMapping("/")
	public String showIndex() {
		return "index";
	}
	/**
	 * 展示其他页面
	 * <p>Title: showpage</p>
	 * <p>Description: </p>
	 * @param page
	 * @return
	 */
	@RequestMapping("/{page}")
	public String showpage(@PathVariable String page) {
		return page;
	}
}

​ 查看对应index.jsp文件,其访问页面的形式如下:(在controller层通过编写通用的controller实现页面的跳转)

【2】商品列表查询

需求分析:商品列表分页查找

1.查看对应请求的url:/item/list(商品查询列表页面)

2.请求的参数:http://localhost:8080/item/list?page=1&rows=30,分页信息(需查阅官方手册)

3.返回值:json数据

# 数据格式:Easyui中datagrid控件要求的数据格式为
{total:"2",rows:[{"id":"1","name":"张三"},{"id":"2","name":"李四"}]}

dao层

​ sql语句:SELECT * from tb_item LIMIT 0,30

(1)分页插件PageHelperopen in new window

​ PageHelper实现原理说明

在工程中引入pagehelper插件:

​ PageHelper使用

a.引入pageHelper的jar包

b.在SqlMapConfig.xml中配置插件
<?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>
	<!-- 配置分页插件 -->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->        
        	<property name="dialect" value="mysql"/>
		</plugin>
	</plugins>
</configuration>

c.在查询的sql语句执行之前,添加代码PageHelper.startPage(1, 10); 、
- pages:要显示第几页
- rows:每一页要显示的记录数
	
d.处理查询结果
	创建一个PageInfo类的对象,从对象中取分页信息
(2)分页测试

​ 在src/test/java下添加一个类TestPageHelper进行测试

public class TestPageHelper {
	@Test
	public void testPageHelper() {
		//创建一个spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
//		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
		//从spring容器中获得Mapper的代理对象
		TbItemMapper mapper = applicationContext.getBean(TbItemMapper.class);
		//执行查询,并分页
		TbItemExample example = new TbItemExample();
		//分页处理
		PageHelper.startPage(2, 10);
		List<TbItem> list = mapper.selectByExample(example);
		//取商品列表
		for (TbItem tbItem : list) {
			System.out.println(tbItem.getTitle());
		}
		//取分页信息
		PageInfo<TbItem> pageInfo = new PageInfo<>(list);
		long total = pageInfo.getTotal();
		System.out.println("共有商品:"+ total);
	}
}

​ 选择相应的方法,右键测试Run As:Junit Test,如果出现如下问题:

​ Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor

​ 问题处理:PageHelper本质上是一个mybatis拦截器,因此如果要使用,必须在xml中进行配置

​ 此处注意:分页插件对逆向工程生成的代码支持不好,不能对有查询条件的查询分页。会抛异常(所以参考源码中实际上使用的修改过的版本,一开始没有考虑之前搭建项目没有用提供的maven仓库而修改了pagehelper版本导致现在访问出错!)

​ 参考了许多资料,始终会出现各种各样的问题,原因是之前搭建环境的时候pagehelper是由另外提供的,已经放在maven仓库中,因此搭建环境可直接引用而不报错,但在搭建环境的时候没有使用提供的maven仓库,因此修改了pom引用配置,使用了默认的pagehelper,所以导致上述操作出错,因此此处考虑将相关的插件导入本地仓库,修改相关的pom文件进行测试

解决方案:

​ 将提供的maven仓库下的com.github下的相关内容替换掉当前使用仓库对应目录下的数据,随后修改taotao-parent的pom文件,将原有pagehelper的版本修改为如下所示,随后重新通过mvn clean install指令更新项目,将taotao-parent重新导入到本地仓库,再次根据文档要求重新进行测试,测试成功!

service层

​ Service层接收分页参数,分别为page(第几页)、rows(多少行数据)。随后通过调用dao查询商品列表,结合pagehelper实现分页,返回对应的商品列表。

​ 通过创建一个pojo对象,使其返回一个EasyUIDateGrid支持的数据格式。此pojo应该放到taotao-common工程(通用,使其可以被多个项目引用)中。创建完成要在taotao-common工程中执行mvn clean install,及时更新maven仓库

EUDataGridResult.java

public class EUDataGridResult {	
	// 提供一个通用的数据格式
	private long total;
	private List<?> rows;
	public long getTotal() {
		return total;
	}
	public void setTotal(long total) {
		this.total = total;
	}
	public List<?> getRows() {
		return rows;
	}
	public void setRows(List<?> rows) {
		this.rows = rows;
	}
}

Service层代码实现

Service接口定义:
	// 分页查找商品信息
	public EUDataGridResult getItemList(int page, int rows); 

Service接口实现:
	/**
	 * 商品列表查询
	 * <p>Title: getItemList</p>
	 * <p>Description: </p>
	 * @param page
	 * @param rows
	 * @return
	 * @see com.taotao.service.ItemService#getItemList(long, long)
	 */
	@Override
	public EUDataGridResult getItemList(int page, int rows) {
		//查询商品列表
		TbItemExample example = new TbItemExample();
		//分页处理
		PageHelper.startPage(page, rows);
		List<TbItem> list = itemMapper.selectByExample(example);
		//创建一个返回值对象
		EUDataGridResult result = new EUDataGridResult();
		result.setRows(list);
		//取记录总条数
		PageInfo<TbItem> pageInfo = new PageInfo<>(list);
		result.setTotal(pageInfo.getTotal());
		return result;
	}

controller层

​ 接收页面传递过来的参数page、rows。返回json格式的数据EUDataGridResult(使用@ResponseBody注解)

	@RequestMapping("/item/list")
	@ResponseBody
	public EUDataGridResult getItemList(Integer page, Integer rows) {
		EUDataGridResult result = itemService.getItemList(page, rows);
		return result;
	}

​ 重启tomcat,测试结果如下:(改动了taotao-common的数据,需要执行mvn clean inall指令重新将其导入本地仓库,随后进入taotao-manager执行相关的指令进行编译,测试)

​ 可能出现的问题:(将taotao-common重新导入到仓库中)

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3