1. 开发步骤:

(1)增加Spring支持

下载Spring安装包和其依赖的commons-logging.jar,复制到项目Web应用的lib文件夹(WebRoot/WEB-INF/lib);

Spring文件夹内容介绍:    

dccs: Spring相关文档,包括开发指南、API参考文档;

libs: jar包。分为:1)Spring框架calss文件的JAR包;2)Spring框架源文件的压缩包,文件名以-source结尾; 3)Spring框架API文档的压缩包,文件名以-javadoc结尾;

schemas: Spring配置文件的XML Schema文档;

其他.txt说明性文档。

(2)配置前端控制器DispatchServlet

在部署描述符web.xml中编辑配置DispatchServlet(WebRoot/WEB-INF/web.xml)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>SM02</display-name> <!-- 配置SpringMVC前端控制器DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 指定SpringMVC配置文件spring-config.xml,用来将拦截的对应请求分发给对应的Controller-->
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <!-- 指定该springmvc的Servlet可以拦截的请求为所有请求("/"),
之后可以分发给对应的Controller-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

(3)配置SpringMVC的Controller

在SpringMVC的配置文件springmvc-config.xml中配置对应的Controller、对应的Java Bean、对应拦截的请求等

(WEN-INF/springmvc-config.xml,路径在web.xml的DispatcherServlet的配置中param-value子标签中配置)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <!-- 配置Handle,映射"/hello"请求 -->
<bean name="/hello" class="org.fkit.controller.HelloController"/> <!-- 处理映射器将bean的name作为url进行查找,需要在配置Handle时指定name(即url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- SimpleControllerHandlerAdapter是一个处理器适配器,所有处理适配器都要实现 HandlerAdapter接口-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>

其中,Spring4.0之后可以不配置处理映射器、处理器适配器、视图解析器,这些工作会默认完成。此处为显式表现出SpringMVC工作流程。

(4)Controller类的实现

HelloController类实现了Controller接口,用来处理"/hello"的单一请求,即浏览器发出http://localhost:8080/SM02/hello的请求时实际由该Controller处理。

(src/org/fkit/controller/HelloController.java)

package org.fkit.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller; /**
* 一个实现了Controller接口的控制器
* 可以处理一个单一的请求动作("/hello")
* http://localhost:8080/SM02/hello
*/
public class HelloController implements Controller {
private static final Log logger = LogFactory.getLog(HelloController.class);
/**
* handleRequest方法时Controller接口必须实现的方法
* 返回一个ModelAndView对象,包含视图名或视图名和模型
*/
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
logger.info("handleRequest调用"); //创建ModelAndView对象
ModelAndView mv = new ModelAndView(); //添加模型数据,可以是任意POJO对象,第一个参数是对该对象的命名,可在jsp中用EL表达式引用
mv.addObject("message", "Hello SpringMVC"); //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面,参数指定该页面路径
mv.setViewName("/WEB-INF/content/welcome.jsp"); //返回ModelAndView对象
return mv;
}
}

(5)View页面实现

HelloController返回的页面,用来显式返回的视图内容,在该Controller的ModelAndView对象的setViewName()中指定路径。

(WEB-INF/content/welcome.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>欢迎页面</title>
</head>
<body>
<!-- 页面可以访问Controller传递传递出来的message -->
${requestScope.message}
</body>
</html>

(6)结果展示

在浏览器中输入URL:http://localhost:8080/SM02/hello,返回以下视图,表示访问成功。

2. 执行流程解析

(1)用户向服务器发送请求

(2)请求被DispatcherServlet拦截

(3)DispatcherServlet对请求URL(统一资源定位符)进行解析,得到URI(请求资源标识符)。根据该URI,调用HandlerMapping获得该Handler(Controller)配置的所有相关对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个HandlerExecutionChain对象中返回。

(4)DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。HandlerAdapter的设计符合面向对象的单一职责原则,代码架构清晰,便于维护,可复用性高。HandlerAdapter被用于处理多种Handler,调用Handler实际处理请求的方法。

(5)提取请求中的模型数据,执行Handler(Controller)。在填充Handler入参过程中,根据配置,Spring会做一些额外的工作(消息转换、数据转换、数据格式化、数据验证...)

(6)Handler执行完成后向DispatcherServlet返回一个ModelAndView对象,对象中应包括视图名,或视图名和模型

(7)根据返回的对象,选择合适的ViewResolver(视图解析器),返回给DispatcherServlet。

(8)ViewResolver结和Model和View渲染视图。

(9)将视图渲染结果返回给客户端。

第一个SpringMVC实例和解析(HelloSpringMVC)的更多相关文章

  1. 【SpringMVC架构】SpringMVC入门实例,解析工作原理(二)

    上篇博文,我们简单的介绍了什么是SpringMVC.这篇博文.我们搭建一个简单SpringMVC的环境,使用非注解形式实现一个HelloWorld实例,从简单入手,逐步深入. 环境准备 我们须要有主要 ...

  2. SpringMVC-02 第一个SpringMVC程序

    SpringMVC-02 第一个SpringMVC程序 第一个SpringMVC程序 配置版 新建一个Moudle , springmvc-02-hello,确定依赖导入进去了 1.配置web.xml ...

  3. SpringMVC学习02(我的第一个SpringMVC程序)

    2.Hello,SpringMVC 2.1 配置版 1.新建一个Moudle , springmvc-02-hello , 添加web的支持! 2.确定导入了SpringMVC 的依赖! 3.配置we ...

  4. SpringMVC源码解析- HandlerAdapter - ModelFactory(转)

    ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...

  5. springmvc 请求参数解析细节

    springmvc 的请求流程,相信大家已经很熟悉了,不熟悉的同学可以参考下资料! 有了整体流程的概念,是否对其中的实现细节就很清楚呢?我觉得不一定,比如:单是参数解析这块,就是个大学问呢? 首先,我 ...

  6. SpringMVC源码解析- HandlerAdapter - ModelFactory

    ModelFactory主要是两个职责: 1. 初始化model 2. 处理器执行后将modle中相应参数设置到SessionAttributes中 我们来看看具体的处理逻辑(直接充当分析目录): 1 ...

  7. 第一个SpringMVC程序 (配置版)

    通过配置版本的MVC程序,可以了解到MVC的底层原理,实际开发我们用的是注解版的! 1.新建一个普通Maven的项目,然后添加web的支持 2.导入相关的SpringMVC的依赖 3.配置web.xm ...

  8. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  9. 用c#写一个json的万能解析器

    CommonJsonModel .cs /// <summary> /// 万能JSON解析器 /// </summary> public class CommonJsonMo ...

随机推荐

  1. ImageIO.write不好用了

    今天奇怪的发现这个下面不好使了,即用ImageIO把图片写入网络流中,第一次还好使,对于同一个SocketOutputStream,第二次使用write方法就不好使了,变成了死等. 网上搜了资料搜不到 ...

  2. 5、Java Swing布局管理器(FlowLayout、BorderLayout、CardLayout、BoxLayout、GirdBagLayout 和 GirdLayout)

    5.Java-Swing常用布局管理器       应用布局管理器都属于相对布局,各组件位置可随界面大小而相应改变,不变的只是其相对位置,布局管理器比较难以控制,一般只在界面大小需要改是才用,但即使这 ...

  3. 求一个整数数组最大子数组之和,时间复杂度为N

    #include<iostream.h> int main () { ]={-,-,-,-,-,-,-,-,-,-}; ],sum=; ;i<;i++) { ) { sum=b[i] ...

  4. nginx+tomcat集群负载均衡(实现session复制)

    转自:http://talangniao.iteye.com/blog/341512 架构描述 前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过nginx转发到后面( ...

  5. 第 12 章 MySQL 可扩展设计的基本原则

    前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体系,提升系统的扩展能力,通过组合 ...

  6. Struts2入门(一)

    今天学习Struts2首先struts是一个成熟的框架.Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Cont ...

  7. Customer segmentation – LifeCycle Grids with R(转)

    I want to share a very powerful approach for customer segmentation in this post. It is based on cust ...

  8. IT培训行业揭秘(六)

    2017年全国的IT职业培训机构的招生数量相比于去年同期都出现了大规模的下滑,虽然目前大学生毕业之后参加培训班的人数依然没有变化,但是目前中小培训机构像雨后春笋般的纷纷建立,他们纷纷抢占市场,为了招生 ...

  9. 放弃FreeMark?

    JAVA项目FreeMark 生产静态页面   a)    弊端                 i.          依赖后台工程师拼装页面,不利于前端.后台工作完全解耦. ii.         ...

  10. HTML5笔记3——Web Storage和本地数据库

    上一篇:HTML5笔记2——HTML5音/视频标签详解 Web Storage概述 在HTML5中,除了Canvas元素之外,另一个新增的非常重要的功能是可以再客户端本地保存数据的Web Storag ...