SpringMVC学习与开发(三)

news2024/11/14 19:34:32

注:此为笔者学习狂神说SpringMVC的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!!

10、ssm整合

问了一下ChatGPT
SSM 是一个基于 Java 的开发框架整合,由 Spring、Spring MVC 和 MyBatis 三个开源框架组成。每个框架都有不同的职责和作用,通过整合,可以发挥各自的优势,形成一个完整的、高效的 Java 开发框架。

下面简要解释一下 SSM 各个组成部分的作用:

  1. Spring:
    • 作用: 提供了一个轻量级的 IoC(控制反转)容器,用于管理应用组件的生命周期和配置。
    • IoC容器: 负责创建对象、管理对象的依赖关系,实现了对象的松耦合。
    • AOP(面向切面编程): 提供了面向切面编程的支持,可以方便地实现事务管理、日志记录等横切关注点。
  2. Spring MVC:
    • 作用: 是一个基于 MVC 模式的 Web 框架,用于构建 Web 层的应用程序。
    • 控制器层: 通过控制器(Controller)处理用户请求,将请求映射到相应的业务逻辑处理方法。
    • 模型层: 通过模型(Model)将数据传递到视图层,与业务逻辑进行交互。
    • 视图层: 通过视图(View)负责渲染页面,呈现给用户。
  3. MyBatis:
    • 作用: 是一个持久层框架,用于简化数据库操作和 SQL 查询的编写。
    • ORM(对象关系映射): 将数据库表映射为 Java 对象,通过配置文件或注解实现对象与数据库表之间的映射关系。
    • SQL映射: 提供了 XML 文件或注解的方式定义 SQL 查询,可以更灵活地进行数据库操作。
    • 缓存: 支持缓存机制,提高数据库查询性能。

综合起来,SSM 框架整合了 Spring 的 IoC 和 AOP 特性,Spring MVC 的 Web 层框架,以及 MyBatis 的持久层框架,使得开发者能够更方便地进行企业级 Java 应用的开发。通过配置文件和注解,可以实现各层之间的松耦合,提高代码的可维护性和可扩展性。整合后,Spring 处理业务逻辑和控制反转,Spring MVC 处理 Web 层,MyBatis 处理数据库交互,形成一个完整的、分层清晰的应用架构。
在这里插入图片描述

1、环境要求

环境:

  • IDEA
  • MySQL 5.7.19
  • Tomcat 9
  • Maven 3.6

要求:

  • 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;

2、数据库环境

创建一个存放书籍数据的数据库表

CREATE DATABASE `ssmbuild`;

USE `ssmbuild`;

DROP TABLE IF EXISTS `books`;

CREATE TABLE `books` (
`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COMMENT '书名',
`bookCounts` INT(11) NOT NULL COMMENT '数量',
`detail` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID` (`bookID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT  INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');

3、基本环境搭建

1、新建一Maven项目!ssmbuild , 添加web的支持
2、导入相关的pom依赖!

在这里插入图片描述

<dependencies>
   <!--Junit-->
   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
   </dependency>
   <!--数据库驱动-->
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.47</version>
   </dependency>
   <!-- 数据库连接池 -->
   <dependency>
       <groupId>com.mchange</groupId>
       <artifactId>c3p0</artifactId>
       <version>0.9.5.2</version>
   </dependency>

   <!--Servlet - JSP -->
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.2</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
   </dependency>

   <!--Mybatis-->
   <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis</artifactId>
       <version>3.5.2</version>
   </dependency>
   <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis-spring</artifactId>
       <version>2.0.2</version>
   </dependency>

   <!--Spring-->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.1.9.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbc</artifactId>
       <version>5.1.9.RELEASE</version>
   </dependency>
</dependencies>
3、Maven资源过滤设置

在这里插入图片描述

<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
   </resources>
</build>
4、建立基本结构和配置框架!
  • com.kuang.pojo

在这里插入图片描述

  • com.kuang.dao

在这里插入图片描述

声明扫描xml文件,将xml和mapper绑定起来

在这里插入图片描述

  • com.kuang.service

在这里插入图片描述

在这里插入图片描述

  • com.kuang.controller
  • mybatis-config.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>
  • applicationContext.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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

5、Mybatis层编写

1、数据库配置文件 database.properties

在这里插入图片描述

2、IDEA关联数据库

3、编写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>
   
   <typeAliases>
       <package name="com.kuang.pojo"/>
   </typeAliases>
   <mappers>
       <mapper resource="com/kuang/dao/BookMapper.xml"/>
   </mappers>

</configuration>

4、编写数据库对应的实体类 com.kuang.pojo.Books

使用lombok插件!

package com.kuang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
   
   private int bookID;
   private String bookName;
   private int bookCounts;
   private String detail;
   
}

5、编写Dao层的 Mapper接口!

package com.kuang.dao;

import com.kuang.pojo.Books;
import java.util.List;

public interface BookMapper {

   //增加一个Book
   int addBook(Books book);

   //根据id删除一个Book
   int deleteBookById(int id);

   //更新Book
   int updateBook(Books books);

   //根据id查询,返回一个Book
   Books queryBookById(int id);

   //查询全部Book,返回list集合
   List<Books> queryAllBook();

}

6、编写接口对应的 Mapper.xml 文件。需要导入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.kuang.dao.BookMapper">

   <!--增加一个Book-->
   <insert id="addBook" parameterType="Books">
      insert into ssmbuild.books(bookName,bookCounts,detail)
      values (#{bookName}, #{bookCounts}, #{detail})
   </insert>

   <!--根据id删除一个Book-->
   <delete id="deleteBookById" parameterType="int">
      delete from ssmbuild.books where bookID=#{bookID}
   </delete>

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

   <!--根据id查询,返回一个Book-->
   <select id="queryBookById" resultType="Books">
      select * from ssmbuild.books
      where bookID = #{bookID}
   </select>

   <!--查询全部Book-->
   <select id="queryAllBook" resultType="Books">
      SELECT * from ssmbuild.books
   </select>

</mapper>

7、编写Service层的接口和实现类

接口:

package com.kuang.service;

import com.kuang.pojo.Books;

import java.util.List;

//BookService:底下需要去实现,调用dao层
public interface BookService {
   //增加一个Book
   int addBook(Books book);
   //根据id删除一个Book
   int deleteBookById(int id);
   //更新Book
   int updateBook(Books books);
   //根据id查询,返回一个Book
   Books queryBookById(int id);
   //查询全部Book,返回list集合
   List<Books> queryAllBook();
}

实现类:

package com.kuang.service;

import com.kuang.dao.BookMapper;
import com.kuang.pojo.Books;
import java.util.List;

public class BookServiceImpl implements BookService {

   //调用dao层的操作,设置一个set接口,方便Spring管理
   private BookMapper bookMapper;

   public void setBookMapper(BookMapper bookMapper) {
       this.bookMapper = bookMapper;
  }
   
   public int addBook(Books book) {
       return bookMapper.addBook(book);
  }
   
   public int deleteBookById(int id) {
       return bookMapper.deleteBookById(id);
  }
   
   public int updateBook(Books books) {
       return bookMapper.updateBook(books);
  }
   
   public Books queryBookById(int id) {
       return bookMapper.queryBookById(id);
  }
   
   public List<Books> queryAllBook() {
       return bookMapper.queryAllBook();
  }
}

6、Spring层

1、配置Spring整合MyBatis,我们这里数据源使用c3p0连接池;

2、我们去编写Spring整合Mybatis的相关的配置文件;spring-dao.xml

在这里插入图片描述

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd">

   <!-- 配置整合mybatis -->
   <!-- 1.关联数据库文件 -->
   <context:property-placeholder location="classpath:database.properties"/>

   <!-- 2.数据库连接池 -->
   <!--数据库连接池
       dbcp 半自动化操作 不能自动连接
       c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)
   -->
   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
       <!-- 配置连接池属性 -->
       <property name="driverClass" value="${jdbc.driver}"/>
       <property name="jdbcUrl" value="${jdbc.url}"/>
       <property name="user" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>

       <!-- c3p0连接池的私有属性 -->
       <property name="maxPoolSize" value="30"/>
       <property name="minPoolSize" value="10"/>
       <!-- 关闭连接后不自动commit -->
       <property name="autoCommitOnClose" value="false"/>
       <!-- 获取连接超时时间 -->
       <property name="checkoutTimeout" value="10000"/>
       <!-- 当获取连接失败重试次数 -->
       <property name="acquireRetryAttempts" value="2"/>
   </bean>

   <!-- 3.配置SqlSessionFactory对象 -->
   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <!-- 注入数据库连接池 -->
       <property name="dataSource" ref="dataSource"/>
       <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
       <property name="configLocation" value="classpath:mybatis-config.xml"/>
   </bean>

   <!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
   <!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       <!-- 注入sqlSessionFactory -->
       <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
       <!-- 给出需要扫描Dao接口包 -->
       <property name="basePackage" value="com.kuang.dao"/>
   </bean>

</beans>

3、Spring整合service层

在这里插入图片描述

理解applicationContext.xml、spring-dao、spring-service这些配置文件的关系,和融合起来的起的作用,或者直接让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: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
   http://www.springframework.org/schema/context/spring-context.xsd">

   <!-- 扫描service相关的bean -->
   <context:component-scan base-package="com.kuang.service" />

   <!--BookServiceImpl注入到IOC容器中-->
   <bean id="BookServiceImpl" class="com.kuang.service.BookServiceImpl">
       <property name="bookMapper" ref="bookMapper"/>
   </bean>

   <!-- 配置事务管理器 -->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <!-- 注入数据库连接池 -->
       <property name="dataSource" ref="dataSource" />
   </bean>

</beans>

7、SpringMVC层

1、web.xml

spring-mvc.xml

在这里插入图片描述

dao层、service层、mvc层整合起来

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

   <import resource="spring-dao.xml"/>
   <import resource="spring-service.xml"/>
   <import resource="spring-mvc.xml"/>
   
</beans>

springmvc层的所有的请求都被这个dispatchServlet核心分发器接管了

在这里插入图片描述

有错误的:dispatchServlet绑定核心配置文件的时候,只绑定了mvc层的配置文件,dao、service层的没有绑定起来,应该改为三层:mvc层、dao、service层都绑定给applicationContext.xml,交由spring托管的applicationContext.xml,才算把所有的bean都注入spring统一托管

在这里插入图片描述

<?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-->
   <servlet>
       <servlet-name>DispatcherServlet</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!-->  
           <param-value>classpath:applicationContext.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
       <servlet-name>DispatcherServlet</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>

   <!--encodingFilter-->
   <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>
   </filter>
   <filter-mapping>
       <filter-name>encodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>
   
   <!--Session过期时间-->
   <session-config>
       <session-timeout>15</session-timeout>
   </session-config>
   
</web-app>

2、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
   http://www.springframework.org/schema/context/spring-context.xsd
   http://www.springframework.org/schema/mvc
   https://www.springframework.org/schema/mvc/spring-mvc.xsd">

   <!-- 配置SpringMVC -->
   <!-- 1.开启SpringMVC注解驱动 -->
   <mvc:annotation-driven />
   <!-- 2.静态资源默认servlet配置-->
   <mvc:default-servlet-handler/>

   <!-- 3.配置jsp 显示ViewResolver视图解析器 -->
   <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>

   <!-- 4.扫描web相关的bean -->
   <context:component-scan base-package="com.kuang.controller" />

</beans>

小结1

dao层、service层、mvc层这三个框架都是通过spring整合到一起的,这些都是框架的底层,以后写轻量级项目的基础,一定要保留下来

8、Controller 和 视图层编写

1、BookController 类编写 , 方法一:查询全部书籍

在这里插入图片描述

简易的的jsp页面,先测试跳转成功与否,再往下做

在这里插入图片描述

首页使用绝对地址

在这里插入图片描述

2、排除bean注入的错误

在这里插入图片描述

思路:

在这里插入图片描述

①使用单元测试底层能否查出bean是否注入的问题

在这里插入图片描述

结果是可以的,因为底层applicationContext.xml把三层:dao层、service层、mvc层都注入绑定在一起了,所以说明底层没有事,是springmvc整合出的问题

在这里插入图片描述

由于springmvc整合applicationContext出了问题,所以applicationContext整合三层也会出现bean没法注入的问题

②真正原因:springmvc整合applicationContext出了问题

在这里插入图片描述

有错误的:dispatchServlet绑定核心上下文配置文件的时候,只绑定了mvc层的配置文件,dao、service层的没有绑定起来,应该改为applicationContext.xml,因为三层:mvc层、dao、service层都绑定给applicationContext.xml,交由spring托管的applicationContext.xml,才算把所有的bean都注入spring统一托管

修改过来即可

在这里插入图片描述

结果:

在这里插入图片描述

小结2

从以上错误中,理解spring是如何通过绑定applicationContext.xml(绑定了三层:mvc层、dao、service层),来托管三层的,管理和注入bean的

3.编写首页 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE HTML>
<html>
<head>
   <title>首页</title>
   <style type="text/css">
       a {
           text-decoration: none;
           color: black;
           font-size: 18px;
      }
       h3 {
           width: 180px;
           height: 38px;
           margin: 100px auto;
           text-align: center;
           line-height: 38px;
           background: deepskyblue;
           border-radius: 4px;
      }
   </style>
</head>
<body>

<h3>
   <a href="${pageContext.request.contextPath}/book/allBook">点击进入列表页</a>
</h3>
</body>
</html>
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">
</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>

   <div class="row">
       <div class="col-md-4 column">
           <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增</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.getBookID()}</td>
                       <td>${book.getBookName()}</td>
                       <td>${book.getBookCounts()}</td>
                       <td>${book.getDetail()}</td>
                       <td>
                           <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> |
                           <a href="${pageContext.request.contextPath}/book/del/${book.getBookID()}">删除</a>
                       </td>
                   </tr>
               </c:forEach>
               </tbody>
           </table>
       </div>
   </div>
</div>
5、BookController 类编写 , 方法二:添加书籍
@RequestMapping("/toAddBook")
public String toAddPaper() {
   return "addBook";
}

@RequestMapping("/addBook")
public String addPaper(Books books) {
   System.out.println(books);
   bookService.addBook(books);
   return "redirect:/book/allBook";
}
6、 添加书籍页面: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="bookName"><br><br><br>
      书籍数量:<input type="text" name="bookCounts"><br><br><br>
      书籍详情:<input type="text" name="detail"><br><br><br>
       <input type="submit" value="添加">
   </form>

</div>
7、BookController 类编写 , 方法三:修改书籍

在这里插入图片描述

在这里插入图片描述

结果:

在这里插入图片描述

8、添加事务支持

在这里插入图片描述

在spring-service.xml中添加aop事务支持

导入jar包,还要往WEB-INF中导入,注意生成文件中可能没有也会报错

在这里插入图片描述

9、隐藏域ID的问题

在这里插入图片描述

添加隐藏域

在这里插入图片描述

显而易见是sql出现了问题,这里可以配置日志输出方式,让SQL输出日志更清晰,更容易判断出错的地方

在这里插入图片描述

在这里插入图片描述

10、 修改书籍页面 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="bookID" value="${book.getBookID()}"/>
      书籍名称:<input type="text" name="bookName" value="${book.getBookName()}"/>
      书籍数量:<input type="text" name="bookCounts" value="${book.getBookCounts()}"/>
      书籍详情:<input type="text" name="detail" value="${book.getDetail() }"/>
       <input type="submit" value="提交"/>
   </form>

</div>
11、BookController 类编写 , 方法四:删除书籍
@RequestMapping("/del/{bookId}")
public String deleteBook(@PathVariable("bookId") int id) {
   bookService.deleteBookById(id);
   return "redirect:/book/allBook";
}

使用RestFul风格

在这里插入图片描述

在这里插入图片描述

配置Tomcat,进行运行!

到目前为止,这个SSM项目整合已经完全的OK了,可以直接运行进行测试!这个练习十分的重要,大家需要保证,不看任何东西,自己也可以完整的实现出来!

12、搜索图书

1、前端

在这里插入图片描述

2、controller

在这里插入图片描述

3、设置接口方法

在这里插入图片描述

4、xml配置SQL

在这里插入图片描述

5、添加业务

在这里插入图片描述

6、改进controller

在这里插入图片描述

7、修改前端

在这里插入图片描述

在这里插入图片描述

8、前端可视化

在这里插入图片描述

SpringMVC学习与开发(三)的学习笔记到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1353748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以STM32为例,实现按键的短按和长按

以STM32为例&#xff0c;实现按键的短按和长按 目录 以STM32为例&#xff0c;实现按键的短按和长按1 实现原理2 实现代码3 测试结束语 1 实现原理 简单来说就是通过设置一个定时器来定时扫描几个按键的状态&#xff0c;并分别记录按键按下的持续时间&#xff0c;通过时间的长短…

k8s---声明式资源管理(yml文件)

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都在y…

【致远FAQ】V8.0sp1_门户设置——页面组件中设置列表头的颜色

问题描述 门户设置——页面组件中设置列表头的颜色后&#xff0c;底表数据查看时的列表头颜色没有变呢 解决办法 设置不对cap4生效&#xff0c;只针对原始oa的列表支持&#xff08;比如协同工作——已办事项、公文等列表项&#xff09; 设置参考

uni-app 经验分享,从入门到离职(实战篇)——模拟从后台获取图片路径数据后授权相册以及保存图片到本地(手机相册)

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;需求描述&#x1f3af;前置知识点&#x1f9e9;uni.showLoading()&#x1f9e9;uni.authorize()&#x1f9e9;uni.downloadFile()&#x1f9e9;uni.saveImageToPhotosAlbum() &#x1f3af;演示代码&#x1f9e9;关于图片接…

晓源|算法专栏

文章目录 数据结构1.栈1.1 单调栈1.2括号匹配问题 2.树形结构2.1二叉树2.1.1树形DP 3.动态规划3.1 背包3.2 LIS ERRORheap-buffer-overflow 数据结构 1.栈 1.1 单调栈 单调栈内的元素具有单调性质&#xff0c;要么单调递增&#xff0c;要么单调递减。 1.2括号匹配问题 921…

基于猫群算法优化的Elman神经网络数据预测 - 附代码

基于猫群算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于猫群算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于猫群优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

MySQL中的事务到底是怎么一回事儿

简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。在MySQL中&#xff0c;事务支持是在引擎层实现的&#xff0c;但并不是所有的引擎都支持事务&#xff0c;如MyISAM引擎就不支持事务&#xff0c;这也是MyISAM被InnoDB取代的…

xlrd.biffh.XLRDError: Can‘t find workbook in 0LE2 compound document

今天在运行之前可以正常运行的程序&#xff0c;解析excel文件&#xff0c;代码简单示例如下&#xff1a; import pandas as pddf pd.read_excel("F:\\1.xlsx")# 解析文件 不过&#xff0c;这次却遇到了一个问题&#xff0c;如下图&#xff1a; 第一次遇到这个错误…

QGIS设计导出Geoserver服务使用的SLD样式

1、打开QGis软件 2、打开shp文件所在所在文件夹&#xff0c;双击添加选中图层 3、编辑shp文件样式 &#xff08;1&#xff09;双击“Layers”中需要编辑的图层 &#xff08;2&#xff09;选择样式 &#xff08;3&#xff09;编辑样式后&#xff0c;选择“应用”—》“确定” 4…

Java经典面试题笔记

一&#xff0c;Java基础 1&#xff0c;说说你对面向对象的理解。 什么是面向对象呢&#xff1f;在所其是什么时&#xff0c;不妨我们先来说说以其不同的一个概念面向过程。面向过程是一个更加注重事情的每一个步骤即顺序&#xff0c;即是强调过程的。而面向对象更加注重有哪些…

Springboot集成RabbitMq一

0、知识点 1、创建项目-生产者 默认官方start.spring.io已不支持自动生成低版本jkd的Spring项目&#xff0c;自定义用阿里云的starter即可&#xff1a;https://start.aliyun.com 2、创建配置类 package com.wym.rabbitmqprovider.utils;import org.springframework.amqp.core.…

数据库设计-DDL

D D L \huge{DDL} DDL DDL&#xff1a;数据库定义语言&#xff0c;用来定义数据对象&#xff08;数据库、表&#xff09; 简单操作 首先在cmd中进行操作&#xff0c;登录数据库 show databases; -- 以列表的形式显示所有的数据库create database [if not exists] 数据库名称…

1.3 day3 IO进程线程

使用标准IO进行文件拷贝 #include <myhead.h> int main(int argc, const char *argv[]) {if(argc!3)//外部传参{printf("input error\n");}//定义两个文件指针FILE *fpNULL;FILE *cfpNULL;if((fpfopen(argv[1],"r"))NULL){perror("fopen error…

在宝塔Linux中安装Docker

前言 帮助使用宝塔的用户快速上手docke的安装 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Docker》。&#x1f3af;&#x1f3af…

安装Unity详细教程(如何获取免费个人版许可证)

文章目录 下载Unity Hub安装Unity Hub登录获取免费个人版许可证安装Unity编辑器卸载Unity编辑器 下载Unity Hub 首先&#xff0c;我们需要到Unity的官网下载Unity Hub&#xff1a;Unity CN 我们可以在Unity Hub上管理我们的编辑器版本和项目文件。 安装Unity Hub 然后安装Un…

阿赵UE学习笔记——7、导入资源

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次将会把一个带动作和贴图的钢铁侠模型&#xff0c;导入的UE的项目中。 1、准备的资源 这里有2个fbx文件&#xff0c;都是带着网格和动画的&#xff0c;模型网格和骨骼是一样的&#xff0c;只…

PRD文档参考

在我们当前的项目中&#xff0c;我们采取了模块化的划分方式。因此&#xff0c;PRD&#xff08;产品需求文档&#xff09;也是按照各个模块进行组织和编辑的。虽然各个模块在功能细节上可能有所差异&#xff0c;但整体风格还是保持了一致性。这种风格使得文档结构清晰&#xff…

2007-2022年上市公司数字化转型数据(区分年报和管理层讨论)(含原始数据+处理代码+结果)

2007-2022年上市公司数字化转型数据&#xff08;年报和管理层讨论&#xff09;&#xff08;含原始数据处理代码结果&#xff09; 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;统计年度、证券代码、人工智能技术、区块链技术、云计算技术、大数据技术、数字技术应用、…

DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证…

自定义View之理解测量onMeasure和布局onLayout过程

Android应用的用户界面中&#xff0c;我们经常需要自定义View以满足特定的设计需求。在自定义视图的过程中&#xff0c;理解视图的测量&#xff08;onMeasure&#xff09;和布局&#xff08;onLayout&#xff09;过程至关重要。本篇博客将用通俗的语言&#xff0c;为你解析这两…