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>
剩下的步骤,编辑器帮我们完成了,就无法显示了,最终实现的功能就是用户认证