前端控制器(DispatcherServlet)的工作流程:
前端控制器工作流程:用户通过http协议发送请求到前端控制器,前端控制器根据用户的请求到具体的controller处理数据,返回处理结果到前端控制器,前端控制器将数据分发给业务视图,由业务视图呈现最终的用户页面,返回给前端控制器,在呈现给用户-----------------------------------------------------------------------------------------------
Spring MVC基本概念:
1.DispatcherServlet:桥梁(核心)2.Controller:MVC 中的C
3.MVC中的V 用户看到的东西
-------------------------------------------------
SpringMVC的静态概念:
1:.DispatcherServlet :分发到合适的controller来生产我们需要的model model通过DispatcherServlet来传递给我们的View
2.Controller: 就是MVC中的C 屌用业务逻辑生成model的地方
3.在SpringMVC中并没有一个Interface叫controller 但是有一个annotation 叫@Controller去识别controller
4.HandlerAdapter: 是DispatcherServlet中的一个类 DispatcherServlet实际调用的Controller其实是以handler(Handler是DispatcherServlet调用Controller的中间过渡对象,是Controller的一种表现形式)形式出现的 HandlerAdapter(适配器模式)就是把各种不同的Handler适配成DispatcherServlet可以使用的Handler
5.HandlerInterceptor:(拦截器) 该接口提供after postHandle preHandle 三个方法,调用controller前后使用
6.HandlerMapping:前端控制器与controller映射关系的类
7.HandlerExecutionChain: preHandle->Controller method->postHandle->afterCompletion的执行链
8.ModelAndView:model的具体表现
9.viewResolver:视图解析器,决定需要用哪个视图来进行视图的呈现
10.view:响应页面的呈现。
------------------------------------------------------
SpringMVC的动态概念:
2.DispatcherServlet拦截request 就需要找到一个Controller 如何找?
3.DispatcherServlet就把功能代理给了HandlerMapping(web.xml中配置的init-param就是HandlerMapping配置方式之一)
4.HandlerMapping根据配置 通过annotation找到Controller也找到了HandlerInterceptor
形成了一个HandlerExcutionChain 作为一个Handler或者是HandlerAdapter返回给DispatcherServlet
5.DispatcherServlet调用这个Handler或者是HandlerAdapter(找到Controller,Controller目的:生成ModelAndView) 生成ModelAndView 并返回给DispatcherServlet
6.DispatcherServlet调用ViewResolver(视图解析器)方法 返回View对象给DispatcherServlet
7.DispatcherServlet调用ModelAndView作为模型数据传递给我们的View完成了呈现 返回给DispatcherServlet
8.DispatcherServlet再把视图响应给用户
---------------------------------------------
创建一个Spring MVC 需要做的:
1.DispatcherServlet,HandlerMaping 只需要配置2.Handler/HandlerAdapter忽略掉
3.Controller需要自己写
4.HandlerInterceptor(Controller调用前后干点啥)是一个接口,需要就写不需要就不用实现
5.ModelAndView:只是一个类 也可以使用Map把需要的放进去就好了
6.ViewResolver和HandlerMapping差不多只需要知道使用那种类型就可以了
7.view:不需要管具体的呈现。只需要管是哪一个就好了
---------------------------------------
综上所述:需要自己写的就是Controller 其他的就是配置
------------------------------------------------
第一个Spring MVC实例(eclipse 要是高版本的)
安装Maven
创建一个Maven项目:
启动CMD cd到自己想要在那个文件夹下创建Maven项目输入
--》mvn archetype:generate -DgroupId=imooc-loki -DartifactId=spring-mvc-study -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=internal
(加个参数 -DarchetypeCatalog=internal
让它不要从远程服务器上取catalog:)
在安装maven的计算机用户下会有一个m2文件夹,把maven安装目录下的conf文件夹下的配置文件settings.xml复制一份到.m2文件下 (好处:可以在升级maven后不必再更改settings.xml文件)
在eclipse的 window-->preferences-->Maven-->Installations-->add 加入最新安装的Maven路径
Maven-->User settings-->User settings 加入.m2文件夹下的settings.xml 而不是用户下的
导入maven项目: import-->maven-->exisiting Maven Projetcs
点击项目右键 properties-->java Bulid Path-->Libraries 看那些包没有就创建
项目包结构:
1.配置POM.xml 加入项目所需要的依赖包 :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>imooc-loki</groupId>
<artifactId>spring-mvc-study2</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring-mvc-study2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<commons-lang.version>2.6</commons-lang.version>
<slf4j.version>1.7.6</slf4j.version>
<spring.version>4.1.3.RELEASE</spring.version>
<jackson.version>2.5.4</jackson.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- JSON依赖包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
</plugin>
</plugins>
</build>
</project>
2.配置web.xml 因为DispatcherServlet是一个Servlet:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- DispatcherServlet, Spring MVC的核心 -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet对应的上下文配置, 默认为/WEB-INF/$servlet-name$-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher拦截所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.创建并配置mvc-dispatcher-servlet.xml(位置在
<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
)
<?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: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">
<!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用, 提供其相关的Spring MVC配置 -->
<!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required
@Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 -->
<context:annotation-config />
<!-- DispatcherServlet上下文, 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
<context:component-scan base-package="com.imooc.mvcdemo">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。 DefaultAnnotationHandlerMapping
annotation-driven HandlerMapping -->
<!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
<mvc:annotation-driven />
<!-- 静态资源处理, css, js, imgs 不加这个就访问不到静态资源-->
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
4.写Controller:
package com.imooc.mvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/hello2")
public class HelloSpring {
@RequestMapping("/xixi")
public String hellomvc(){
//组成了一个请求URL-->http://localhost:8080/hello2/xixi
return "home";
}
}
5:编写home.jsp (随便写点啥)
6.在CMD中 进入创建的项目中 输入如下命令(第一次会下载各种资源 )
如果出现gbk字符不匹配的问题就在后面加 mvn jetty:run -Dfile.encoding=UTF-8
7:在URL处输入--》
http://localhost:8080/hello2/xixi
结果截图:
第一个Spring MVC工作流程:
用户发送 http://localhost:8080/hello2/xixi-->web.xml文件读取DispatcherServlet对应的上下文配置-->mvc-dispatcher-servlet.xml-->解析annotation类型的controller-->controller返回一个home字符串-->ViewResolver
用前缀和home和后缀 组成一个响应路径给DispatcherServlet (但是URL路径却没有变)
类级别的@RequestMapping("/hello2")和方法级别的@RequestMapping("/xixi")组成了请求路径