SpringMVC

SpringMVC

MVC三层架构

模型 Dao,service

视图 jsp

控制器 servlet

dao ----service----servlet----jsp/html

pojo:User vo:UserVo dto: 都是实体类,后两个进行了细分

1.MVC框架要做那些事情

  1. 将URL映射到Java类或Java方法上
  2. 封装用户 提交的数据
  3. 处理请求---调用相关的业务处理---封装响应数据
  4. 将响应的数据进行渲染.jsp/html等表示层数据

常见的服务器端MVC框架有:Struts,Spring MVC, ASP.NET MVC ,Zend Framework,JSF

Spirng MVC的特点

  1. 轻量级,简单易学
  2. 高效基于请求响应的MVC框架
  3. 与Spirng兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTful,数据验证,格式化,本地化,主题等
  6. 简洁灵活

可能遇到的问题:访问出现404,排查步骤

  1. 查看控制台输出,看一下是不是缺少了什么jar包。
  2. 如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖
  3. 重启tomcat

2.例子:spirngmvc1

编写SpirngMVC配置文件

<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">
<!--添加处理器映射器  URL处理器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--    添加 处理器适配器   URL适配器  把URL匹配Spring里面有那个Controller,处理它-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--    添加视图解析器-->
<!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--        前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
<!--        后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>


<!--Handler-->
    <bean id="/hellos" class="com.luobo.controller.HelloController"/>
</beans>

编写web.xml配置DispatcherServlet(前端控制器:所有的请求和响应都会交给DispatcherServlet处理)

<?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>
<!--        关联一springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
<!--        启动级别-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>

<!--    /匹配所有的请求;不包括.jsp-->
<!--    /*匹配所有的请求包括.jsp-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

3.SpirngMVC执行流程

image-20201111174045393

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求, DispatcherServlet接收请求并拦截请求。 我们假设请求的url为 : http://localhost:8080/SpringMVC/hello 如上url拆分成三部分: http://localhost:8080服务器域名 SpringMVC部署在服务器上的web站点 hello表示控制器 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
  2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据 请求url查找Handler。
  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器 为:hello。
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  6. Handler让具体的Controller执行。
  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  12. 最终视图呈现给用户。

HandlerMapping,是众多Handler的映射器,注册中心,通过它找到具体的Handler的名字,再去adapter具体的handler,也就是我们写的Controller

重写例子(springmvc2)

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">
<!--配置DispatchServlet:这个是Spring的核心:请求分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatcherServlet要绑定SpringMVC的配置文件-->
        <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>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

springmvc-servlet.xml

<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">
    <!--添加处理器映射器  URL处理器  这个处理器通过Bean来查找,也可以选择别的处理器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--    添加 处理器适配器   URL适配器  把URL匹配Spring里面有那个Controller,处理它-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--    添加视图解析器-->
    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--        前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--        后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>


    <!--Handler  不加/会自动追加到项目名字后边,会报404-->
    <bean id="/hellos" class="com.luobo.controller.HelloController"/>
</beans>

HelloController

public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        //业务代码
        String resoult = "HelloSpring";
        modelAndView.addObject("msg",resoult);

        //视图跳转
        modelAndView.setViewName("test");


        return modelAndView;
    }
}

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>${msg}</h1>
</body>
</html>

4.使用注解开发SpringMVC(spirngmvc3)

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">
    <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:springmvc-servlet.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>
</web-app>

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
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">
    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.luobo.controller"/>
    <!-- 让Spring MVC不处理静态资源  .css  .js   .html .mp3 .mp4 -->
    <mvc:default-servlet-handler />
    <!--
    支持mvc注解驱动 相当于配置处理器映射器和处理器适配器
    在spring中一般采用@RequestMapping注解来完成映射关系
    要想使@RequestMapping注解生效
    必须向上下文中注册DefaultAnnotationHandlerMapping
    和一个AnnotationMethodHandlerAdapter实例
    这两个实例分别在类级别和方法级别处理。
    而annotation-driven配置帮助我们自动完成上述两个实例的注入。
    -->
    <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>

HelloController.java

package com.luobo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model){
        //封装数据
        model.addAttribute("msg","fdsfdsfdsfds");
        return "hello";//会被视图解析器处理
    }
}

hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

</body>
</html>

5.Controller及RestFul风格

控制器Controller

控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。

控制器负责解析用户的请求并将其转换为一个模型。

在Spring MVC中一个控制器类可以包含多个方法

在Spring MVC中,对于Controller的配置方式有很多种

被这个注解的类,中的所有方法,如果返回值是String ,并且有具体页面可以跳转就,就会被视图解析器解析;

@RequestMappering

RestFul风格

概念

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

在原来:localhost:8080/method?add=1&post=he

现在:localhost:8080/method/add/1/post/he

@PathVariable:路径变量

在SpringMVC中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URI模板变量上。

方式一:默认为get方式,,可以只写参数

@Controller
public class HelloController1 {
    @RequestMapping(value = "/hello/{a}/{b}",method = RequestMethod.GET)
    public String hello(@PathVariable int a, @PathVariable int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果为"+res);
        return "hello";
    }
}

image-20201111210442915

第二种方式:

 	@GetMapping("/hello/{a}/{b}")
    @DeleteMapping("/hello/{a}/{b}")
    public String hello(@PathVariable int a, @PathVariable int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果为"+res);
        return "hello";
    }

如果有两个完全一样的请求会报,Ambiguous

6.SpringMVC结果跳转方式

通过SpirngMVC来实现转发和重定向-无需视图解析器

通过return "/WEB-INF/jsp/test.jsp"

或者指定转发或重定向return "forward:/WEB-INF/jsp/test.jsp" return "redirect:/index.jsp"

7.SpringMVC:数据一致

1.提交的域名称和处理方法的参数名一致时自动匹配

提交数据:http://localhost:8080/hello?a=1&b=5

    @RequestMapping(value = "/hello/{a}/{b}",method = RequestMethod.GET)
    public String hello(@PathVariable int a, @PathVariable int b, Model model){

2.提交的域名称和处理方法的参数名不一致时设置@RequestParam("username")

提交数据:http://localhost:8080/hello?c=1&d=5

	@RequestMapping(value = "/hello/{a}/{b}",method = RequestMethod.GET)
    public String hello(@RequestParam("c") int a,@RequestParam("d") int b, Model model){

3.提交的是一个对象

要求提交的表单域和对象的属性名一致,参数使用对象即可

  • 接收前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接使用
  • 假设传递的是一个对象User,匹配User对象中的字段名;如果名字一致,就可以使用

8.数据显示到前端

第一种:通过ModelAndVIew

public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        //业务代码
        String resoult = "HelloSpring";
        modelAndView.addObject("msg",resoult);
        //视图跳转
        modelAndView.setViewName("test");
        return modelAndView;
    }

第二种:通过ModelMap

LinkedHashMap

ModelMap:继承了LinkedHashMap,所以它拥有LinkedHashMap的全部功能

Model:精简版,大部分情况使用Model;

第三种:通过Model

@RequestMapping(value = "/hello/{a}/{b}",method = RequestMethod.GET)
    public String hello(@PathVariable int a, @PathVariable int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果为"+res);
        return "hello";
    }

9.乱码问题

<!-- 配置Spring的乱码过滤器-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

10.JSON

JSON是一种轻量级的数据交换格式

    <script type="text/javascript">
        //编写一个JavaScript对象
        var user = {
            name:"犯得上发射点",
            age:3,
            set:"男"
        };
        //将js对象转换为json对象
        var json = JSON.stringify(user);
        console.log(json);
        //将json转换为js对象
        var aa = JSON.parse(json);
        console.log(aa);
    </script>

1.java生成json对象传给前端

json解析工具:

  • Jackson
  • fastjson

1.Jachson:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.2</version>
</dependency>

@Respnsebody将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。

​ 当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。

​ 如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为json串,然后写到客户端。

或者载类上面加@RestController注解也可以实现

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">
    <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:springmvc-servlet.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>

    <!-- 配置Spring的乱码过滤器-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

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
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">
    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.luobo.controller"/>
    <!-- 让Spring MVC不处理静态资源  .css  .js   .html .mp3 .mp4 -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

User.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;
}

UserController.java:解决json乱码的第一种方式在@RequestMapping注解里加produces的参数

一个对象的传输:

@Controller
public class UserController {

    @RequestMapping(value = "/a",produces = "application/json;charset=utf-8")
    @ResponseBody//加了这个注解就不会走视图解析器,会直接返回一个字符串
    public String json1() throws JsonProcessingException {
        //jackson里有个objectMapper
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("发射点发", 87, "范德萨");
        String s = mapper.writeValueAsString(user);

        return s;
    }
}

第二种:统一解决乱码

在spirngmvc配置文件里添加一段消息StringHttpMessageConverter转换配置

<!--JSON乱码问题配置    -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
<!--            Http消息转换格式-->
            <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>

list传输一样

时间传输 Date默认时时间戳的方式,可以用SimpleDateFormat改变格式,也可以用ObjectMapper设置关闭时间戳

@RequestMapping("/a")
    @ResponseBody//加了这个注解就不会走视图解析器,会直接返回一个字符串
    public String json1() throws JsonProcessingException {
        //jackson里有个objectMapper
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(simpleDateFormat);
        Date date = new Date();
        String s = mapper.writeValueAsString(date);

        return s;
    }

把Json时间提成工具类

public class JsonUtils {
    public static String getJson(Object object){
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }
    public static String getJson(Object object,String dateFormat){
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(simpleDateFormat);
        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

测试

 @RequestMapping("/a")
    @ResponseBody//加了这个注解就不会走视图解析器,会直接返回一个字符串
    public String json1() throws JsonProcessingException {
        Date date = new Date();
        return JsonUtils.getJson(date);
    }

2.FastJson

fastjson.jar是阿里开发的一款专门用于Java的开发包,可以方便实现json对象与javaBean对象之间的转换,

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

![各个](E:\图片\Saved Pictures\各个.jpg)11.SSM整合

spirng4.0之后不建议在字段使用autowired,可以在构造方法或setter上写,甚至有构造方法的时候可以省略Autowired也可以自动实现注入

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SsmBuild</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--依赖   junit,数据库,连接池,servlet,jsp,mybatis,mybatis-spring,spring-->
    <dependencies>
<!--        junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <!--        数据库连接池-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <!--        servlt  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.1</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!--        MyBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!--        spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
    </dependencies>
    <!--静态资源到处问题        -->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

2.Mybatis

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>
<!--    配置数据源 交给Spring去做-->

    <typeAliases>
        <package name="com.luobo.pojo"/>
    </typeAliases>

    <mappers>
        <mapper class="com.luobo.dao.BookMapper"/>
    </mappers>
</configuration>

pojo

Books.java

package com.luobo.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;
}

dao

BookMapper.java

package com.luobo.dao;

import com.luobo.pojo.Books;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BookMapper {
    int addBook(Books books);
    int deleteBookById(@Param("bookID") int bookID);
    int updateBook(Books books);
    Books getBookById(@Param("bookID") int bookID);
    List<Books> getBookList();
}

BookMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
这里要把config改为mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.luobo.dao.BookMapper">
    <insert id="addBook" parameterType="Books">
        insert  into books (bookName,bookCounts,detail) values (#{bookName},#{bookCounts},#{detail})
    </insert>
    <delete id="deleteBookById" parameterType="int">
        delete from books where bookID=#{bookID}
    </delete>
    <update id="updateBook" parameterType="Books">
        update books set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail} where bookID=#{bookID};
    </update>
    <select id="getBookById" parameterType="int" resultType="Books">
        select * from books where bookID=#{bookID}
    </select>
    <select id="getBookList" resultType="Books">
        select * from books
    </select>
</mapper>

service

BookService.java

package com.luobo.service;

import com.luobo.pojo.Books;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BookService {
    int addBook(Books books);
    int deleteBookById(int bookID);
    int updateBook(Books books);
    Books getBookById(int bookID);
    List<Books> getBookList();
}

BookServiceImpl.java

package com.luobo.service;

import com.luobo.dao.BookMapper;
import com.luobo.pojo.Books;

import java.util.List;

public class BookServiceImpl implements BookService {

    //业务层调dao层
    private BookMapper bookMapper;

    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }

    public int addBook(Books books) {
        return bookMapper.addBook(books);
    }

    public int deleteBookById(int bookID) {
        return bookMapper.deleteBookById(bookID);
    }

    public int updateBook(Books books) {
        return bookMapper.updateBook(books);
    }

    public Books getBookById(int bookID) {
        return bookMapper.getBookById(bookID);
    }

    public List<Books> getBookList() {
        return bookMapper.getBookList();
    }
}

controller

BookController

package com.luobo.controller;

import com.luobo.pojo.Books;
import com.luobo.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/book")
public class BookController {
    //controller 调service层

    @Qualifier("BookServiceImpl")
    private BookService bookService;
    @Autowired
    public void setBookService(BookService bookService) {
        this.bookService = bookService;
    }
    //查询全部书籍返回书籍展示页面
    @RequestMapping("allBook")
    public String list(Model model){
        System.out.println("指定coller方法");
        List<Books> bookList = bookService.getBookList();
        model.addAttribute("list",bookList);

        return "allBook";
    }

}

3.spring spring-dao(spirng-mybatis) spring-service

1.spirng-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/springbeans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    spring整合dao层  dao层就是mybatis管理的   就是spring与mybatis整合-->
<!--    1.关联数据库配置文件-->
    <context:property-placeholder location="classpath:database.properties"/>
<!--    2.连接池
    dacp:半自动化操作,不能自动连接
    c3p0:自动化操作,自动化的加载配置文件,并且可以自动设置到对象中
    druid:
    hikari
-->
    <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}"/>
    </bean>
<!--    3.sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        这里要用ref而不是value
        <property name="dataSource" value="dataSource"/>
<!--        绑定MyBatis配置文件  这里要注意使用classpath:-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>

<!--配置dao接口扫描包,动态的实现了dao接口可以注入到spring容器中,,相当于在spring与mybatis整合中,获得SqlSessionDaoSupport或者sqlSessionTemplate-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--        注入SqlSessionFactory   value就是上面的bean  的sqlSessionFactory-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--        要扫描的dao包-->
        <property name="basePackage" value="com.luobo.dao"/>
    </bean>
</beans>

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

<!--扫描service下的包  只要包下有注解就会自动扫描到-->
    <context:component-scan base-package="com.luobo.service"/>
<!--将我们的所有业务类注入到spring可以通过配置或者注解实现  @service-->
    <bean id="BookServiceImpl" class="com.luobo.service.BookServiceImpl">
        <property name="bookMapper" ref="bookMapper"/>
    </bean>
<!--声明式事务配置-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        注入数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!--aop事务支持    -->

</beans>

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans.xsd">
    <import resource="classpath:spring-dao.xml"/>
    <import resource="classpath:spring-service.xml"/>
</beans>

4.spirngmvc

1.添加web支持

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">
<!-- DispatchServlet   -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--绑定Springmvc配置文件  注意/  不能是/* 不然jsp页面直接显示源码     -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.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>

2.springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/cache/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--1.注解驱动-->
    <mvc:annotation-driven/>

<!--2.静态资源过滤-->
    <mvc:default-servlet-handler/>


<!--3.扫描包controller-->
    <context:component-scan base-package="com.luobo.controller"/>


<!--    4.视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--        web-inf下新建jsp文件夹-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

@Autowsadas

5.排错

  1. 查看这个bean注入是否成功
  2. Junit单元测试,看我们的代码是否能够查询出来结果
  3. 问题,一定不在我们的底层,是Spring出问题
  4. Springmvc整合的时候没有调用到我们的service层的bean

12.Ajax技术

13.spirngmvc拦截

posted @ 2022-02-24 18:02  萝卜i  阅读(35)  评论(0编辑  收藏  举报