SpringMVC
SpringMVC框架是一个基于请求驱动的Web框架,并且使用了前段控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理
SpringMVC处理请求的流程
具体执行步骤如下
- 首先用户发送请求——>前端控制器,前端控制器根据请求信息(URL)来决定选择哪一个页面控制器进行处理并把请求委托给它
- 页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在SpringMVC中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
- 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染
- 前端控制器再次收回控制权,将相应返回给用户,至此结束
SpringMVC核心架构
核心架构的处理流程如下
- 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制
- DisptcherServlet——>HandlerMapping,HanderMapping将会请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器)对象,通过这种策略,很容易添加新的映射策略
- DisptcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用
- HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据,逻辑视图名)
- ModelAndView的逻辑视图名——>ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术
- View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术
- 返回控制权给DisptcherServlet,由DisptcherServlet返回响应给用户,到此一个流程结束
SpringMVC核心开发步骤
- DisptcherServlet在web.xml中的部署描述,从而拦截请求到SpringMVC
- HandlerMapping的配置,从而将请求映射到处理器
- HandlerAdapter的配置,从而支持多种类型的处理器
- ViewResolver的配置,从而将逻辑视图名解析为具体视图技术
- 处理器(页面控制器)的配置,从而进行功能处理
SpringMVC开发实例(Hello World)
开发环境,运行环境,工程:eclipse Jee Neon + tomcat8.0.36 + Dynamic Web Project
导入jar包到WebContent/WEB-INF/lib目录
JSP视图
在WebContent目录下新建一个index.jsp文件
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Spring 3.0 MVC demo</title>
</head>
<body>
<a href="hello.html">Say Hello</a>
</body>
</html>
再在WebContent/jsp目录下新建一个hello.jsp文件
<pre name="code" class="java"><%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Spring mvc demo</title>
</head>
<body>
<p> This is my message: ${message} </p>
</body>
</html>
前端控制器的配置
在WEB-INF目录下配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Spring3MVC</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- load-on-startup:表示启动容器时初始化该Servlet; -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<!-- url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。 -->
<!-- 也可以如“*.html”表示拦截所有以html为扩展名的请求。 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 自此请求已交给Spring Web MVC框架处理,因此我们需要配置Spring的配置文件, -->
<!-- 默认DispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字,也就是上面的spring]-servlet.xml配置文件。 -->
<!-- 即spring-servlet.xml -->
</web-app>
配置Spring配置文件
在WEB-INF目录下配置spring-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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="net.spring.controller" />
<!-- 在Spring配置文件中配置ViewResolver -->
<!-- InternalResourceViewResolver:用于支持Servlet、JSP视图解析;
viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包;
prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),
比如传进来的逻辑视图名为hello,则该该jsp视图页面应该存放在“WEB-INF/jsp/hello.jsp”; -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
编写Controller和Mapping(开发处理器/页面控制器)
在Java Resources/src目录下新建一个包:com.springmvc.controller,在包下新建一个HelloWorldController.java文件
package net.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloWorldController {
@RequestMapping("/hello")
public ModelAndView helloWorld() {
String me = "Hello World, Spring 3.0!";
//ModelAndView: 包含了试图要实现的模型数据和逻辑视图名
//message 为数据的名称,在视图中用来引用的名字
//me 是对应的值
//hello 是对应视图的名字。
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", me);
modelAndView.setViewName("hello");
return modelAndView;
//以上4个语句相当于一下一句:
//return new ModelAndView("hello","message",me);
}
}
工程目录