一.SpringMVC概括
SpringMVC从字面上的意思可以理解成它在spring的基础上加了mvc的思想,让视图,控制,模型这三层分离SpringMVC其实可以看成是struts2+spring。比较官方的说法SpringMVC是是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
二.Spring MVC工作流程
Spring MVC工作流程图
SpringMVC的工作流程描叙
1.用户向服务器发送请求,请求会被SpringMVC的前单控制器DispatcherServlet捕获。
2.DispatcherServlet将捕获到的url进行解析,将解析结果交给HandlerMapping,HandlerMapping根据传过来的url解析结果来匹配相应的Handler(处理器)。
3.DispatcherServlet将匹配的结果交给HandlerAdapter,由HandlerAdapter调用真正的处理器来进行处理用户的请求,处理完成后返回一个ModelAndView对象(视图加上数据模型)交给DispatcherServlet。
4.DispatcherServlet将ModelAndView对象交给ViewResolver处理,ViewResolver对ModelAndView对象进行解析,根据视图名产生一个view实例。
5.DispatcherServlet将view对象和model交给View进行处理,View对视图渲染,最后将结果呈现给用户。
三.SpringMVC代码实例
1.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></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!-- DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。 -->
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springController.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--
ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springController.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
-->
</web-app>
2.springController.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-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/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- handlerMapping -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="springMVC.d">HelloWorld</prop>
</props>
</property>
</bean>
<bean id="HelloWorld" class="com.wangbiao.springMVC.HelloWorld">
<property name="methodNameResolver">
<ref local="methodNameResolver"/>
</property>
</bean>
<!-- 在url中对应具体的方法,通过m后面带的参数来确定方法 -->
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName"><value>m</value></property>
<property name="defaultMethodName"><value>execute</value></property>
</bean>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- webroot到一指定文件夹文件路径 -->
<property name="prefix" value="/"/>
<!-- 视图名称后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3.HelloWorld.java
package com.wangbiao.springMVC;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class HelloWorld extends MultiActionController{
public ModelAndView sayHelloWorld(HttpServletRequest request, HttpServletResponse response) {
String param = request.getParameter("param");
System.out.println("springMVC测试:helloWorld;"+param);
ModelAndView mv = new ModelAndView();
mv.addObject("content", "this is springMVC HelloWorld");
mv.setViewName("springMVC/helloWorld");
return mv;
}
}
4.helloWorld.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/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>Insert title here</title>
</head>
<body>
${requestScope.content }
</body>
</html>
5.输出结果
在浏览器上输入:http://localhost:8000/SpringMVC/springMVC.d?m=sayHelloWorld¶m=123
页面展示为:
整个的SpringMVC流程就是这样的,需要说明的是HelloWorld这样的处理器必须继承MultiActionController,HelloWorld中的sayHelloWorld方法的参数必须是HttpServletRequest 和HttpServletResponse,这里我不知道是什么原因啊,如果有知道的请告诉我一声,感激不尽。上面的代码在springController.xml中的methodNameResolver可以实现一个处理器对应多个方法,根据http://localhost:8000/SpringMVC/springMVC.d?m=sayHelloWorld¶m=123中的“m=sayHelloWorld”来确定处理改请求的方法。
写完这篇博客有一点感谢,上面的代码是早已写好的,但当写这篇博客的时候却发现迟迟不能动笔,写的字数虽然不多,但发现有到很多地方却遇到卡壳,在写的时候内心也在问自己你虽然知道SpringMVC的总体原理,但你对其中的某个细节知道是怎么处理的吗?发现自己给不了自己肯定的答案。有很多技术我们平时都在用,用起来甚至是乱熟于心,但让他说,却说不出个一二出来,即使说出了大体理解,但细节方面又有多少是吃透了的。后面我一定要写一个SpringMVC的系列博客