zoukankan      html  css  js  c++  java
  • SSM 整合

    SSM 框架整合

    1、环境

    • IDEA
    • MySQL 5.5.40
    • Tomcat 9
    • Maven 3.6

    2、数据库环境

    创建一个数据库表

    CREATE DATABASE `ssmbuild`;
    
    USE `ssmbuild`;
    
    DROP TABLE IF EXISTS `books`;
    
    CREATE TABLE `books` (
    `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
    `bookName` VARCHAR(100) NOT NULL COMMENT '书名',
    `bookCounts` INT(11) NOT NULL COMMENT '数量',
    `detail` VARCHAR(200) NOT NULL COMMENT '描述',
    KEY `bookID` (`bookID`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    INSERT  INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES 
    (1,'Java',1,'从入门到放弃'),
    (2,'MySQL',10,'从删库到跑路'),
    (3,'Linux',5,'从进门到进牢');
    

    3、基本环境搭建

    1. 新建Maven项目,ssmbuild,添加web的支持(生成最新的 web.xml 文件)

    2. 导入相关的 pom 依赖 pom.xml

      junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring,Lombok插件

      <!--依赖:junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring-->
      <dependencies>
          <!--Junit-->
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
          </dependency>
          <!--数据库驱动-->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.47</version>
          </dependency>
          <!-- 数据库连接池: c3p0、dbcp -->
          <dependency>
              <groupId>com.mchange</groupId>
              <artifactId>c3p0</artifactId>
              <version>0.9.5.2</version>
          </dependency>
      
          <!--Servlet - JSP -->
          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>servlet-api</artifactId>
              <version>2.5</version>
          </dependency>
          <dependency>
              <groupId>javax.servlet.jsp</groupId>
              <artifactId>jsp-api</artifactId>
              <version>2.2</version>
          </dependency>
          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>jstl</artifactId>
              <version>1.2</version>
          </dependency>
      
          <!--Mybatis-->
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis</artifactId>
              <version>3.5.2</version>
          </dependency>
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis-spring</artifactId>
              <version>2.0.2</version>
          </dependency>
      
          <!--Spring-->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-webmvc</artifactId>
              <version>5.1.9.RELEASE</version>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-jdbc</artifactId>
              <version>5.1.9.RELEASE</version>
          </dependency>
          <dependency>
              <groupId>org.aspectj</groupId>
              <artifactId>aspectjweaver</artifactId>
              <version>1.8.13</version>
          </dependency>
      
          <dependency>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>1.18.10</version>
              <scope>provided</scope>
          </dependency>
      </dependencies>
      
    3. Maven 资源过滤设置

      <!--静态资源导出问题-->
      <build>
          <resources>
              <resource>
                  <directory>src/main/java</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>false</filtering>
              </resource>
              <resource>
                  <directory>src/main/resources</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>false</filtering>
              </resource>
          </resources>
      </build>
      
    4. 建立基本结构和配置框架

      • com.song.pojo

      • com.song.dao

      • com.song.service

      • com.song.controller

      • mybatis-config.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configuration
                PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
      
      </configuration>
      
      • 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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd">
      
      </beans>
      

    4、Mybatis 层

    1. 数据库配置文件 database.properties

      jdbc.driver=com.mysql.jdbc.Driver
      # 如果使用的是 MySQL8.0+,增加一个时区的配置 serverTimezone=Asia/Shanghai
      jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
      jdbc.username=root
      jdbc.password=root
      
    2. IDEA关联数据库

    3. 编写 MyBatis 的核心配置文件 mybatis-config.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
      
          <!-- 配置数据源交给 Spring 做-->
      
          <settings>
              <setting name="logImpl" value="STDOUT_LOGGING"/>
          </settings>
      
          <typeAliases>
              <package name="com.song.pojo"/>
          </typeAliases>
      
          <mappers>
              <mapper class="com.song.dao.BookMapper"/>
          </mappers>
      
      </configuration>
      
    4. 编写数据库对应的实体类 com.kuang.pojo.Books (使用lombok插件)

      @Data
      @NoArgsConstructor
      @AllArgsConstructor
      public class Books {
          private int bookID;
          private String bookName;
          private int bookCounts;
          private String detail;
      }
      
    5. 编写 Dao 层的 Mapper 接口

      public interface BookMapper {
      
          //增加一本书
          int addBook(Books books);
      
          //根据 id 删除一本书
          int deleteBookById(@Param("bookId") int id);
      
          //更新一本书
          int updateBook(Books books);
      
          //根据 id 查询一本书
          Books queryBookById(@Param("bookId") int id);
      
          //查询全部书
          List<Books> queryAllBooks();
      
      	//根据 name 查询一本书
          Books queryBookByName(@Param("bookName") String bookName);
      }
      
    6. 编写接口对应的 Mapper.xml 文件 BookMapper.xml

      需要配置到 MyBatis 的核心配置文件中

      <?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.song.dao.BookMapper">
      
          <!--增加一个Book-->
          <insert id="addBook" parameterType="Books">
              insert into ssmbuild.books (bookName, bookCounts, detail)
              values (#{bookName}, #{bookCounts}, #{detail});
          </insert>
      
          <!--根据id删除一个Book-->
          <delete id="deleteBookById" parameterType="_int">
              delete from ssmbuild.books
              where bookID = #{bookId}
          </delete>
      
          <!--更新Book-->
          <update id="updateBook" parameterType="Books">
              update ssmbuild.books
              set bookName = #{bookName}, bookCounts = #{bookCounts}, detail = #{detail}
              where bookID = #{bookID};
          </update>
      
          <!--根据id查询,返回一个Book-->
          <select id="queryBookById" resultType="Books">
              select * from ssmbuild.books
              where bookID = #{bookId};
          </select>
      
          <!--查询全部Book-->
          <select id="queryAllBooks" resultType="Books">
              select * from ssmbuild.books;
          </select>
      
          <!--根据name查询,返回一个Book-->
          <select id="queryBookByName" resultType="Books">
              select * from ssmbuild.books where bookName = #{bookName};
          </select>
      
      </mapper>
      
    7. 编写 Service 层的接口和实现类

      • 接口 BookService
      public interface BookService {
          //增加一本书
          int addBook(Books books);
      
          //删除一本书
          int deleteBookById(int id);
      
          //更新一本书
          int updateBook(Books books);
      
          //查询一本书
          Books queryBookById(int id);
      
          //查询全部书
          List<Books> queryAllBooks();
      
          Books queryBookByName(String bookName);
      }
      
      • 实现类 BookServiceImpl
      public class BookServiceImpl implements BookService {
      
          // Service 调用 dao层: 把 dao 层组合进来
          private BookMapper bookMapper;
      
          public void setBookMapper(BookMapper bookMapper) {
              this.bookMapper = bookMapper;
          }
      
          public int addBook(Books books) {
              return bookMapper.addBook(books);
          }
      
          public int deleteBookById(int id) {
              return bookMapper.deleteBookById(id);
          }
      
          public int updateBook(Books books) {
              return bookMapper.updateBook(books);
          }
      
          public Books queryBookById(int id) {
              return bookMapper.queryBookById(id);
          }
      
          public List<Books> queryAllBooks() {
              return bookMapper.queryAllBooks();
          }
      
          public Books queryBookByName(String bookName) {
              return bookMapper.queryBookByName(bookName);
          }
      }
      

    5、Spring层

    1. Spring 整合 Mybatis 的相关的配置文件 spring-dao.xml,这里的数据源使用 c3p0 连接池

      <?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/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd">
      
          <!--1. 关联数据库配置文件-->
          <context:property-placeholder location="classpath:database.properties"/>
      
          <!--2. 连接池
              dbcp:半自动化操作,不能自动连接
              c3p0:自动化操作(自动化的加载配置文件,并且可以自动设置到对象中)
              druid:
              hikari:springboot 2.x 默认集成
          -->
          <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}"/>
              <!-- c3p0连接池的私有属性 -->
              <property name="maxPoolSize" value="30"/>
              <property name="minPoolSize" value="10"/>
              <!-- 关闭连接后不自动commit -->
              <property name="autoCommitOnClose" value="false"/>
              <!-- 获取连接超时时间 -->
              <property name="checkoutTimeout" value="10000"/>
              <!-- 当获取连接失败重试次数 -->
              <property name="acquireRetryAttempts" value="2"/>
          </bean>
      
          <!--3. SqlSessionFactory-->
          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource"/>
              <!--绑定配置文件-->
              <property name="configLocation" value="classpath:mabatis-config.xml"/>
          </bean>
      
          <!--4. 配置 dao 接口扫描包,动态的实现了 Dao接口可以接入到 Spring容器中-->
          <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
              <!--注入 sqlSessionFactory-->
              <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
              <!--要扫描的dao包-->
              <property name="basePackage" value="com.song.dao"/>
          </bean>
      
      </beans>
      
    2. Spring 整合 service 层 spring-service.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
             https://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/aop
             https://www.springframework.org/schema/aop/spring-aop.xsd
             http://www.springframework.org/schema/tx
             http://www.springframework.org/schema/tx/spring-tx.xsd">
      
          <!--1. 扫描 service下的包-->
          <context:component-scan base-package="com.song.service"/>
      
          <!--2. 将所有的业务类注入到 spring-->
          <bean id="BookServiceImpl" class="com.song.service.BookServiceImpl">
              <property name="bookMapper" ref="bookMapper"/>
          </bean>
      
          <!--3. 声明式事务-->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <!--注入数据源-->
              <property name="dataSource" ref="dataSource"/>
          </bean>
      
          <!--4. aop 事务支持-->
          <!--结合AOP,实现事务的织入-->
          <!--配置事务通知-->
          <tx:advice id="txAdvice" transaction-manager="transactionManager">
              <!--给哪些方法配置事务-->
              <!--配置事务的传播特性  propagation-->
              <tx:attributes>
                  <tx:method name="*" propagation="REQUIRED"/>
              </tx:attributes>
          </tx:advice>
      
          <!--配置事务切入-->
          <aop:config>
              <aop:pointcut id="txPointCut" expression="execution(* com.song.dao.*.*(..))"/>
              <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
          </aop:config>
      
      </beans>
      

    6、SpringMVC 层

    1. **web.xml **中配置 DispatcherServlet 和乱码过滤

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
      
      
          <!--DispatcherServlet-->
          <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:applicationContext.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>
      
          <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      
          <!--乱码过滤-->
          <filter>
              <filter-name>encodingFilter</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>encodingFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      
          <!--Session 过期时间-->
          <session-config>
              <session-timeout>15</session-timeout>
          </session-config>
      
      </web-app>
      
    2. spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
             xmlns:context="http://www.springframework.org/schema/context"
             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
             https://www.springframework.org/schema/context/spring-context.xsd">
      
      
          <!--1.开启SpringMVC注解驱动-->
          <mvc:annotation-driven/>
          <!--2.静态资源过滤-->
          <mvc:default-servlet-handler/>
          <!--3.扫描包:controller(扫描web相关的bean)-->
          <context:component-scan base-package="com.song.controller"/>
      
      
          <!--4.视图解析器-->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix" value="/WEB-INF/jsp/"/>
              <property name="suffix" value=".jsp"/>
          </bean>
      
      </beans>
      
    3. Spring 配置整合文件,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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd">
      
          <import resource="classpath:spring-dao.xml"/>
          <import resource="classpath:spring-service.xml"/>
          <import resource="classpath:spring-mvc.xml"/>
      
      </beans>
      

    配置文件结束,接下来要进行 Controller 和视图层编写,实现功能

    7、Controller 和视图层(实现功能)

    7.1 查询全部书籍

    1. 编写 BookController

      @Controller
      @RequestMapping("/book")
      public class BookController {
          // Controller调service层
          @Autowired
          @Qualifier("BookServiceImpl")
          private BookService bookService;
      
          // 查询全部的书籍
          @RequestMapping("/allBook")
          public String list(Model model){
              List<Books> list = bookService.queryAllBooks();
              model.addAttribute("list", list);
              return "allBook";  // localhost:8080/book/allBook.jsp
          }
      }
      
    2. 编写首页 index.jsp

      点击首页的超链接 进入书籍页面 ,DispatcherServlet 会接收并拦截这个超链接的 url,通过 SpringMVC 中的处理器映射器和适配器,BookController 根据 /book/allBook 执行 list() 方法,进行业务处理并返回模型数据,最后通过视图解析器渲染视图,将结果显示在 allBook.jsp 页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
        <head>
          <title>首页</title>
      
          <style>
              a{
                  text-decoration: none;
                  color: black;
                  font-size: 18px;
              }
              h3{
                   180px;
                  heigh: 38px;
                  margin: 100px auto;
                  text-align: center;
                  line-height: 38px;
                  background: deepskyblue;
                  border-radius: 5px;
              }
          </style>
      
        </head>
        <body>
      
        <h3>
          <a href="${pageContext.request.contextPath}/book/allBook">进入书籍页面</a>
        </h3>
      
        </body>
      </html>
      
    3. 查询全部书籍后跳转到的页面 allBook.jsp,会将 Controller 中的 list 遍历出来放到一个表格中

      使用 Bootstrap 美化界面

      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>书籍展示页面</title>
      
          <%--Bootstrap美化界面--%>
          <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
      
      </head>
      <body>
      
      <div class="container">
      
          <div class="row clearfix">
              <div class="col-md-12 column">
                  <div class="page-header">
                      <h1>
                          <small>书籍列表 —————— 显示所有书籍</small>
                      </h1>
                  </div>
              </div>
      
              <div class="row">
                  <div class="col-md-4 column">
                      <%--toAddBook--%>
                      <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增书籍</a>
                      <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/allBook">显示全部书籍</a>
                  </div>
                  <div class="col-md-4 column"></div>
                  <div class="col-md-4 column">
                      <%--查询书籍--%>
                      <form action="${pageContext.request.contextPath}/book/queryBook" method="post" style="float:right" class="form-inline">
                          <span style="color:red;font-weight:bold">${error}</span>
                          <input type="text" name="queryBookName" class="form-control" placeholder="请输入要查询的书籍名称">
                          <input type="submit" value="查询" class="btn btn-primary">
                      </form>
                  </div>
              </div>
      
          </div>
      
          <div class="row clearfix">
              <div class="col-md-12 column">
                  <table class="table table-hover table-striped">
                      <thead>
                          <tr>
                              <th>书籍编号</th>
                              <th>书籍名称</th>
                              <th>书籍数量</th>
                              <th>书籍详情</th>
                              <th>操作</th>
                          </tr>
                      </thead>
      
                      <%--书籍从数据库查询出来,从list中遍历出来:foreach--%>
                      <tbody>
                          <c:forEach var="book" items="${list}">
                              <tr>
                                  <td>${book.bookID}</td>
                                  <td>${book.bookName}</td>
                                  <td>${book.bookCounts}</td>
                                  <td>${book.detail}</td>
                                  <td>
                                      <a href="${pageContext.request.contextPath}/book/toUpdate?id=${book.bookID}">修改</a>
                                      &nbsp; | &nbsp;
                                      <a href="${pageContext.request.contextPath}/book/deleteBook/${book.bookID}">删除</a>
                                  </td>
                              </tr>
                          </c:forEach>
                      </tbody>
                  </table>
              </div>
          </div>
      </div>
      
      
      </body>
      </html>
      

    7.2 添加书籍

    1. 前面的 BookController 类中添加【跳转到增加书籍页面】和【添加书籍的请求】的方法。

      allBook.jsp 页面添加一个 新增书籍 超链接,点击这个按钮之后根据请求路径 /book/toAddBook 跳转到 addBook.jsp 界面。

      添加完书籍之后,根据请求路径 /book/addBook 会重定向到 显示全部书籍 allBook.jsp 页面。

      <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增书籍</a>
      
      // 跳转到增加书籍页面
      @RequestMapping("/toAddBook")
      public String toAddPage(){
          return "addBook";
      }
      
      // 添加书籍的请求
      @RequestMapping("/addBook")
      public String addBook(Books books){
          System.out.println("addBook=>"+ books);
          bookService.addBook(books);
          return "redirect:/book/allBook"; //重定向到@RequestMapping("/allBook")请求
      }
      
    2. 添加书籍页面:addBook.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      
          <%--Bootstrap美化界面--%>
          <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
      </head>
      <body>
      
      <div class="container">
      
          <div class="row clearfix">
              <div class="col-md-12 column">
                  <div class="page-header">
                      <h1>
                          <small>新增书籍</small>
                      </h1>
                  </div>
              </div>
          </div>
      
          <form action="${pageContext.request.contextPath}/book/addBook" method="post">
              <div class="form-group">
                  <label>书籍名称:</label>
                  <input type="text" name="bookName" class="form-control" required>
              </div>
              <div class="form-group">
                  <label>书籍数量:</label>
                  <input type="text" name="bookCounts" class="form-control" required>
              </div>
              <div class="form-group">
                  <label>书籍详情:</label>
                  <input type="text" name="detail" class="form-control" required>
              </div>
              <div class="form-group">
                  <input type="submit" class="form-control" value="添加">
              </div>
          </form>
      
      </div>
      
      </body>
      </html>
      

    7.3 修改书籍信息

    1. 前面的 BookController 类中添加【跳转到修改书籍页面】和【修改书籍的请求】的方法。

      allBook.jsp 页面的表格中添加一列【操作】的选项,每一行有【修改和删除】的超链接,点击之后会对某个对象进行相应操作。

      对于【修改】操作,点击之后根据 /book/toUpdate 跳转到修改页面 updateBook.jsp。注意:要在点击按钮时自动获取 bookID 参数,并将其作为请求参数传入控制器,这样,可以根据 bookID 查询出对应书籍的信息显示在修改页面。

      修改后根据请求 /book/updateBook 会将新的 book 对象传入 updateBook,该方法会调用业务层和 dao 层的 update 方法和数据库进行交互,执行完这些操作后重定向到 allBook.jsp

      <th>操作</th>
      
      <td>
          <a href="${pageContext.request.contextPath}/book/toUpdate?id=${book.bookID}">修改</a>
          &nbsp; | &nbsp;
          <a href="${pageContext.request.contextPath}/book/deleteBook/${book.bookID}">删除</a>
      </td>
      
      // 跳转到修改页面
      @RequestMapping("/toUpdate")
      public String toUpdatePage(int id, Model model){
          Books books = bookService.queryBookById(id);
          model.addAttribute("QBooks",books);  // QBooks信息会显示在前端
          return "updateBook";
      }
      
      // 修改书籍
      @RequestMapping("/updateBook")
      public String updateBook(Books books){  // 前端修改后的数据传入
          System.out.println("updateBook=>" + books);
          int i = bookService.updateBook(books);
          if(i>0){
              System.out.println("添加books成功" + books);
          }
          return "redirect:/book/allBook";
      }
      
    2. 修改书籍页面 updateBook.jsp

      注意:别忘了传递 bookID,否则会传递 bookID=0 修改不成功

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>修改书籍</title>
      
          <%--Bootstrap美化界面--%>
          <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
      </head>
      <body>
      
      <div class="container">
      
          <div class="row clearfix">
              <div class="col-md-12 column">
                  <div class="page-header">
                      <h1>
                          <small>修改书籍</small>
                      </h1>
                  </div>
              </div>
          </div>
      
          <form action="${pageContext.request.contextPath}/book/updateBook" method="post">
              <%--出现的问题:提交了修改的SQL请求,但是修改失败,初次考虑是事务问题,配置完毕,依旧失败
                  看SQL语句能否执行成功:SQL执行失败,修改未完成--%>、、
              <%--前端传递隐藏域--%>
              <input type="hidden" name="bookID" value="${QBooks.bookID}">
      
              <div class="form-group">
                  <label>书籍名称:</label>
                  <input type="text" name="bookName" class="form-control" value="${QBooks.bookName}" required>
              </div>
              <div class="form-group">
                  <label>书籍数量:</label>
                  <input type="text" name="bookCounts" class="form-control" value="${QBooks.bookCounts}" required>
              </div>
              <div class="form-group">
                  <label>书籍详情:</label>
                  <input type="text" name="detail" class="form-control" value="${QBooks.detail}" required>
              </div>
              <div class="form-group">
                  <input type="submit" class="form-control" value="修改">
              </div>
          </form>
      
      </div>
      
      </body>
      </html>
      

    7.4 删除书籍

    1. allBook.jsp 页面添加删除的超链接,点击之后会发送 /book/deleteBook/${book.bookID} 请求

       <a href="${pageContext.request.contextPath}/book/deleteBook/${book.bookID}">删除</a>
      
    2. 前面的 BookController 类中添加【根据 id 删除书籍】的方法。

      该方法接收到请求参数,调用 service 和 dao 层执行删除操作,最后重定向到 allBook.jsp

      // 删除书籍 这里使用了RestFul风格
      @RequestMapping("/deleteBook/{bookId}")
      public String deleteBook(@PathVariable("bookId") int id){
          bookService.deleteBookById(id);
          return "redirect:/book/allBook";
      }
      

    7.5 搜索书籍(根据名称查询书籍)

    1. allBook.jsp 页面添加一个 form 表单,输入书籍名称后点击查询会发送 /book/queryBook 请求,Controller 会根据这个请求做出相应处理。

      <%--查询书籍--%>
      <form action="${pageContext.request.contextPath}/book/queryBook" method="post" style="float:right" class="form-inline">
          <span style="color:red;font-weight:bold">${error}</span>
          <input type="text" name="queryBookName" class="form-control" placeholder="请输入要查询的书籍名称">
          <input type="submit" value="查询" class="btn btn-primary">
      </form>
      
    2. 前面的 BookController 类中添加【根据名称查询书籍】的方法。

      查询完成之后转发到 allBook.jsp 页面,输入为空或者输入不匹配会显示“未查到”,仍显示全部书籍。

      // 查询书籍
      @RequestMapping("/queryBook")
      public String queryBook(String queryBookName, Model model){
          Books books = bookService.queryBookByName(queryBookName);
          List<Books> list = new ArrayList<Books>();
          list.add(books);
      
          //查询优化
          if(books == null){
              list = bookService.queryAllBooks();
              model.addAttribute("error", "未查到");
          }
      
          model.addAttribute("list", list);
          return "allBook";
      }
      

    8、结果展示

    • index.jsp

    • allBook.jsp

    • addBook.jsp

    • updateBook.jsp

    9、注意事项

    • 要确保 IDEA 的项目发布中,添加 lib 依赖,否则会出现 404 错误

    • 要确保 Tomcat 服务器中部署了项目

    • 服务器使用说明

      • 修改了 java 代码,Redeploy
      • 修改了配置文件,重启服务器
      • 修改了前端页面,更新资源

  • 相关阅读:
    matplotlib数据可视化之柱形图
    xpath排坑记
    Leetcode 100. 相同的树
    Leetcode 173. 二叉搜索树迭代器
    Leetcode 199. 二叉树的右视图
    Leetcode 102. 二叉树的层次遍历
    Leetcode 96. 不同的二叉搜索树
    Leetcode 700. 二叉搜索树中的搜索
    Leetcode 2. Add Two Numbers
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/Songzw/p/13192529.html
Copyright © 2011-2022 走看看