[TOC]
# 查詢
## 步驟 1 : 先運行,看到效果,再學習
接下來就開始一步一步來,由淺入深地開發功能了。(測試)
因為項目用到了SSM技術,SSM技術本身較為復雜,涉及到了多個框架、多個類、多個配置文件。 不僅如此,模仿天貓業務也較為復雜,所以在進行項目開發之前,一定要先將tmall-ssm(向老師要相關資料),配置運行起來, 先自己跑起來,確認項目本身沒有問題,建立對學習內容的信心,然后再跟著步驟,一步步做出來。 這樣出了問題心里才有底,通過代碼比較等手段,定位到問題所在,成功消化掉這個知識點。
> 必讀:十分不推薦一來就跟著步驟做下去,本知識點一共有20多個步驟,只要任何一個步驟,跟著做的時候寫錯了,都有可能導致項目無法成功啟動,影響學習情緒和學習效果。
## 步驟 2 : 模仿和排錯
在確保可運行項目能夠正確無誤地運行之后,再嚴格照著教程的步驟,對代碼模仿一遍。
模仿過程難免代碼有出入,導致無法得到期望的運行結果,此時此刻通過比較正確答案 ( 可運行項目 ) 和自己的代碼,來定位問題所在。
采用這種方式,學習有效果,排錯有效率,可以較為明顯地提升學習速度,跨過學習路上的各個檻。
## 步驟 3 : 新建Maven 項目
菜單->File->New->Other->Maven->Maven Project

## 步驟 4 : 這個界面點下一步

## 步驟 5 : 這個界面使用webapp,點下一步
默認選中的是maven-archetype-quickstart, 請修改為: maven-archetype-webapp

## 步驟 6 : 這一步填寫如圖所示的信息
GroupId: com.dodoke.tmall
ArtifactId: tmall_ssm

## 步驟 7 : 此時得到的maven web 項目的問題
此時能得到的maven web 項目,不過有兩個問題
1. 沒有java源代碼目錄
2. index.jsp報錯

## 步驟 8 : 創建java 源代碼目錄
在上一步的截圖中可以發現,沒有地方存放java源文件,這個時候就需要按照如下步驟做:
右鍵項目->屬性->Java Build Path->Libraries->Edit->Workspace default
JRE(jdk8)->Finish

## 步驟 9 : java源文件目錄創建好了
如圖所示,java源文件目錄創建好了

## 步驟 10 : pom.xml
復制如下內容到已經存在的pom里, 粘貼之后,jsp本來的報錯就消失了,不過出來一個新的問題,要求通過Maven更新項目。
右鍵項目->Maven->Update Project,會彈出一個對話框,點擊Ok,這個問題就消失了。
~~~
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dodoke.tmall</groupId>
<artifactId>tmall_ssm</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring.version>4.1.3.RELEASE</spring.version>
<pagehelper.version>5.1.2-beta</pagehelper.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.spring.version>1.2.3</mybatis.spring.version>
<mybatis.version>3.1.1</mybatis.version>
<junit.version>4.12</junit.version>
<jstl.version>1.2</jstl.version>
<jsqlparser.version>1.0</jsqlparser.version>
<jackson.version>1.2.7</jackson.version>
<servlet-api.version>3.1.0</servlet-api.version>
<druid.version>1.0.18</druid.version>
<log4j.version>1.2.16</log4j.version>
<commons-logging.version>1.2</commons-logging.version>
<commons-fileupload.version>1.2.1</commons-fileupload.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-lang.version>2.6</commons-lang.version>
<aopalliance.version>1.0</aopalliance.version>
<mybatis-generator.version>1.3.5</mybatis-generator.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<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>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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</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>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- pageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!--jsqlparser -->
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>${jsqlparser.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>${aopalliance.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>${mybatis-generator.version}</version>
</dependency>
</dependencies>
<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.8</source>
<target>1.8</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>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
~~~
## 步驟 11 : 創建包
首先點中源目錄:src/main/java,然后菜單->File->New->Package 輸入 com.dodoke.tmall.pojo 創建包。
包創建好之后如圖所示:

## 步驟 12 : Category
選中創建包步驟中的包,然后菜單->File->New->Java Class,創建Category類。
這是實體類,聲明了id和name,以及對應的setter,getter。
~~~
package com.dodoke.tmall.pojo;
public class Category {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
~~~
## 步驟 13 : CategoryMapper
首先點中源目錄:src/main/java 然后菜單->File->New->Package 輸入 com.dodoke.tmall.mapper 創建包
接著創建接口CategoryMapper,因為本知識點只做查詢,所以只聲明了一個list方法。
~~~
package com.dodoke.tmall.mapper;
import java.util.List;
import com.dodoke.tmall.pojo.Category;
public interface CategoryMapper {
List<Category> list();
}
~~~
## 步驟 14 : CategoryService
首先點中源目錄:src/main/java 然后菜單->File->New->Package 輸入 com.dodoke.tmall.service 創建包
接著創建接口CategoryService,因為本知識點只做查詢,所以只聲明了一個list方法。
~~~
package com.dodoke.tmall.service;
import java.util.List;
import com.dodoke.tmall.pojo.Category;
public interface CategoryService {
List<Category> list();
}
~~~
## 步驟 15 : CategoryServiceImpl
首先點中源目錄:src/main/java 然后菜單->File->New->Package 輸入 com.dodoke.tmall.service.impl 創建包
新建CategoryService接口的實現類CategoryServiceImpl
注解@Service聲明當前類是一個Service類
通過自動裝配@Autowired引入CategoryMapper ,在list方法中調用CategoryMapper 的list方法.
~~~
package com.dodoke.tmall.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.dodoke.tmall.mapper.CategoryMapper;
import com.dodoke.tmall.pojo.Category;
@Service
public class CategoryServiceImpl {
@Autowired
CategoryMapper categoryMapper;
public List<Category> list() {
return categoryMapper.list();
}
}
~~~
## 步驟 16 : CategoryController
首先點中源目錄:src/main/java 然后菜單->File->New->Package 輸入 com.dodoke.tmall.controller 創建包
新建CategoryController,
注解@Controller聲明當前類是一個控制器。
注解@RequestMapping("")表示訪問的時候無需額外的地址。
注解@Autowired把CategoryServiceImpl自動裝配進了CategoryService 接口。
注解@RequestMapping("admin_category_list") 映射admin_category_list路徑的訪問。
在list方法中,通過categoryService.list()獲取所有的Category對象,然后放在"cs"中,并服務端跳轉到 “admin/listCategory” 視圖。
> “admin/listCategory” 會根據后續的springMVC.xml 配置文件,跳轉到 WEB-INF/jsp/admin/listCategory.jsp 文件。
~~~
package com.dodoke.tmall.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.dodoke.tmall.pojo.Category;
import com.dodoke.tmall.service.CategoryService;
@RequestMapping("")
@Controller
public class CategoryController {
@Autowired
CategoryService categoryService;
@RequestMapping("admin_category_list")
public String list(Model model) {
List<Category> cs = categoryService.list();
model.addAttribute("cs", cs);
return "admin/listCategory";
}
}
~~~
## 步驟 17 : CategoryMapper.xml
1. 在src/main/resources目錄下,新建mapper目錄
2. 右鍵mapper目錄->New->File 新建文件CategoryMapper.xml
CategoryMapper.xml的namespace必須是com.dodoke.tmall.mapper.CategoryMapper,以和CategoryMapper保持一致。
CategoryMapper.xml聲明了唯一的一條sql語句:
`select * from t_category order by id desc`
~~~
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dodoke.tmall.mapper.CategoryMapper">
<select id="list" resultType="Category">
select * from t_category order by id desc
</select>
</mapper>
~~~
## 步驟 18 : log4j.properties
在resources目錄下新建log4j.properties。這個配置文件的作用是開啟日志,當訪問頁面的時候,查看mybatis運行的情況,執行了什么SQL語句,以及sql語句的返回情況等信息。
~~~
# Global logging configuration
log4j.rootLogger=debug, stdout
# MyBatis logging configuration...
log4j.logger.com.dodoke.tmall=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
~~~
## 步驟 19:jdbc.properties
在resources目錄下新建jdbc.properties,此配置文件給出了訪問數據庫需要的必須信息:
1. 驅動
2. url
3. 賬號
4. 密碼
~~~
# 數據庫配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tmall_ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=
~~~
> 這邊是我自己的數據庫配置信息,注意改成自己的數據庫,用戶名,以及密碼。
## 步驟 20 : applicationContext.xml
在resources目錄下新建applicationContext.xml
此配置文件做了如下工作
1. 啟動對注解的識別
~~~
<context:annotation-config />
<context:component-scan base-package="com.dodoke.tmall.service" />
~~~
2. 指定對jdbc.properties的引用
~~~
<context:property-placeholder location="classpath:jdbc.properties"/>
~~~
3. 配置數據源
~~~
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
~~~
4. 配置Mybatis的SessionFactory,其中聲明了別名,并且使用前面配置的數據源,掃描CategoryMapper.xml配置文件
~~~
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
~~~
5. 掃描Mapper類: CategoryMapper
~~~
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
~~~
~~~
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="com.dodoke.tmall.service" />
<!-- 導入數據庫配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置數據庫連接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本屬性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="60000" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 1" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize"
value="20" />
</bean>
<!--Mybatis的SessionFactory配置-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="typeAliasesPackage" value="com.dodoke.tmall.pojo" />
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
<!--分頁插件,目前先注釋,后面重構的時候才會使用
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
</value>
</property>
</bean>
</array>
</property>
-->
</bean>
<!--Mybatis的Mapper文件識別-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dodoke.tmall.mapper"/>
</bean>
</beans>
~~~
## 步驟 21 : springMVC.xml
在resources目錄下新建springMVC.xml
1. 開啟注解的識別
~~~
<context:annotation-config/>
<context:component-scan base-package="com.dodoke.tmall.controller">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<mvc:annotation-driven />
~~~
2.開通靜態資源的訪問,否則訪問圖片,css,js等文件可能出錯
~~~
<mvc:default-servlet-handler />
~~~
3. 視圖定位
視圖定位到/WEB-INF/JSP/*.jsp這里
4. 對上傳文件的解析
~~~
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
~~~
~~~
<?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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!--啟動注解識別 -->
<context:annotation-config />
<!-- 掃描Controller,并將其生命周期納入Spring管理 -->
<context:component-scan base-package="com.dodoke.tmall.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 注解驅動,以使得訪問路徑與方法的匹配可以通過注解配置 -->
<mvc:annotation-driven />
<!--開通靜態資源的訪問 -->
<mvc:default-servlet-handler />
<!-- 視圖定位到/WEB/INF/jsp 這個目錄下 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 對上傳文件的解析 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
</beans>
~~~
目錄結構:

## 步驟 22 : 修改web.xml
修改web.xml,主要提供如下功能
1. 指定spring的配置文件為classpath下的applicationContext.xml
2. 設置中文過濾器
3. 指定spring mvc配置文件為classpath下的springMVC.xml
> 若出現"Cannot change version of project facet Dynamic web module to 2.5"相關錯誤提示,對項目的運行是沒有影響。
>
> 我們用Eclipse創建Maven結構的web項目的時候選擇了Artifact Id為maven-artchetype-webapp,由于這個catalog比較老,用的servlet還是2.3的,而一般現在至少都是2.5,在Project Facets里面修改Dynamic web module為2.5的時候就會出現Cannot change version of project facet Dynamic web module to 2.5,可自行搜索如何將其改為2.5版本。
~~~
<?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"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- spring的配置文件 -->
<!-- 通過ContextLoaderListener在web app啟動的時候,獲取contextConfigLocation配置文件的文件名applicationContext.xml,并進行Spring相關初始化工作 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--中文過濾器 -->
<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>
<!-- spring mvc核心:分發servlet -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- spring mvc的配置文件 -->
<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>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
~~~
> web.xml沒指定歡迎頁的情況下,它默認先查找index.html文件,如果找到了,就把index.html作為歡迎頁還回給瀏覽器。如果沒找到index.html,tomcat就去找index.jsp。找到index.jsp就把它作為歡迎頁面返回。而如果index.html和index.jsp都沒找到,又沒有用web.xml文件指定歡迎頁面,那此時tomcat就不知道該返回哪個文件了。
>
## 步驟 23 : 靜態資源
接下來是各種靜態資源,諸如jquery, bootstrap, css, 圖片,公用jsp等,內容稍雜,就不挨個列出來了。
這些靜態資源打包在webapp.rar里(向老師要相關資料),解壓之后,并復制到項目中的webapp目錄中,復制結果如圖所示。
1. admin目錄里有個index.jsp 用戶客戶端跳轉到CategoryController中指定的admin_category_list路徑
2. css,img,js目錄是樣式,圖片腳本等文件
3. include/admin目錄下是4個JSP包含關系中講解到的被包含文件

## 步驟 24 : listCategory.jsp
通過**靜態資源**步驟,就會在WEB-INF下創建jsp目錄。 然后在jsp目錄中創建admin目錄,接著創建listCategory.jsp文件
listCategory.jsp主要作用是通過27行的forEach標簽遍歷"cs"里的內容,然后挨個顯示出來。
~~~
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@include file="../include/admin/adminHeader.jsp"%>
<%@include file="../include/admin/adminNavigator.jsp"%>
<title>分類管理</title>
<div class="workingArea">
<h1 class="label label-info" >分類管理</h1>
<br>
<br>
<div class="listDataTableDiv">
<table class="table table-striped table-bordered table-hover table-condensed">
<thead>
<tr class="success">
<th>ID</th>
<th>圖片</th>
<th>分類名稱</th>
<th>屬性管理</th>
<th>產品管理</th>
<th>編輯</th>
<th>刪除</th>
</tr>
</thead>
<tbody>
<c:forEach items="${cs}" var="c">
<tr>
<td>${c.id}</td>
<td><img height="40px" src="img/category/${c.id}.jpg"></td>
<td>${c.name}</td>
<td><a href="admin_property_list?cid=${c.id}"><span class="glyphicon glyphicon-th-list"></span></a></td>
<td><a href="admin_product_list?cid=${c.id}"><span class="glyphicon glyphicon-shopping-cart"></span></a></td>
<td><a href="admin_category_edit?id=${c.id}"><span class="glyphicon glyphicon-edit"></span></a></td>
<td><a deleteLink="true" href="admin_category_delete?id=${c.id}"><span class=" glyphicon glyphicon-trash"></span></a></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div class="pageDiv">
<%//@include file="../include/admin/adminPage.jsp" %>
</div>
<div class="panel panel-warning addDiv">
<div class="panel-heading">新增分類</div>
<div class="panel-body">
<form method="post" id="addForm" action="admin_category_add" enctype="multipart/form-data">
<table class="addTable">
<tr>
<td>分類名稱</td>
<td><input id="name" name="name" type="text" class="form-control"></td>
</tr>
<tr>
<td>分類圖片</td>
<td>
<input id="categoryPic" accept="image/*" type="file" name="image" />
</td>
</tr>
<tr class="submitTR">
<td colspan="2" align="center">
<button type="submit" class="btn btn-success">提 交</button>
</td>
</tr>
</table>
</form>
</div>
</div>
</div>
<%@include file="../include/admin/adminFooter.jsp"%>
<script>
$(function(){
$("#addForm").submit(function(){
if(!checkEmpty("name","分類名稱"))
return false;
if(!checkEmpty("categoryPic","分類圖片"))
return false;
return true;
});
});
</script>
~~~
> 表格參考:菜鳥教程中,Bootstrap教程-Bootstrap表格
## 步驟 25 : 測試數據
首先點中源目錄:src/main/java 然后菜單->File->New->Package 輸入 com.dodoke.tmall.test 創建包
接著創建測試TestTmall, 其作用是借助JDBC, 運行代碼,創建10條分類測試數據。
注: 既然是SSM教程,為什么不用mybatis創建測試數據,而要用JDBC創建? 因為增加功能要到下個知識點才講。
~~~
package com.dodoke.tmall.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestTmall {
public static void main(String args[]) {
Connection conn = null;
PreparedStatement ps = null;
String url = "jdbc:mysql://localhost:3306/tmall_ssm?useUnicode=true&characterEncoding=utf8";
String user = "root";
String password = "";
try {
// 1.選擇連接數據庫:加載數據庫驅動
Class.forName("com.mysql.jdbc.Driver");
// 2.連接數據庫
conn = DriverManager.getConnection(url, user, password);
for (int i = 1; i <= 10; i++) {
// 3.創建數據庫查詢(加入占位符)
ps = conn.prepareStatement("INSERT INTO t_category(name) VALUES(?)");
ps.setString(1, "測試分類" + i);
// 4.獲取查詢結果
ps.executeUpdate();
}
System.out.println("已經成功創建10條分類測試數據");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 5.關閉查詢和連接
try {
if (null != ps) {
ps.close();
}
if (null != conn) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
~~~

## 步驟 26 : 啟動Tomcat并觀察效果
通過Eclipse中的tomcat啟動并部署項目之后,訪問地址:
`http://localhost:8080/tmall_ssm/admin_category_list`
將觀察到如圖的運行效果
注: 剛開始看不到分類數據,分類數據需要自己添加

### 問題
1. 正常運行之后圖片不顯示,請問這樣是正常的嗎?
> 對的,要增加,或者修改的時候上傳了圖片才看得到圖片。
## 步驟 27 : 可運行項目
實在自己搞不出來,就比較下可運行項目中的內容。
## 步驟 28 : 思路圖
1. 首先瀏覽器上訪問路徑 /admin_category_list
2. tomcat根據web.xml上的配置信息,攔截到了/admin_category_list,并將其交由DispatcherServlet處理。
3. DispatcherServlet 根據springMVC的配置,將這次請求交由CategoryController類進行處理,所以需要進行這個類的實例化
4. 在實例化CategoryController的時候,注入CategoryServiceImpl
5. 在實例化CategoryServiceImpl的時候,又注入CategoryMapper
6. 根據ApplicationContext.xml中的配置信息,將CategoryMapper和CategoryMapper.xml關聯起來了。
7. 這樣就拿到了實例化好了的CategoryController,并調用list方法
8. 在list方法中,訪問CategoryService,并獲取數據,并把數據放在"cs"上,接著服務端跳轉到listCategory.jsp去
9. 最后在listCategory.jsp 中顯示數據

- 項目簡介
- 功能一覽
- 前臺
- 后臺
- 開發流程
- 需求分析-展示
- 首頁
- 產品頁
- 分類頁
- 搜索結果頁
- 購物車查看頁
- 結算頁
- 確認支付頁
- 支付成功頁
- 我的訂單頁
- 確認收貨頁
- 確認收貨成功頁
- 評價頁
- 需求分析-交互
- 分類頁排序
- 立即購買
- 加入購物車
- 調整訂單項數量
- 刪除訂單項
- 生成訂單
- 訂單頁功能
- 確認付款
- 確認收貨
- 提交評價信息
- 登錄
- 注冊
- 退出
- 搜索
- 前臺需求列表
- 需求分析后臺
- 分類管理
- 屬性管理
- 產品管理
- 產品圖片管理
- 產品屬性設置
- 用戶管理
- 訂單管理
- 后臺需求列表
- 表結構設計
- 數據建模
- 表與表之間的關系
- 后臺-分類管理
- 可運行的項目
- 靜態資源
- JSP包含關系
- 查詢
- 分頁
- 增加
- 刪除
- 編輯
- 修改
- 做一遍
- 重構
- 分頁方式
- 分類逆向工程
- 所有逆向工程
- 后臺其他頁面
- 屬性管理實現
- 產品管理實現
- 產品圖片管理實現
- 產品屬性值設置
- 用戶管理實現
- 訂單管理實現
- 前端
- 前臺-首頁
- 可運行的項目
- 靜態資源
- ForeController
- home方法
- home.jsp
- homePage.jsp
- 前臺-無需登錄
- 注冊
- 登錄
- 退出
- 產品頁
- 模態登錄
- 分類頁
- 搜索
- 前臺-需要登錄
- 購物流程
- 立即購買
- 結算頁面
- 加入購物車
- 查看購物車頁面
- 登錄狀態攔截器
- 其他攔截器
- 購物車頁面操作
- 訂單狀態圖
- 生成訂單
- 我的訂單頁
- 我的訂單頁操作
- 評價產品
- 總結