`
chenruieye
  • 浏览: 36580 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

spring mvc 原理及应用

    博客分类:
  • Java
 
阅读更多

原址:http://blog.csdn.net/baple/article/details/11880393

 

 

 一,前言

近年来,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 /> 
  3.  

不知道是版本还是其他原因,这种方式我用不了, 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以上所说只是一些简单的应用,不能满足实际需求。有一句话叫做什么来着,不重复发明轮子,那么,这里就贴出个链接,个人感觉还可以,有空可以去看看:
http://elf8848.iteye.com/blog/875830;
另外,如果想深入了解,还是去看看源码吧~~虽然比较耗时,不过绝对值得~


版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    Spring MVC MYBatis企业应用实战

    Spring MVC MYBatis企业应用实战,详细描述spring mvc原理及注解,怎么与mybatis整合,构建企业级web实战

    全面掌握Spring MVC:从基础到高级的实践指南

    作为架构师和Java开发者,深入理解Spring MVC的原理和实践应用是非常重要的。本文通过分析Spring MVC的核心组件和执行流程,提供了一个全面的学习指南。 Spring MVC基于Model-View-Controller(MVC)架构模式,优化...

    Spring MVC 3.0实战指南.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...

    互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

    Spring、Spring MVC、MyBatis源码深度剖析》Spring 源码剖析篇基于Spring 4.3.2 版本,剖析了Spring 上下文、Spring AOP 和Spring 事务的实现,并通过实例展示了框架陷阱的隐蔽性及学习框架原理的必要性。...

    看透SpringMVC源代码分析与实践(扫描版)

     系统理解Spring MVC框架,为灵活开发高质量产品打下坚实基础。  深入理解Spring MVC的编程技巧和设计理念,提高综合思考、整体架构的能力。  学习作者自研的源代码分析方法——器用分析法,高效学习程序源代码。

    Spring3MVC注解教程.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及...

    Maven+Hibernate+Spring+Spring MVC开发新闻发布系统

    5、Spring MVC 三、课程目标 1、深入理解Maven工作原理 2、熟练掌握Maven基础应用 3、熟练掌握Maven企业级开发 四、课程大纲 第1课 Maven 概述及安装 第2课 使用Maven构建Java项目 第3课 理解Maven核心概念(一) ...

    互联网轻量级 ssm 框架解密 springspringmvcmybatis源码深度剖析

    Spring、Spring MVC、MyBatis源码深度剖析》Spring 源码剖析篇基于Spring 4.3.2 版本, 剖析了Spring 上下文、Spring AOP 和Spring 事务的实现,并通过实例展示了框架陷阱的隐蔽性及学习框架原理的必要性。...

    Spring和SpringMVC面试问题总结(15个)

    Spring和SpringMVC面试...1.Spring中AOP的应用场景、Aop原理、好处? 2.Spring中IOC的作用与原理?对象创建的过程。 3.介绍spring框架 4.Spring常见创建对象的注解? 5.Spring中用到的设计模式 6.Spring的优点? ......

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

     Spring如何在Web环境中集成IoC容器并为Web应用开发提供利器?  我们耳熟能详的MVC模式在Spring中是如何实现的?  Spring MVC如何灵活地集成各种丰富的视图展现方案?  Spring实现远端调用的方案有很多种,你...

    springmvc深入解析.pdf

    springmvc深入解析.pdf

    《精通Spring2.X企业应用开发详解》随书源码1-15章

    展现层应用 第19章 Spring MVC之一 第20章 Spring MVC之二 第21章 集成其他Web框架 第6篇 其他 第22章 Spring应用的测试 第23章 Spring工具类盘点 附录A 各种数据库连接配置及驱动 附录B ...

    Spring框架+Spring工作原理+AOP面向切面编程+JDK代理+Cglib代理

    Spring框架是一个开放源代码的J2EE应用程序框架,是对bean的生命周期进行管理的轻量...Spring框架主要由七部分组成,分别是Spring Core,Spring AOP,Spring ORM,Spring DAO,Spring Context,Spring Web和Spring Web MVC。

    SpringMVC常见知识点.md

    - Spring MVC常见知识点及源码解析 - MVC 是什么 / 有什么优点? - 什么是 Spring MVC? - Spring MVC的优缺点? - 什么是DispatcherServlet? - Spring MVC有哪些组件?(见:DispatcherServlet源码) - 简述...

    基于Spring MVC框架的Web研究与应用 (2012年)

    MVC是软件工程中的一种经典软件架构模式。文章在分析MVC架构基本组成和原理的基础上,详细介绍了Spring MVC架构的组成原理、应用配置;最后,以一个应用案例,详细说明了Web请求在Spring MVC框架中的流转生命周期。

    Spring技术内幕:深入解析Spring架构与设计原理

     spring如何在web环境中集成ioc容器并为web应用开发提供利器?  我们耳熟能详的mvc模式在spring中是如何实现的?  spring mvc如何灵活地集成各种丰富的视图展现方案?  spring实现远端调用的方案有很多种,你...

    看透springMvc源代码分析与实践

    21.1 Spring MVC原理总结272 21.2 实际跟踪一个请求275 第22章 异步请求281 22.1 Servlet 3.0对异步请求的支持281 22.1.1 Servlet 3.0处理异步请求实例282 22.1.2 异步请求监听器Async-Listener284 22.2 ...

    Spring技术内幕:深入解析Spring架构与设计原理 1/2

     spring如何在web环境中集成ioc容器并为web应用开发提供利器?  我们耳熟能详的mvc模式在spring中是如何实现的?  spring mvc如何灵活地集成各种丰富的视图展现方案?  spring实现远端调用的方案有很多种,你...

    《精通Spring2.X企业应用开发详解》16-19章

    展现层应用 第19章 Spring MVC之一 第20章 Spring MVC之二 第21章 集成其他Web框架 第6篇 其他 第22章 Spring应用的测试 第23章 Spring工具类盘点 附录A 各种数据库连接配置及驱动 附录B ...

Global site tag (gtag.js) - Google Analytics