一,前言

近年来,Struts因为其各种优异的属性,成为风靡全球的时兴技术,而这里要讨论的不是Struts,而是同样提供web 前端解决方案的框架:springMVC;

springMVC作为spring的一部分,继承了spring轻量级,高度可配置性,良好的拓展性和兼容性等特征,使其成为企业的新选择。

二,springMVC工作原理(括号内为相关接口)

SpringMVC主要由调度器(DispatcherServlet)、处理器映射(HanderMapping)、处理器(HandlerAdapter)、拦截器(HandlerInterceptor )、控制器(Controller)、视图解析器(ViewResolver)、视图(View)这几部分构成。下面根据springMVC的工作流程依次介绍以上接口。

一个请求到达服务器,首先经过的是DispacherServlet,它是springMVC的入口,也是核心所在,主要职责是:

1,截获相应请求(具体将在下面配置中讲到).

2,初始化其WebApplicationContext上下文.

3,初始springMVC各个组件,并装配到DispacherServlet.

DispacherServlet拿到请求后,根据配置的处理器映射,将去寻找HanderMapping.HanderMapping有两个实现:

1,SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller

2,DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上

接下下来是根据注解或者配置找到对应的Controller,执行其业务逻辑(若有拦截器,当然先走拦截器,springMVC拦截器类型不同,此处暂不提,下面有讲到)。Controller里面的方法返回值类型有String,ModelAndView,View,json等等。它的返回值包含了响应所需数据和url等信息。

接下来将到达ViewResolver(这个过程是DispacherServlet定位到ViewResolver还是框架既定的步骤?求解),根据配置的ViewResolver将找到对应的View,然后构造response呈递给浏览器。

大致步骤就是这样子。

三,入门小例子

下面我们来做个springMVC的小东西.

首先到spring官网下载jar包,附上地址:

http://www.springsource.org/download/community

(家里网速很不给力啊,- -!)

环境:eclipse4.2,tomcat;

1,新建一个web项目,这里我们取名为demo,打开web.xml,配置DispacherServlet,内容如下:

<?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/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <display-name>demo</display-name>

<servlet>
 <servlet-name>spring</servlet-name><!-- 此处指定servlet的名字,它将决定springmvc配置文件的名字,
 默认是[servletName-servlet.xml],也可以自定义。-->
 <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><!-- 这里表示DispacherServlet所拦截的请求,拦截方式很多,以下分别讲到 -->
</servlet-mapping>

<welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>

自定义springmvc配置文件名字:通过为servlet指定init-param实现,如下:

<servlet>
 <servlet-name>spring</servlet-name><!-- 此处指定servlet的名字,它将决定springmvc配置文件的名字,
 默认是[servletName-servlet.xml],也可以自定义。-->
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <init-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath*:/springMVC.xml</param-value>
 </init-param>

<load-on-startup>1</load-on-startup><!-- 该值用于确定优先级;正数值越小优先级越高 -->
</servlet>
此处指定的文件是web根目录下的叫做springMVC.xml

拦截地址:

<url-pattern>/</url-pattern>:这种方式拦截了类似/user/login的地址;会导致静态资源无法访问。

<url-pattern>/*</url-pattern>:错误的拦截方式,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。

<url-pattern>/path/*</url-pattern>:拦截包含/path/路径的请求。

<url-pattern>*.do</url-pattern>:简单,实用的拦截方式,不存在静态资源访问的问题。

好了,接下来就在WEB-INF目录下新建springmvc的配置文件。名字根据以上配置取。我使用的默认配置,所以我的配置文件名字就是: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" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
 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
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- 自动扫描的包名 -->
 <context:component-scan base-package="com.my.test" />
 <!-- 配置使用注解 --> 
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 
 <!-- 视图解释类 --> 
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
 <property name="prefix" value="/jsp/"/> 
 <property name="suffix" value=".jsp"/>
 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
 </bean> 
 
</beans>

来解释下:

<context:component-scan base-package="com.my.test" />这句指定springmvc扫描的包名,在该目录下的都将被扫描~也可以写*,比如:com.*.test

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />这句启用springmvc注解功能,网络上还有一种配置方式:

  1. <!-- 默认的注解映射的支持 -->
  2. <mvc:annotation-driven />

不知道是版本还是其他原因,这种方式我用不了, o(╯□╰)o

下面是指定物理目录用的, springmvc将根据controller里面方法的返回值查找物理路径,规则是这样的:

项目路径下/[prefix的value]+[controller的返回值]+[suffix指定的后缀]

比如我的controller里面某个方法返回index,那么,springmvc所找的页面就是:demo/jsp/index.jsp

好了接下来写一个Controller,代码如下:

package com.my.test;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MainController
{
 @RequestMapping(value = "/test/dotest")
 public String refreshmeta(Model model,HttpServletRequest request)
 {
 request.setAttribute("name","susan");
 return "index";
 }

}
简单得很,能说明大致工作原理就成了。

顺便说几句吧:

@RequestMapping(value = "/test/dotest")表示将处理为/test/dotest的请求,也可以在后面加上请求类型,像这样:,@RequestMapping(value="/test/dotest/",method = RequestMethod.GET);也可以一个方法拦截多个请求,像这样:   @RequestMapping(value = { "/test/dotest", "/test/mytest" })

public String refreshmeta(Model model,HttpServletRequest request)
这句方法名可以任意,后面的参数,Model是spring封装的一个request对象,把他当成request用没一点问题;后米娜的HttpServletRequest都清楚,不必多说了~其实还可以在后面参数中加入从表单取值的东西,比如这样写:  public String refreshmeta(Model model,HttpServletRequest request@RequestParam(required = false) String email),这里的email是可以直接拿来用的,它的值对应于页面中的email元素的值。

return "index";
这句上面有提到,springMVC通过这个返回值来确定需要返回的视图的物理路径,按照我们spring-servlet.xml的配置,框架去找的物理路径就是:/demo/jsp/index.jsp

好吧,物理路径是这个,那么就在这个路径下建一个jsp页面,内容够简洁:

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ 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>
<title>Insert title here</title>
</head>
<body>
welcome to spring mvc ,your name is  ${name}
</body>
</html>

好了,部署到tomcat,在浏览器中输入:http://localhost:8080/demo/test/dotest/就可以看到以下结果:

以上代码在eclipse4.2+tomcat6.0.26的环境中可用。

四,配置拓展

关于springMVC以上所说只是一些简单的应用,不能满足实际需求。有一句话叫做什么来着,不重复发明轮子,那么,这里就贴出个链接,个人感觉还可以,有空可以去看看:

spring mvc 原理及应用相关推荐

  1. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  2. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  3. Spring MVC原理及配置详解

    转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...

  4. 一步一步手绘Spring MVC运行时序图(Spring MVC原理)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  5. 【Spring】Spring MVC原理及配置详解

    [Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...

  6. Spring MVC 原理

    文章目录 一.Spring MVC 原理 1.MVC流程 2.MVC常用注解 在这里插入图片描述 总结 一.Spring MVC 原理 Spring 的模型-视图-控制器(MVC)框架是围绕一个 Di ...

  7. tomcat + spring mvc原理(二):tomcat容器初始化加载和启动

    tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...

  8. tomcat + spring mvc 原理(一):tomcat原理综述和静态架构

    tomcat + spring mvc 原理(一):tomcat原理综述和静态架构 tomcat + spring mvc的运作模式 tomcat内部的基本容器构成 tomcat容器对应的外部配置 t ...

  9. tomcat + spring mvc原理(六):tomcat WAR包的部署与加载

    tomcat + spring mvc原理(六):tomcat WAR包的部署与加载 前言 监控的启动原理 状态监听 部署项目 前言 单独部署的tomcat服务器在运行中,当开发人员或者运维人员将开发 ...

  10. spring mvc原理_Spring MVC的工作原理,我们来看看其源码实现

    来源:https://www.cnblogs.com/youzhibing/p/10695012.html 作者:youzhibing2904 遗留问题 在关于利用maven搭建ssm的博客,我们一起 ...

最新文章

  1. 在像Angular2这样的SPA应用中使用Google Analytics的方法
  2. 解锁云原生 AI 技能|在 Kubernetes 上构建机器学习系统
  3. wxWidgets:编写非英语应用程序
  4. android 设置folder类型,正确配置你的 Android 项目
  5. 内蒙古联通与锡盟行政公署签大数据合作协议
  6. 如何针对业务设计架构?——QCon热点专题前瞻
  7. 不打开Excel文件读取工作表名(ADOX)
  8. php 定义宏函数,汇编语言宏函数
  9. 字节跳动 校招薪资曝光,老员工被倒挂疯了~
  10. iOS 中集成百度echarts3.0
  11. .net mapi_使用C#.NET通过MAPI访问收件箱
  12. 链路聚合+MSTP实验
  13. 品德+创意+执行力=企业的不断壮大
  14. 三极管的工作条件及工作状态的判断
  15. #E. 加加加树的边权
  16. h3cr4900g3安装系统_H3C案例查看:H3C UniServer R4900 G3服务器NVMe硬盘配置阵列方法以及相关操作...
  17. TeamSpeak3服务器搭建
  18. 用7行Python代码构建自己的有声读物
  19. 计算机桌面图标怎么放大缩小,Win10系统的桌面图标怎么放大或缩小
  20. HaaS Python + AI 隆重登场 使用 ESP32 + 摄像头 机器视觉实现水果识别

热门文章

  1. html下拉刷新原理,微信小程序 下拉刷新及上拉加载原理解析
  2. 华为鸿蒙战略泄天机,谷歌最强Fuchsia OS进入狗粮测试,华为害怕?鸿蒙战略超乎你想象...
  3. android 控制流混淆 反向,AST混淆实战:仿obfuscator混淆控制流平坦化
  4. 使用TensorFlow.js从网络摄像头进行实时AI情感检测
  5. 将您的SQL Server工作负载迁移到PostgreSQL –第4部分
  6. 求斐波那契数列第n位的几种实现方式及性能对比(c#语言)
  7. 程序在发布前就应该发现的一些错误
  8. 微信登录画面_微信登录界面改版,美炸了!
  9. python websocket爬虫_Python如何爬取实时变化的WebSocket数据
  10. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)