文章目录

  • 1. 系统介绍
  • 2. 技术选型
  • 3. 环境搭建
    • 3.1 创建数据库和表
    • 3.2 创建 Maven 工程
      • 3.2.1 创建父工程
      • 3.2.2 创建子模块 dao
      • 3.2.3 创建子模块 service
      • 3.2.4 创建子模块 domain
      • 3.2.5 创建子模块 utils
      • 3.2.6 创建子模块 web
      • 3.2.7 在父工程中编写 pom.xml
    • 3.3 编写工具类
    • 3.4 编写实体类
    • 3.5 编写持久层接口
    • 3.6 编写业务层接口和实现类
    • 3.7 编写控制层
    • 3.8 SSM 整合
    • 3.9 编写 JSP 页面
    • 3.10 配置 tomcat 服务器
    • 3.11 配置 Maven
    • 3.12 运行项目
  • 4. 实现添加产品操作
    • 4.1 编写控制层
    • 4.2 编写业务层接口和实现类
    • 4.3 编写持久层接口
    • 4.4 编写实体类
    • 4.5 编写 JSP 页面

1. 系统介绍

该系统实现了一个旅游网站的后台管理功能,包括用户登录,产品管理,订单管理,用户管理,角色管理,资源权限管理,访问日志功能。

2. 技术选型

  • 表现层:SpringMVC,JSP,AdminLTE
  • 业务层:Spring
  • 持久层:MyBatis
  • 数据库:MySQL
  • 安全认证:Spring Security
  • 单元测试:Junit
  • 连接池:c3p0
  • 日志:log4j,slf4j
  • 分页插件:pagehelper
  • 服务器:Tomcat
  • 开发工具:IDEA
  • 项目管理工具:Maven

3. 环境搭建

3.1 创建数据库和表

  1. 创建数据库

    create database ssm;
    
  2. 创建产品表

    序号 字段名称 字段类型 字段描述
    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 创建父工程

  1. 打开 IDEA,选择 Create New Project --> Maven

  2. 不勾选 Create From archetype,点击 Next

  3. 填写以下内容,点击 Next

    GroupId:com.zt
    ArtifactId:ssm_travel
    
  4. 填写以下内容,点击 Finish

    Project name:ssm_travel
    Project location:D:\idea_workspace\ssm\ssm_travel
    

3.2.2 创建子模块 dao

  1. 点击 File --> New --> Module --> Maven

  2. 不勾选 Create From archetype,点击 Next

  3. 此时已经指定了其父工程,我们填写以下内容,点击 Next

    ArtifactId:ssm_travel_dao
    
  4. 内容已经帮我们填写好了,点击 Finish

3.2.3 创建子模块 service

  1. 点击 File --> New --> Module --> Maven

  2. 不勾选 Create From archetype,点击 Next

  3. 此时已经指定了其父工程,我们填写以下内容,点击 Next

    ArtifactId:ssm_travel_service
    
  4. 内容已经帮我们填写好了,点击 Finish

3.2.4 创建子模块 domain

  1. 点击 File --> New --> Module --> Maven

  2. 不勾选 Create From archetype,点击 Next

  3. 此时已经指定了其父工程,我们填写以下内容,点击 Next

    ArtifactId:ssm_travel_domain
    
  4. 内容已经帮我们填写好了,点击 Finish

3.2.5 创建子模块 utils

  1. 点击 File --> New --> Module --> Maven

  2. 不勾选 Create From archetype,点击 Next

  3. 此时已经指定了其父工程,我们填写以下内容,点击 Next

    ArtifactId:ssm_travel_utils
    
  4. 内容已经帮我们填写好了,点击 Finish

3.2.6 创建子模块 web

  1. 点击 File --> New --> Module --> Maven

  2. 勾选 Create From archetype,选择以下模板,点击 Next

    org.apache.maven.archetypes:maven-archetype-webapp
    
  3. 此时已经指定了其父工程,我们填写以下内容,点击 Next

    ArtifactId:ssm_travel_web
    
  4. 内容已经帮我们填写好了,点击 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 编写工具类

  1. 在子模块 utils 中,java 中创建包 com.zt.utils

  2. 创建日期转换工具类 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 编写实体类

  1. 在子模块 domain 中,java 中创建包 com.zt.domain

  2. 创建实体类 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;}@Overridepublic 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 编写持久层接口

  1. 在子模块 dao 中,java 中创建包 com.zt.dao

  2. 创建接口 ProductDao

    @Repository
    public interface ProductDao {/*** 查询所有产品* @return* @throws Exception*/@Select("select * from product")List<Product> findAll() throws Exception;
    }

3.6 编写业务层接口和实现类

  1. 在子模块 service 中,java 中创建包 com.zt.service

  2. 创建接口 ProductService

    public interface ProductService {/*** 查询所有产品* @return* @throws Exception*/List<Product> findAll() throws Exception;
    }
    
  3. 创建包 com.zt.service.impl,创建 ProductServiceImpl

    @Service("productService")
    public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductDao productDao;@Overridepublic List<Product> findAll() throws Exception {return productDao.findAll();}
    }

3.7 编写控制层

  1. 在子模块 controller 中,java 中创建包 com.zt.controller

  2. 创建 ProductController

    @Controller
    @RequestMapping("/product")
    public class ProductController {@Autowiredprivate 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 整合

  1. 在子模块 web 中,main 中创建包 java 和 resources

  2. 右键 java --> Make Directory as --> Sources Root

  3. 右键 resources --> Make Directory as --> Resource Root

  4. 在 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://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>
  5. 在 resources 中创建 db.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=123456
  6. 在 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://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>
  7. 配置 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>
    
  8. 将 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 页面

  1. 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>
  2. 将 AdminLTE 的 css,img,plugins 三个包复制到 webapp 下,并在 webapp 下创建 pages 包

  3. 在 pages 包中创建 aside.jsp

  4. 在 pages 包中创建 header.jsp

  5. 在 pages 包中创建 main.jsp

  6. 在 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

  1. 点击 run --> Edit Configurations --> 添加 Maven

  2. 配置 Name

    Name:ssm_travel
    
  3. 配置 Working directory

    D:/idea_workspace/ssm/ssm_travel/ssm_travel_web
    
  4. 配置 command line

    tomcat7:run
    
  5. 点击 OK

  6. 选择 Maven Project,clean 父工程,再 install 父工程

  7. clean web 子模块,再 install web 子模块

3.12 运行项目

  1. 点击运行项目

  2. 打开浏览器访问

    http://localhost/
    

4. 实现添加产品操作

4.1 编写控制层

@Controller
@RequestMapping("/product")
public class ProductController {@Autowiredprivate 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 {@Autowiredprivate ProductDao productDao;/*** 查询所有产品* @return* @throws Exception*/@Overridepublic List<Product> findAll() throws Exception {return productDao.findAll();}/*** 添加产品* @param product* @throws Exception*/@Overridepublic 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;}@Overridepublic 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

旅游网后台管理系统(一)环境搭建相关推荐

  1. 乐优商城之后台管理系统的环境搭建(七)

    文章目录 (一)搭建管理后台的前端 (二)项目结构 (三)vuetify (四)使用域名访问后台页面 (五)nginx的介绍 (六)nginx的使用 (一)搭建管理后台的前端 把资料包中提供的leyo ...

  2. 旅游网后台管理系统(三)权限操作

    文章目录 1. 创建表 1.1 表之间的关系 1.2 用户表 1.3 角色表 1.4 用户与角色的中间表 1.5 权限表 1.6 角色与权限的中间表 2. Spring Security 2.1 Sp ...

  3. php快速搭建后台,基于thinkphp的后台管理系统模板快速搭建,thinkphp后台模板_PHP教程...

    基于thinkphp的后台管理系统模板快速搭建,thinkphp后台模板 当我们在搭建网站的时候,后端开发人员在编写后台的管理系统的时候,往往会因为缺少一个合适的后台管理系统的模板,而必须去重新编写一 ...

  4. 2021-06-27基于web旅游景点后台管理系统

    ## 基于web旅游景点后台管理系统 功能模块: 用户模块 登录模块(注册) 景点模块 景点线路查询及周围食宿查询模块 订单模块 可视化模块(大屏和疫情实时可视化) 启动前端项目(npm run de ...

  5. (12/05/21) vue-element-admi介绍 后台系统基础环境搭建

    1. vue-element-admin 介绍 vue-element-admin 是一个后台前端解决方案,它基于 Vue.js 和 Element-UI 实现,它使用了最新的前端技术栈,内置了 i1 ...

  6. 内网渗透初探(靶场环境搭建+web层面实验+内网基本操作)

    靶场环境搭建 在此我使用的是红日安全的环境 下载地址(红日安全) 图片取自互联网,ip地址以实际地址为准 操作系统 IP地址 攻击者 kali IP地址:192.168.3.10 攻击者 Window ...

  7. 企业级内网的域控环境搭建教程

    所谓域控就是一台或多台域控制器能够控制域内的其他服务器,可实现统一更换电脑桌面,统一修改密码等诸多操作,就像网吧里的网络结构一样,只不过更复杂,更庞大,下面是详细部署教程 说明:要做这个实验需要模拟内 ...

  8. 使用VUE搭建后台管理系统(使用vue-cli搭建框架)

    接触VUE已经几个月了,已经完成了一个后台管理系统,一个商城系统.今天决定总结一下之前的零散的知识点,在此开一个系列,自己也从头开始完成一个后台管理系统的搭建,并放在github中供大家参考. 安装v ...

  9. 基于asp.net061旅游网旅行社管理系统

    本旅游管理信息系统主要以Visual Studio.NET为主要的网络开发工具,以SQLServer为后台的数据库开发工具.采用ASP.NET技术和C#语言SQL Server数据库技术来完成该系统. ...

最新文章

  1. 报错You may use special comments to disable some warnings.vue-cli脚手架关闭eslint的步骤
  2. 判断类之间的父子关系
  3. Golang简单写文件操作的四种方法
  4. 李宏毅深度学习——Backpropagation
  5. ios 摇一摇不走响应方法_猫咪不和主人亲近?这几种方法让它变得黏人,赶都赶不走|猫|宠物猫|主人...
  6. RxSwift之深入解析dispose源码的实现原理
  7. 开发中我们谈的产品化是什么?阿里是怎么看待产品化?
  8. cms是什么意思啊_美团面试官问我:ZGC 的 Z 是什么意思?
  9. 万字长文讲解编码知识,看这文就够了!| 原力计划
  10. mysql学习笔记 51_MySQL学习笔记(一)
  11. 基于移动最小二乘的图像变形
  12. 前端js获取屏幕高度
  13. 数学图形之双曲抛物面
  14. 微信公众号过程中都有哪些技巧,提升公众号活跃度
  15. 关于oppo和vivo这两年强势崛起的反思
  16. 我的2016---悲喜交加的一年
  17. win10可以运行linux模拟器,Win10将原生兼容安卓App,但模拟器不会被打败
  18. 【微机原理与接口技术】之一微型计算机系统概述
  19. C#用easy-mvc开发的后台管理系统
  20. 宇宙少女-小贾的一时兴起

热门文章

  1. 网易有道即将上市,在线教育还能讲出怎样的故事?
  2. C# AddRange 添加位置
  3. K12827 骨头收集者
  4. python实现ftp到ftp文件摆渡_双网隔离后 超大文件要如何快速的进行文件摆渡?...
  5. vue url 地址中的 # 是什么?
  6. php 8 jit,了解PHP 8的JIT
  7. 征服面试官:OkHttp 原理篇 掌握这篇面试题汇总,吊打面试官!
  8. 专业防霾口罩走红 专家:普通口罩无法防细菌
  9. 百付宝携手瑞星 打造零风险支付平台
  10. 微服务架构 与 Dubbo 微服务框架、SpringCloud 微服务框架 详解