**Model(模型)**:数据模型,用于提供要展示的数据。一般包含数据和行为(也就是业务),在JavaWEB中,数据和业务往往是分离开的。
**View(视图)**:负责对模型数据进行展示,例如我们看到的网页。概念比较广泛,可以是:html、JSP、excel、Word、PDF、json、XML等
**Controller(控制器)**:接收用户请求,委托给模型做处理,处理完毕返回数据,再交给视图做渲染,相当于调度员工作
可以让我们实现:
-
进行更简洁的Web层的开发;
-
天生与Spring框架集成(如IoC容器、AOP等);
-
提供强大的约定大于配置的契约式编程支持;
-
支持灵活的URL到页面控制器的映射;
-
非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);
-
非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
-
支持Restful风格。
SrpingMVC架构了解一下:
DispatcherServlet 前置控制器
HandlerMapping 处理器映射器
HandlerAdapter 处理器适配器
Controller接口 控制器
ViewResolver 视图解析器
流程总结:
流程总结: 1. 用户发起请求到DispatcherServlet(前端控制器) 2. DispatcherServlet通过HandlerMapping(处理映射器)寻找用户要请求的Handler 3. HandlerMapping返回执行链,包含两部分内容: a) 处理器对象:Handler b) HandlerInterceptor(拦截器)的集合 4. 前端控制器通过HandlerAdapter(处理器适配器)对Handler进行适配包装 5. 调用包装后的Handler中的方法,处理业务 6. 处理业务完成,返回ModelAndView对象,包含两部分 a) Model:模型数据 b) View:视图名称,不是真正的视图 7. DispatcherServlet获取处理得到的ModelAndView对象 8. DispatcherServlet将视图名称交给ViewResolver(视图解析器),查找视图 9. ViewResolver返回真正的视图对象给DispatcherServlet 10. DispatcherServlet把Model(数据模型)交给视图对象进行渲染 11. 返回渲染后的视图 12. 将最终的视图返回用户,产生响应
快速入门案例:
首先创建一个java web项目,引入需要的包:
<dependencies> <!--spring mvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <!--日志--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <!-- JSP相关 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <scope>provided</scope> </dependency> </dependencies>
配置tomcat:
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/</path> <port>8080</port> </configuration> </plugin> </plugins> </build>
编写我们的controller(实现Controller接口)和jsp页面:
package com.zy.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; public class MyTestController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView(); mv.setViewName("hello");//设置对应视图的名字 mv.addObject("msg", "hello springmvc ===" + new Date().toLocaleString()); return mv; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h1>${msg}</h1> </body> </html>
1,想使用springmvc必须先配置web.xml中的DispatcherServlet:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>myspringmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--tomcat启动时就创建--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myspringmvc</servlet-name> <!-- /* 匹配所有请求路径,不要用 / 匹配除了.jsp以为的所有请求 *.xxx: 匹配以xxx为后缀的路径 --> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
2,创建并配置SpringMVC配置文件:
SpringMVC有自己的配置文件,其实就是类似于Spring的applicationContext.xml的一个配置文件,配置SpringMVC需要使用到的bean,例如HandlerMapping,HandlerAdapter等
这个文件默认是去寻找:WEB-INF/{servletName}-servlet.xml(下面图片可以说明):
刚才在DispatcherServlet中配置的ServletName是 myspringmvc,所以默认是去找WEB-INF/myspringmvc-servlet.xml:
创建好这个文件后,我们需要配置一下其中的HandlerMapping,HandlerAdapter,Handler,viewResolver:
<?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"> <!--1 配置HandlerMapping 可省略不写--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--2 配置HandlerAdapter 可省略不写--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--3 配置业务处理器 handler(我们自己写的controller)--> <bean name="/hello.do" class="com.zy.controller.HelloController"/> <!--4 配置 viewResolver 视图解析器: 定位视图的准确位置, 问题: 根据视图名称,找到 视图对应的位置 * 例子: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="hello" -> "/WEB-INF/jsp/hello.jsp" --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--指定前缀--> <property name="prefix" value="/WEB-INF/views/"/> <!--指定后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>
运行tomcat即可。
注解版案例:
1) 类必须实现Controller接口,不友好。
2) 每个类中只能有一个默认处理方法,只能处理一个用户请求。
3) 每个类需要在配置文件中进行配置,很麻烦。
为了解决上面这些问题,我们使用注解版来改造一下:
1,首先我们的控制器controller:
//加上Controller注解 @Controller public class HelloController { //映射注解 @RequestMapping("/helloSpringMVC") public ModelAndView helloSpringMVC(){ ModelAndView mv = new ModelAndView(); mv.setViewName("hello");//设置视图名字 mv.addObject("msg", "hello springmvc 注解版 ===" + new Date().toLocaleString()); return mv; } }
2,然后我们的myspringmvc-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--下面配置HandlerMapping和HandlerAdapter的两步是可以不写的--> <!--但是不写的情况下 默认的注解版的是过时的,所以可以写成下面这种推荐版的,也可以写最终这两步结合的简化版--> <!--1 因为 默认注解的handlermaping过时了,所以使用推荐版--> <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>--> <!--2 因为 默认注解的HandlerAdapter过时了,所以使用推荐版--> <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>--> <!--上面注释的两步的结合简化版--> <mvc:annotation-driven></mvc:annotation-driven> <!--由于是注解版的 所以开启扫描包扫描controller--> <context:component-scan base-package="com.zy.controller"></context:component-scan> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/views/"></property> <!--后缀--> <property name="suffix" value=".jsp"></property> </bean> </beans>
运行tomcat访问 http://localhost:8080/helloSpringMVC.do 即可。