Jsp應用實訓一

分層開發

  • 表現層
  • 業務邏輯層
  • 數據訪問層
  • 數據庫

後臺功能

  • 分類管理
    • 分類的id
    • 分類的名稱
  • 商品管理
    • 商品的id
    • 商品的名稱
    • 商品的價格
    • 商品描述

準備工作

  • 軟件
    • IntellJ Idea 2017~2020版本都可以
    • MySQL5.5~5.7 都可以{5.7的版本完全區分表的名稱大小寫}
    • Jdk1.8 (示例開發:1.8.211)
    • Tomcat(9.0)
    • Maven3.63
  • 創建Maven項目 命名store
  • 選擇到maven
    • Maven home directory:apache-maven-3.6.3
    • User setting file:apache-maven-3.6.3\conf\settings.xml
  • 關於Maven的設置

    在maven的目錄下有一個文件夾叫conf(配置的目錄)內有一個文件名稱是 settings.xml 進行修改

    • 修改 座標的下載位置[若不修改、需確定有D盤、且下方路徑存在]
      • <localRepository>D:\Tols\Repository</localRepository>
    • 修改 jar下載源採用爲阿里鏡像
  • 程序的目錄結構如下
    • src
      ----main
      -------java
      -------webapp
      ----test
      -------java
      ----pom.xml
      store.iml
      
  • 編寫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>StoreMall</groupId>
        <artifactId>StoreMall</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>war</packaging>
      
        <name>StoreMall Maven Webapp</name>
        <!-- FIXME change it to the project's website -->
        <url>http://www.example.com</url>
      
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
      
          <dependencies>
              <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
              <!--數據驅動包-->
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>5.1.47</version>
              </dependency>
              <!--選擇【阿里巴巴的德魯伊】數據源-->
              <dependency>
                  <groupId>com.alibaba</groupId>
                  <artifactId>druid</artifactId>
                  <version>1.1.14</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
              <!--導入工具類:1.dbutils -->
              <dependency>
                  <groupId>commons-dbutils</groupId>
                  <artifactId>commons-dbutils</artifactId>
                  <version>1.6</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
              <!--導入工具類:2.beanutil -->
              <dependency>
                  <groupId>commons-beanutils</groupId>
                  <artifactId>commons-beanutils</artifactId>
                  <version>1.9.3</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
              <!--導入工具類:3.lang3 -->
              <dependency>
                  <groupId>org.apache.commons</groupId>
                  <artifactId>commons-lang3</artifactId>
                  <version>3.8.1</version>
              </dependency>
              <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
              <!--依賴包: 日誌包-->
              <dependency>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
                  <version>1.2</version>
              </dependency>
      
      
      
              <!--    導入servlet座標-->
              <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>4.0.1</version>
                  <scope>provided</scope>
              </dependency>
              <!--    導入jsp座標-->
              <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
              <dependency>
                  <groupId>javax.servlet.jsp</groupId>
                  <artifactId>javax.servlet.jsp-api</artifactId>
                  <version>2.3.3</version>
                  <scope>provided</scope>
              </dependency>
              <!-- 導入Jstl標準標籤庫的座標-->
              <dependency>
                  <groupId>org.apache.taglibs</groupId>
                  <artifactId>taglibs-standard-spec</artifactId>
                  <version>1.2.5</version>
              </dependency>
      
              <dependency>
                  <groupId>org.apache.taglibs</groupId>
                  <artifactId>taglibs-standard-impl</artifactId>
                  <version>1.2.5</version>
              </dependency>
              <!--單元測試-->
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.11</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>
          <build>
              <finalName>storemall</finalName>
              <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
                  <plugins>
                      <plugin>
                          <artifactId>maven-clean-plugin</artifactId>
                          <version>3.1.0</version>
                      </plugin>
                      <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                      <plugin>
                          <artifactId>maven-resources-plugin</artifactId>
                          <version>3.0.2</version>
                      </plugin>
                      <plugin>
                          <artifactId>maven-compiler-plugin</artifactId>
                          <version>3.8.0</version>
                      </plugin>
                      <plugin>
                          <artifactId>maven-surefire-plugin</artifactId>
                          <version>2.22.1</version>
                      </plugin>
                      <plugin>
                          <artifactId>maven-war-plugin</artifactId>
                          <version>3.2.2</version>
                      </plugin>
                      <plugin>
                          <artifactId>maven-install-plugin</artifactId>
                          <version>2.5.2</version>
                      </plugin>
                      <plugin>
                          <artifactId>maven-deploy-plugin</artifactId>
                          <version>2.8.2</version>
                      </plugin>
                  </plugins>
              </pluginManagement>
          </build>
      </project>
      
      
  • 配置文件- db.properties
    • driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql://localhost:3306/store
      classname=root
      password=root
      

編寫代碼

  • 創建各個包
    • 實體包 entity
    • 服務層(業務邏輯層)接口包 dao
    • 服務層(業務邏輯層)接口的實現類包 daoimpl
    • 持久層(數據訪問層)接口包 service
    • 持久層(數據訪問層)接口的實現類包 serviceimpl
    • 工具包 util
    • 異常包 exception
    • 通用包 commons
    • 數據庫包
    • Servlet包
    • fifilter包
    • [測試包] test
  • 類目的實體類
    • Category
      package cn.javabs.store.entity;
      
      /**
       * 類別
       * getter和setter方法
       * toString方法
       * 構造方法
       *      有參構造方法
       *      無參構造方法
       */
      public class Category {
          private Integer cid;
          private String cname;
      
          @Override
          public String toString() {
              return "Category{" +
                      "cid=" + cid +
                      ", cname='" + cname + '\'' +
                      '}';
          }
      
          public Category(Integer cid, String cname) {
              this.cid = cid; this.cname = cname;}
      
          public Category() {super();}
      
          public Integer getCid() {return cid;}
      
          public void setCid(Integer cid) {this.cid = cid;}
      
          public String getCname() {return cname;}
      
          public void setCname(String cname) {this.cname = cname;}
      }
      
  • 類目的Service的接口
    • CategoryService
      package cn.javabs.store.service;
      
      import cn.javabs.store.entity.Category;
      import java.util.List;
      
      /** 類目的功能邏輯 
        * 思考? 類目會涉及到分頁功能嗎? | 不涉及到! 
        */
      public interface CategoryService {
          /**
           * 查詢全部類目
           */
          public List<Category> findAllCategries();
          /**
           * 指定查找類目
           */
          public Category findCategoryById(Integer id);
          /**
           * 添加類目
           */
          public int addCategory(Category category);
          /**
           * 修改類目
           */
          public int editCategory(Category category);
          /**
           * 刪除類目
           */
          public int delCategory(Integer id);
      
      }
      
  • 類目的Service的接口的實現類ServiceImpl
    • CategoryServiceImpl
      package cn.javabs.store.service.impl;
      
      import cn.javabs.store.dao.CategoryDao;
      import cn.javabs.store.dao.impl.CategoryDaoImpl;
      import cn.javabs.store.entity.Category;
      import cn.javabs.store.service.CategoryService;
      
      import java.util.List;
      
      /**
       * 業務邏輯層實現類
       */
      public class CategoryServiceImpl implements CategoryService {
          // 創建Dao 層對象 進行此類中進行 dao類的方法
      
          CategoryDao categoryDao = new CategoryDaoImpl();
      
          /**
           * 查詢所有類目
           */
          @Override
          public List<Category> findAllCategries() {
              List<Category> categoryList = categoryDao.findAll();
              return categoryList;
          }
      
          /**
           * 指定查詢類目
           */
          @Override
          public Category findCategoryById(Integer id) {
              Category category =  categoryDao.findById(id);
              return category;
          }
      
          /**
           * 添加類目
           */
          @Override
          public int addCategory(Category category) {
              int number = categoryDao.add(category);
              return number;
          }
      
          /**
           * 修改類目
           */
          @Override
          public int editCategory(Category category) {
              int number = categoryDao.update(category);
              return number;
          }
      
          /**
           * 刪除類目
           */
          @Override
          public int delCategory(Integer id) {
              int number = categoryDao.delById(id);
              return number;
          }
      }
      
  • 類目的dao的接口
    • CategoryDao
      package cn.javabs.store.dao;
      
      import cn.javabs.store.entity.Category;
      
      import java.util.List;
      
      public interface CategoryDao {
          /**
           * 查詢所有類目
           */
          List<Category> findAll();
      
          /**
           * 指定查詢
           */
          Category findById(Integer id);
      
          /**
           * 添加類目
           */
          int add(Category category);
      
          /**
           * 修改類目
           */
          int update(Category category);
      
          /**
           * 刪除類目
           */
          int delById(Integer id);
      }
      
  • 類目的dao的接口的實現類DaoImpl
    • CategoryDaoImpl
      package cn.javabs.store.dao.impl;
      
      import cn.javabs.store.dao.CategoryDao;
      import cn.javabs.store.entity.Category;
      import cn.javabs.store.util.DruidUtil;
      import org.apache.commons.dbutils.QueryRunner;
      import org.apache.commons.dbutils.handlers.BeanHandler;
      import org.apache.commons.dbutils.handlers.BeanListHandler;
      
      import java.sql.SQLException;
      import java.util.List;
      
      public class CategoryDaoImpl implements CategoryDao {
          /**
           * 準備QueryRunner
           * 因爲QueryRunner的有參數構造方法需要一個參數的 參數爲DataSource類型的ds
           * 而DruidUtil.getDs() 方法是一個 返回
           */
          QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());
      
          /**
           * 查詢所有類目
           */
          @Override
          public List<Category> findAll() {
              try {
                  List<Category> list = qr.query("select cid,cname from category",new BeanListHandler<Category>(Category.class));
                  return list;
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
          }
          /**
           * 指定查詢類目
           */
          @Override
          public Category findById(Integer id) {
      
              try {
                   Category category = qr.query("select cid,cname from category where cid=?",
                          new BeanHandler<Category>(Category.class));
                  return category;
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
          }
          /**
           * 添加類目
           */
          @Override
          public int add(Category category) {
              try {
                  int num = qr.update("insert into category(cid,cname) values(?,?)",
                          null,category.getCname());
                  return num;
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
      
          }
          /**
           * 修改類目
           */
          @Override
          public int update(Category category) {
              try {
                  int num = qr.update("update category set cname=? where cid=?",
                          category.getCname(),
                          category.getCid());
                  return num;
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
          }
          /**
           * 刪除類目
           */
          @Override
          public int delById(Integer id) {
              try {
                  int num = qr.update("delete from category where cid=?",id);
                  return num;
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
      
          }
      }
      
  • 工具類的創建 DruidUtil
    • DruidUtil
      package cn.javabs.store.util;
      
      import com.alibaba.druid.pool.DruidDataSourceFactory;
      
      import javax.sql.DataSource;
      import java.io.InputStream;
      import java.sql.Connection;
      import java.sql.SQLException;
      import java.util.Properties;
      
      /**
       * 工具類
       */
      public class DruidUtil {
          // 1.定義全局變量ds  類型是 DataSource(數據源)
          private static DataSource dataSource;
          // 2.定義靜態代碼塊
          static {
              try {
                  // 2.1 通過反射讀取 db.properties文件 返回一個io對象
                  InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("db.properties");
                  // 2.2 找properties類去讀取(加載)io流
                  // 2.2.1 創建properties對象
                  Properties properties = new Properties();
                  // 2.2.2 讀取
                  properties.load(is);
                  // 2.3 通過核心類[德魯伊數據源工廠]去創建數據源 會返回一個DataSource類型 --會有一場需要try
                  DruidDataSourceFactory.createDataSource(properties);
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
          // 3.定義靜態方法:獲取數據源  返回值類爲 DataSource
          public static DataSource getDataSource(){
              //3.1 返回ds
              return dataSource;
          }
          // 4.定義靜態方法:獲取連接方法 返回值類爲 Connection
          public static Connection getConnection() throws SQLException {
              //4.1 返回調用獲取連接 -- 會有異常
              return dataSource.getConnection();
          }
      }
      
      
  • 數據庫表結構搭建
    • # 創建數據庫 
      create database store; 
      # 選擇哪1個數據庫來進行操作 
      use store; 
      create table category( 
          cid int primary key auto_increment, 
          cname varchar(50) not null unique # not null 不許爲空、| unique 唯一的約束 
      );
      # 插入語句 
      insert into category(cid,cname) values (1,'手機'); 
      insert into category(cid,cname) values (2,'手機殼'); 
      insert into category(cid,cname) values (3,'充電器');
      
      
  • 單元測試
    • package cn.javabs.store.test;
      
      import cn.javabs.store.entity.Category;
      import cn.javabs.store.service.CategoryService;
      import cn.javabs.store.service.impl.CategoryServiceImpl;
      import org.junit.Test;
      
      import java.util.List;
      
      public class TestCategory {
          //創建對象CategoryService
          CategoryService categoryService = new CategoryServiceImpl();
          /**
           * 查詢所有類目
           */
          @Test
          public void testFindAllCategories(){
              List<Category> list = categoryService.findAllCategries();
              System.out.println("從數據庫中查詢到的分類和類目有:"+list);
          }
      
          /**
           * 根據id進行指定查詢
           */
          @Test
          public void testFindById(){
              Category category = categoryService.findCategoryById(2);
              System.out.println(category);
          }
      
          /**
           * 添加分類
           */
          @Test
          public void testAddCategory(){
              Category category = new Category(null,"耳機");
              // 這是用 有參數的構 造方法
              int number = categoryService.addCategory(category);
              System.out.println("數據庫插入了"+number+"條語句"); }
      
          /**
           *  修改分類
           */
          @Test
          public void testEditCategory(){
              Category category = new Category(2,"手機保護殼");
              int number = categoryService.editCategory(category);
              System.out.println("數據庫修改了"+number+"條語句"); }
      
          /**
           * 刪除分類
           */
          @Test
          public void testDelCategoryById(){
              int number = categoryService.delCategory(4);
              System.out.println("數據庫刪除了"+number+"條語句");
          }
      }
      
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章