一,前言
近年来,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,内容如下:
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">
自定义springmvc配置文件名字:通过为servlet指定init-param实现,如下:
此处指定的文件是web根目录下的叫做springMVC.xml
拦截地址:
好了,接下来就在WEB-INF目录下新建springmvc的配置文件。名字根据以上配置取。我使用的默认配置,所以我的配置文件名字就是:spring-servlet.xml,内容如下:
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">
来解释下:
不知道是版本还是其他原因,这种方式我用不了, 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" })