SpringMvc

SpringMVC基础入门详解

  • 环境搭建
  • 经典三层

1.经典三层和mvc模式
经典三层:web表现层,(view+controller),service业务层,持久层(数据接入访问层)
MVC模式:model+view+Controller
2.springMvc是一种基于java的实现mvc设计模式的web 框架,属于spring FrameWork的后续产品.springMv从框架提供了构建web应用程序的全功能的mvc模块,是目前最流行的mvc框架
3.总体来说,就是在spring的基础上加入了mvc的支持 ,springMvc=Ioc+mvc.

4.SpringMvc的处理流程,全局只需要一个servlet [DispatcherServlet]

在这里插入图片描述
下面来介绍一下执行流程:
1.前端接收用户请求
2.前端控制器分发 请求
3.控制器返回处理结果
4.前端控制器将处理结果交给jsp[前端页面其中一种]去渲染数据
5.将渲染后的Html页面在返回给前端控制器
6.在由前端控制器将渲染后的html页面交给用户浏览器

入门案例
环境搭建和简单业务的完成(将后端服务器的时间发送到前端页面上)
1.构建web项目
在这里插入图片描述
2.配置tomcat启动插件

build>
    <plugins>
      <!--tomcat启动插件-->
      <plugin>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <groupId>org.apache.tomcat.maven</groupId>
        <version>2.2</version>
        <configuration>
          <path>/</path>
          <port>80</port>
          <uriEncoding>UTF-8</uriEncoding>
        </configuration>
      </plugin>
    </plugins>
  </build>

配置端口号为80 以及地址栏编码 UTF-8 方便之后操作.
3.导入依赖

<dependencies>
  	<!--配置servlet、jsp依赖jar包-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
 	 <!--spring的mvc核心jar包-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.5.RELEASE</version>
      </dependency>
</dependencies>```

注意:servlet-api 和jsp-api 必须设置依赖范围为provided 为生产环境中使用

4.配置文件的编写
spring-mvc.xml

  <!--配置spring mvc 的注解驱动 自动选择最优的处理器映射器,处理适配器-->
    <!--类型转换器工厂对象需要使用 mvc注解驱动加载-->
    <mvc:annotation-driven conversion-service="ConversionServiceFactoryBean"/>
    <!--配置组件扫描,让spring 容器加载组件-->
    <context:component-scan base-package="com.wnz"/>
```xml
在这里插入代码片

5.集成springmvc
配置web.xml 文件 ,使用前端控制器
DispatcherServlet是springmvc处理http请求的入口

<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <!--配置SpringMVC的核心控制器-->
    <servlet>
        <servlet-name>DispacherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化的配置文件springmvc.xml路径地址-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-*.xml</param-value>
        </init-param>
        <!--表示容器在应用启动时就加载并初始化这个servlet,如果是负数或没有,随意时机加载servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--设置Servlet拦截的请求路径-->
    <servlet-mapping>
        <servlet-name>DispacherServlet</servlet-name>
        <!--
        当前servlet拦截的请求路径
        含义:拦截所有以.do结尾的请求url地址
        -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

6.编写处理器Controller

package com.wnz.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.Date;

/**
 * 全部注入到spring中
 */
@Controller
@RequestMapping("/hello")
public class HelloController {

    /**
     * 配置虚拟路径
     * 处理器里有多个使用 @RequestMapping 注解的方法
     * 每个方法映射为一个HTTP 接口
     * modelAndView 是spring提供的数据视图对象
     * 用于指定视图(html/jsp)以及所需的数据
     * @return
     */
    //@RequestMapping("/sayHello")
    @GetMapping("/sayHello")
    //@PostMapping("/sayHello")
    public ModelAndView sayHello(ModelAndView modelAndView) {
        //设置数据模型
        modelAndView.addObject("nowDate",new Date());
        modelAndView.addObject("msg", "hello springMvc");
        modelAndView.setViewName("message");
        return modelAndView;
    }
}

7.编写视图页面
src/main/webapp/pages目录下创建message.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <p>服务器时间:${nowDate}</p>
    <p>消息:${msg}</p>
</body>
</html>

编辑index.jsp页面

测试的请求地址写在页面中

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>welcome to test springmvc</title>
</head>
<body>
<fieldset>
    <h2>入门案例测试</h2>
    <a href="/hello/sayHello.do">message get测试</a>


    <p>请求方式Post</p>
    <form method="post" action="/hello/sayHello.do">

        <input type="submit" value="测试post">
    </form>
</fieldset>

8.测试
快速启动
在这里插入图片描述
访问:http://localhost
在这里插入图片描述
在这里插入图片描述
左下角 显示实际访问地址 ,测试页面 自己写的 也就是后端 实际做的操作
在这里插入图片描述
入门案例工作流程:
在这里插入图片描述
处理请求
在这里插入图片描述
springMvc 架构
在这里插入图片描述
架构流程:
1.发送请求到DispatchServlet
2.DispatcherServlet 请求HandlerMapping [注解或者xml配置]
3.处理映射器HandlerMapping 向前端控制器返回Handler,HandlerMapping把请求映射为HandlerExcutionChain对象
(包含 一个Handler 对象,多个handlerInterceptor拦截器对象)
4.DispatcherServlet 调用HandlerAdapter去执行handler
5.HandlerAdapter 将根据设配的结果执行Handler
6. :Handler执行完成后,会给适配器返回ModelAndView
7:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
8.前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp),通过这种策略很容易更换其他视图技术。
9.视图解析器向前端控制器返回View
10. 前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
11. 前端控制器向用户响应结果
Spring 组件 (一个核心、三个组件)
一个核心:DispatcherServlet(前端控制器)
三个组件:HandlerMapping 处理器映射器
handlerAdapter 处理器适配器[找到更好的执行的Handler的适配器],ViewResolver视图解析器

  1. DispatcherServlet:前端控制器 (SpringMVC框架提供)
    作用:接收用户请求,响应结果,相当于中央处理器,DispatcherServlet是整个流程控制的中心,由它调用其它组件完成用户请求的处理。DispatcherServlet的存在降低了组件之间的耦合性。
  2. HandlerMapping:处理器映射器 (SpringMVC框架提供)
    作用:根据请求的url查找Handler。
    理解为一个Map<url,Handler>,HandlerMapping负责根据用户请求的Url找到Handler即处理器,SpringMVC提供了不同的映射器来实现不同的映射方式,例如:实现接口方式,注解方式等。
  3. HandlerAdapter:处理器适配器 (SpringMVC框架提供)
    作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
  4. Handler:处理器 (需要程序员开发)
    在SpringMVC当中有两层意思:Controller或者Controller当中的方法,Handler相对于前端控制器DispatcherServlet来说是后端控制器(子控制器),执行具体业务处理的,它在DispatcherServlet的控制下处理用户的具体请求。
  5. ViewResolver:视图解析器 (SpringMVC框架提供, 需要配置)
    作用:进行视图解析,根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象。
  6. View:视图 (需要程序员开发jsp)
    SpringMVC框架提供了很多的View视图类型的支持,包括:jsp、velocity、freemarker、Thymeleaf…等。
    • jsp 功能强大,但繁琐,互联网行业使用越来越少
    • freemarker 功能强大,语法简单,使用很广泛,当前主流
    • Thymeleaf spring官方推荐

注意1:开发的组件仅有handler(Controller层代码)和view(Jsp页面)

注意2:对初学者而言,完全理解SpringMvc的所有组件有些困难,这需要在后续的使用中慢慢体会,我们可以先只关注handler(Controller层代码)和view(Jsp页面)这两部分是如何协作的。

3.2 视图解析器配置

Controller每次都要返回视图(jsp)页面地真实路径,非常繁琐,我们还可以对视图解析器进行一些配置,来简化操作。在spring-mvc配置文件中新增如下配置

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--路径名称前缀-->
    <property name="prefix" value="/pages/"/>
    <!--路径名称后缀-->
    <property name="suffix" value=".jsp"/>
</bean>```

```java

配置mvc:annotation-driven

<!--
配置Spring MVC的注解驱动
作用:自动选择最优的处理器映射器,处理器适配器
-->
<mvc:annotation-driven/>
动为我们注册多个SpringMVC框架提供的Bean

我们主要说明里面的两个RequestMappingHandlerMapping和RequestMappingHandlerAdapter。

第一个是HandlerMapping的实现类,它会处理@RequestMapping 注解,并将其注册到请求映射表中。

第二个是HandlerAdapter的实现类,它是处理请求的适配器,就是确定调用哪个类的哪个方法,并且构造方法参数,返回值。

为什么入门案例中没配置mvc:annotation-driven/ 仍然可以正常使用呢?

即使没有配置mvc:annotation-driven/,springmvc容器启动时会加载默认的RequestMappingHandlerMapping和RequestMappingHandlerAdapter,所以不会影响简单地使用。对于后续要学习的复杂请求,就必须要配置这个标签了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值