Spring MVC创建过程及请求流程详细解释

什么是MVC?

MVC是设计模式的一种,Model代表模型,负责Dao,Service等数据;View代表视图,就是网页等用来展示数据;Controller代表控制器,控制器负责转发,把不同的数据显示在不同的网页上。

SpringMVC中的核心组件:

Spring MVC创建过程及请求流程详细解释_第1张图片

接下来通过实践来熟悉SpringMVC的处理流程:

首先新建一个SpringMVC项目

Spring MVC创建过程及请求流程详细解释_第2张图片

选中Download后idea会自动下载所需的jar包,使用eclipse的可以自己导入相应的需要使用的jar包。除了自动下载的包以外,我们还需要导入本地Tomcat路径下lib文件夹中的servlet-api.jar这个包。生成项目之后,我们会发现lib文件夹并不在WEB-INF之下,为了防止之后出现问题,我们把lib文件夹剪切到WEB-INF之下,接着右键整个项目选择Open Module Settings,选中Dependencies点击右侧的加号。

Spring MVC创建过程及请求流程详细解释_第3张图片

接着选择第一个jar选项,选中lib文件夹,点击确定。

Spring MVC创建过程及请求流程详细解释_第4张图片

接下来修改web.xml

Spring MVC创建过程及请求流程详细解释_第5张图片

将url-pattern修改为 / ,表示要拦截所有的请求,并交由Spring MVC的后台控制器来处理。

接下来修改dispatcher-servlet.xml,这是SoringMVC的映射配置文件,名称和web.xml文件中定义的servlet-name相对应,为xxx-servlet.xml



       
           
               
                   
                   firstController
               
           
       
        

新建一个包【controller】,包下新建一个类FirstController,继承Controller接口,重写handleRequest方法,通过ModelAndView将视图和数据结合在一起。

package controller;

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

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

public class FirstController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView("index.jsp");
        modelAndView.addObject("message","Hello Spring MVC");
        return modelAndView;
    }
}

修改index.jsp,使用EI表达式展示message的数据

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" isELIgnored="false" %>

  
    $Title$
  
  
  

hello

${message}

启动tomcat,在浏览器中修改路径后加上/first,看到结果。启动tomcat的方法见博客https://blog.csdn.net/qq_41973594/article/details/95037638

Spring MVC创建过程及请求流程详细解释_第6张图片

-------------------------------------------------------------------------------------------------------------------------------------

Spring MVC的请求流程

Spring MVC创建过程及请求流程详细解释_第7张图片

很多人学习SpringMVC时都见过这个图,也能用语言表示出其中的步骤,但是放到代码中就不是那么清楚了,接下来就通过上面的代码解释一下SpringMVC的请求流程

1.请求发送到DispatcherServlet


    dispatcher
    org.springframework.web.servlet.DispatcherServlet
    1


    dispatcher
    /

请求首先到达DispatcherServlet,通过将url-pattern修改成“/”,DispatcherServlet会拦截所有请求

2.DispatcherServlet根据HandlerMapping中的配置信息找到相应的二级控制器



       
           
               
                   
                   firstController
               
           
       
        

我们通过配置 simpleUrlHandlerMapping 来将 /first 地址交给 firstController 处理

3.DispatcherServlet调用相应的控制器

public class FirstController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView("index.jsp");
        modelAndView.addObject("message","Hello Spring MVC");
        return modelAndView;
    }
}

这里的控制器将视图与数据结合在一起

4.当处理完业务逻辑后,Controller返回ModelAndView给DispatcherServlet

5.DispatcherServlet调用视图解析器进行解析,上面的例子直接绑定到了index.jsp

6.最后的View负责展示视图,在本例中就是index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" isELIgnored="false" %>

  
    $Title$
  
  
  

hello

${message}

-------------------------------------------------------------------------------------------------------------------------------------

使用注解配置Spring MVC

使用XML方式配置Spring MVC程序虽然可以很好的了解SpringMVC的全过程,但是终究还是太麻烦了,在现实中大多还是使用注解的方式。

SpringMVC中的常用注解有以下几种:

1.@Controller

在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model,使用@Controller 标记一个类是Controller,后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到

2.@ResquestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

3.@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

4.@ResponseBody

 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区

更多的注解等使用到的时候再做补充

将上面的例子使用注解进行修改:

@Controller
public class FirstController{
    @RequestMapping("/first")
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView("index.jsp");
        modelAndView.addObject("message","Hello Spring MVC");
        return modelAndView;
    }
}

将原来的XML文件中的配置注释,增加新的配置

再次重新启动服务器后可以达到和原来一样的效果。

------------------------------------------------------------------------------------------------------------------------------------

配置安全的视图解析器

如果我们把jsp页面放在web的根目录下,那么通过 路径/jsp名字 就能直接访问到jsp页面,这会导致web网站不安全。【WEB-INF】是javaweb中默认的安全目录,用户无法通过在地址栏直接访问到WEB-INF目录中的文件,我们要做的就是在WEB-INF下建立一个存放jsp文件的目录,然后告诉视图解析器就行。

1.在WEB-INF目录下新建包page,并把index.jsp剪切到包下

2.在dispatcher-servlet.xml中增加下面一项


    
    

这里的意思是告诉视图解析器视图资源的物理路径,为/WEB-INF/page/xxx.jsp,xxx就是接下来配置的。

3.修改FirstController

Spring MVC创建过程及请求流程详细解释_第8张图片

去掉 index.jsp中的后缀,因为我们在xml文件中已经配置好了

4.重启服务器,加上后缀/first后查看结果,和原先的结果一致。

 

你可能感兴趣的:(SSM框架)