创建一个简单的SpringMVC框架
昨天写了一个单个Mybatis框架的小例子,今天来写一个SpringMVC框架的小例子。来复习一下框架的一些知识。主要是理解框架的执行流程。下面就直接开始吧。
SpringMVC框架是现在比较流行的MVC框架,类似于Struts2,它的好处有很多,最重要的大概就是它是Spring的衍生产品,属于SpringFrameWork的后续产品,所以不需要特别的jar包,直接就可以和Spring整合,另外SpringMVC框架的设计思想是:控制器是基于方法的拦截,不是Struts2基于实例的拦截,所以SpringMVC对于服务器的内存的消耗要小于Struts2。剩下的优点我可能不太了解,欢迎大家补充。
实现SpringMVC的小例子比较简单,和前面Mybatis的例子一样,也需要几个步骤。
1.导入jar包,因为SpringMVC是SpringFrameWork的后续产品,所以需要的jar包和Spring没有什么区别,下面就举出本次小例子需要的jar包。
2.编写Controller类。Controller类相当于Struts2中的Action,只不过Action是实例拦截用户请求的,Controller是方法拦截用户请求的。因为SpringMVC配置文件比较少,只有一个核心配置文件,所以大部分的配置都是需要注解来完成的。代码如下:
package com.psq.springmvctrain.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloWorld { /** * hello方法 */ @RequestMapping("hello") public ModelAndView hello() { System.out.println("hello world"); //模型视图,springMVC自带的 ModelAndView mav = new ModelAndView(); //设置的模型数据,用于传递到jsp页面 mav.addObject("msg", "hello springmvc..."); //设置打开的视图名字 mav.setViewName("/WEB-INF/jsp/hello.jsp"); return mav; } }
3.配置SpringMVC核心配置文件springmvc.xml。这个文件主要是配置SpringMVC中的bean对象,还有就是配置映射器,适配器,视图解析器(SpringMVC三大组件)。一些细节的问题代码中都有注释,都有详细的介绍。代码如下:
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置@Controller处理器,包扫描器 --> <context:component-scan base-package="com.psq.springmvctrain.controller" /> <!-- springmvc三大组件,处理器映射器,处理器适配器,视图解析器 --> <!-- 映射器与适配器必需配套使用,如果映射器使用了推荐的RequestMappingHandlerMapping, 适配器也必需使用推荐的RequestMappingHandlerAdapter。 --> <!-- 配置处理器映射器 --> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> --> <!-- 配置处理器适配器 --> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> --> <!-- 注解驱动配置,代替映射器与适配器的单独配置,同时支持json响应(推荐使用) --> <mvc:annotation-driven /> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置视图响应的前缀 --> <property name="prefix" value = "/WEB-INF/jsp/" /> <!-- 配置视图响应的后缀 --> <property name="suffix" value = ".jsp" /> </bean> </beans>
4.编写jsp页面,提供测试。这个页面写什么无所谓,主要就是 测试使用,hello world即可。没有什么难度。要注意的就是jsp文件夹的位置要在WEB-INF目录下,可以防止用户的直接访问。
5.配置前端控制器,在web.xml中配置和SpringMVC相关的一些配置,没有什么要讲的点,主要代码如下:
<!-- 配置前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 加载springmvc核心配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <!-- 配置拦截路径 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
6.测试。测试就是最后一步了,要注意在web.xml中配置了拦截的路径,所以在访问的时候要注意请求的地址是以.action为结束的。
编写的是一个小例子,甚至没有连接数据库,这里也不再讲和Mybatis的整合,大概在复习完Spring后,我会整合三个框架。我还是认为,最主要的学习是学习框架的思想和框架的具体流程,使用框架只是一个入门。剩下的就没有什么了。下面就说一说SpringMVC框架的具体流程。
用户请求一个地址,首先web.xml会先拿到地址,首先进行判断,找到处理这个请求的servlet,在加载SpringMVC的核心配置文件。在核心配置文件中会加载所有的Controller类,因为springmvc.xml中声明了包扫描器,会扫描所有的Controller类,在去对应的Controller类中找到和用户请求相同的方法。处理请求后,在返回视图。代码执行的流程图如下所示:
以上就是代码的执行流程图,但是单看这个还是很难理解SpringMVC的执行流程,下面就在说说SpringMVC的架构。
SpringMVC中最重要的就是三大组件。处理器映射器,处理器适配器,视图解析器。三大组件的先后顺序也是这样,用户请求先交给前端控制器,在调用处理器映射器,返回处理执行链。在调用处理器适配器,适配器决定由那个处理器处理,处理完成后返回一个模型和视图,在交给视图解析器决定返回的视图。最后视图解析器返回给前端控制器,前端控制器在响应用户。最后完成。具体的结构图如下:
上面的两个图不是我的,如果有问题,联系我,我删除。
上面就是SpringMVC的一些具体流程,现在可以完成和理解本次的简单的例子了,但是对于开发还是远远不够,还是有很多问题,这里也不再叙述,因为本博客只是理解SpringMVC的思想和流程。但是还是列出具体的问题,防止自己忘记。
首先是:在实际的开发中,Controller中会有一些参数要传进去,如何传参是个问题,SpringMVC支持request和response传参,但是很麻烦,所以可以直接传pojo类,基本类型,包装的pojo类。具体的传参还是要看个人的开发。
其次是:映射器和适配器必须要配套使用,还有就是我的代码本来使用映射器和适配器是过时的,所以进行了修改,具体的修改有些麻烦,不再叙述。提个醒,自己没有忘就可以了。
在其次就是:SpringMVC和Mybatis的整合问题,其实可以直接三个框架整合,因为SpringMVC是和Spring无缝整合的,所以后面会在写一个博客直接整合三个框架。
最后就是:个人认为Spring-Boot和Maven虽然在一定程度上方便了开发,但是这些工具也在一定程度上提高了入门的门槛,工具的使用看自己的理解,菜鸟像我还是先慢慢写,最后理解了在使用这些工具会更好。这是个人的理解,勿喷。
结束。