天天看点

30分钟轻松入门Spring MVC

30分钟轻松入门Spring MVC

Spring MVC框架入门学习步骤

  • 1、了解Spring MVC基本慨念, 是什么?,能干什么?
  • 2、Spring MVC核心组件、底层实现原理
  • 3、Spring MVC实际开发, 基于XML方式、基于注解的方式

什么是MVC设计模式?

可以将一个Web应用程序分成三层:Controller层、View层 和 Model层。

  • Controller:负责接收客户端请求, 然后对请求做出相应的业务处理, 最终将处理结果返回给客户端
  • Model:负责处理具体的业务逻辑, 产生不同的模型数据。一般是指dao 和 service
  • View:视图层负责将模型数据展示给用户, 是程序与用户进行交互的窗口
30分钟轻松入门Spring MVC
  • 1、用户提交请求后, 被controller控制层接收。
  • 2、控制层根据不同的请求, 去调用model模型层相应的业务方法。
  • 3、不同的业务方法会对数据库进行增删改查的持久化操作, 并产生相应的模型数据。
  • 4、模型数据传递给view视图层, view视图层拿到数据之后进行渲染, 最终把结果响应给客户端。

什么是Spring MVC?

  • Spring MVC是Spring框架的一个后续产品, 是Spring的一个子模块, 二者可以很好的结合使用, 无需整合处理。
  • Spring MVC是目前最好的一款实现了MVC设计模式的框架。它对整个MVC设计模式进行的封装, 然后提供更加简洁方便的方法, 大大提高程序员的开发效率。

Spring MVC的核心组件(底层实现)?

  • 1、DispatcherServlet:前置控制器, 是整个流程控制的核心, 用来控制其他组件的执行, 进行一个统一的调度,降低各个组件的耦合性, 相当于总指挥。
  • 2、Handler:处理器(控制器), 用来完成具体的业务逻辑, 它就是我们Spring MVC中的编写的Controller类。
  • 3、HandlerMapping:请求映射, DispatcherServlet接收到不同的请求后, 将不同的请求分发到不同的Handler中, 那么它是如何分发实现的呢?需要借助HandlerMapping, 将请求映射到具体的Handler中, 映射成功后会返回一个HandlerExecutionChain对象给DispatcherServlet。
  • 4、HandlerInterceptor:处理器拦截器, 它是一个接口, 如果需要做一些拦截处理, 可以实现这个接口来完成这样的功能, 它会在访问Controller前后执行。它其实与AOP有点类似, 只是它拦截的是url, 而AOP拦截的是类的元数据(包、方法), 相比较而言AOP更细致一点。
  • 5、HandlerExecutionChain:处理器执行链, 它包括一个Handler处理器(控制器)对象 和 至少一个HandlerInterceptor拦截器。Handler是我们编写的Controller类, 至于为什么是至少一个HandlerInterceptor呢, Spring MVC一般会默认提供一个拦截器, 如果需要额外添加拦截器的话, 需要实现这个接口。
  • 6、HandlerAdapter:处理器适配器, Handler在执行业务方法之前,需要执行一系列的操作。包括对表单数据的验证、表单数据数据类型的转换 以及将表单数据封装到Java Bean当中。这一系列的操作都是由HandlerAdapter来完成的。DispatcherServlet通过HandlerAdapter来执行不同的Handler
  • 7、ModelAndView:是装载了模型数据和视图信息的一个类, 这里的视图指的是逻辑视图, 它作为Handler的处理结果返回给DispatcherServlet, DispatcherServlet拿到ModelAndView之后, 是需要进行解析的, 那怎么解析呢?需要借助ViewResolver视图解析器。
  • 8、ViewResolver:视图解析器, 视图解析器会将逻辑视图解析成物理视图, 并完成模型数据的填充, 最终将结果渲染响应给客户端。

Spring MVC的实现流程?

30分钟轻松入门Spring MVC
  • 1、客户端发送的请求被DispatcherServlet接收。
  • 2、DispatcherServlet接收到请求后, 根据HandlerMapping的映射将这个请求映射到具体的Handler, 映射成功后会返回一个HandlerExecutionChain对象(包括一个Handler对象 和 至少一个HandlerInterceptor)给DispatcherServlet。注意这里只是拿到Handler对象, 并没有执行Handler中的处理方法。
  • 3、DispatcherServlet拿到Handler之后, 通过HandlerAdapter来执行具体的Handler的处理方法, 并且在Handler的处理方法执行之前, 可能会做一系列的处理, 包括表单数据的验证、表单数据类型转换等. . . 。
  • 4、在Handler的处理方法执行完之后,会返回一个ModelAndView(模型数据和逻辑视图)这样一个对象给DispatcherServlet。
  • 5、DispatcherServlet拿到返回的ModelAndView后, 将其交给ViewResolver, 通过ViewResolver视图解析器进行解析, 将逻辑视图转换成web工程的一个物理视图(jsp), 然后返回一个视图对象给DispatcherServlet。
  • 6、然后在jsp视图中将Handler传递过来的模型数据进行封装, 并加以渲染, 最终响应给客户端。
30分钟轻松入门Spring MVC

在前面学习到Spring MVC的组件时, 是不是有点小恐惧, Spring MVC有这么多个组件, 那么它使用起来会不会非常复杂,开发步骤会不会很多. . .

其实, Spring MVC的大部分组件是由它自身提供的, 我们只需要通过配置进行关联即可, 实际需要我们手动编写的只有两个部分:Handler 和 View。 Handler是MVC中的C, 即Controller; View是我们的视图, 可以理解为jsp

Spring MVC基于XML的开发方式?

基于XML的开发步骤:

  • 1、Spring MVC基础配置, 在web.xml中配置
  • 2、编写Handler, 即Controller类
  • 3、编写View, 也就是jsp
  • 4、通过XML配置Handller(Controller),HandlerMapping组件的映射
  • 5、通过XML配置ViewResolver视图解析器

( 红色字体是需要我们编写的部分, 其它的部分通过配置完成 )

1、在web.xml中配置Spring MVC基础配置。

  • 配置前置控制器DispatcherServlet, < servlet>结点下由三个必须的子节点:

    <servlet-name>

    <servlet-class>

    <init-param>

    , < servlet-name>是servlet的名字, 一般与servlet类名有关, < servlet-class>是servlet类的全类名, < init-param>初始化参数, 用于指定spring mvc配置文件地址。
  • 配置servlet与url之间的映射< servlet-mapping>, < servlet-mapping>有两个子节点:

    <servlet-name>

    <url-pattern>

    。该< servlet-name>的名字必须与servlet的名字一致, < url-pattern>指定对应servlet的url路径。
<!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>

   <!--配置前端控制器,接收不同的url请求分发给不同的Handler,起到一个总指挥的作用-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化参数,指定spring mvc配置文件路径-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc1.xml</param-value>
        </init-param>
    </servlet>

    <!--配置url请求映射-->
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!--拦截所有请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
           

2、定义Handler, 即Controller类

  • 定义一个XmlHandler 实现Controller接口,并重写handlerRequest方法, 然后在方法中处理具体的业务逻辑
package com.cd.handler.xml;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

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

/**
 * 定义一个Handler实现Controller接口,并重写handlerRequest方法
 */
public class XmlHandler implements Controller {

	/**
     * 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
     */
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        //填充模型数据
        modelAndView.addObject("name","李宁");
        //设置逻辑视图
        modelAndView.setViewName("show");
        //将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
        return modelAndView;
    }
}
           

3、编写View, 也就是jsp

  • 由于我们前面设置的视图名称是show, 模型数据会返回到show视图中, 所以这里需要我们定义show.jsp。由于Spring MVC会自动将ModelAndView中的模型数据放到jsp内置对象(request作用域)当中, 然后我们就可以通过EL表达式从内置对象中回去到模型数据, 并对其进行渲染。
  • 并且, 使用EL表达式需要我们添加

    <%@page isELIgnored="false" %>

    语句, 表示不忽略EL表达式
<%@page pageEncoding="UTF-8" %> <%--页面使用UTF-8编码--%>
<%@page isELIgnored="false" %>  <%--不忽略EL表达式--%>
<html>
<head>
    <meta charset="UTF-8">
    <title>SpringMVC实现方式</title>
</head>
<body>
    My name is ${name}
</body>
</html>
           

4、在springmvc.xml中, 通过XML配置Handller(Controller),HandlerMapping组件的映射

  • 就是将url请求通过SimpleUrlHandlerMapping映射到具体的Handler中
<!--配置HandlerMapping,将请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<!--配置映射url-->
    <property name="mappings">
        <props>
        	<!--配置test请求对应的Handler,就是将test请求映射到id为xmlHandler的Handler对象中,
                使url请求和Handler进行关联-->
            <prop key="/test">xmlHandler</prop>
        </props>
    </property>
</bean>

<!--配置 Handler的 Bean,即Controller-->
<bean id="xmlHandler" class="com.cd.handler.xml.XmlHandler"/>
           

5、在springmvc.xml中, 通过XML配置ViewResolver视图解析器

  • 配置视图解析器, 将ModelAndView中的设置的逻辑视图解析成web工程中对应的jsp视图 。ViewResolver中定义的视图前缀和视图后缀, 就是分别用来加在逻辑视图前后的 。 比如ModelAndView中设置的逻辑视图是show, 那么经过下面的ViewResolver视图解析器解析后, 就变成了/show.jsp, 即根目录底下的show.jsp视图文件
<!--视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--视图前缀-->
    <property name="prefix" value="/"/>	  <!--/表示根目录-->
    <!--视图后缀-->
    <property name="suffix" value=".jsp"/>
</bean>
           

完整的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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置HandlerMapping,将请求映射到Handler-->
    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/test">xmlHandler</prop>
            </props>
        </property>
    </bean>
    <!--配置Handler,即Controller-->
    <bean id="xmlHandler" class="com.cd.handler.xml.XmlHandler"/>

    <!--视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图前缀-->
        <property name="prefix" value="/"/><!--/表示根目录-->
        <!--视图后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
           

Spring MVC基于注解的开发方式?

基于注解的开发步骤:

  • 1、Spring MVC基础配置, 在web.xml中配置
  • 2、编写Handler, 即Controller类
  • 3、编写View, 也就是jsp
  • 4、在Controller中, 通过注解实现Handller(Controller)、HandlerMapping组件的映射
  • 5、通过XML配置ViewResolver视图解析器

( 红色字体是需要我们编写的部分, 其它的部分通过配置完成 )

1、在web.xml中配置Spring MVC基础配置

  • 包括前置控制器DispatcherServlet 和 将 配置将 url 请求映射到DispatcherServlet。
<!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>

   <!--配置前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化参数,指定spring mvc配置文件路径-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc2.xml</param-value>
        </init-param>
    </servlet>

    <!--配置url请求映射-->
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!--拦截所有请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
           

2、定义Handler, 即Controller类

  • 基于注解方式无需实现Controller接口, 使用@Controller注解声明该类是一个Controller类即可。所以, 我们可以在类中自定义方法, 然后在方法中处理具体的业务逻辑。
package com.cd.handler.annotation;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class AnnotationHandler {

	/**
     * 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
     */
    public ModelAndView testModelAndView(){
        //装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        //填充模型数据
        modelAndView.addObject("name","李宁");
        //设置逻辑视图
        modelAndView.setViewName("show");
        //将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
        return modelAndView;
    }
}
           

3、编写View, 也就是jsp

  • 由于我们前面设置的视图名称是show, 模型数据会返回到show视图中, 所以这里需要我们定义show.jsp。由于Spring MVC会自动将ModelAndView中的模型数据放到jsp内置对象(request作用域)当中, 然后我们就可以通过EL表达式从内置对象中回去到模型数据, 并对其进行渲染。
  • 并且, 使用EL表达式需要我们添加

    <%@page isELIgnored="false" %>

    语句, 表示不忽略EL表达式
<%@page pageEncoding="UTF-8" %> <%--页面使用UTF-8编码--%>
<%@page isELIgnored="false" %>  <%--不忽略EL表达式--%>
<html>
<head>
    <meta charset="UTF-8">
    <title>SpringMVC实现方式</title>
</head>
<body>
    My name is ${name}
</body>
</html>
           

4、在Controller中, 通过注解实现Handller(Controller)、HandlerMapping组件的映射

  • 通过@RequestMapping注解直接将url请求和Controller中的方法进行关联, @RequestMapping的作用是将一个具体的url请求 和 Controller中的一个具体的方法进行映射关联
package com.cd.handler.annotation;

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

@Controller
public class AnnotationHandler {

	/**
     * 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        //装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        //填充模型数据
        modelAndView.addObject("name","李宁");
        //设置逻辑视图
        modelAndView.setViewName("show");
        //将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
        return modelAndView;
    }
}
           

5、在springmvc.xml中, 通过XML配置ViewResolver视图解析器

  • 配置自动扫描, 使@Controller注解生效
  • 配置视图解析器, 将ModelAndView中的设置的逻辑视图解析成web工程中对应的jsp视图 。ViewResolver中定义的视图前缀和视图后缀, 就是分别用来加在逻辑视图前后的 。 比如ModelAndView中设置的逻辑视图是show, 那么经过下面的ViewResolver视图解析器解析后, 就变成了/show.jsp, 即根目录底下的show.jsp视图文件
<?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/spring-beans.xsd 
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd ">

    <!--自动扫描-->
    <context:component-scan base-package="com.cd.handler.annotation"/>

    <!--视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图前缀-->
        <property name="prefix" value="/"/>
        <!--视图后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
           

Spring MVC基于注解开发中Controller的业务方法开发方式?

Spring MVC基于注解开发中, 处理业务方法的方式, 除了ModelAndView之外,还有另外两种方式:Model 和 Map

取前面基于注解开发案例代码, 其它内容不变, 修改AnnotationHandler处理器控制器类代码, 在类中添加两个业务方法, 用来演示Model 和 Map开发方式

package com.cd.handler.annotation;

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

import java.util.Map;

@Controller
public class AnnotationHandler {
    
    /**
     * 1、业务方法: ModelAndView完成模型数据的传递 和 视图的解析
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        //装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        //填充模型数据
        modelAndView.addObject("name","李宁");
        //设置逻辑视图
        modelAndView.setViewName("show");
        //将模型数据和逻辑视图装入ModelAndView后,返回一个ModelAndView对象
        return modelAndView;
    }

    /**
     * 2、业务方法: Model传值,String进行视图解析
     */
    @RequestMapping("/testModel")
    public String testModel(Model model){
        //填充模型数据
        model.addAttribute("name","李宁");
        //设置逻辑视图
        return "show";
    }

    /**
     * 3、业务方法: Map传值,String进行视图解析
     */
    @RequestMapping("/testMap")
    public String testMap(Map<String,String> map){
        //填充模型数据
        map.put("name","李宁");
        //设置逻辑视图
        return "show";
    }
}
           

Model方式, 其实就是将 ModelAndView 拆分成 Model 和 String , Model用来传递模型数据, String用来设置逻辑视图, 然后return返回。Map方式与Model方式大致相同, 只不过是将Model替换成Map而已, 它们的填充模型数据时调用的方法不一样。

对比Spring MVC中3种Controller的业务方法的开发方式, 发现Model 和 Map方式 明显要比ModelAndView方式要简单很多。 所以实际开发中, 建议使用这两种方式。

30分钟轻松入门Spring MVC

1、Spring MVC实现了MVC设计模式, 它对MVC设计模式进行了封装。Spring MVC 是Spring的一个后续产品, 二者可以很好的结合使用, 无需过多的整合处理。

2、Spring MVC底层有很多组件, 它们大部分都是Spring MVC提供的, 我们只需要通过配置进行关联即可, 真正需要我们手动编写的只有Handler 和 View 两个组件。

3、Spring MVC有基于XML 和 注解两种开发方式。

4、基于XML方式需要定义一个类来实现Controller接口, 表明这是一个Controller, 然后再spring mvc配置文件中配置SimpleUrlHandlerMapping 和 Handler(实现了Controller接口的类), 通过SimpleUrlHandlerMapping将url请求和Handler进行关联/映射。

5、基于注解方式, 直接再类中通过@Controller注解声明为Controller类后, 通过@RequestMapping直接将Url请求 和 Controller中具体的业务方法进行关联即可, 比基于XML方式要简单很多, 所以建议使用基于注解方式进行开发。

Spring MVC入门案例源码

继续阅读