zoukankan      html  css  js  c++  java
  • SSM 项目整合(书籍管理系统)

    SSM 项目整合(书籍管理系统)

    新建项目工程

    配置Tomcat

    项目结构目录

    导入 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.xiang</groupId>
        <artifactId>bms</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>bms</name>
        <packaging>war</packaging>
    
        <properties>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.source>1.8</maven.compiler.source>
            <junit.version>5.7.1</junit.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.25</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>2.0.6</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.6</version>
            </dependency>
            <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>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.3.10</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.3.9</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.20</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.13.0-rc2</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>5.1.2</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>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>utf-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    编写data.sql

    -- 创建数据库
    create
    database webapp3 charset utf8mb4;
    -- 创建用户名、密码
    create
    user'webapp3'@'localhost'identified by'webapp3';
    -- 授权
    grant all
    on webapp3.*to'webapp3'@'localhost';
    -- 用用户名、密码登录
    mysql
    -uwebapp3 -pwebapp3;
    
    create table user
    (
        id       int not null primary key auto_increment,
        username varchar(50), --用户名
        password varchar(50)  -- 密码
    );
    
    insert into user
        (`username`, `password`)
    values ("xiang", "123456");
    
    create table book
    (
        bookId int not null primary key auto_increment, --图书id
        name   varchar(50),                             --图书名
        author varchar(50),                             --图书作者
        press  varchar(50),                             --图书出版社
        price  double(6, 2                              --图书单价
    )
        );
    insert into book (`name`, `author`, `press`, `price`)
    values ("数据库系统实现", "加西亚-莫利纳(Hector Garcia-Molina)", "机械工业出版社", "99.99"),
           ("数据库系统基础教程", "(美)厄尔曼", "机械工业出版社", "89.99"),
           ("Three.js入门指南", "余振华", "人民邮电出版社", "89.99"),
           ("术与道 移动应用UI设计必修课", "张雯莉", "图灵社区", "89.99"),
           ("数学思维导论", "[美] Keith Devlin", "人民邮电出版社", "89.99"),
           ("JSON必知必会", "[美] Lindsay Bassett", "人民邮电出版社", "89.99"),
           ("第一本Docker书", "[澳]詹姆斯•特恩布尔(James Turnbull)", "人民邮电出版社", "89.99"),
           ("HTML5与WebGL编程", "[美] Tony Parisi", "人民邮电出版社", "89.99"),
           ("智能Web算法", "Haralambos Marmanis / Dmitry Babenko", "电子工业出版社", "89.99");
    
    

    编写druid.properties

    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3307/webapp3
    jdbc.username=webapp3
    jdbc.password=webapp3
    
    #这里的每一个key的前面加了jdbc的原因是,如果不加有可能会与电脑的其他路径相冲突
    

    编写log4j.properties

    #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
    log4j.rootLogger=DEBUG,console,file
    
    #控制台输出的相关设置
    log4j.appender.console = org.apache.log4j.ConsoleAppender 
    log4j.appender.console.Target = System.out
    log4j.appender.console.Threshold=DEBUG
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
    
    #文件输出的相关设置
    log4j.appender.file = org.apache.log4j.RollingFileAppender
    log4j.appender.file.File=./log/xiang.log
    log4j.appender.file.MaxFileSize=10mb
    log4j.appender.file.Threshold=DEBUG
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
    log4j.appender.QCDataWS_LOG.encoding=utf-8
    
    #日志输出级别
    log4j.logger.org.mybatis=DEBUG
    log4j.logger.java.sql=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.ResultSet=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    

    编写spring-mybatis.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">
    
        <!--导入druid.properties进行关联-->
        <context:property-placeholder location="classpath:druid.properties"/>
    
        <!--配置数据库连接池-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <!--注入连接属性-->
            <property name="driverClassName" value="${jdbc.driverClassName}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </bean>
    
        <!--配置SqlSessionFactory对象,该对象可以生成SqlSession对象-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--连接数据源-->
            <property name="dataSource" ref="dataSource"/>
            <!--绑定Mybatis的配置文件-->
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
        </bean>
    
        <!--配置MapperScannerConfigurer,将创建的接口的都自动注入到了SqlSessionFactory中,
            给每个接口创建了实例-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--确定哪个包下的接口需要创建实体类-->
            <property name="basePackage" value="com.xiang.mapper"/>
            <!--指定需要注入到哪一个SqlSessionFactory中-->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
    
    </beans>
    

    编写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:tx="http://www.springframework.org/schema/tx"
           xmlns:jdbc="http://www.springframework.org/schema/jdbc"
           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/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
    
    
        <!-- 配置事务管理器 -->
        <!--1.创建事务管理器-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--注入数据源-->
            <constructor-arg ref="dataSource" />
        </bean>
    
        <!--2.开启事务注解,需要导入tx命名空间-->
        <!--transaction-manager="transactionManager" : 绑定事务管理器-->
        <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    
        <jdbc:embedded-database id="dataSource"/>
    </beans>
    

    编写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:context="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
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--开启注解支持,确定扫描的包-->
        <!--    <context:component-scan base-package="com.xiang"/>-->
    
        <!--开启mvc的注解支持-->
        <!--<mvc:annotation-driven/>-->
        <!--开启mvc的注解支持,同时解决json乱码问题,这是固定的,记住怎么使用就可以-->
        <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                        <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                            <property name="failOnEmptyBeans" value="false"/>
                        </bean>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
        <!-- 让Spring MVC不处理静态资源,比如.css .js .mp4 .jpg .html等 -->
        <!-- 该请求没有对应的@requestmapping时,将该请求交给服务器默认的servlet去处理 -->
        <mvc:default-servlet-handler/>
        <!-- 静态资源处理, css, js, imgs -->
    <!--    <mvc:resources mapping="/resource/css/**" location="/resource/css/"/>-->
    <!--    <mvc:resources mapping="/resource/js/**" location="/resource/js/"/>-->
    <!--    <mvc:resources mapping="/resource/image/**" location="/resource/image/"/>-->
    
        <!--配置视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    

    编写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>
        <!--    设置-->
        <settings>
            <!--        设置日志-->
            <setting name="logImpl" value="LOG4J"/>
        </settings>
        <!--    别名-->
        <typeAliases>
            <package name="com.xiang"/>
        </typeAliases>
        <!--引入pageHelper分页插件,注意整个plugins标签位置,位置不对会报错!-->
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
        </plugins>
        <!--    关联UserMapper.xml 文件-->
        <mappers>
            <!--        <mapper resource="com/xiana/mapper/UserMapper.xml"/>-->
            <mapper class="com.xiang.mapper.UserMapper"/>
            <mapper class="com.xiang.mapper.BookMapper"/>
        </mappers>
    
    
    </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"
           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">
        <!--扫描包-->
        <context:component-scan base-package="com.xiang"/>
        <import resource="spring-mvc.xml"/>
        <import resource="spring-service.xml"/>
        <import resource="spring-mybatis.xml"/>
    
    
    </beans>
    

    编写User

    package com.xiang.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.stereotype.Component;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 0:58
     */
    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        /**
         * id       int not null primary key auto_increment,
         * username varchar(12), --用户名
         * password varchar(12)  -- 密码
         */
        private int id;
        private String username;
        private String password;
    }
    
    

    编写Book

    package com.xiang.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.stereotype.Component;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 0:58
     */
    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Book {
        /**
         * bookId int not null primary key auto_increment, --图书id
         * name   varchar(50),                             --图书名
         * author varchar(50),                             --图书作者
         * press  varchar(50),                             --图书出版社
         * price  double(6, 2                              --图书单价
         */
        private int bookId;
        private String name;
        private String author;
        private String press;
        private double price;
    }
    
    

    编写UserMapper

    package com.xiang.mapper;
    
    import com.xiang.pojo.User;
    import org.springframework.stereotype.Component;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 1:04
     */
    @Component
    public interface UserMapper {
        //登录验证
        User logincheck(User user);
        //注册
        void register(User user);
    
        //检查是否用户存在
        String checkUserName(String username);
    }
    
    

    编写UserMapper.xml

    <?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.xiang.mapper.UserMapper">
    
        <select id="logincheck" parameterType="user" resultType="user">
            select *
            from user
            <where>
                <if test="username != null and username != ''">
                    and `username` = #{username}
                </if>
                <if test="password != null and password != ''">
                    AND `password` = #{password}
                </if>
            </where>
        </select>
    
        <select id="checkUserName" parameterType="String" resultType="String">
            select *
            from user
            <where>
                <if test="username != null and username != ''">
                    AND `username` = #{username}
                </if>
            </where>
        </select>
    
        <insert id="register" parameterType="user">
            insert into user(username, password)
                value (#{username},#{password})
        </insert>
    
    </mapper>
    

    编写BookMapper

    package com.xiang.mapper;
    
    import com.xiang.pojo.Book;
    import com.xiang.pojo.User;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 1:04
     */
    @Component
    public interface BookMapper {
        /**
         * * bookId int not null primary key auto_increment, --图书id
         * * name   varchar(50),                             --图书名
         * * author varchar(50),                             --图书作者
         * * press  varchar(50),                             --图书出版社
         * * price  double(6, 2                              --图书单价
         *
         * @param book
         * @return
         */
    
        // 增
        int addBook(Book book);
    
        // 删
        int deleteBook(int bookId);
    
        // 改
        int updateBook(Book book);
    
        // 查所有
        List<Book> queryAllBook();
    
        // 根据id查一个
        Book queryBookById(int bookId);
    
        //条件查询
        List<Book> conditionQuery(Book book);
    
    }
    
    

    编写BookMapper.xml

    <?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.xiang.mapper.BookMapper">
        <!--    `name`, `author`, `press`, `price`-->
        <!--增-->
        <insert id="addBook" parameterType="book">
            insert into book(name, author, press, price)
            values (#{name}, #{author}, #{press}, #{price})
        </insert>
    
        <!--删-->
        <delete id="deleteBook" parameterType="int">
            delete
            from book
            where bookId = #{bookId}
        </delete>
    
        <!--改-->
        <update id="updateBook" parameterType="book">
            update book
            set name=#{name},
                author=#{author},
                press=#{press},
                price=#{price}
            where bookId = #{bookId}
        </update>
    
        <!--查所有-->
        <select id="queryAllBook" resultType="book">
            select *
            from book
        </select>
    
        <!--根据id查一个-->
        <select id="queryBookById" resultType="book" parameterType="int">
            select *
            from book
            where bookId = #{bookId}
        </select>
    
        <!--根据条件查询-->
        <select id="conditionQuery" resultType="book" parameterType="book">
            select * from book
            <where>
                <if test="name != null and name != ''">
                    name = #{name}
                </if>
                <if test="author != null and author != ''">
                    and author=#{author}
                </if>
                <if test="press != null and press != ''">
                    and press=#{press}
                </if>
            </where>
        </select>
    
    </mapper>
    

    编写UserService

    package com.xiang.service;
    
    import com.xiang.pojo.User;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 0:58
     */
    public interface UserService {
        //登录验证
        User logincheck(User user);
        //注册
        void register(User user);
    
    
        //检查是否用户存在
        String checkUserName(String username);
    }
    
    

    编写UserServiceImpl

    package com.xiang.service.impl;
    
    import com.xiang.mapper.UserMapper;
    import com.xiang.pojo.User;
    import com.xiang.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 0:59
     */
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserMapper userMapper;
    
        @Override
        public User logincheck(User user) {
            return userMapper.logincheck(user);
    
        }
    
        @Override
        public void register(User user) {
            userMapper.register(user);
    
        }
    
        @Override
        public String checkUserName(String username) {
            return userMapper.checkUserName(username);
        }
    
    }
    
    

    编写BookService

    package com.xiang.service;
    
    import com.xiang.pojo.Book;
    
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 0:58
     */
    public interface BookService {
        // 增
        int addBook(Book book);
    
        // 删
        int deleteBook(int bookId);
    
        // 改
        int updateBook(Book book);
    
        // 查所有
        List<Book> queryAllBook();
    
        // 根据id查一个
        Book queryBookById(int bookId);
    
        //条件查询
        List<Book> conditionQuery(Book book);
    }
    
    

    编写BookServiceImpl

    package com.xiang.service.impl;
    
    import com.xiang.mapper.BookMapper;
    import com.xiang.pojo.Book;
    import com.xiang.service.BookService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 0:59
     */
    @Service
    public class BookServiceImpl  implements BookService {
        @Autowired
        private BookMapper bookMapper;
        @Override
        public int addBook(Book book) {
            return bookMapper.addBook(book);
        }
    
        @Override
        public int deleteBook(int bookId) {
            return bookMapper.deleteBook(bookId);
        }
    
        @Override
        public int updateBook(Book book) {
            return bookMapper.updateBook(book);
        }
    
        @Override
        public List<Book> queryAllBook() {
            return bookMapper.queryAllBook();
        }
    
        @Override
        public Book queryBookById(int bookId) {
            return bookMapper.queryBookById(bookId);
        }
    
        @Override
        public List<Book> conditionQuery(Book book) {
            return bookMapper.conditionQuery(book);
        }
    }
    
    

    编写UserController

    package com.xiang.controller;
    
    import com.xiang.pojo.User;
    import com.xiang.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    /**
     * Created by IntelliJ IDEA.
     * User: xiang
     * Date: 2021/9/28 1:00
     */
    @Controller
    public class UserController {
        @Autowired
        private UserService userService;
    
        //登录验证
        @RequestMapping("/login")
        public String login(@RequestParam("username") String username,
                            @RequestParam("password") String password, Model model, HttpServletRequest request, User user) {
            HttpSession session = request.getSession();
            session.setAttribute("UserSession", user);
    //        User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            if (userService.logincheck(user) != null) {
                model.addAttribute("username", username);
                return "redirect:/list";
            } else {
                model.addAttribute("error", "账号或密码错误");
                return "index";
            }
        }
    
        //注册
        @RequestMapping("/register")
        public String register(@RequestParam String username,@RequestParam String password, Model model) {
            User user = new User();
            System.out.println("执行");
            String s = userService.checkUserName(username);
            System.out.println("s"+s);
            if(s==null){
                user.setUsername(username);
                user.setPassword(password);
                userService.register(user);
                return "redirect:/list";
            }else {
                model.addAttribute("fail","该用户存在");
                System.out.println("该用户存在");
                return "/register";
            }
    
        }
    
        //注销
        @RequestMapping(value = "/logout")
        public String getLogout(HttpServletRequest request) {
            HttpSession session = request.getSession();
            if (session != null) {
                session.removeAttribute("UserSession");
            }
            return "index";
    
        }
    
    }
    
    

    编写BookController

    package com.xiang.controller;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.xiang.pojo.Book;
    import com.xiang.service.BookService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.*;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     * book: xiang
     * Date: 2021/9/28 1:01
     */
    @Controller
    public class BookController {
        @Autowired
        private BookService bookServiceImpl;
    
        //查询所有并分页显示
        @GetMapping("/list")
        public String queryAllbook(@RequestParam(value = "page", defaultValue = "1") Integer page, Model model){
            //获取指定页数据,每页显示5条数据
            PageHelper.startPage(page, 5);
            //紧跟的第一个select方法被分页
            List<Book> books = bookServiceImpl.queryAllBook();
            model.addAttribute("books",books);
            //使用PageInfo包装数据 navigatePages表示导航标签的数量
            PageInfo pageInfo = new PageInfo(books, 5);
            model.addAttribute("pageInfo", pageInfo);
            return null;
        }
    
    
    
        @PostMapping("/add")
        public String addbook(Book book) {
            int i = bookServiceImpl.addBook(book);
            return "redirect:/list";  // redirect 重定向/跳转
        }
    
        @GetMapping("/queryBookById/{bookId}")
        public String querybookById(@PathVariable("bookId") Integer bookId, Model model) {
            Book book = bookServiceImpl.queryBookById(bookId);
            model.addAttribute("book",book);
            return "update";  //转发(默认为)
        }
    
        @PostMapping("/update")
        public String queryBookById(Book book) {
            System.out.println(book);
            int i = bookServiceImpl.updateBook(book);
            return "redirect:/list";
        }
    
        @GetMapping("/delete/{bookId}")
        public String deletebook(@PathVariable("bookId") int bookId) {
            int i = bookServiceImpl.deleteBook(bookId);
            return "redirect:/list";
        }
    
        @GetMapping("/conditionQuery")
        public String deletebook(Book book,Model model) {
            List<Book> books = bookServiceImpl.conditionQuery(book);
            model.addAttribute("books",books);
            return "list";
        }
    
    
    
    
    }
    

    配置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">
    
        <!--配置DispatcherServlet,是SpringMVC的核心,又名前端控制器;用于拦截符合配置的 url 请求、分发请求-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--DispatcherServlet需要绑定Spring的配置文件-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applicationContext.xml</param-value>
            </init-param>
            <!--设置启动级别1:随着服务器的启动而启动-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
    <!--        <url-pattern>*.css</url-pattern>-->
    <!--        <url-pattern>*.js</url-pattern>-->
    <!--        <url-pattern>*.png</url-pattern>-->
    <!--        <url-pattern>*.gif</url-pattern>-->
    <!--        <url-pattern>*.jpg</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>
    
    </web-app>
    

    编写登录页CSS样式 login.css

    html,
    body {
        height: 100%;
    }
    
    body {
        display: -ms-flexbox;
        display: flex;
        -ms-flex-align: center;
        align-items: center;
        padding-top: 40px;
        padding-bottom: 40px;
        background-color: #f5f5f5;
    }
    
    .form-signin {
         100%;
        max- 330px;
        padding: 15px;
        margin: auto;
    }
    
    .form-signin .checkbox {
        font-weight: 400;
    }
    
    .form-signin .form-control {
        position: relative;
        box-sizing: border-box;
        height: auto;
        padding: 10px;
        font-size: 16px;
    }
    
    .form-signin .form-control:focus {
        z-index: 2;
    }
    
    .form-signin input[type="email"] {
        margin-bottom: -1px;
        border-bottom-right-radius: 0;
        border-bottom-left-radius: 0;
    }
    
    .form-signin input[type="password"] {
        margin-bottom: 10px;
        border-top-left-radius: 0;
        border-top-right-radius: 0;
    }
    
    

    登录页头像

    登录页 index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>login</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
        <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/resource/css/login.css">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    </head>
    <body class="text-center">
    <form class="form-signin" action="<%=request.getContextPath()%>/login">
        <img class="mb-4" src="<%=request.getContextPath()%>/resource/image/images.png" alt="" width="100" height="100">
        <h1 class="h3 mb-3 font-weight-normal">请登录</h1>
        <label for="username" class="sr-only">账号</label>
        <input type="text" name="username" id="username" class="form-control" placeholder="账号" required="" autofocus="">
        <label for="password" class="sr-only">密码</label>
        <input type="password" name="password" id="password" class="form-control" placeholder="密码" required="">
        <div class="checkbox mb-3">
            <label>
                <input type="checkbox" value="remember-me"> 记住我
            </label>
        </div>
        <%--    <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>--%>
        <%--    <a href="register.jsp" class="btn btn-lg btn-primary btn-block" type="submit">注册</a>--%>
    
        <a href="register.jsp" type="submit" class="btn btn-primary btn-lg">注册</a>
        <button type="submit" class="btn btn-primary btn-lg">登录</button>
    
        <p class="mt-5 mb-3 text-muted">© 2021</p>
    </form>
    </body>
    </html>
    
    

    注册页 register.jsp (与登录页一样)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>login</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
        <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/resource/css/login.css">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
        <script>
            /* function register(){
                 let username = document.getElementById("username").value;
                 let password  = document.getElementById("password").value;
                 alert(username+""+""+password);
                 window.location.href="http://localhost:8001/register/";
             }*/
        </script>
    </head>
    
    
    <c:if test="${fail != null} ">
        <div class="alert alert-danger" role="alert">
            <c:out value="${fail}"/>
            <c:remove var="fail" scope="session"/>
        </div>
    </c:if>
    
    
    <div style="color:red;font-size: 30px">
        <c:out value="${fail}"/>
    </div>
    <body class="text-center">
    <form class="form-signin" action="${pageContext.request.contextPath}/register">
        <img class="mb-4" src="<%=request.getContextPath()%>/resource/image/images.png" alt="" width="100" height="100">
        <h1 class="h3 mb-3 font-weight-normal">请登录</h1>
        <label for="username" class="sr-only">账号</label>
        <input type="text" name="username" id="username" class="form-control" placeholder="账号" required="" autofocus="">
        <label for="password" class="sr-only">密码</label>
        <input type="password" name="password" id="password" class="form-control" placeholder="密码" required="">
        <div class="checkbox mb-3">
            <label>
                <input type="checkbox" value="remember-me"> 记住我
            </label>
        </div>
        <%--    <a href="index.jsp" class="btn btn-lg btn-primary btn-block" type="submit">登录</a>--%>
        <%--    <button class="btn btn-lg btn-primary btn-block" type="submit">注册</button>--%>
    
    
        <button type="submit" class="btn btn-primary btn-lg">注册</button>
        <a href="index.jsp" class="btn btn-primary btn-lg">登录</a>
        <p class="mt-5 mb-3 text-muted">© 2021</p>
    </form>
    </body>
    </html>
    
    

    书箱列表展示页 list.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Xiang
      Date: 2021/9/28
      Time: 1:22
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>list</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div style=" 1200px;margin: auto">
        <div>
            <h4 align="center">书籍列表展示</h4>
        </div>
        <div>
            <form style="float: left;margin: 5px;" class="form-inline"
                  action="${pageContext.request.contextPath}/conditionQuery" method="get">
                <div class="form-group">
                    <label for="name">图书名</label>
                    <input type="text" name="name" class="form-control" id="name">
                </div>
                <div class="form-group">
                    <label for="author">图书作者</label>
                    <input type="text" name="author" class="form-control" id="author">
                </div>
                <div class="form-group">
                    <label for="press">图书出版社</label>
                    <input type="text" name="press" class="form-control" id="press">
                </div>
    
                <button type="submit" class="btn btn-info">查询</button>
            </form>
    
    
            <a style="float: right;margin: 5px;" class="btn btn-primary"
               href="${pageContext.request.contextPath}/list">书籍列表页</a>
            <a style="float: right;margin: 5px;" class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加书籍</a>
            <a style="float: right;margin: 5px;" class="btn btn-primary"
               href="${pageContext.request.contextPath}/logout">注销</a>
        </div>
    
        <%--    <table class="table table-hover">--%>
        <%--
            bookId int not null primary key auto_increment, --图书id
            name   varchar(50),                             --图书名
            author varchar(50),                             --图书作者
            press  varchar(50),                             --图书出版社
            price  double(6, 2                              --图书单价
            --%>
        <table class="table table-striped">
            <tr>
                <th>序号</th>
                <th>图书名</th>
                <th>图书作者</th>
                <th>图书出版社</th>
                <th>图书单价</th>
                <th>&nbsp;&nbsp;&nbsp;&nbsp;操作</th>
            </tr>
            <c:forEach items="${books}" var="book" varStatus="s">
                <tr>
                    <td>${s.count}</td>
                    <td>${book.name}</td>
                    <td>${book.author}</td>
                    <td>${book.press}</td>
                    <td>${book.price}</td>
                    <td>
                        <a href="${pageContext.request.contextPath}/delete/${book.bookId}" class="btn btn-danger">删除</a>
                        <a href="${pageContext.request.contextPath}/queryBookById/${book.bookId}"
                           class="btn btn-success">修改</a>
                    </td>
                </tr>
            </c:forEach>
    
        </table>
    
        <%--分页导航标签--%>
        <div class="row">
            <div class="col-md-6">
                第${pageInfo.pageNum}页,共${pageInfo.pages}页,共${pageInfo.total}条记录
            </div>
            <div class="col-md-6 offset-md-4">
                <nav aria-label="Page navigation example">
                    <ul class="pagination pagination-sm">
                        <li class="page-item"><a class="page-link"
                                                 href="${pageContext.request.contextPath}/list?page=1">首页</a></li>
                        <c:if test="${pageInfo.hasPreviousPage}">
                            <li class="page-item"><a class="page-link"
                                                     href="${pageContext.request.contextPath}/list?page=${pageInfo.pageNum-1}">上一页</a>
                            </li>
                        </c:if>
                        <c:forEach items="${pageInfo.navigatepageNums}" var="page">
                            <c:if test="${page==pageInfo.pageNum}">
                                <li class="page-item active"><a class="page-link" href="#">${page}</a></li>
                            </c:if>
                            <c:if test="${page!=pageInfo.pageNum}">
                                <li class="page-item"><a class="page-link"
                                                         href="${pageContext.request.contextPath}/list?page=${page}">${page}</a>
                                </li>
                            </c:if>
                        </c:forEach>
                        <c:if test="${pageInfo.hasNextPage}">
                            <li class="page-item"><a class="page-link"
                                                     href="${pageContext.request.contextPath}/list?page=${pageInfo.pageNum+1}">下一页</a>
                            </li>
                        </c:if>
                        <li class="page-item"><a class="page-link"
                                                 href="${pageContext.request.contextPath}/list?page=${pageInfo.pages}">末页</a>
                        </li>
                    </ul>
                </nav>
            </div>
        </div>
    
    
    </div>
    </body>
    </html>
    
    

    添加书籍页 add.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Xiang
      Date: 2021/9/28
      Time: 9:14
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>add</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div style=" 1200px;margin: auto">
        <div>
            <h4 align="center">添加书箱</h4>
        </div>
        <%--
        bookId int not null primary key auto_increment, --图书id
                name   varchar(50),                             --图书名
                author varchar(50),                             --图书作者
                press  varchar(50),                             --图书出版社
                price  double(6, 2                              --图书单价
        --%>
        <form class="form-horizontal" action="${pageContext.request.contextPath}/add" method="post">
            <div class="form-group">
                <label for="name" class="col-sm-2 control-label">图书名</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="name" name="name" placeholder="图书名">
                </div>
            </div>
    
            <div class="form-group">
                <label for="author" class="col-sm-2 control-label">图书作者</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="author" name="author" placeholder="图书作者">
                </div>
            </div>
    
            <div class="form-group">
                <label for="press" class="col-sm-2 control-label">图书出版社</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="press" name="press" placeholder="图书出版社">
                </div>
            </div>
             <div class="form-group">
                <label for="price" class="col-sm-2 control-label">图书单价</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="price" name="price" placeholder="图书单价">
                </div>
            </div>
    
    
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="submit" class="btn btn-success">确认添加</button>
    
                    <input type="button" onclick="history.go(-1)" class="btn btn-warning" value="取消添加"/>
                </div>
            </div>
        </form>
    </div>
    </body>
    </html>
    
    

    修改书籍信息页 update.jsp

    <%--
      Created by IntelliJ IDEA.
      User: Xiang
      Date: 2021/9/28
      Time: 10:50
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>update</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div style=" 1200px;margin: auto">
        <div>
            <h4 align="center">修改书籍信息</h4>
        </div>
        <%--
          bookId int not null primary key auto_increment, --图书id
                  name   varchar(50),                             --图书名
                  author varchar(50),                             --图书作者
                  press  varchar(50),                             --图书出版社
                  price  double(6, 2                              --图书单价
          --%>
        <form class="form-horizontal" action="${pageContext.request.contextPath}/update" method="post">
            <input name="bookId" value="${book.bookId}" hidden />
            <div class="form-group">
                <label for="name" class="col-sm-2 control-label">图书名</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="name" name="name" placeholder="姓名" value="${book.name}">
                </div>
            </div>
    
            <div class="form-group">
                <label for="author" class="col-sm-2 control-label">图书作者</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="author" name="author" placeholder="年龄" value="${book.author}">
                </div>
            </div>
    
            <div class="form-group">
                <label for="press" class="col-sm-2 control-label">图书出版社</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="press" name="press" placeholder="press" value="${book.press}">
                </div>
            </div>
            <div class="form-group">
                <label for="price" class="col-sm-2 control-label">图书单价</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="price" name="price" placeholder="price" value="${book.price}">
                </div>
            </div>
    
    
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="submit" class="btn btn-primary">确认修改</button>
    
                    <input type="button" onclick="history.go(-1)" class="btn btn-warning" value="取消修改"/>
                </div>
            </div>
        </form>
    </div>
    </body>
    </html>
    
    

    书籍管理系统 项目工程运行截图

    登录页面

    注册页面

    书籍列表展示页面

    添加书籍页面

    修改书籍页面

    至此 本项目工程完结

  • 相关阅读:
    gitlab web端使用
    1、gitlab的理论知识
    git命令
    gitlab web客户端的使用
    jenkins
    jenkins pipeline
    nginx
    ELK(+Redis)-开源实时日志分析平台
    OpenStack构架知识梳理
    Linux 下的dd命令使用详解
  • 原文地址:https://www.cnblogs.com/d534/p/15349364.html
Copyright © 2011-2022 走看看