SpringMVC 学习第一天

1 三层架构介绍

咱们开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序

使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构

三层架构

  • Model(模型):封装实体类
  • Controller(控制器):层则根据 View 层的用户输入调用Model 层的逻辑读写相关数据,并将数据选择适当的视图模板生成对应的 View 层展示效果
  • View(视图):层直接与用户交互,负责向用户展示数据

请求流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. 执行处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户

以上流程是以DispatcherServlet为核心轴,并且DispatcherServlet就是一个Servlet

使用XML方式配置

1 创建项目并引入依赖

<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!--Spring核心基础依赖-->
        <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-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- 增加了切面 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>

        <!-- spring jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--spring mvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志相关-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--测试相关-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>


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

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


    </dependencies>

配置文件

1.web.xml 配置如下
 

 <servlet>
            <!-- 设置所有请求拦截到分发器
                             第一种 如果SpringMVC的配置文件,和web.xml在同一个目录
                             比如 MVC配置文件名字叫 basic-servlet.xml
                             只需要把servlet-name的值 设置为basic就可以,
                             但是 MVC配置文件的名字必须是xxx-servlet.xml的格式 -->
            <servlet-name>basic</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 指定配置文件-->
            <!-- <init-param> -->
            <!-- <param-name>contextConfigLocation</param-name> -->
            <!-- 可以放在任何地方 -->
            <!-- <param-value>/a/b/c/d/xxxxxxxxx.xml</param-value> -->
            <!-- 放在src下 -->
            <!-- <param-value>classpath:xxxxxxxxx.xml</param-value> -->
            <!-- </init-param> -->
            <!-- 项目启动就会加载这个servlet -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>basic</servlet-name>
            <url-pattern>/</url-pattern>
            <!--
                             /* 会拦截jsp文件
                             / 不会拦截jsp
             -->
        </servlet-mapping>

2.basic-servlet.xml 配置

   <!-- 使用XML进行映射
            MVC框架基本两个点
                              1 url怎么映射进去进行处理
                              2 处理完如何找到视图
    -->
    <!-- 处理映射器配置-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!-- 创建映射,配置映射器,name必须是 / 打头-->
    <bean name="/w" class="com.wxx.SpringMVCDay01.Controller.TestControlle"/>

    <!-- 视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

 注意点  文件名字和Servlet-name必须相同

3.创建 Controlle层  绑定映射关系

继承AbstractController 

 覆写里面handleRequestInterna

 注解配置(重点)

1.引用依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

2.配置mvc的配置文件  basic-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-4.2.xsd
                  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
                  http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!--    配置包扫描文件-->
    <context:component-scan base-package="com.wxx.SpringMVCNotes.controller"/>
<!--    开启动MVC的配置-->
    <mvc:annotation-driven>
<!--        解决响应乱码-->
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
                </bean>
            </mvc:message-converters>

    </mvc:annotation-driven>
    <!--视图解析器 -->
    <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

 配置包扫描文件

配置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">
    <display-name>SpringMVC_01_Basic</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <!-- 设置所有请求拦截到分发器
                         第一种 如果SpringMVC的配置文件,和web.xml在同一个目录
                         比如 MVC配置文件名字叫 basic-servlet.xml
                         只需要把servlet-name的值 设置为basic就可以,
                         但是 MVC配置文件的名字必须是xxx-servlet.xml的格式 -->
        <servlet-name>basic</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定配置文件-->
        <!-- <init-param> -->
        <!-- <param-name>contextConfigLocation</param-name> -->
        <!-- 可以放在任何地方 -->
        <!-- <param-value>/a/b/c/d/xxxxxxxxx.xml</param-value> -->
        <!-- 放在src下 -->
        <!-- <param-value>classpath:xxxxxxxxx.xml</param-value> -->
        <!-- </init-param> -->
        <!-- 项目启动就会加载这个servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>basic</servlet-name>
        <url-pattern>/</url-pattern>
        <!--
                         /* 会拦截jsp文件
                         / 不会拦截jsp
         -->
    </servlet-mapping>
<!--    请求中文乱码解决方法 过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
设置所有请求拦截到分发器
                 第一种 如果SpringMVC的配置文件,和web.xml在同一个目录
                 比如 MVC配置文件名字叫 basic-servlet.xml
                 只需要把servlet-name的值 设置为basic就可以,
                 但是 MVC配置文件的名字必须是xxx-servlet.xml的格式

3.创建 controller

1. 类上加上@Controller(@component的基础含义)

2.类上还需要加@RequestMapping(“”)配置地址和controller的映射关系(一级路径)

3.方法上也要加@RequestMapping(“”)配置地址和方法的映射关系(二级路径)

4方便咱们不用再去写很多个controller(servlet)

5方法返回值可以写成字符串,返回值就是view-name

 代码如下

@Controller
@RequestMapping("/Test")
public class TestController {
    @RequestMapping("/w")
    public String Test1(){
        return "One";
    }
    @RequestMapping("/ws")
    public ModelAndView Test12(){
        return new ModelAndView("One");
    }

常用注解

@Controller

1.具有component的基础含义,被spring管理,当成bean注入到spring容器中

2.可以让该类中的方法返回String,该String默认就是view-name

3.标志该层为表现层或者控制层

@RequestMapping

映射地址和controller或者方法的关系,

写在controller上就是一级路径,写在方法上就是二级路径

同样效果的 GetMapping,PostMapping,PutMapping,DeleteMapping

@ResponseBody

封印 被视图解析器解析的效果( 避过视图解析器的解析 )

返回想要返回的数据类型,String就是String,而不是view-name

@RequestBody

加载参数前

要求前端必须传json格式,就算没有传参,你也得传给我一个空的json {}

如果用form-data传参,其实就是(application/x-www-form-urlencoded)

会报错 415 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported 

如果没有传参,也会报错,400 Required request body is missing 请求体缺失

@RestController(适合用于整个类都避开视图解析时使用)

1.具有component的基础含义,被spring管理,当成bean注入到spring容器中

2.可以让该类中的方法避过视图解析器的解析,返回的String不再是view-name

3.标志该层为表现层或者控制层

@RestController和@Controller做了一个对比,是否被视图解析器解析

@RequestParam("")

只能用Post请求方式

加在参数前

1.当前端传值时,key值和后端不一致,可以用该注解解决,

2.当前端没有传该注解起的名字name时,前端调用接口就会报400的错误 Required String parameter 'name' is not present 不存在不在场

@PathVariable

只能用Post请求方式

加载参数前

获取地址栏动态参数,/{as}

如果参数类型转化发生异常,会报错

Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer';nested exception is java.lang.NumberFormatException: For input string: "abc"

数组的添加方式 

多个Url映射到同一个方法上

@RequestMapping({"/hello","/h","/hi"})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值