介绍一个SSM框架搭建的Demo

本文简介

本文介绍的是使用SSM框架书写的一个Demo,非常适合初学SSM的伙伴进行练手,同时还可以巩固SSM的知识,加强自己的动手能力。

本次Demo使用到的技术为:
SSM+Mysql+Bootstrap+JSP+Maven+JSTL+EL

环境为:IDEA、MySQL5.7、Tomcat 7、JDK1.8、Win10、

本Demo的部分显示为:
在这里插入图片描述

数据库环境的搭建

建表语句以及插入数据的语句:

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 '描述',
PRIMARY 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,'从进门到进牢');

基本环境的搭建

1、新建一个普通的Maven工程

新建一个普通的Maven工程05ssm-build,并且在main的目录下新建webapp目录,在webapp目录下新建一个WEB-INF和index.jsp,在WEB-INF目录下新建一个web.xml文件,然后选中项目Ctrl+Shift+Alt+S进入到项目的设置,在Faces处点击+号新建一个Web,并且在在右边配置好web.xml文件和webapp的路径,然后点击apply即可。

2、添加Pom依赖以及配置资源拷贝

<?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.oldou</groupId>
    <artifactId>05ssm-build</artifactId>
    <version>1.0-SNAPSHOT</version>

    <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>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</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.2.8.RELEASE</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>
    <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>
</project>

导包之后,要去项目结构的配置中新增一个lib,并且选中lib右键拷贝所有的包。不然的话你的项目启动时就会一直报404异常等等。
在这里插入图片描述
在这里插入图片描述

3、建立基本的结构和配置框架

搭建架构:

  • com.oldou.pojo
  • com.oldou.mapper
  • com.oldou.service.impl
  • com.oldou.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-dao.xml : Spring连接数据库配置文件
<?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、开始编写数据库层面的配置

  • db.properties文件 放在resources目录下
jdbc.driver=com.mysql.jdbc.Driver
# 如果是mysql 8+的版本,需要添加时区  &serverTimezone=Asia/Shanghai
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
  • 编写实体类com.oldou.pojo.Books,并且使用lombok插件生成对应方法
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
    
    
    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;
}
  • 编写Mapper层接口 BooksMapper
public interface BooksMapper {
    
    
    //新增一本书
    int addBook(Books book);
    //更新一本书
    int updateBook(Books book);
    //删除一本书
    int deleteBook(int id);
    //查询一本书
    Books queryBookByID(int id);
    //查询所有的书
    List<Books> queryAllBooks();

    //根据名字查书籍
    Books queryBookByName(String name);
}
  • 编写BooksMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.oldou.mapper.BooksMapper">
    <!--增加一本书-->
    <insert id="addBook" parameterType="Books">
        insert into ssmbuild.books (bookName,bookCounts,detail)
        values(#{bookName},#{bookCounts},#{detail})
    </insert>

    <!--更新一本书-->
    <update id="updateBook" parameterType="Books">
        update ssmbuild.books
        set  bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
        where bookID = #{bookID}
    </update>

    <!--删除一本书-->
    <delete id="deleteBook" parameterType="int">
        delete from ssmbuild.books where bookID = #{bookID}
    </delete>
    
    <!--根据ID查询一本书-->
    <select id="queryBookByID" resultType="Books">
        select * from ssmbuild.books
        where  bookID = #{bookID}
    </select>

    <!--查询全部的书籍-->
    <select id="queryAllBooks" resultType="Books">
        select * from ssmbuild.books
    </select>

    <!--根据书籍名字查找书籍-->
    <select id="queryBookByName" resultType="Books">
        select * from ssmbuild.books where bookName = #{bookName}
    </select>
</mapper>
  • 编写Service层接口 com.oldou.service.BooksService
public interface BooksService {
    
    
    //新增一本书
    int addBook(Books book);
    //更新一本书
    int updateBook(Books book);
    //根据ID删除一本书
    int deleteBook(int id);
    //查询一本书
    Books queryBookByID(int id);
    //查询所有的书
    List<Books> queryAllBooks();

    //根据名字查书籍
    Books queryBookByName(String name);
}
  • 编写Service层接口实现类 com.oldou.service.impl.BooksServiceImpl
@Service
public class BooksServiceImpl implements BooksService {
    
    
    @Autowired
    private BooksMapper booksMapper;

    @Override
    public int addBook(Books book) {
    
    
        return booksMapper.addBook(book);
    }

    @Override
    public int updateBook(Books book) {
    
    
        return booksMapper.updateBook(book);
    }

    @Override
    public int deleteBook(int id) {
    
    
        return booksMapper.deleteBook(id);
    }

    @Override
    public Books queryBookByID(int id) {
    
    
        return booksMapper.queryBookByID(id);
    }

    @Override
    public List<Books> queryAllBooks() {
    
    
        return booksMapper.queryAllBooks();
    }

    @Override
    public Books queryBookByName(String name) {
    
    
        return booksMapper.queryBookByName(name);
    }
}

5、开始整合Spring框架,编写Spring的配置文件

  • 配置Spring整合MyBatis框架,数据源使用C3P0连接池
  • 编写Spring整合MyBatis的相关配置文件 applicationContext-dao.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"
       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">
  <!--整合MyBatis框架-->

    <!--1.关联数据库文件,扫描.properties文件-->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--2.数据库连接池 c3p0:自动化操作(自动加载配置文件 并且设置到对象里面)-->
    <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"/>
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--配置别名-->
        <property name="typeAliasesPackage" value="com.oldou.pojo"/>
        <!--配置Mapper.xml文件的路径-->
        <property name="mapperLocations" value="classpath:com/oldou/mapper/*.xml"/>
    </bean>

    <!--4.配置扫描mapper接口包,动态实现mapper接口注入到spring容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入sqlSqssionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--给出需要扫描的Mapper接口包-->
        <property name="basePackage" value="com.oldou.mapper"/>
    </bean>

</beans>
  • Spring整合Service层,编写 applicationContext-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"
       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">
    <!--扫描service相关bean-->
    <context:component-scan base-package="com.oldou.service"/>
    
</beans>
  • 编写事务的配置文件 applicationContext-tx.xml 这里将事务和Service层的配置文件进行了分离。
<?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:applicationContext-dao.xml"/>
    <!--配置事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入数据库连接池-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--aop事务的支持-->
</beans>

到此,Spring就整合完毕了,之后就开始进行SporingMVC的整合。

6、整合SpringMVC框架

  • web.xml文件的配置
<?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">

    <!--指定Spring配置文件的位置以及名称-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext-*.xml</param-value>
    </context-param>
    <!--配置启动Spring框架的监听器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--配置前端控制器DispactherServlet-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--配置字符编码过滤器-->
    <!--配置字符编码过滤器-->
    <filter>
        <filter-name>encoding</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>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--设置Session过期时间-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>

在该文件中,首先是配置了启动Spring框架的监听器,启动就加载Spring的配置文件,之后便是SpringMVC相关的前端控制器将SpringMVC的配置文件进行配置、还有字符编码过滤器以及Session的过期时间。并且在WEB-INF下新建jsp、css、js、img四个文件夹。

  • 编写SpringMVC的配置文件 springmvc-config.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:comtext="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--配置注解扫描-->
    <comtext:component-scan base-package="com.oldou.controller"/>

    <!--配置注解驱动-->
    <mvc:annotation-driven/>

    <!-- 配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--配置静态资源映射器-->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
    <mvc:resources mapping="/img/**" location="/WEB-INF/img/"/>
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>

   <!--配置拦截器-->
</beans>

以上配置了Controller层的注解扫描、以及注解驱动、视图解析器、静态资源映射器。到此,配置文件就都准备完成了。

7、实现基本的业务

  • 编写Controller层,新建一个BookController,编写查询全部书籍的代码
@Controller
@RequestMapping("book")
public class BookController {
    
    
    @Autowired
    private BooksService booksService;

    //查询所有的书籍
    @RequestMapping("/allBooks")
    public String showAllBooks(Model model){
    
    
        List<Books> books = booksService.queryAllBooks();
        model.addAttribute("books",books);
        return "/showBooks";
    }
}
  • 编写首页index.jsp的样式以及跳转
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index.jsp</title>
    <style type="text/css">
        a {
     
     
            text-decoration: none;
            color: black;
            font-size: 18px;
        }
        h3 {
     
     
            width: 180px;
            height: 38px;
            margin: 60px auto;
            text-align: center;
            line-height: 38px;
            background: deepskyblue;
            border-radius: 4px;
        }
    </style>
</head>
<body>
    <h1 align="center">菜单选项</h1>
    <hr/>
    <h3><a href="${pageContext.request.contextPath}/book/allBooks">查询所有书籍信息</a></h3>
</body>
</html>
  • 编写显示全部书籍的代码,新建showBooks.jsp,用于显示所有书籍信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<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 align="center">
                    <small>书籍列表 —— 显示所有书籍</small>
                </h1>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-md-4 column">
            <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增</a>
            <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/allBooks">查询全部书籍</a>
        </div>
        <div class="col-md-8 column">
            <form action="${pageContext.request.contextPath}/book/queryBook" method="post" class="form-inline " style="float: right">
                <span style="color: red;font-weight: bold">${error}</span>
                <input type="text" name="bookName" class="form-control" placeholder="请输入要查询的书籍"/>
                <input type="submit" value="查询" class="btn btn-primary" />

            </form>
        </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>

                <tbody>
                    <c:forEach items="${books}" var="books">
                        <tr>
                            <th>${books.bookID}</th>
                            <th>${books.bookName}</th>
                            <th>${books.bookCounts}</th>
                            <th>${books.detail}</th>
                            <td>
                                <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${books.bookID}">修改</a>
                                &nbsp;   |   &nbsp;
                                <a href="${pageContext.request.contextPath}/book/deleteBook/${books.bookID}">删除</a>
                            </td>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>
        </div>
    </div>
</div>

</body>
</html>

以上添加了Boostrap框架的CSS样式,用于将页面显示更加美观,以上代码为增删改查的最终版。
启动项目,浏览器进行访问:
在这里插入图片描述
点击查询所有书籍,前端就会从index.jsp的超链接到Controller层的/book/allBooks的方法,然后该方法调用业务层、业务层再调用Mapper层,再去访问数据库,将数据查询出来以后,逐一返回,最后数据被Model对象传到前端showBooks.jsp,再由前端JSTL标签进行显示。
在这里插入图片描述

  • 实现添加书籍功能,编写Controller层方法
//跳转到添加书籍的页面
@RequestMapping("/toAddBook")
public String toAddBook(){
    
    
    return "/addBook";
}

//添加书籍的操作
@RequestMapping("/addBook")
public String addBook(Books book){
    
    
    int i = booksService.addBook(book);
    if(i>0){
    
    
        System.out.println("添加书籍成功-->"+book);
    }
    return "redirect:/book/allBooks";
}

编写添加书籍的页面 addBook.jsp

<%@ 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"/>
</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">
        书籍名称:<input type="text" name="bookName" required="required"/><br><br><br>
        书籍数量:<input type="text" name="bookCounts" required="required"/><br><br><br>
        书籍详情:<input type="text" name="detail" required="required"/><br><br><br>
        <input type="submit" value="添加"/>
    </form>
</div>
</body>
</html>

运行项目,在显示全部书籍的页面中有一个新增按钮,点击新增,请求就会从showBooks.jsp由超链接到Controller层的/book/toAddBook的方法,然后由该方法转发到添加书籍的界面addBook.jsp,当添加好书籍的信息之后,点击添加提交,信息就会提交到Controller的addBook方法,该方法调用业务层将书籍信息新增到数据库,添加成功之后就重定向到显示所有书籍的页面。
在这里插入图片描述

  • 实现修改书籍的功能,在Controller层中添加以下方法
//跳转到更新书籍信息的界面
@RequestMapping("/toUpdateBook")
public String toUpdateBook(Model model,int id){
    
    
    Books books = booksService.queryBookByID(id);
    model.addAttribute("book",books);
    return "/updateBook";
}

//更新书籍信息
@RequestMapping("/updateBook")
public String updateBook(Model model,Books book){
    
    
    int i = booksService.updateBook(book);
    if(i>0){
    
    
        System.out.println("更新书籍成功");
    }
    return "redirect:/book/allBooks";
}

编写更新书籍的界面updateBook.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<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">
        <input type="hidden" name="bookID" value="${book.getBookID()}"/>
        <label>书籍名称:</label>
        <input type="text" name="bookName" value="${book.getBookName()}"/>
        <label>书籍数量:</label>
        <input type="text" name="bookCounts" value="${book.getBookCounts()}"/>
        <label>书籍详情:</label>
        <input type="text" name="detail" value="${book.getDetail() }"/>
        <input type="submit" value="提交"/>
    </form>

</div>
</body>
</html>

运行项目,首先会在显示所有书籍的页面,点击书籍信息后面的修改,就会根据超链接转到Controller层下的toUpdateBook方法并且携带该书籍的id信息,然后该方法接收到id信息之后,先去业务层再到数据库根据ID将书籍信息全部查找出来,然后由Model对象传到更新书籍信息的页面updateBook.jsp,然后在该页面中,修改好书籍信息之后,点击提交,就会将书籍信息提交到Controller下的updateBook方法,将书籍信息写入到数据库,并且重定向到查询所有书籍的方法,再到显示所有书籍的页面。
在这里插入图片描述

  • 实现删除书籍的方法
//根据ID删除书籍
@RequestMapping("/deleteBook/{bookID}")
public String deleteBook(@PathVariable("bookID") int id){
    
    
    int flag = booksService.deleteBook(id);
    if(flag>0){
    
    
        System.out.println("bookID为"+id+"的书籍删除成功!");
    }
    return "redirect:/book/allBooks";
}

在显示所有书籍的页面点击书籍后面的删除,就会根据超链接并且携带书籍的ID到这个方法,根据书籍的ID删除数据库中对应的数据,然后重定向到查询所有书籍的方法,再到显示所有书籍的页面。

  • 实现搜索框功能,在Controller中添加以下代码
//根据ID查询书籍
@RequestMapping("/queryBook")
public String queryBook(String bookName,Model model){
    
    
    Books book = booksService.queryBookByName(bookName);
    List<Books> books = new ArrayList<Books>();
    books.add(book);
    if(book==null){
    
    
        books = booksService.queryAllBooks();
        model.addAttribute("error","未查到该书籍!");
    }
    model.addAttribute("books",books);
    return "showBooks";
}

在showBooks.jsp中的新增代码后,添加了以下代码:

<div class="col-md-4 column">
    <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增</a>
    <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/allBooks">查询全部书籍</a>
</div>
<div class="col-md-8 column">
    <form action="${pageContext.request.contextPath}/book/queryBook" method="post" class="form-inline " style="float: right">
        <span style="color: red;font-weight: bold">${error}</span>
        <input type="text" name="bookName" class="form-control" placeholder="请输入要查询的书籍"/>
        <input type="submit" value="查询" class="btn btn-primary" />

    </form>
</div>

实现了1个搜索框,查询全部书籍的按钮是为了防止空查询时页面没有数据显示。在showBooks.jsp页面中的搜索框中输入书籍的名字,当然这里可以用模糊查询去实现(我没有用),当点击查询的时候,就会根据表单提交到queryBook方法中,然后就根据表单提交过来的书籍名称去数据库查询书籍,如果由则返回显示到页面,如果没有(为null)就会显示所有书籍,并且提示查询错误,无此数据。当查询到数据之后,想要显示全部书籍,就点击查询全部书籍按钮即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

这里将业务先写好了再去调用的,如果是正常情况下应该是先实现查询全部的功能,然后从mapper—>service—>Controller—>视图的编写。这样逐一去编写业务,当然每个人都有每个人的编码习惯,以上在JSP的页面中引入了Bootstrap的css样式进行了简单的页面编写,其实Bootstrap的中文官网里面有详细的教程可以尝试在该Demo的基础上再多加一些功能,比如文件的上传与下载等等。

本Demo要先弄好配置文件,一个业务一个业务的去编写,编写完一个业务操作之后就运行一下项目,看自己刚刚编写的能不能实现,如果出现异常了就检查异常是什么,自己将项目的业务逻辑理一遍过去,对着自己介绍一下这个业务是怎么实现的,不仅可以加强对项目的熟悉更能让自己对项目开发的业务流程更加熟练。

猜你喜欢

转载自blog.csdn.net/weixin_43246215/article/details/108349991