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的原理框图:
Spring MVC(1)
整个处理过程从一个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 代码
  1. xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <context-param>
  7. <param-name>contextConfigLocationparam-name>
  8. <param-value>
  9. classpath:com/springdemo2/dao/springdemo2-dao.xml,classpath:com/springdemo2/service/springdemo2-service.xml
  10. param-value>
  11. context-param>
  12. <listener>
  13. <listener-class>
  14. org.springframework.web.context.ContextLoaderListener
  15. listener-class>
  16. listener>
  17. <servlet>
  18. <servlet-name>springdemo2servlet-name>
  19. <servlet-class>
  20. org.springframework.web.servlet.DispatcherServlet
  21. servlet-class>
  22. servlet>
  23. <servlet-mapping>
  24. <servlet-name>springdemo2servlet-name>
  25. <url-pattern>*.htmlurl-pattern>
  26. servlet-mapping>
  27. <welcome-file-list>
  28. <welcome-file>welcome.jspwelcome-file>
  29. welcome-file-list>
  30. 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 代码
  1. package com.demo1.web.controller;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.springframework.web.servlet.ModelAndView;
  5. import org.springframework.web.servlet.mvc.Controller;
  6. public class HelloController implements Controller {
  7. private String name;
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public ModelAndView handleRequest(HttpServletRequest arg0,
  15. HttpServletResponse arg1) throws Exception {
  16. // TODO Auto-generated method stub
  17. return new ModelAndView("hello", "name", name);
  18. }
  19. }
4)配置web.xml文件:
xml 代码
  1. xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <servlet>
  7. <servlet-name>demo1servlet-name>
  8. <servlet-class>
  9. org.springframework.web.servlet.DispatcherServlet
  10. servlet-class>
  11. servlet>
  12. <servlet-mapping>
  13. <servlet-name>demo1servlet-name>
  14. <url-pattern>*.htmlurl-pattern>
  15. servlet-mapping>
  16. <welcome-file-list>
  17. <welcome-file>index.jspwelcome-file>
  18. welcome-file-list>
  19. web-app>
5)在WEB-INF文件夹下建立demo1-servlet.xml文件,代码如下:
xml 代码
  1. xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd ">
  5. <bean
  6. class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
  7. <bean name="/hello.html"
  8. class="com.demo1.web.controller.HelloController">
  9. <property name="name" value="Rod Johnson" />
  10. bean>
  11. <bean
  12. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  13. <property name="prefix" value="/WEB-INF/jsp/" />
  14. <property name="suffix" value=".jsp" />
  15. bean>
  16. beans>
6)在src文件夹下创建log4j.properties文件,处理日志,代码如下:
properties 代码
  1. log4j.rootLogger=INFO,stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
7)部署到你的web服务器上就可以看到输出了,例子程序在附件。Spring MVC(1)