SpringMVC 是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求响应模型,框架的目的就是帮助我们简化开发工作量,SpringMVC也可以帮助我们简化Web开发的工作量。
SpringMVC 流程介绍:
1. 当DispatcherServlet接到请求时,他先回查找适当的处理程序来处理请求。DispatcherServlet通过一个或者多个处理程序映射,将每个请求映射到处理程序中。处理程序映射配置在web应用程序的上下文中,是实现了HandlerMapping接口的Bean。它负责为请求返回一个适当的处理程序(也就是Controller)。处理程序映射通常根据请求的URL将请求映射到处理程序(Controller)。
2. 一旦DispatcherServlet选择了适当的控制器,它就会调用这个控制器来处理请求。
3. 控制器处理完请求后,会将模型和视图名(有时候是视图对象)返回给DispatcherServlet。模型包含了控制器要传递给视图进行显示的属性。如果返回的是视图名称,它会被解析成视图对象再进行呈现。绑定模型和视图的基本类是ModelAndView
4. 当DispatcherServlet接收到模型和视图名称时,它会将逻辑视图名称解析成视图对象再进行呈现。DispatcherServlet从一个或者多个视图解析器中解析视图。视图解析器配置在Web应用程序上下文中,是实现了ViewResolver接口的Bean。它的任务是根据逻辑视图名称返回试图对象。
5. 一旦DispatcherServlet将视图名称解析称为试图对象,它就会呈现视图对象,并传递控制器返回的模型。视图的任务是将模型属性展示给用户。
简单构建一个 “Hello World” SpringMVC 项目,具体步骤如下:
1、依赖包
1)Spring框架Jar包
下载 spring-framework-3.1.1.RELEASE-with-docs.zip 压缩包,解压后将 spring-framework-3.1.1.RELEASE-with-docs.zip/dist/ 下的所有jar包拷贝到项目的 WEB-INF/lib 目录下;
2)Spring框架依赖包
commons-logging-1.1.3.jar,此Jar包 Apache commons logging日志;
jstl-1.2.jar和standard-1.1.2.jar,Jar包支持jstl标签库
注意:Eclipse中缺省servlet-api.jar包,由于servlet-apbi.jar以及jsp-api.jar这两个包包含在Apache Tomcat中,所以提示这两个包缺省而出现错误的情况下,执行Build Path-Configure Build path-Libraries-Add Library-server Runtime或者在项目 WEB-INF/lib 包中增加servlet-api.jar包即可
2、前端控制器配置
在项目 WEB-INF 目录下新增 web.xml 文件添加如下配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
参数含义:
load-on-startup:表示启动容器时初始化该Servlet
url-pattern:表示哪些请求交给 SpringMVC 处理, “/” 是用来定义默认 servlet映射的。也可以如“*.htm”表示拦截所有以htm为扩展名的请求地址
注意:配置Spring的配置文件,默认 DispatcherServlet 会加载 WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml 配置文件,本文是以 spring-servlet.xml为例
3、在 spring-servlet.xml 配置文件中,增加 HandlerMapping、HandlerAdapter、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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" 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/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- ViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
参数含义:
BeanNameUrlHandlerMapping:表示将请求的URL和Bean名字映射,如URL为 “***/hello”,则Spring配置文件必须有一个名字为“/hello”的Bean,“***”默认忽略;
SimpleControllerHandlerAdapter:表示所有实现org.springframework.web.servlet.mvc.Controller 接口的Bean可以作为 SpringMVC 中的处理器,如果需要其他类型的处理器可以通过实现HadlerAdapter来解决;
InternalResourceViewResolver:用于支持Servlet、JSP视图解析;
viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包;
prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为hello,则该jsp视图页面应该存放在“WEB-INF/jsp/hello.jsp”;
4、页面控制器
1)HelloWorldController 类实现 Controller 接口,具体源码如下:
package com.yoodb.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; /** * @author www.yoodb.com */ public class HelloWorldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub ModelAndView mv = new ModelAndView(); mv.addObject("message", "Hello World!"); mv.setViewName("hello"); return mv; } }
参数含义:
org.springframework.web.servlet.mvc.Controller:页面控制器必须实现Controller接口;
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能处理方法用于实现相应的功能处理,比如收集参数、验证参数、绑定参数到命令对象、将命令对象传入业务对象进行业务处理、最后返回ModelAndView对象;
ModelAndView:包含视图要实现的模型数据和逻辑视图名;“mv.addObject("message", "Hello World!");”表示添加模型数据,此处可以是任意POJO对象;“mv.setViewName("hello");”表示设置逻辑视图名为“hello”,视图解析器会将其解析为具体的视图,如前边的视图解析器InternalResourceVi。wResolver会将其解析为“WEB-INF/jsp/hello.jsp”;
2)将视图名“hello”添加到 spring-servlet.xml 配置文件,使其接受Spring IOC 容器管理,具体配置如下:
<!-- 页面控制器 --> <bean name="/hello" class="com.yoodb.controller.HelloWorldController"/>
参数含义:
name="/hello":第三步配置 BeanNameUrlHandlerMapping ,请求URL为 “***/hello”则将会交给该Bean进行处理
5、视图层
在 /WEB-INF 目录下,新增 jsp 目录并创建 hello.jsp 文件,内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> </head> <body> ${message} </body> </html>
6、启动服务器运行测试
请求 http://localhost:8080/SpringDemo/hello 地址,页面输出“Hello World! ”就表明框架构建成功,“8080”是默认 tomcat端口,“SpringDemo”是项目名称。