一、Spring MVC
简介

Spring MVC(全称 Spring Web MVC)是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架。

MVC架构

(1)示意图




springMVc 接收xml格式参数_spring


(2)各层职责

  • Model:负责对请求进行处理,并将结果返回给 Controller
  • View:负责将请求的处理结果进行渲染,展示在客户端浏览器上
  • Controller:是 Model 和 View 交互的纽带;主要负责接收用户请求,并调用 Model 对请求处理,然后将 Model 的处理结果传递给 View
SpringMVC工作原理

(1)控件

DispatcherServlet(前端控制器)
负责拦截客户端请求并分发给其他组件,它是整个流程控制的中心,负责调度其他组件的执行,降低各组件之间的耦合,提升整体效率

HandlerMapping(处理器映射器)
负责根据客户端请求的URL寻找处理器,Spring MVC中提供了配置文件、注解等映射方式,这些映射方式将由相应的处理器映射器负责处理

Handler(处理器)
负责对客户端的请求进行处理,由开发者编写

HandlerAdapter(处理器适配器)
负责根据特定的规则对处理器进行执行,它可以执行多种类型的处理器,是设计模式中适配器模式的具体应用

ViewResolver(视图解析器)
负责视图解析,它可以将处理结果生成View(视图)并展示给用户

View(视图)
展示给用户看,由开发者编写

(2)原理


springMVc 接收xml格式参数_spring_02


用户发送请求到前端控制器(DispatcherServlet)

前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)

找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)

前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

处理器适配器去执行Handler

处理器执行完给处理器适配器返回ModelAndView

处理器适配器向前端控制器返回ModelAndView

前端控制器请求视图解析器(ViewResolver)去进行视图解析

视图解析器向前端控制器返回View

前端控制器对视图进行渲染

前端控制器向用户响应结果

二、使用xml开发
配置前端控制器(web.xml)
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

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

    <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:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动时自动加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- /  拦截 不包括jsp的其他请求-->
        <!-- /* 拦截 包括jsp的所有请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
配置映射器(springmvc-servlet.xml)
  • 方式一:BeanNameUrlHandlerMapping
<!--BeanNameUrlHandlerMapping
        浏览器发送/user请求,在spring容器中找到id="/user"的对应实例-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean id="/user" class="com.app.xml.UserController"/>
  • 方式二:SimpleUrlHandlerMapping
<!--SimpleUrlHandlerMapping
        在自己的实例中自定义一套映射规则properties(请求与实例id关系)
        浏览器发送/user请求,在property中找到key="/user"映射的id,然后在spring容器中找到id对应实例-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/user">userController</prop>
            </props>
        </property>
    </bean>
<!--配置Controller-->
    <bean id="userController" class="com.app.xml.UserController"/>
配置适配器(springmvc-servlet.xml)
  • 方式一:SimpleControllerHandlerAdapter(要求我们编写的Controller继承Controller接口)
<!--需要Controller继承Controller-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  • 方式二:HttpRequestHandlerAdapter(要求我们编写的Controller继承HttpRequestHandler接口)
<!--需要Controller继承HttpRequestHandler-->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
配置视图解析器(springmvc-servlet.xml)
<!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
编写Controller
  • 继承Controller接口(使用了SimpleControllerHandlerAdapter适配器)
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class UserController implements Controller {
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) {
        ModelAndView modelAndView = new ModelAndView();
        // index即逻辑视图名,视图解析器会自动加上前缀(/)和后缀(.jsp),即 index -> /index.jsp
        modelAndView.setViewName("index");
        return modelAndView;
    }
}
  • 继承HttpRequestHandler接口(使用了HttpRequestHandlerAdapter适配器)
import org.springframework.web.HttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserController2 implements HttpRequestHandler {
    public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
        System.out.println("UserController.handleRequest");
    }
}
编写index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
运行tomcat服务器,使用浏览器访问


springMVc 接收xml格式参数_springMVc 接收xml格式参数_03


二、使用注解开发
添加自动扫包(springmvc-servlet.xml)
<context:component-scan base-package="com.app.annotation"/>
编写Controller类
  • @Controller注解 —— 标识本类为Controller类,使Spring的IoC容器扫描到
  • @RequestMapping —— 请求映射,标识出浏览器访问的url路径
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("user")
public class UserController {
    @RequestMapping(value = "func1")
    public ModelAndView func1() {
        return null;
    }
}
配置映射器和适配器(springmvc-servlet.xml)
  • 方式一:配置bean类
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
  • 方式二:配置<mvc:annotation-driven/>标签(推荐)

方法二除了自动配置方式一的bean类外,还添加了其他功能,利于后面的学习使用。

<mvc:annotation-driven/>
配置前端控制器(web.xml)
  • 代码与使用xml开发相同
配置视图解析器(springmvc-servlet.xml)
  • 代码与使用xml开发相同
运行tomcat服务器,使用浏览器访问


springMVc 接收xml格式参数_spring_04