SpringMVC
1.MVC设计模式
- Model1时代:很多学Java后端比较晚的朋友可能并没有接触过Model1模式下的JavaWeb应用开发。在Model1模式下,整个Web应用几乎全部用JSP页面组成,只用少量的JavaBean来处理数据库连接、访问等操作。这个模式下JSP即是控制层又是表现层。显而易见,这种模式存在很多问题。比如①将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;②前端和后端相互依赖,难以进回测试并且开发效率极低;
- Model2时代: JavaBean(Model)+JSP(View)+Servlet(Controller)这种开发模式是早期的JavaWeb MVC 开发模式。
Model:系统涉及的数据,也就是dao和beano
View:展示模型中的数据,只是用来展示。
Controller:处理用户请求都发送给,返回数据给JSP并展示给用户。
Model2模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多Javaweb开发相关的MVC框架应运而生比如Struts2,但Struts2比较笨重。随着Spring轻量级开发框架的流行Spring生态圈出现了SpringMVC框架,SpringMVC是当前最优秀的MVC框架。相比Struts2,SpringMVC使用更加简单和方便,开发效率更高,并且springMVC运行速度更快。
- MVC是一种设计模式,SpringMVC是一款很优秀的MVC框架。它可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成。SpringMVC下一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity(实体类)、Controller(控制层,返回数据给前台页面)。
SpringMVC的简单流程
SpringMVC的工作原理
流程说明:
1.客户端发送请求,直接请求DispatcherServlet
2.DispatcherServlet ——> HandlerMapping,处理器映射器会将请求映射为HandlerExecutionChain对象返回给DispatcherServlet,该对象里面包含了一个Handler处理器对象和多个HandlerInterceptor拦截器对象(如果设置了拦截器则生成拦截器对象,没有则不生成)
3.解析到对应的Handle(也就是平时我们所说的Controller控制器)后,开始由HandleAdapter适配器
处理。
4.HandlerAdapter会根据Handle来调用真正的处理器来处理请求,并处理相应的业务逻辑。
5.处理器处理完业务后,会返回ModelAndView对象。Model是返回的数据对象,View是个逻辑上的VIew。
6.DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
7.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
8.把View返回给请求者。
SpringMVC的配置文件
1.配置DispatcherServlet
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。
<!-- 配置springmvc核心servlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.DispatcherServlet的配置文件
但是,我们在搭建SpringMVC框架时,往往总是把DispatcherServlet的配置文件放错位置。网上有的说:springDispatcherServletMVC-servlet.xml(暂且命名这么一个springDispatcherServletMVC的dispatchservlet配置文件)应该放在WEB-INF下面(与web.xml放一起);有的说:应该直接把springDispatcherServletMVC-servlet.xml放在src文件夹下面;有的说:在java resources下面新建一个config的resource folder,把配置文件都放在这个资源文件夹下面。那么到底哪种是正确的呢?
答案是:这个要根据web.xml中DispatcherServlet的配置声明有关系。
3.url-pattern的配置
url-pattern配置有三种:
- *.do 访问以.do结尾的由DispatcherServlet进行解析.
- /(斜杠) 所有访问的地址都由DispatcherServlet进行解析,对于静态的文件解析需要配置,不让DispatcherServlet进行解析.
注意:使用此种方式可以实现 RESTful风格的url. - /* 配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet进行解析,但是不能根据这个jsp页面找到handler所以会报错.
2.SpringMVC配置文件
springmvc的配置文件一般都是在web.xml里面指定位置的。其实,springmvc的配置文件有默认位置。因此,存在两种配置方式。
2.1 用指定位置配置方式,即在web.xml配置文件中指定springmvc配置文件的位置。
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
上面代码中,明确了contextConfigLocation的地址为:classpath:(即在classess文件夹下面),而且命名为springmvc.xml(或者其他名称都可以),指定配置文件位置时,这个配置文件的名字可以随便取。
2.2采用默认位置配置方式
当web.xml中DispatcherServlet配置声明中,没有明确DispatcherServlet前端控制器配置文件的位置时,则系统默认DispatcherServlet前端控制器配置文件放在WEB-INF文件夹下。
<!-- Spring MVC 的Servlet,它将加载WEB-INF/springDispatcherServlet-servlet.xml 的配置文件,以启动Spring MVC模块-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2.3springmvc配置文件的内容
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--注解扫描-->
<!-- 设置自动注入bean的扫描范围,use-default-filters默认为true,
会扫描所有的java类进行注入 Use-dafault-filters=”false”的情况下:
<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描
springmvc和application文件都需要配置,但mvc文件只扫描controller类,
application扫描不是controller类 -->
<context:component-scan base-package="com.zua" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,
是spring MVC为@Controllers分发请求所必须的。它提供了数据绑定支持,读取json的支持
-->
<mvc:annotation-driven/>
<!--视图解析器,对应pages文件夹下以.jsp为后缀的视图-->
<bean id="view" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--解除静态资源拦截-->
<mvc:default-servlet-handler/>
</beans>