1. 系统介绍
该系统实现了一个旅游网站的后台管理功能,包括用户登录,产品管理,订单管理,用户管理,角色管理,资源权限管理,访问日志功能。
2. 技术选型
- 表现层:SpringMVC,JSP,AdminLTE
- 业务层:Spring
- 持久层:MyBatis
- 数据库:MySQL
- 安全认证:Spring Security
- 单元测试:Junit
- 连接池:c3p0
- 日志:log4j,slf4j
- 分页插件:pagehelper
- 服务器:Tomcat
- 开发工具:IDEA
- 项目管理工具:Maven
3. 环境搭建
3.1 创建数据库和表
-
创建数据库
create database ssm;
-
创建产品表
序号 字段名称 字段类型 字段描述 1 id int(11) 主键,自增长 2 productNum varchar(50) 产品编号,唯一,非空 3 productName varchar(50) 产品名称 4 cityName varchar(50) 出发城市 5 departureTime datetime 出发时间 6 productPrice double 产品价格 7 productDesc varchar(255) 产品描述 8 productStatus int(11) 状态(0 或 1) DROP TABLE IF EXISTS `product`; CREATE TABLE `product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `productNum` varchar(50) NOT NULL, `productName` varchar(50) DEFAULT NULL, `cityName` varchar(50) DEFAULT NULL, `departureTime` datetime DEFAULT NULL, `productPrice` double DEFAULT NULL, `productDesc` varchar(255) DEFAULT NULL, `productStatus` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `productNum` (`productNum`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; INSERT INTO `product` VALUES ('1', 'pro-001', '北京三日游', '北京', '2019-11-07 14:51:13', '1200', '不错的旅行', '1'); INSERT INTO `product` VALUES ('2', 'pro-002', '上海五日游', '上海', '2019-10-19 14:51:24', '1800', '魔都我来了', '0'); INSERT INTO `product` VALUES ('3', 'pro-003', '香港七日游', '香港', '2019-10-25 14:51:30', '2800', '不错的旅行', '1'); INSERT INTO `product` VALUES ('7', 'pro-004', '广州六日游', '广州', '2019-10-17 10:50:00', '1800', '广州是个好地方', '1'); INSERT INTO `product` VALUES ('8', 'pro-005', '广州六日游', '广州', '2019-10-22 15:50:00', '1800', '广州好地方', '1');
3.2 创建 Maven 工程
3.2.1 创建父工程
-
打开 IDEA,选择 Create New Project --> Maven
-
不勾选 Create From archetype,点击 Next
-
填写以下内容,点击 Next
GroupId:com.zt ArtifactId:ssm_travel
-
填写以下内容,点击 Finish
Project name:ssm_travel Project location:D:\idea_workspace\ssm\ssm_travel
3.2.2 创建子模块 dao
-
点击 File --> New --> Module --> Maven
-
不勾选 Create From archetype,点击 Next
-
此时已经指定了其父工程,我们填写以下内容,点击 Next
ArtifactId:ssm_travel_dao
-
内容已经帮我们填写好了,点击 Finish
3.2.3 创建子模块 service
-
点击 File --> New --> Module --> Maven
-
不勾选 Create From archetype,点击 Next
-
此时已经指定了其父工程,我们填写以下内容,点击 Next
ArtifactId:ssm_travel_service
-
内容已经帮我们填写好了,点击 Finish
3.2.4 创建子模块 domain
-
点击 File --> New --> Module --> Maven
-
不勾选 Create From archetype,点击 Next
-
此时已经指定了其父工程,我们填写以下内容,点击 Next
ArtifactId:ssm_travel_domain
-
内容已经帮我们填写好了,点击 Finish
3.2.5 创建子模块 utils
-
点击 File --> New --> Module --> Maven
-
不勾选 Create From archetype,点击 Next
-
此时已经指定了其父工程,我们填写以下内容,点击 Next
ArtifactId:ssm_travel_utils
-
内容已经帮我们填写好了,点击 Finish
3.2.6 创建子模块 web
-
点击 File --> New --> Module --> Maven
-
勾选 Create From archetype,选择以下模板,点击 Next
org.apache.maven.archetypes:maven-archetype-webapp
-
此时已经指定了其父工程,我们填写以下内容,点击 Next
ArtifactId:ssm_travel_web
-
内容已经帮我们填写好了,点击 Finish
3.2.7 在父工程中编写 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.zt</groupId>
<artifactId>ssm_travel</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<mybatis.version>3.4.5</mybatis.version>
<mysql.version>5.1.6</mysql.version>
<spring.security.version>5.0.1.RELEASE</spring.security.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</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-core</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-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- web -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</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>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
<!-- SpringSecurity -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<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>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<modules>
<module>ssm_travel_dao</module>
<module>ssm_travel_service</module>
<module>ssm_travel_domain</module>
<module>ssm_travel_utils</module>
<module>ssm_travel_web</module>
</modules>
</project>
3.3 编写工具类
-
在子模块 utils 中,java 中创建包 com.zt.utils
-
创建日期转换工具类 DateUtils
/** * 日期转换工具类 */ public class DateUtils { /** * 字符串转日期 * @param str * @param patten * @return * @throws ParseException */ public static Date string2Date(String str, String patten) throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(patten); Date date = simpleDateFormat.parse(str); return date; } /** * 日期转字符串 * @param date * @param patten * @return */ public static String date2String(Date date, String patten){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(patten); String str = simpleDateFormat.format(date); return str; } }
3.4 编写实体类
-
在子模块 domain 中,java 中创建包 com.zt.domain
-
创建实体类 Product
/** * 产品实体类 */ public class Product implements Serializable { private Integer id; // 主键 private String productNum; // 产品编号,唯一 private String productName; // 产品名称 private String cityName; // 出发城市 private Date departureTime; // 出发时间 private String departureTimeStr; // 出发时间的字符串 private double productPrice; // 产品价格 private String productDesc; // 产品描述 private Integer productStatus; // 状态: 0关闭,1开启 private String productStatusStr; // 状态的字符串 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getProductNum() { return productNum; } public void setProductNum(String productNum) { this.productNum = productNum; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public Date getDepartureTime() { return departureTime; } public void setDepartureTime(Date departureTime) { this.departureTime = departureTime; } public String getDepartureTimeStr() { if (departureTime != null) { departureTimeStr = DateUtils.date2String(departureTime, "yyyy-MM-dd HH:mm:ss"); } return departureTimeStr; } public void setDepartureTimeStr(String departureTimeStr) { this.departureTimeStr = departureTimeStr; } public double getProductPrice() { return productPrice; } public void setProductPrice(double productPrice) { this.productPrice = productPrice; } public String getProductDesc() { return productDesc; } public void setProductDesc(String productDesc) { this.productDesc = productDesc; } public Integer getProductStatus() { return productStatus; } public void setProductStatus(Integer productStatus) { this.productStatus = productStatus; } public String getProductStatusStr() { if (productStatus != null) { if (productStatus == 0) { productStatusStr = "关闭"; } if (productStatus == 1) { productStatusStr = "开启"; } } return productStatusStr; } public void setProductStatusStr(String productStatusStr) { this.productStatusStr = productStatusStr; } @Override public String toString() { return "Product{" + "id='" + id + '\'' + ", productNum='" + productNum + '\'' + ", productName='" + productName + '\'' + ", cityName='" + cityName + '\'' + ", departureTime=" + departureTime + ", departureTimeStr='" + departureTimeStr + '\'' + ", productPrice=" + productPrice + ", productDesc='" + productDesc + '\'' + ", productStatus=" + productStatus + ", productStatusStr='" + productStatusStr + '\'' + '}'; } }
3.5 编写持久层接口
-
在子模块 dao 中,java 中创建包 com.zt.dao
-
创建接口 ProductDao
@Repository public interface ProductDao { /** * 查询所有产品 * @return * @throws Exception */ @Select("select * from product") List<Product> findAll() throws Exception; }
3.6 编写业务层接口和实现类
-
在子模块 service 中,java 中创建包 com.zt.service
-
创建接口 ProductService
public interface ProductService { /** * 查询所有产品 * @return * @throws Exception */ List<Product> findAll() throws Exception; }
-
创建包 com.zt.service.impl,创建 ProductServiceImpl
@Service("productService") public class ProductServiceImpl implements ProductService { @Autowired private ProductDao productDao; @Override public List<Product> findAll() throws Exception { return productDao.findAll(); } }
3.7 编写控制层
-
在子模块 controller 中,java 中创建包 com.zt.controller
-
创建 ProductController
@Controller @RequestMapping("/product") public class ProductController { @Autowired private ProductService productService; @RequestMapping("/findAll.do") public ModelAndView findAll() throws Exception { ModelAndView modelAndView = new ModelAndView(); List<Product> products = productService.findAll(); modelAndView.addObject("productList",products); modelAndView.setViewName("product-list"); return modelAndView; } }
3.8 SSM 整合
-
在子模块 web 中,main 中创建包 java 和 resources
-
右键 java --> Make Directory as --> Sources Root
-
右键 resources --> Make Directory as --> Resource Root
-
在 resources 中创建 applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 开启注解扫描,管理 service和 dao --> <context:component-scan base-package="com.zt.service"> </context:component-scan> <context:component-scan base-package="com.zt.dao"> </context:component-scan> <!-- Spring 整合 MyBatis --> <!--读取外部配置文件--> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置连接池 --> <bean id="dataSource" 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> <!-- 配置 SqlSessionFactory 工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 扫描 dao 接口 --> <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.zt.dao"/> </bean> <!-- 配置 Spring 的声明式事务管理 --> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--开启 Spring 对注解事务的支持--> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
-
在 resources 中创建 db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123456
-
在 resources 中创建 springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- 扫描 controller的注解 --> <context:component-scan base-package="com.zt.controller"> </context:component-scan> <!-- 配置视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- JSP文件所在的目录 --> <property name="prefix" value="/pages/"/> <!-- 文件的后缀名 --> <property name="suffix" value=".jsp"/> </bean> <!-- 设置静态资源不过滤 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/img/" mapping="/img/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/plugins/" mapping="/plugins/**"/> <!-- 开启对 SpringMVC 注解的支持 --> <mvc:annotation-driven/> <!-- 支持AOP的注解支持,AOP底层使用代理技术 JDK动态代理,要求必须有接口 cglib代理,生成子类对象,proxy-target-class="true" 默认使用cglib的方式 --> <aop:aspectj-autoproxy proxy-target-class="true"/> </beans>
-
配置 web.xml
<?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" version="3.1"> <!-- 配置 Spring 的监听器 --> <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> <!-- 配置 servlet 的初始化参数,读取 springmvc 的配置文件,创建 spring 容器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 配置 servlet 启动时加载对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- 配置过滤器解决 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> <!-- 指定默认加载页面 --> <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>
-
将 log4j.properties 导入 resources
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. # log4j.appender.LOGFILE=org.apache.log4j.FileAppender # log4j.appender.LOGFILE.File=d:\axis.log # log4j.appender.LOGFILE.Append=true # log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout # log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
3.9 编写 JSP 页面
-
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--转发到 main.jsp--%> <jsp:forward page="/pages/main.jsp"></jsp:forward> </body> </html>
-
将 AdminLTE 的 css,img,plugins 三个包复制到 webapp 下,并在 webapp 下创建 pages 包
-
在 pages 包中创建 aside.jsp
-
在 pages 包中创建 header.jsp
-
在 pages 包中创建 main.jsp
-
在 pages 包中创建 product-list.jsp
3.10 配置 tomcat 服务器
在子模块 web 中,pom.xml 中加入 tomcat 配置
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--端口号-->
<port>80</port>
<!--访问路径-->
<path>/</path>
</configuration>
</plugin>
</plugins>
3.11 配置 Maven
-
点击 run --> Edit Configurations --> 添加 Maven
-
配置 Name
Name:ssm_travel
-
配置 Working directory
D:/idea_workspace/ssm/ssm_travel/ssm_travel_web
-
配置 command line
tomcat7:run
-
点击 OK
-
选择 Maven Project,clean 父工程,再 install 父工程
-
clean web 子模块,再 install web 子模块
3.12 运行项目
-
点击运行项目
-
打开浏览器访问
http://localhost/
4. 实现添加产品操作
4.1 编写控制层
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService;
/**
* 添加产品
* @param product
* @return
* @throws Exception
*/
@RequestMapping("/save.do")
public String save(Product product) throws Exception {
productService.save(product);
return "redirect:findAll.do";
}
/**
* 查询所有产品
* @return
* @throws Exception
*/
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
ModelAndView modelAndView = new ModelAndView();
List<Product> products = productService.findAll();
modelAndView.addObject("productList",products);
modelAndView.setViewName("product-list");
return modelAndView;
}
}
4.2 编写业务层接口和实现类
public interface ProductService {
/**
* 查询所有产品
* @return
* @throws Exception
*/
List<Product> findAll() throws Exception;
/**
* 添加产品
* @param product
* @throws Exception
*/
void save(Product product) throws Exception;
}
@Transactional
@Service("productService")
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
/**
* 查询所有产品
* @return
* @throws Exception
*/
@Override
public List<Product> findAll() throws Exception {
return productDao.findAll();
}
/**
* 添加产品
* @param product
* @throws Exception
*/
@Override
public void save(Product product) throws Exception {
productDao.save(product);
}
}
4.3 编写持久层接口
@Repository
public interface ProductDao {
/**
* 查询所有产品
*
* @return
* @throws Exception
*/
@Select("select * from product")
List<Product> findAll() throws Exception;
/**
* 添加产品
* @param product
*/
@Insert("insert into product(productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus) values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})")
void save(Product product) throws Exception;
}
4.4 编写实体类
在 departureTime 字段上添加注解 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm”),实现 String 类型转换为 Date 类型
/**
* 产品实体类
*/
public class Product implements Serializable {
private Integer id; // 主键
private String productNum; // 产品编号,唯一
private String productName; // 产品名称
private String cityName; // 出发城市
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private Date departureTime; // 出发时间
private String departureTimeStr; // 出发时间的字符串
private double productPrice; // 产品价格
private String productDesc; // 产品描述
private Integer productStatus; // 状态: 0关闭,1开启
private String productStatusStr; // 状态的字符串
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProductNum() {
return productNum;
}
public void setProductNum(String productNum) {
this.productNum = productNum;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Date getDepartureTime() {
return departureTime;
}
public void setDepartureTime(Date departureTime) {
this.departureTime = departureTime;
}
public String getDepartureTimeStr() {
if (departureTime != null) {
departureTimeStr = DateUtils.date2String(departureTime, "yyyy-MM-dd HH:mm:ss");
}
return departureTimeStr;
}
public void setDepartureTimeStr(String departureTimeStr) {
this.departureTimeStr = departureTimeStr;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public Integer getProductStatus() {
return productStatus;
}
public void setProductStatus(Integer productStatus) {
this.productStatus = productStatus;
}
public String getProductStatusStr() {
if (productStatus != null) {
if (productStatus == 0) {
productStatusStr = "关闭";
}
if (productStatus == 1) {
productStatusStr = "开启";
}
}
return productStatusStr;
}
public void setProductStatusStr(String productStatusStr) {
this.productStatusStr = productStatusStr;
}
@Override
public String toString() {
return "Product{" +
"id='" + id + '\'' +
", productNum='" + productNum + '\'' +
", productName='" + productName + '\'' +
", cityName='" + cityName + '\'' +
", departureTime=" + departureTime +
", departureTimeStr='" + departureTimeStr + '\'' +
", productPrice=" + productPrice +
", productDesc='" + productDesc + '\'' +
", productStatus=" + productStatus +
", productStatusStr='" + productStatusStr + '\'' +
'}';
}
}
4.5 编写 JSP 页面
在 pages 包中创建 product-add.jsp