所用技能:Mybatis+spring+SpringMVC+mysql+javase+jsp
文章目录
所需要的数据库
自己使用sqlyog可视化mysql软件创建一下吧!
1、创建Maven项目,pom中导入jar包,编写Mybatis、web、SpringMvc配置文件
1.1pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SSM框架整合</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Demo1</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--springMVC的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.13</version>
</dependency>
<!--自动编写pojo实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!--aop的包-->
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
<!--解决资源导入失败-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
1.2 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>
<--注册别名-->
<typeAliases>
<package name="pojo"/>
</typeAliases>
<!--注册dao接口-->
<mappers>
</mappers>
</configuration>
1.3 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"
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">
<!-- 数据库连接 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase?"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Mybatis全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="dao"/>
</bean>
<!-- 扫描service相关的bean -->
<context:component-scan base-package="service" />
<!--BookServiceImpl注入到IOC容器中-->
<bean id="bookServiceImpl" class="service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
<!--LoginServiceImpl注入IOC容器中-->
<bean id="loginServiceImpl" class="service.LoginIntoServiceImpl">
<property name="loginInfoMapper" ref="loginInfoMapper"/>
</bean>
<!--RegisterServiceImpl注入IOC容器中-->
<bean id="registerServiceImpl" class="service.RegisterServiceImpl">
<property name="registerMapper" ref="registerMapper"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启注解自动扫描-->
<context:component-scan base-package="controller"/>
<!--servlet处理器-->
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
这里的applicationContext.xml文件,建议用三层结构分开写,然后用import导入到applicationContext总文件中,这里为了写博客方便,整合在一起了
2、创建pojo实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private int id;
private String name;
private int bookCount;
private String author;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginInfo {
private int id;
private String username;
private String password;
}
3、创建dao接口
3.1 BookMapper
public interface BookMapper {
//增
@Insert("insert into mydatabase.books(name,bookCount,author) values (#{name},#{bookCount},#{author})")
int add(Book book);
//删
@Delete("delete from mydatabase.books where id=#{id}")
int delete(int id);
//改
@Update("update mydatabase.books set name=#{name},bookCount=#{bookCount},author=#{author} where id=#{id}")
int update(Book book);
//查
@Select("select * from mydatabase.books where id=#{id}")
Book getOne(int id);
@Select("select * from mydatabase.books")
List<Book> getAll();
}
3.2 LoginInfoMapper
public interface LoginInfoMapper {
@Select("select * from mydatabase.logininfo where username=#{username}")
LoginInfo select(String str);
}
3.3 RegisterMapper
public interface RegisterMapper {
@Insert("insert into mydatabase.logininfo(username,password) values(#{username},#{password})")
int insert(LoginInfo info);
@Select("select * from mydatabase.logininfo where username=#{username}")
LoginInfo queryName(String str);
}
3.4 在配置文件中注册
<mappers>
<mapper class="dao.BookMapper"/>
<mapper class="dao.LoginInfoMapper"/>
<mapper class="dao.RegisterMapper"/>
</mappers>
4、创建service层
4.1 BookService
public interface BookService {
//增
int add(Book book);
//删
int delete(int id);
//改
int update(Book book);
//查
Book getOne(int id);
List<Book> getAll();
}
@Service
public class BookServiceImpl implements BookService{
private BookMapper bookMapper;
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
@Override
public int add(Book book) {
return bookMapper.add(book);
}
@Override
public int delete(int id) {
return bookMapper.delete(id);
}
@Override
public int update(Book book) {
return bookMapper.update(book);
}
@Override
public Book getOne(int id) {
return bookMapper.getOne(id);
}
@Override
public List<Book> getAll() {
return bookMapper.getAll();
}
}
4.2 LoginInfoService
public interface LoginInfoService {
LoginInfo select(String str);
}
@Service
public class LoginIntoServiceImpl implements LoginInfoService{
private LoginInfoMapper loginInfoMapper;
public void setLoginInfoMapper(LoginInfoMapper loginInfoMapper) {
this.loginInfoMapper=loginInfoMapper;
}
@Override
public LoginInfo select(String str) {
return loginInfoMapper.select(str);
}
}
4.3 md5工具类
为了注册的时候,密码加密
public class MD5 {
public static String enmd5(String str) throws NoSuchAlgorithmException{
byte[] md5s = MessageDigest.getInstance("md5").digest(str.getBytes());
String md5code = new BigInteger(1, md5s).toString(16);
for (int i = 0;i < 32-md5code.length() ; i++){
md5code = "0" + md5code;
}
return md5code;
}
}
4.4 RegisterService
public interface RegisterService {
int insert(LoginInfo info);
LoginInfo queryName(String str);
}
@Service
public class RegisterServiceImpl implements RegisterService{
private RegisterMapper registerMapper;
public void setRegisterMapper(RegisterMapper registerMapper){
this.registerMapper=registerMapper;
}
@Override
public int insert(LoginInfo info){
String s = null;
String password = info.getPassword();
try {
s = MD5.enmd5(password);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
info.setPassword(s);
return registerMapper.insert(info);
}
@Override
public LoginInfo queryName(String str) {
return registerMapper.queryName(str);
}
}
5、创建controller层
5.1 LoginController
@Controller
public class LoginController {
@Autowired
private LoginIntoServiceImpl loginIntoService;
@GetMapping(value = "/toLogin")
public String toLogin() {
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String Login(HttpServletRequest request, Model model, HttpSession session) throws NoSuchAlgorithmException{
String username = request.getParameter("username");
LoginInfo info = loginIntoService.select(username);
String password = MD5.enmd5(request.getParameter("password"));
if (password.equals(info.getPassword())) {
session.setAttribute("info",info);
return "redirect:book/allBook";
}
model.addAttribute("msg", "账号密码错误!");
return "login";
}
@RequestMapping("/logout")
public String Logout(HttpSession session) {
session.invalidate();
return "redirect:toLogin";
}
}
5.2 RegisterController
public class RegisterController {
@Autowired
private RegisterServiceImpl registerService;
@RequestMapping(value = "/toReg",method = RequestMethod.GET)
public String toReg() {
return "reg";
}
@RequestMapping(value = "/reg",method = RequestMethod.POST)
public String reg(HttpServletRequest request, Model model,HttpSession session){
String username = request.getParameter("username");
LoginInfo info = new LoginInfo();
info.setUsername(username);
info.setPassword(request.getParameter("password"));
if (registerService.queryName(username) == null){
registerService.insert(info);
session.setAttribute("info",info);
return "redirect:book/allBook";
}
else {
model.addAttribute("error","用户名存在,不可以注册");
return "reg";
}
}
}
5.3 BookController
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
@Qualifier("bookServiceImpl")
private BookService bookService;
//查
@RequestMapping("/allBook")
public String list(Model model) {
List<Book> list = bookService.getAll();
model.addAttribute("list", list);
return "allBook";
}
//添加书籍
@RequestMapping("/toAddBook")
public String toAddPaper() {
return "addBook";
}
@RequestMapping("/addBook")
public String addPaper(Book books) {
System.out.println(books);
bookService.add(books);
return "redirect:/book/allBook";
}
//修改
@RequestMapping("/toUpdateBook")
public String toUpdateBook(Model model, int id) {
Book books = bookService.getOne(id);
System.out.println(books);
model.addAttribute("book",books);
return "updateBook";
}
@RequestMapping("/updateBook")
public String updateBook(Model model, Book book) {
System.out.println(book);
bookService.update(book);
Book books = bookService.getOne(book.getId());
model.addAttribute("books", books);
return "redirect:/book/allBook";
}
//删除
@RequestMapping("/del/{bookId}")
public String deleteBook(@PathVariable("bookId") int id) {
bookService.delete(id);
return "redirect:/book/allBook";
}
}
6、创建jsp页面
6.1 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE HTML>
<html>
<head>
<title>首页</title>
</head>
<body>
<h3>
<a href="${pageContext.request.contextPath}/toLogin">点击登录</a>
</h3>
</body>
</html>
6.2 login.jsp
<html>
<head>
<title>登录页面</title>
<style type="text/css">
.bg{
background-color: #FFDEE9;
background-image: linear-gradient(0deg, #FFDEE9 0%, #B5FFFC 100%);
}
</style>
</head>
<body class="bg" >
<div align="center" style="text-align: center">
<form action="${pageContext.request.contextPath}/login" method="post">
<p>用户名:
<input type="text" name="username" id="username" placeholder="请输入账号" required>
</p>
<p>密 码:
<input type="password" name="password" id="password" placeholder="请输入密码" required>
</p>
<input type="submit" value="登录">
<a href="${pageContext.request.contextPath}/toReg">注册</a>
${msg}
</form>
</div>
</body>
</html>
6.3 reg.jsp
<html>
<head>
<title>注册</title>
<style type="text/css">
.bg{
background-color: #D9AFD9;
background-image: linear-gradient(0deg, #D9AFD9 0%, #97D9E1 100%);
}
</style>
</head>
<body class="bg">
<div align="center" style="height: auto" >
<form action="${pageContext.request.contextPath}/reg" method="post">
<p>账号:
<input type="text" name="username" id="username" placeholder="请输入账号" required>
</p>
<p>密码:
<input type="text" name="password" id="password" placeholder="请输入密码" required>
</p>
<input type="submit" value="注册"><br>
${error}
</form>
</div>
</body>
</html>
6.4 allBook.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书籍列表</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 引入 Bootstrap -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<style type="text/css">
.bg{
background-color: #FFDEE9;
background-image: linear-gradient(0deg, #FFDEE9 0%, #B5FFFC 100%);
}
</style>
</head>
<body class="bg">
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="page-header">
<h1>
<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}/logout" >退出</a>
</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 var="book" items="${requestScope.get('list')}">
<tr>
<td>${book.getId()}</td>
<td>${book.getName()}</td>
<td>${book.getBookCount()}</td>
<td>${book.getAuthor()}</td>
<td>
<a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getId()}">更改</a> |
<a href="${pageContext.request.contextPath}/book/del/${book.getId()}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
6.5 addBook.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>新增书籍</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 引入 Bootstrap -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="page-header">
<h1>
<small>新增书籍</small>
</h1>
</div>
</div>
</div>
<form action="${pageContext.request.contextPath}/book/addBook" method="post">
书籍名称:<input type="text" name="name"><br><br><br>
书籍数量:<input type="text" name="bookCount"><br><br><br>
书籍作者:<input type="text" name="author"><br><br><br>
<input type="submit" value="添加">
</form>
</div>
</body>
</html>
6.6 updateBook.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改信息</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 引入 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="id" value="${book.getId()}"/>
书籍名称:<input type="text" name="name" value="${book.getName()}"/>
书籍数量:<input type="text" name="bookCount" value="${book.getBookCount()}"/>
书籍作者:<input type="text" name="author" value="${book.getAuthor()}"/>
<input type="submit" value="提交"/>
</form>
</div>
到此,web项目的程序已经构造完成
7、启动tomcat服务器
8、报错
如果报错,可能是项目结构里没有将Maven的jar导入WEB-INF/lib目录,一般IDEA新建的WEB项目,没有这个文件,记得重新创建一个lib目录,导入jar包!