Spring入门篇8 --- 初识SpringMVC

SpringMVC是基于MVC的一种Web框架,那么什么是MVC?

MVC是软件工程中的一种软件架构模式,可以把软件系统分为三大块Model,View,Controller,这样实现了不同层次的解耦,每一块专心做自己的事就好,这个时候可能会想到Django的MTV模型,其实这两者本质是一样的,只不过是Django叫了别的名称而已,让具体如下图,看Django的设计模式不就是MVC。

 接下来看一张SpringMVC的工作流程图,也是符合MVC的要求,这张图里面出现了一个Servlet,这是个什么鬼?

 那接下来在网上找了一张图片,这个图更加清晰的绘制了SpringMVC的请求流程,在这里我们可以发现一个叫做DispatcherServlet的组件,其实2-4整个都是控制器,SpringMVC基于servlet实现的,通过图我们了解到SpringMVC的工作流程就是

  • 客户端发起请求被前置控制器DispatcherServlet捕捉到
  • 然后DispatcherServlet通过映射处理器HandlerMapping,通过我们配置的XML(现在都用注解了),注解去寻找合适的处理方法返回给DispathcherServlet
  • DispatcherServlet通过反射,真正找到处理这个请求的方法,白进行处理,同时会返回一个ModelAndView对象给DispatcherServlet
  • DispatcherSevlet通过调用视图解析器去解析ModelAndView中的view,也就是真正的视图文件(比如jsp),并返回
  • DispatcherServlet进行视图渲染,在渲染过程中,如需调用Model数据,就会将模型层数据进行调用并进行最终渲染
  • DispatcherServlet将最终结果返回客户端

 

原理应该都清楚了,废话少说,我们直接来看XML配置的代码

首先来看使用IDEL启动一个SpringMVC项目,

我们直接来配置web.xml文件,我们先来看servlet的信息,servlet已经为我们配置好了,不需要在进行更改,我们只需要改动Servlet-mapping中的信息,将想要拦截的请求进行配置,拦截到的请求会交给SpringMVC控制器进行处理

...
  <!--这个就是servelet,Spring为我们封装的前置控制器,通过配置,我们可以拦截请求,并进行控制-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<!--这个name一定要写对,他是按照servlet-name里面的值加上-servlet.xml来进行查找文件-->
<servlet-name>dispatcher</servlet-name>
<!--拦截所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
...

按照流程,接下来就到了适配器,我们来看dispatcher-servlet.xml,注意这个文件跟上面的web.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">

    <!--实例化类对象,这个用了很多遍了-->
    <bean id="hello" class="controller.Hello" />
    <bean id="login" class="controller.Login" />
    <bean id="authenticate" class="controller.Authenticate" />
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <!--将请求路径为/hello的传递给helloController-->
                <prop key="/login">login</prop>
                <prop key="/authenticate">authenticate</prop>
                <prop key="/">hello</prop>
            </props>
        </property>
    </bean>
</beans>

接下来就到了我们的控制类,我只贴出一个,源码可以去以前提到的github上看,因为逻辑都很简单

看一下Authentication的类的代码,这一步完成以后,会把mva返回给DispatcherServlet进行我们上面讲述的视图渲染,数据加载

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;

// 一定要继承Controller这个接口,注意包不要导错了
public class Authenticate implements Controller {
    // 这个是我们需要实现的方法,通过名称就可以知道,一个是请求对象,一个是相应对象
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        // 因为要进行模型层跟视图层渲染,我们实例化这个对象,并告知我们的视图是那个
        ModelAndView mav = new ModelAndView("views/result.jsp");
        // 在请求中获取参数
        String userName = httpServletRequest.getParameter("userName");
        String password = httpServletRequest.getParameter("password");
        String message = "认证失败";
        if (userName.equals("ming") && password.equals("1234")) {
            message = "认证成功";
        }
        // 告知要向视图添加对象
        mav.addObject("message", message);
        // 返回我们设置好的mav
        return mav;
    }
}

我们看一下视图view/result.jsp,使用EI语法,将数据渲染进视图

<%--
  Created by IntelliJ IDEA.
  User: yangshixiong
  Date: 2020/1/15
  Time: 下午8:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>

剩下的步骤,编辑器帮我们完成了,就无法显示了,最终实现的功能就是用户认证

猜你喜欢

转载自www.cnblogs.com/yangshixiong/p/12198869.html
今日推荐