zoukankan      html  css  js  c++  java
  • 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>

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

  • 相关阅读:
    jQuery的deferred对象详解
    MySQL主从复制与读写分离
    MySQL和MongoDB的性能测试
    MongoDB与MySQL的插入性能测试【转】
    mongodb+php通过_id查询
    MongoDB资料汇总专题
    mongodb常用命令
    【Mongodb教程 第十九课 】PHP与MONGODB的条件查询
    【Mongodb教程 第十八课 】MongoDB常用命令 数据库命令 集合操作命令
    mongoVUE 破解方法
  • 原文地址:https://www.cnblogs.com/yangshixiong/p/12198869.html
Copyright © 2011-2022 走看看