1.1 Spring MVC的静态概念
1.2 Spring MVC的动态概念
2. Eclipse的安装配置
2.1 Maven的安装配置与配置文件修改
2.2 Eclipse集成Maven
3. 创建Maven项目
3.1 Eclipse导入Maven项目
3.2 Eclipse下配置pom.xml
4. 编写Spring MVC代码
4.1 配置dispatcherServlet
4.2 编写Controller
4.3 编写View
5. jetty容器启动Servlet
6. 结果展示
7. 问题汇总
8.关于web.xml
9.关于applicationContext.xml和dispatcher-servlet.xml的修改
1. Spring MVC的基本概念
1.1 Spring MVC的静态概念
- DispatcherServlet:前端控制器,负责分发Requst到Controller,然后将Controller返回的Model传递到View;
- Controller:调用业务逻辑产生Model;
- HandlerAdapter:Controller的一种表现形式,包括具体的Controller实例以及包裹的HandlerInterceptor;
- HandlerInterceptor: 拦截器,三个接口方法:preHandler,postHandler,afterCompletion分别用于Controller执行之前,之后以及view显示完成后调用;
- HandlerMapping:帮助DispatcherServlet找到正确的controller,使用HandlerInterceptor包裹Controller;
- HandlerExecutionChain:执行链条
- ModelAndView:Model或者Map
- ViewResolver:视图解析器,告诉DispatcherServlet使用哪一个view,Help DispatcherServlet to Resolve the right View to render page;
- View:jsp等,用于呈现页面;
1.2 Spring MVC的动态概念
浏览器发送Request请求到前端控制器,然后DispatcherServlet通过HandlerMapping找到相应的Controller,并包裹HandlerInterceptor,从而形成HandlerExecutionChain,生成Handler/HandlerAdapter返回给DispatcherServlet,然后获取ModelAndVIew,通过ViewResolver找到相应的View,返回;
2. Eclipse的安装配置
(略)
2.1 Maven的安装配置与配置文件修改
(略)
2.2 Eclipse集成Maven
windows-preference-Maven-Installations配置本地Maven;
windows-preference-Maven-User Settings配置Maven的配置文件
3. 创建Maven项目
mvn archetype:generate -DgroupId=lalala -DartifactId=spring-mvc-study -DarchetypeArtifactId=maven-archetype-webapp
然后在命令行中输入上面的命令,需要先定位到工作空间目录,然后在执行;
3.1 Eclipse导入Maven项目
(略)
3.2 Eclipse下配置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-arthur</groupId>
<artifactId>spring-mvc-study</artifactId>
<version>1.0-SNAPSHOT</version>
<name>spring-mvc-study 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>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<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>
</dependencies>
<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>
<build>
<finalName>spring-mvc-study</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.2.v20140723</version>
</plugin>
</plugins>
</build>
</project>
dependencyManager用于解决依赖冲突,并且添加了jetty插件;jetty是servlet容器。
4. 编写Spring MVC代码
4.1 配置dispatcherServlet
因为使用的是Spring MVC,所以需要在web.xml中添加前端控制器的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>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<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>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意:comtextConfigLocation指明了了servlet的配置文件路径,所以要在相应的路径下创建xml配置文件
mvc-dispatcher-servlet.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"
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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- 激活标注 -->
<context:annotation-config/>
<!-- DispatcherServlet上下文,只搜索@Controller标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="com.imooc.mvcdemo">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<mvc:annotation-driven/>
<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>
注意:beans、mvc、context的版本,否则可能会不识别annotation-config和annotation-driven
4.2 编写Controller
package com.imooc.mvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* @author
*
*/
@Controller
@RequestMapping("/hello")
public class HelloMvcController {
@RequestMapping("/mvc")
public String helloMvc() {
return "home";
}
}
添加Controller和RequestMapping注解
4.3 编写View
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello Spring MVC ! Here is iMooc Duan!
</body>
</html>
注意存放路径在xml文件中配置了
5. jetty容器启动Servlet
启动命令行,cd到项目路径,然后执行:
mvn jetty:run
6. 结果展示
7. 问题汇总
8.关于web.xml
使用spring的东西,所以将web.xml修改为:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Study</display-name>
<!-- Spring 应用上下文,理解层次化的ApplicationContext -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<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>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
对层次化的ApplicationContext的理解:
spring的应用上下文有自己的配置文件,dispatcher-servlet也有自己的配置文件,这就构成了不同的应用上下文的层次。
图中WebApplicationContext(s)就是由ContextLoadListener所加载的应用上下文,他提供的是所有应用所使用的公共组件;WebApplicationContext是与特定的DispatcherServlet关联的应用上下文。
9.关于applicationContext.xml和dispatcher-servlet.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"
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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- 激活Spring 基于annotation的DI -->
<context:annotation-config/>
<!-- DispatcherServlet上下文,只搜索@Controller标注的类 不搜索其他标注的类 -->
<context:component-scan base-package="com.imooc.mvcdemo">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 扩展了驱动注解,可以将请求参数绑定到控制器参数 -->
<mvc:annotation-driven/>
<!-- 静态资源处理,css, js, img -->
<mvc:resources location="/resources/" mapping="/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>
注意annotation-config以及mvc:resources的作用
<?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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- 激活Spring 基于annotation的DI -->
<context:annotation-config/>
<context:component-scan base-package="com.imooc.mvcdemo">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
</beans>