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> 操作</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>
书籍管理系统 项目工程运行截图
登录页面

注册页面

书籍列表展示页面

添加书籍页面

修改书籍页面

至此 本项目工程完结