官方手册:https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html
1 Spring Web MVC
Spring web MVC 是构建在Servlet API的原始web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块(spring-webmvc
)的名称,但它通常被称为“Spring MVC”。
2 框架原理
在Spring MVC框架中,从“Request(请求)”开始,依次进入“DispatcherServlet(核心分发器)” —> “HandlerMapping(处理器映射)” —> “Controller(控制器)” —> “ModelAndView(模型和视图)” —> “ViewResolver(视图解析器)” —> “View(视图)” —> “Response(响应)”结束,其中DispatcherServlet、HandlerMapping和ViewResolver 只需要在XML文件中配置即可,从而大大提高了开发的效率,特别是对于 HandlerMapping 框架为其提供了默认的配置。Spring MVC 框架的结构图如下所示:
具体执行步骤如下:
- 首先用户发送请求,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器(Controller)进行处理并把请求委托给它;图2-1中的1、2步骤;
- 页面控制器接收到请求后,进行功能处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);图2-1中的3、4、5步骤;
- 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图2-1中的步骤6、7;
- 前端控制器再次收回控制权,将响应返回给用户,图2-1中的步骤8;至此整个结束。
3 搭建spring MVC框架
- 新建工程(maven-webapps)
- 新建包
1)main目录下新建文件夹java,然后设置为源码目录;
2)java下新建包com.sd.Controller,com.sd.Dao,com.sd.Entity,com.sd.Server - 导入springmvc的库
配置spring 版本号
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<!-- spring版本号 -->
<spring.version>4.0.0.RELEASE</spring.version>
<hibernate.version>4.2.11.Final</hibernate.version>
</properties>
配置依赖库
<!-- spring核心包 -->
<!-- springframe start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springframe end -->
- src/main/webapp/WEB-INF/web.xml中添加前段控制器的配置:
<servlet>
<servlet-name>applicationContext</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>applicationContext</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义所有的请求都交给DispatcherServlet。也可以如“*.html”表示拦截所有以html为扩展名的请求;
默认DispatcherServlet会加载WEB-INF/[Servlet名字]-servlet.xml配置文件(Spring官方文档上推荐的默认的文件名是[servlet-name]-servlet.xml)。
- WEB-INF下增加applicationContext-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:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- 扫描 -->
<context:component-scan base-package="com.sd.*"/>
<!-- 开启spring 注解的使用,上面扫描包含该配置,所以可省略 -->
<context:annotation-config/>
<!-- springMVC handle -->
<mvc:default-servlet-handler />
<!-- 开启springmvc注解 -->
<mvc:annotation-driven />
<!-- 对模型视图添加前后缀 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- springmvc 异常处理页面 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">errorJSP/error</prop>
</props>
</property>
</bean>
</beans>
其中自动扫描的目录需要正确,否则会报错:
WARNING: No mapping found for HTTP request with URI [/springMVC/hello] in DispatcherServlet with name ‘mydemo’
InternalResourceViewResolver:用于支持Servlet、JSP视图解析;
prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为index,则该该jsp视图页面应该存放在“WEB-INF/index.jsp”
- 开发处理器(页面控制器)
在com.sd.Controller包下创建类MyController,写入以下内容:
package com.suredata.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MyController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(Model model) {
model.addAttribute("msg", "Hello World!");
return "hello";
}
}
- 开发页面
在WEB-INF目录下新建index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
${msg}
</body>
- 配置tomcat和jdk
网友评论