Spring MVC(1)
大部分的Java应用都是基于Web的,作为轻量级的JavaEE框架,Spring也提供了自己的Web层的展现技术,一个优秀的MVC框架—— Spring MVC。与其它的Web框架相比Spring的MVC框架在可扩展性和灵活性上有很大提高。但是相对要复杂很多。Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器、视图解析器、视图组成。以DI(笔者更喜欢DI这个概念,觉得IoC表达没有DI清晰)为核心的Spring MVC也有的技术人员认为设计太复杂,有过度设计的嫌疑。不过它确实提供了一个接近于完美的Web框架,或许这也正是Rod Johnson先生的初衷吧。下图是Spring MVC的原理框图:
整个处理过程从一个HTTP请求开始:
1)DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMapping),根据配置的映射规则,找到对应的处理器(Handler)。
2)调用相应处理器中的处理方法,处理该请求,处理器处理结束后会将一个ModelAndView类型的数据传给DispatcherServlet,这其中包含了处理结果的视图和视图中要使用的数据。
3)DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将视图要显示的数据传给对应的视图,最后给浏览器构造一个HTTP响应。
DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
1)截获符合特定格式的URL请求。
2)初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
下面给出一个典型的使用Spring MVC的Web应用中的web.xml文件的配置:
我们一般倾向于使用“.html”作为框架映射的后缀,这样做可以屏蔽服务器端所使用的具体技术,容易被搜索引擎收录。
除了上面的配置外,web.xml中的DispatcherServlet还有四个初始化参数:
1)namespace:DispatcherServlet所对应的命名空间,用以构造Spring配置文件的路径。默认条件下配置文件的路径应该为 WEB-INF/<servlet-name>(servlet-name)-servlet.xml,如果配置了该参数,那么配置文件的路径就是WEB- INF/namespace<namespace>.xml。
2)contextConfigLocation:如果有多个配置文件可以使用这个属性。其配置形式和上面的<context-param>中的相似。
3)publishContext:boolean类型属性,默认为true。DispatcherServlet根据此属性来决定是否将WebApplicationContext发布到ServletContext中去。
4)publishEvents:波哦了案类型属性,默认为true。指定当DispatcherServlet处理完一个请求后是否向容器发布一个ServletRequestHandledEvent事件。
下面演示一个开发Spring MVC的小例子,一个相当于Hello,World的小程序。程序开发使用MyEclipse6.0完成的。
1)首先要下载Spring的发布包。地址为:www.springframework.org/download
2)创建一个Web应用程序,将下载的发布包中的spring.jar(dist文件夹下)和依赖包(lib文件夹)下的commons-logging.jar、log4jxxx.jar(xxx为版本号)添加到该应用的lib文件夹下。
3)创建一个处理器,代码如下:
</context-param></namespace></servlet-name>
4)配置web.xml文件:
5)在WEB-INF文件夹下建立demo1-servlet.xml文件,代码如下:
6)在src文件夹下创建log4j.properties文件,处理日志,代码如下:
7)部署到你的web服务器上就可以看到输出了,例子程序在附件。
整个处理过程从一个HTTP请求开始:
1)DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMapping),根据配置的映射规则,找到对应的处理器(Handler)。
2)调用相应处理器中的处理方法,处理该请求,处理器处理结束后会将一个ModelAndView类型的数据传给DispatcherServlet,这其中包含了处理结果的视图和视图中要使用的数据。
3)DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将视图要显示的数据传给对应的视图,最后给浏览器构造一个HTTP响应。
DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
1)截获符合特定格式的URL请求。
2)初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
下面给出一个典型的使用Spring MVC的Web应用中的web.xml文件的配置:
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">
- <context-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>
- classpath:com/springdemo2/dao/springdemo2-dao.xml,classpath:com/springdemo2/service/springdemo2-service.xml
- param-value>
- context-param>
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- listener-class>
- listener>
- <servlet>
- <servlet-name>springdemo2servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- servlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>springdemo2servlet-name>
- <url-pattern>*.htmlurl-pattern>
- servlet-mapping>
- <welcome-file-list>
- <welcome-file>welcome.jspwelcome-file>
- welcome-file-list>
- web-app>
我们一般倾向于使用“.html”作为框架映射的后缀,这样做可以屏蔽服务器端所使用的具体技术,容易被搜索引擎收录。
除了上面的配置外,web.xml中的DispatcherServlet还有四个初始化参数:
1)namespace:DispatcherServlet所对应的命名空间,用以构造Spring配置文件的路径。默认条件下配置文件的路径应该为 WEB-INF/<servlet-name>(servlet-name)-servlet.xml,如果配置了该参数,那么配置文件的路径就是WEB- INF/namespace<namespace>.xml。
2)contextConfigLocation:如果有多个配置文件可以使用这个属性。其配置形式和上面的<context-param>中的相似。
3)publishContext:boolean类型属性,默认为true。DispatcherServlet根据此属性来决定是否将WebApplicationContext发布到ServletContext中去。
4)publishEvents:波哦了案类型属性,默认为true。指定当DispatcherServlet处理完一个请求后是否向容器发布一个ServletRequestHandledEvent事件。
下面演示一个开发Spring MVC的小例子,一个相当于Hello,World的小程序。程序开发使用MyEclipse6.0完成的。
1)首先要下载Spring的发布包。地址为:www.springframework.org/download
2)创建一个Web应用程序,将下载的发布包中的spring.jar(dist文件夹下)和依赖包(lib文件夹)下的commons-logging.jar、log4jxxx.jar(xxx为版本号)添加到该应用的lib文件夹下。
3)创建一个处理器,代码如下:
</context-param></namespace></servlet-name>
java 代码
- package com.demo1.web.controller;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.Controller;
- public class HelloController implements Controller {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public ModelAndView handleRequest(HttpServletRequest arg0,
- HttpServletResponse arg1) throws Exception {
- // TODO Auto-generated method stub
- return new ModelAndView("hello", "name", name);
- }
- }
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">
- <servlet>
- <servlet-name>demo1servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- servlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>demo1servlet-name>
- <url-pattern>*.htmlurl-pattern>
- servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jspwelcome-file>
- welcome-file-list>
- web-app>
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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd ">
- <bean
- class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
- <bean name="/hello.html"
- class="com.demo1.web.controller.HelloController">
- <property name="name" value="Rod Johnson" />
- bean>
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/" />
- <property name="suffix" value=".jsp" />
- bean>
- beans>
properties 代码
- log4j.rootLogger=INFO,stdout
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout