SpringMVC

SpringMVC

ssm : mybatis + Spring + SpringMVC MVC三层架构

JavaSE:

JavaWeb:

SSM框架: 研究官方文档,锻炼自学能力,笔记能力,项目能力

SpringMVC + Vue + SpringBoot + SpringCloud + Linux

SSM = javaWeb做项目

Spring:IOC 和 AOP

SpringMVC:SpringMVC的执行流程!!

SpringMVC:SSM框架整合!!

1、回顾MVC

MVC:模型(dao,service),视图(jsp),控制器(Servlet),是一种软件设计规范;是一种架构模式。

  • dao层:连接数据库

  • service层:执行具体业务(只管业务)

  • servlet层:转发,重定向( 接收前端数据(jsp/html),转交给service处理,接收service返回结果,控制前端界面)

最典型的MVC:JSP + service+ javabean 模式

2、回顾Servlet

  1. 创建项目,父工程

在父工程的pom.xml文件导入依赖

<!--导入依赖-->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</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>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
  1. 创建普通maven模块,右击点add framework support,勾选web,变成web项目

  1. 导入子模块pom.xml的依赖
<dependencies>
        <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>
    </dependencies>
  1. 编写一个Servlet类,处理用户请求

MVC框架要做的事情:

  • 将url 映射到java类或者java类的方法

  • 封装用户提交的数据

  • 处理请求-----调用相关业务处理------封装响应数据

  • 将响应数据进行渲染.jsp/html 等表示层数据

常见服务器端MVC框架:Struts, SpringMVC....

前端三大MVC框架:vue ,angularjs, react

3、什么是SpringMVC

基于java实现MVC的轻量级的web框架。

特点:

  • 轻量级,简单易学

  • 高效,基于响应的MVC框架

  • 与spring无缝结合

  • 约定大于配置

  • 功能强大:RESTful,数据校验,格式化,本地化,主题....

本质也是一个Servlet!

4、SpringMVC执行流程

  1. DispatcherServlet是前置控制器,是整个SpringMVC的控制中心,用户发出请求,它接受请求并且拦截请求

举例子:http://localhost:8080/SpringMVC/hello

http://localhost:8080:服务器域名

SpringMVC:部署在服务器上的web站点

hello:表示控制器

总结:请求位于服务器local host:8080上的SpringMVC站点的hello控制器。

  1. HandierMapping为处理器映射;DispatcherServlet调用HandlerMapping,HandierMapping根据请求url查找Handier

  2. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制,如上url被查找控制器为:hello.

  3. HandlerExecution将解析后的信息传递输DispatcherServlet,如解析控制器映射等。

  4. HandlerAdapter表示处理器活配器,提按照特定的规则去执行Handler.

  5. Handler计腾体的Controller执行。

  6. Controller将群体的执行信息返回给HandierAdapter,如ModelAndView.

  7. HandlerAdapter将视愿逻钼名或模型传递给DispatcherServlet,

  8. DispatcherServlet询用视品解析器(ViewResolver)来解析HandlerAdapter传理的逻码板游名。

  9. 视照解析器将解析的逻端视图名传给DispatcherServiet,

  10. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

  11. 最终视图呈现给用户。

5、代码实现

  • 创建项目搭建环境(看上面的第二点)

    注意看一下spring-webmvc包有没有导入;看一下项目架构里面WEB-INF下有没有lib文件夹,创一个,并点击+号导入里面显示的全部jar包


注意:防止资源导出失败

    <!--在build中配置resources,防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

注意:xml文件编码和平台编码不匹配问题

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

··································

6、使用注解的方式实现SpringMVC(重点)

6.1、项目环境配置

创建一个子模块,和上面第五点,创建创建项目搭建环境步骤一样

注意:web.xml版本要最新的!!!

6.2、配置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核心,请求分发器,前端控制器-->
    <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:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别 (和服务器一起启动)-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--
    在SpringMVC中:/  /*
    / :只匹配所有请求,不会去匹配.jsp页面
    /* :匹配所有请求,包括.jsp页面
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app>

6.3、配置springmvc-servlet.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
        https://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">


    <!--自动扫描包,让指定包下的注解生效,有IOC容器统一管理-->
    <context:component-scan base-package="com.yang.controller"/>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>


    <!--视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="InternalResourceViewResolver">
        <!--映射路径的前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--映射路径的后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

6.4、创建hello.jsp

根据springmvc-servlet.xml文件里面的视图解析器的路径创建hello.jsp文件( /WEB-INF/jsp/xxx.jsp )

在hello.jsp里面的body标签里面写${msg}接收HelloController类的方法传过来的属性以及属性值

6.5、创建HelloController

建包:com.yang.controller;包下建HelloController;

@Controller//扫描
//@RequestMapping("/hello")
public class HelloController {

    //真实访问地址:项目名/h1
    @RequestMapping("/h1")
    public String hello(Model model){
        //封装数据(向模型添加属性msg和值,可以在jsp取出并渲染
        model.addAttribute("msg","Hello,SpringMVCANnotation!!");
        return "hello";//会被视图解析器处理(返回结果是WEB-INF/jsp/hello.jsp)
    }
}

类和方法都有@RequestMapping(映射地址);如果类上面有@RequestMapping("/hello"),那么真实地址为:项目名/hello/h1

6.6、运行,修改tomcat运行的deployment文件

小总结:

  • 先编写web.xml;

  • springmvc-servlet.xml;

  • 根据springmvc-servlet.xml里面扫描的包名新建HelloController类;

  • HelloController类加注解,给其方法一个浏览器地址,方法返回“hello”,视图解析器处理得到完整的路径,找到hello.jsp视图

  • 编写hello.jsp视图

  • 运行

(如果修改了java,run一下;改了配置文件,重新发布tomcat;改了视图页面,刷新一下)

7、注意点和RestFul风格

  • @Component;@Service;@Controller;@Repository----都是一样的,注册在xml文件功能

  • 视图可以复用的,模板框架不变只是其中的内容变了(指向同一个视图)

        //真实访问地址:项目名/h1
        @RequestMapping("/h1")
        public String hello(Model model){
            //封装数据(向模型添加属性msg和值,可以在jsp取出并渲染
            model.addAttribute("msg","Hello,SpringMVCANnotation!!");
            return "hello";//会被视图解析器处理(返回结果是WEB-INF/jsp/hello.jsp)
        }
    
        @RequestMapping("/h2")
        public String hello2(Model model){
            model.addAttribute("msg","Hello2!!!!");
            return "hello";
        }
    
  • 建议在类方法那里写死@RequestMapping

  • @RequestMapping中的请求方式

  • RestFul风格

    @Controller
    public class RestFulController {
        //原来的风格
        //http://localhost:8080/springmvc_03_annotation_war_exploded/restful?a=1&b=5
        @RequestMapping("/restful")
        public String test(int a, int b, Model model){
            int res = a + b;
            model.addAttribute("msg","结果为:"+res);
            return "hello";
        }
    
        //RestFul风格------参数加上注解  @PathVariable
        //http://localhost:8080/springmvc_03_annotation_war_exploded/restful/1/2
        @RequestMapping("/restful/{a}/{b}")
        public String test2(@PathVariable int a, @PathVariable int b, Model model){
            int res = a + b;
            model.addAttribute("msg","结果为:"+res);
            return "hello";
        }
    
    }
    

8、SpringMVC跳转方式

  • ModelAndView

  • ServletAPI(不建议)

  • SpringMVC实现转发和重定向,不用视图解析器

    @RequestMapping("/model/t1")
        public String test1(Model model){
            model.addAttribute("msg","ModelTest1");
            return "/WEB-INF/jsp/hello.jsp";
        }
    
    @Controller
    public class ModelTest1 {
        //转发(网址不变)
    //    @RequestMapping("/model/t1")
    //    public String test1(Model model){
    //        model.addAttribute("msg","ModelTest1");
    //        return "/WEB-INF/jsp/hello.jsp";
    //    }
        //重定向(网址变了)
        @RequestMapping("/model/t1")
        public String test2(Model model){
            model.addAttribute("msg","ModelTest2");
            return "redirect:/index.jsp";
        }
    }
    
  • SpringMVC实现转发和重定向,用上视图解析器

    @Controller
    public class ModelTest2 {
        //转发
    //    @RequestMapping("/model/t2")
    //    public String test(){
    //        return "hello";//默认
    //    }
        //重定向
        @RequestMapping("/model/t2")
        public String test2(){
            return "redirect:/index.jsp";
        }
    }
    

9、SpringMVC数据处理

9.1、提交数据处理

  • 接收前端的参数

  • 接收前端的对象

@Controller
public class UserController {
    //传递的是参数
    //参数没加注解之前(传递参数名字在方法上,可以使用)
    // http://localhost:8080/springmvc_03_annotation_war_exploded/usertest?name=yangshi
    //参数加了注解之后(建议)
    //http://localhost:8080/springmvc_03_annotation_war_exploded/usertest?username=yangshi
    @GetMapping("/usertest")
    public String test(@RequestParam("username") String name, Model model){
        //1.控制台接收前端参数
        System.out.println("接受前端的参数为:" + name);
        //2.将返回的结果传递给前端,model
        model.addAttribute("msg",name);
        //3.视图跳转
        return "hello";
    }

    //传递一个对象User:匹配User对象的字段名,一致就OK,不一致就匹配不到
    //http://localhost:8080/springmvc_03_annotation_war_exploded/usertest2?name=yangshi&age=13
    @GetMapping("/usertest2")
    public String test2(User user,Model model){
        model.addAttribute("msg",user);
        return "hello";
    }

}

9.2、数据显示到前端

  • ModelAndView

  • Model

  • ModelMap

10、乱码问题

11、JSON

前后端分离:

后端部署后端,提供接口,提供数据;

JSON

前端独立部署,负责渲染后端数据;

JSON:

  • 是一种数据交换格式

  • 采用独立于编程语言的文本格式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script type="text/javascript">
        //编写一个javaSrcipt对象
        var user={
            name:"yangshi",
            age:2,
            sex:"女"
        };
        //将js对象转化为json对象
        var json = JSON.stringify(user);
        console.log(json);

        //将json对象转化为js对象
        var obj = JSON.parse(json);
        console.log(obj);

    </script>



</head>
<body>

</body>
</html>

Title

运行打开网页,打开 开发者工具 可以查看!!

12、Jackson工具--json解析工具

Controller返回 Json 数据

  1. 导包
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.0</version>
        </dependency>
  1. 配置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核心,请求分发器,前端控制器-->
    <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:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别 (和服务器一起启动)-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--
    在SpringMVC中:/  /*
    / :只匹配所有请求,不会去匹配.jsp页面
    /* :匹配所有请求,包括.jsp页面
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
```
  1. 编写springmvc-servlet.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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--自动扫描包,让指定包下的注解生效,有IOC容器统一管理-->
    <context:component-scan base-package="com.yang.controller"/>

    <!--视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="InternalResourceViewResolver">
        <!--映射路径的前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--映射路径的后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
  1. 编写pojo层User

pom.xml添加 Lombol 插件

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;
}
  1. 编写controller层UserController
@Controller
public class UserController {
    @RequestMapping("/usercontroller")
    @ResponseBody  //他不会走视图解析器,会直接返回一个字符串
    public String json() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User("yangshi",4,"女");
        String str = mapper.writeValueAsString(user);
        return str;
    }
}

@Controller和@ResponseBody联合使用////或者直接在类上面使用@RestController--这个类返回的是字符串

springmvc-04-json项目模块

如果一个controller类里面很多方法有重复代码,可以将重复代码提取出来在工具层写一个工具类

JSON乱码问题:

springmv-servlet.xml文件添加

    <!--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>

13、fastjson工具

14、整合SSM

14.1、Mybatis层内容

  • 环境:

    • IDEA

    • Mysql 5.7.19

    • Tomcat 7.0.86

    • Maven 3.9.9

  • 数据库搭建:

  • 基础环境搭建:

    • 创建项目

    • 导包,导入依赖

      <!--依赖:junit ,数据库驱动, 连接池, servlet, jsp, mybatis, mybatis-spring, spring -->
          <dependencies>
              <!--Junit-->
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
              </dependency>
              <!--数据库驱动-->
              <dependency>
                  <groupId>com.mysql</groupId>
                  <artifactId>mysql-connector-j</artifactId>  <!-- 注意 artifactId 也变了 -->
                  <version>8.0.33</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.16</version>
              </dependency>
              <dependency>
                  <groupId>org.mybatis</groupId>
                  <artifactId>mybatis-spring</artifactId>
                  <version>3.0.2</version>
              </dependency>
              <!--spring-->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>5.3.23</version>
              </dependency>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-jdbc</artifactId>
                  <version>5.3.23</version>
              </dependency>
          </dependencies>
      
          <!--资源导出-->
          <!--在build中配置resources,防止我们资源导出失败的问题-->
          <build>
              <resources>
                  <resource>
                      <directory>src/main/resources</directory>
                      <includes>
                          <include>**/*.properties</include>
                          <include>**/*.xml</include>
                      </includes>
                      <filtering>true</filtering>
                  </resource>
                  <resource>
                      <directory>src/main/java</directory>
                      <includes>
                          <include>**/*.properties</include>
                          <include>**/*.xml</include>
                      </includes>
                      <filtering>true</filtering>
                  </resource>
              </resources>
          </build>
      
  • IDEA中连接数据库

  • 建包dao,service,controller,pojo以及建applicationContext.xml, mybatis-config.xml 文件

    mybatis-config.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-config.dtd">
    <!-- configuration核心配置文件 -->
    <configuration>
    
        <!--配置数据源交给spring-->
    
        <typeAliases>
            <package name="com.yang.pojo"/>
        </typeAliases>
    
    </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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    

    database.properties: 如果mysql是8.0+,还需要添加一个时区设置

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username=root
    password=123456
    
  • pojo:写主体类Books,dao:接口BooksMapper,以及Books Mapper.xml文件, 并且注册.xml文件到mybatis-config.xml核心配置文件

    package com.yang.pojo;
    
    public class Books {
        private int bookID;
        private String bookName;
        private int bookCounts;
        private String detail;
    
        public Books(){}
        public Books(int bookID, String bookName, int bookCounts, String detail) {
            this.bookID = bookID;
            this.bookName = bookName;
            this.bookCounts = bookCounts;
            this.detail = detail;
        }
    
        public int getBookID() {
            return bookID;
        }
    
        public void setBookID(int bookID) {
            this.bookID = bookID;
        }
    
        public String getBookName() {
            return bookName;
        }
    
        public void setBookName(String bookName) {
            this.bookName = bookName;
        }
    
        public int getBookCounts() {
            return bookCounts;
        }
    
        public void setBookCounts(int bookCounts) {
            this.bookCounts = bookCounts;
        }
    
        public String getDetail() {
            return detail;
        }
    
        public void setDetail(String detail) {
            this.detail = detail;
        }
    }
    
    public interface BooksMapper {
        //增加一本书
        int addBook(Books books);
        //删除一本书
        int deleteBookById(int id);
        //更新一本书
        int updateBook(Books books);
        //查询一本书
        Books queryBookById(int id);
        //查询全部书
        List<Books> queryBook();
    }
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.yang.controller">
        <insert id="addBook" parameterType="Books">
            insert into ssmbuild.books (bookName,bookCounts,detail)
            values (#{bookName},#{bookCounts},#{detail})
        </insert>
    
        <delete id="deleteBookById" parameterType="int">
            delete from ssmbuild.books
            where bookID = #{bookID}
        </delete>
    
        <update id="updateBook" parameterType="Books">
            update ssmbuild.books
            set bookName = #{bookName},bookCounts=#{bookCounts},detail=#{detail}
            where bookID=#{bookID}
        </update>
    
        <select id="queryBookById" resultType="Books">
            select * from ssmbuild.books
            where bookID = #{bookID}
        </select>
    
        <select id="queryBook" resultType="Books">
            select * from ssmbuild.books
        </select>
    </mapper>
    
    <mappers>
            <mapper class="com.yang.dao.BooksMapper"/>
        </mappers>
    
  • service:BookService接口(内容和BooksMapper一致),编写BooksServiceImpl实现类

    public class BooksServiceImpl implements BooksService{
    
        //service调用dao层
        private BooksMapper booksMapper;
    
        public void setBooksMapper(BooksMapper booksMapper) {
            this.booksMapper = booksMapper;
        }
    
        @Override
        public int addBook(Books books) {
            return booksMapper.addBook(books);
        }
    
        @Override
        public int deleteBookById(int id) {
            return booksMapper.deleteBookById(id);
        }
    
        @Override
        public int updateBook(Books books) {
            return booksMapper.updateBook(books);
        }
    
        @Override
        public Books queryBookById(int id) {
            return queryBookById(id);
        }
    
        @Override
        public List<Books> queryBook() {
            return booksMapper.queryBook();
        }
    }
    

14.2、Spring层内容

  • 创建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
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--关联数据库配置文件-->
        <context:property-placeholder location="classpath:database.properties"/>
    
        <!--连接池:dbcp(半自动化), c3p0(自动化), druid, hikari-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${driver}"/>
            <property name="jdbcUrl" value="${url}"/>
            <property name="user" value="${username}"/>
            <property name="password" value="${password}"/>
        </bean>
    
        <!--sqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <!--绑定mybatis配置文件-->
            <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"/>
            <!--扫描包-->
            <property name="basePackage" value="com.yang.dao"/>
        </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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--扫描service下的包-->
        <context:component-scan base-package="com.yang.service"/>
    
        <!--将所有业务类注入spring ,可以通过xml配置或者注解-->
        <bean id="BookServiceImpl" class="com.yang.service.BooksServiceImpl">
            <property name="booksMapper" ref="booksMapper"/>
        </bean>
    
        <!--声明式事务配置-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--注入数据源-->
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--aop 事务支持-->
    
    </beans>
    

14.3、springMVC内容

  • 编写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-->
        <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:applicationContext.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>
        </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>
    
  • 新建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
            https://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">
    
        <!--注解驱动-->
        <mvc:annotation-driven/>
        <!--静态资源过滤-->
        <mvc:default-servlet-handler/>
        <!--扫描包:controller-->
        <context:component-scan base-package="com.yang.controller"/>
        <!--视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  • 把文件整合到applicationContext.xml

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

15、Ajax

无需加载整个页面的情况下,更新部分网页的技术

搭建spring配置或者环境出错:

@RestController
public class AjaxController {
    @RequestMapping("/t1")
    public String test(){
        System.out.println("进入了test方法");
        return "hello";
    }
}

可以进入test()方法并输出结果,但是访问网页是一片空白;

排错:

  1. cmd-->执行命令 curl -v http://localhost:8080/springmvc_ajax/t1

(显示访问网址发生500错误,并且返回了一个不完整的 HTML 响应<html

  1. 测试代码---》问题不在 Controller 逻辑----》Spring 配置或环境问题

  2. web.xml配置了DispatcherServlet,并且 import DispatcherServlet存在

  3. applicationContext.xml 启用了注解驱动

  4. 关于依赖冲突:cmd--》项目目录下---》mvn dependency:tree---》无依赖冲突

  5. 触碰这个地址存在一个框 意思是DispatcherServlet not found

  6. Tomcat 版本不兼容: Spring 5.x 需要 Tomcat 8.5+!!!!!!!!

posted @ 2025-04-24 02:33  蟹堡博  阅读(25)  评论(0)    收藏  举报