目录
简介
ssm整合就是把spring框架springmvc框架和mybatis框架整合在一起724系统架构图前端框架
JSP模式是理论基础,但实际开发中,我们常将服务器端程序,根据逻辑进行分层。一般比较常见的分三层:经典三层体系架构。三层分别是:表示层、业务逻辑层、数据访问层(表现层、业务层、持久层)。
- 表示层:又称为web层,与浏览器进行数据的交互。
- 业务逻辑层:又称为service层,专门用于处理业务数据的。
- 数据访问层:又称为dao层,与数据进行数据的交换的。将数据库的一条记录与JavaBean进行对应
系统构架图
- JSPjQuery框架HTML5、CSS3
- Web框架:Spring MVC Spring Core
- 基于IoC和AOP的处理方式统一管理所有的JavaBean
- ORM:MyBatis框架
- 数据存储:MySQL
数据库创建
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for bookmanage
-- ----------------------------
DROP TABLE IF EXISTS `bookmanage`;
CREATE TABLE `bookmanage` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`author` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`time` datetime(0) NULL DEFAULT NULL,
`type` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of bookmanage
-- ----------------------------
INSERT INTO `bookmanage` VALUES (1, '安徒生童话', '安徒生', '2023-07-03 15:46:41', 1);
INSERT INTO `bookmanage` VALUES (2, '王棋历险记', '王棋', '2023-07-03 15:47:10', 2);
INSERT INTO `bookmanage` VALUES (3, '小史的故事', '屎程浩', '2023-07-03 15:47:50', 3);
SET FOREIGN_KEY_CHECKS = 1;
此数据库可以直接使用
整合框架流程
1.创建项目
2.导入pom配置文件依赖
3.配置mybatis配置文件
4.配置spring配置文件
5.配置springmvc配置文件
6.配置web配置文件
创建项目
注意别选错误;选择完毕后点击下一步
此项目格式
导入pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>sys_service</artifactId><!--我的和你的不一样根据自己的地址写-->
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>sys_service Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source><!--jdk改为8-->
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- log4j 日志jar -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 连接mysql5 的驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
<!-- 参考版本对应 http://www.mybatis.org/spring/ -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 数据源管理 使用了dbcp2数据 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- commons 文件上传jar -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 加入JSON转换工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
<build>
<finalName>springMVC01</finalName>
</build>
</project>
配置mybatis
<?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>
</configuration>
mybatis中不再配置jdbc都交给spring处理,此配置文件中只放log4j日志
配置spring
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--加载属性文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--创建dbcp2数据源,此数据源可以替换为阿里的 德鲁伊-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${user}"></property>
<property name="password" value="${pwd}"></property>
</bean>
<!--整合了slqSessionFactory包含了数据源(dataSource),配置文件(config)和映射文件(mapper)-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property>
<property name="mapperLocations" value="classpath:mappers/*.xml"></property>
</bean>
<!--扫描Mapper接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.book.mapper"></property>
</bean>
<!--扫描业务逻辑层注解-->
<context:component-scan base-package="com.book"></context:component-scan>
<!--引入事务管理器,管理指定的数据源-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" autowire="byName">
</bean>
<!--把事务管理,变成增强(通知),同时指定了方法的事务传播机制-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="update**" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="servicePointcut" expression="execution(* com.book.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"></aop:advisor>
</aop:config>
<!--引用springmvc配置文件-->
<import resource="springmvc.xml"></import>
</beans>
一定要记得在配置spring配置文件要引用springmvc配置文件。
配置springmvc
<?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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<context:component-scan base-package="com.book"></context:component-scan>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<!-- Date的日期转换器 -->
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--转发时的前后坠-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property><!--前缀-->
<property name="suffix" value=""></property><!--后缀-->
</bean>
<!--设置存放图片的静态文件夹-->
<mvc:resources mapping="/static/**" location="/static/"></mvc:resources>
<!-- 配置multipartResolver,用于上传文件,使用spring的CommonsMultipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxInMemorySize" value="5000000"></property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
</beans>
配置web
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
测试增删改查流程
1.编写实体类
2.编写mapper层
3.编写service层
4.编写controller层
5.网页测试
编写实体类
package com.book.bean;
import com.alibaba.fastjson.annotation.JSONField;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class Bookmanage {
private Integer id;
private String name;
private String author;
@DateTimeFormat(pattern = "yyyy-MM-dd")//事件类型转换注解
@JSONField(format = "yyyy-MM-dd")
private Date time;
private Integer type;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
}
编写Mapper接口
package com.book.mapper;
import com.book.bean.Bookmanage;
import java.util.List;
public interface BookmanageMapper {
List<Bookmanage> getBookmanageList(Bookmanage bookmanage);
int addBookmanage(Bookmanage bookmanage);
Bookmanage getBookmanagebyid(int id);
int updateBookmanage(Bookmanage bookmanage);
int deleteBookmanagebyid(int id);
}
mybatis实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.book.mapper.BookmanageMapper">
<select id="getBookmanageList" resultType="com.book.bean.Bookmanage" parameterType="com.book.bean.Bookmanage">
SELECT id,name,author,time,type FROM `bookmanage`
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="author!=null">
and author=#{author}
</if>
<if test="time!=null">
and time=#{time}
</if>
<if test="type!=null">
and type=#{type}
</if>
</where>
</select>
<insert id="addBookmanage" parameterType="com.book.bean.Bookmanage">
insert into bookmanage(name,author,time,type)value(#{name},#{author},#{time},#{type})
</insert>
<select id="getBookmanagebyid" resultType="com.book.bean.Bookmanage" parameterType="int">
SELECT id,name,author,time,type FROM `bookmanage` where id=#{id}
</select>
<update id="updateBookmanage" parameterType="com.book.bean.Bookmanage">
update bookmanage
<set>
<if test="id!=null">
id=#{id},
</if>
<if test="name!=null">
name=#{name},
</if>
<if test="author!=null">
author=#{author},
</if>
<if test="time!=null">
time=#{time},
</if>
<if test="type!=null">
type=#{type},
</if>
</set>
where id=#{id}
</update>
<delete id="deleteBookmanagebyid" parameterType="int">
delete from bookmanage where id=#{id}
</delete>
</mapper>
编写service接口
package com.book.service;
import com.book.bean.Bookmanage;
import java.util.List;
public interface BookmanageService {
List<Bookmanage> getBookmanageList(Bookmanage bookmanage);
int addBookmanage(Bookmanage bookmanage);
Bookmanage getBookmanagebyid(int id);
int updateBookmanage(Bookmanage bookmanage);
int deleteBookmanagebyid(int id);
}
实现service接口
package com.book.service.impl;
import com.book.bean.Bookmanage;
import com.book.mapper.BookmanageMapper;
import com.book.service.BookmanageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookmanageServiceImpl implements BookmanageService {
@Autowired
BookmanageMapper bookmanageMapper;
@Override
public List<Bookmanage> getBookmanageList(Bookmanage bookmanage) {
return bookmanageMapper.getBookmanageList(bookmanage);
}
@Override
public int addBookmanage(Bookmanage bookmanage) {
return bookmanageMapper.addBookmanage(bookmanage);
}
@Override
public Bookmanage getBookmanagebyid(int id) {
return bookmanageMapper.getBookmanagebyid(id);
}
@Override
public int updateBookmanage(Bookmanage bookmanage) {
return bookmanageMapper.updateBookmanage(bookmanage);
}
@Override
public int deleteBookmanagebyid(int id) {
return bookmanageMapper.deleteBookmanagebyid(id);
}
}
创建Controller文件并且编写增删改查方法
调用service层并创建对象
package com.book.controller;
import com.book.bean.Bookmanage;
import com.book.service.BookmanageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
@RequestMapping("/bookmanage")
public class BookmanageController {
@Autowired
BookmanageService bookmanageService;
}
查询
转发的页面要在jsp的包中
@RequestMapping("/getList")
public String getList(Bookmanage bookmanage, Model model){
List<Bookmanage>list=bookmanageService.getBookmanageList(bookmanage);
model.addAttribute("list",list);
return "getbookList.jsp";
}
前端jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>编号</td>
<td>书名</td>
<td>作者</td>
<td>时间</td>
<td>类型</td>
<td> 操 作 </td>
</tr>
<c:forEach items="${list}" var="b">
<tr>
<td>${b.id}</td>
<td>${b.name}</td>
<td>${b.author}</td>
<td>${b.time}</td>
<td class="typeBom">${b.type}</td>
<td><a href="/bookmanage/goupdate?id=${b.id}">修改</a> <a href="/bookmanage/delete?id=${b.id}">删除</a></td>
</tr>
</c:forEach>
</table>
<a href="/bookmanage/goadd">添加书籍</a>
</body>
<script>
//让状态的数值转换为汉字
var typeBom=document.getElementsByClassName("typeBom");
for (var i=0;i<typeBom.length;i++){
if (typeBom[i].innerHTML==1){
typeBom[i].innerHTML="计算机"
}else if (typeBom[i].innerHTML==2){
typeBom[i].innerHTML="小说"
}else{
typeBom[i].innerHTML="杂志"
}
}
</script>
</html>
显示
增加
goadd方法跳转到add页面,因为/WEB-INF/jsp/包下的文件是不能随便访问的
我们springmvc配置了转发可以访问,所以写一个只有转发的goadd方法
@RequestMapping("/goadd")
public String goadd(){
return "addbook.jsp";
}
@RequestMapping("/add")
public String getList(Bookmanage bookmanage){
bookmanageService.addBookmanage(bookmanage);
return "redirect:/bookmanage/getList";
}
add方法增加完重定项到查询的页面
前端jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/bookmanage/add" method="post">
书名:<input type="text" name="name">
<br>
作者:<input type="text" name="author">
<br>
时间:<input type="text" name="time">
<br>
类型:<select name="type">
<option value="0">请选择</option>
<option value="1">计算机</option>
<option value="2">小说</option>
<option value="3">杂志</option>
</select>
<input type="submit" value="提交">
</form>
</body>
</html>
显示
点击提交后自动重定项到查询页面
修改
修改要先根据id查一下要修改的列
@RequestMapping("/goupdate")
public String goupdate(int id,Model model){
Bookmanage bookmanage=bookmanageService.getBookmanagebyid(id);
model.addAttribute("bookmanage",bookmanage);
return "updatebook.jsp";
}
@RequestMapping("/update")
public String update(Bookmanage bookmanage){
bookmanageService.updateBookmanage(bookmanage);
return "redirect:/bookmanage/getList";
}
前端jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="b"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/bookmanage/update" method="post">
<input type="hidden" name="id" value="${bookmanage.id}">
书名:<input type="text" name="name" value="${bookmanage.name}">
<br>
作者:<input type="text" name="author" value="${bookmanage.author}">
<br>
时间:<input type="text" name="time" value="${bookmanage.time}">
<br>
类型:<select name="type">
<option value="0">请选择</option>
<option value="1">计算机</option>
<option value="2">小说</option>
<option value="3">杂志</option>
</select>
<input type="submit" value="提交">
</form>
</body>
</html>
删除
只用前端页面提供的id就行
@RequestMapping("/delete")
public String delete(int id){
bookmanageService.deleteBookmanagebyid(id);
return "redirect:/bookmanage/getList";
}