配置SpringMVC应用的过程和使用


由于Web应用是基于请求/响应架构的应用,所以不管哪个MVC Web框架,都需要在web.xml中配置该框架的核心Servlet或Filter,这样才可以让该框架介入Web应用中。Spring MVC也提供了一个DispatcherServlet的Servlet充当前端控制器名为org.springframework.web.servlet.DispatcherServlet的Servlet,所有的请求驱动都围绕这个DispateherServlet来分派请求。
A994ln.jpg
1.配置web.xml文件:
DispateherServlet是一个Servlet(它继承自HttpServlet基类),因此使用时需要把它配置在Web应用的部署描述符web.xml文件当中,配置信息如下:






  1. springmvc



  2. org.springframework.web.servlet.DispatcherServlet





  3. contextConfigLocation

  4. /WEB-INF/springmvc-config.xml



  5. 1





  6. springmvc


  7. /


以上配置了一个DispatcherServlet,该Servlet在Web应用程序启动时立即加载,DispatcherServlet加载时会需要一个Spring MVC的配置文件,默认情况下,应用会去应用程序文件夹的WEB-INF下查找对应的[servlet- name]-servlet.xml文件,例如本例的是springmvc,默认查找的就是/WEB-INF/springmvc-servlet.xml。也可以把Spring MVC的配置文件放到应用程序文件夹中的任何地方,用servlet元素的init-param子元素进行描述,本例的param-name元素的值contextConfigLocation表示参数名称,param-value元素的值/WEB-INF/springmvc-config.xml则表示Spring MVC的配置文件路径和名称。则DispatcherSemlet会查找/WEB-INF/springmvc-config.xinl文件,作为Spring MVC的配置文件,解析该文件内容并根据文件配置信息创建一个WebApplicationContext容器对象,也称为上下文环境。WebApplicationContext继承自ApplicationContext容器,它的初始化方式和BeanFactory, ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说,它必须在拥有Web容器的前提下才能完成启动Spring Web应用上下文的工作。有了WebApplicationContext容器,开发者就可以很自然地使用Spring的IOC, AOP等其他功能了。


2.编写控制器
DispatcherServlet在Spring当中充当一个前端控制器的角色,它的核心功能是分发请求。请求会被分发给对应处理的Java类,Spring MVC中称为Handle。


2.1 基于Controller接口的控制器
在Spring2.5版本以前,开发一个Handle的唯一方法是实现org. springframeworlc.web. servlet.mvc. Controller接口。Controller接口必须实现一个方法,该方法的签名如下:




  1. ModelAndView handleRequest(HttpServletReques request, HttpServletResponse response) throws Exception


第一步
配置Spring MVC的配置文件:WebContent/WEB-INF/springmvc-config.xml,这个文件再配置web.xml文件中要用到




  1. xml version=“1.0” encoding=“UTF-8”?>

  2. xmlns=http://www.springframework.org/schema/beans

  3. xmlns:xsi=“h七七p;//www.w3.org/2001/XMLSchema-instance”

  4. xsi:schemaLocation=http://www,springframework.org/schema/beans

  5. http://www .springframework.org/schema/beans/spring-beans一4.2.xsd”>


  6. name=“/hello” class=“org.fkit.controller.He1loController”>


  7. class=“org.springframework.web.serelet .handler.BeanNameUrlHandlerMapping”>


  8. class=“org.springframework.web.servle七.mvc. SimpleControl工erHandlerAdapter”>


  9. class=“org.springframework.web.servlet.view.工nternalResourceViewResolver”>



第二步


springmvc-config.xml文件声明了HelloController业务控制器类,并将其映射到/hello请求,此处还配置了一个处理映射器BeanNameUrlHandlerMapping,这样可以Bean的名称为url进行查找;同时配置了处理器适配器SimpleControllerHandlerAdapter,来完成对HelloController类的handleRequest方法的调用;最后配置了视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。需要注意的是,在Spring4.0之后,如果不配置处理映射器、处理器适配器和视图解析器,也会使用默认的完成Spring内部MVC工作,笔者在此处显示配置处理过程,是希望读者能够了解Spring MVC的每一个动作,之后则可以更好地理解SpringMVC的工作流程。




  1. public class HelloController implements Controlter{

  2. /

  3. handleRequest是Controller接口必须实现的方法。

  4. 该方法的参数是对应请求的HttpServletReque。和HttpServletResponse

  5. 该方法必须返回一个包含视图名或视图名和模型的ModelAndView对象。

  6. /

  7. @Override

  8. public ModelAndView handleRequest(HttpServletRequest request,

  9. HttpServletResponse response)throws Exception{


  10. //创建准备返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象

  11. ModelAndView my=new ModelAndView();

  12. //添加模型数据,可以是任意的POJO对象

  13. mv.addObject(“message”“Hello World!”);

  14. //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面

  15. my.se七ViewName(“/WEBINF/content/welcome.jsp }} ) ;

  16. //返回ModelAndView对象。

  17. return mv;

  18. }


}


HelloController是一个实现Controller接口的控制器,它可以处理一个单一的请求动作。


2.2基于注解的控制器
Spring2.5版新增了可基于注解的控制器,也就是说控制器不用实现Controller接口,通过注释类型来描述。而且也不用再springmvc-config.xml配置文件中配置映射请求了


第一步




  1. /

  2. HelloController是一个基于注解的控制器

  3. 可以同时处理多个请求动作,并且无须实现任何接口。

  4. org.springframework.stereotype.Controller注解用于指示该类是一个控制器

  5. /

  6. @Controller

  7. public class HelloController implements Controlter{

  8. /

  9. handleRequest是Controller接口必须实现的方法。

  10. 该方法的参数是对应请求的HttpServletReque。和HttpServletResponse

  11. 该方法必须返回一个包含视图名或视图名和模型的ModelAndView对象。

  12. /

  13. @RequestMapping(value=“/hello”)

  14. public ModelAndView handleRequest(HttpServletRequest request,

  15. HttpServletResponse response)throws Exception{

  16. //创建准备返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象

  17. ModelAndView my=new ModelAndView();

  18. //添加模型数据,可以是任意的POJO对象

  19. mv.addObject(“message”Hello World!”);

  20. //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面

  21. my.seViewName(/WEBINF/content/welcome.jsp }} ) ;

  22. //返回ModelAndView对象。

  23. return mv;

  24. }

  25. }


HelloController是一个基于注解的控制器,org.springframework.stereotype.Controller注释类型用于指示Spring类的实例是一个控制器。org. springframework. web.bind. annotation.RequestMapping注释类型用来映射一个请求和请求的方法,value=”/hello’,表示请求由hello方法进行处理。方法返回一个包含视图名或视图名和模型的ModelAndView对象
第二步 修改Spring MVC的配置文件




  1. xml version=“1.0” encoding=“UTF-8”?>

  2. xmlns=http://www.springframework.org/schema/beans

  3. xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

  4. xmlns:mvc=http://www.springframework.org/schema/mvc

  5. xmlns:context=“httP://www.springframework.org/schema/context”

  6. xsi:schemaLocation=”

  7. http://www .springframework.org/schema/beans

  8. http://www .springframework.org/schema/beans/spring-beans-4.2.xsd

  9. http://www .springframework.org/schema/mvc

  10. http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd

  11. httP://www .springframework.org/schema/context

  12. http://www.springframework.org/schema/context/spring-context-4.2.xsd“>


  13. base-package=“org.fkit.controller”>


  14. class=“org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping”>




  15. class=“org.springframework.web.servlet.view.工nternalResourceViewResolver”>



由于使用了注解类型,因此不需要再在配置文件中使用XNIL描述Beano Spring使用扫描机制查找应用程序中所有基于注解的控制器类。指定需要Spring扫描。rg.fkit.controlle:包及其子包下面的所有Java文件。


3.需要的jar包
为了让Web应用具有Spring支持的功能,将所有Spring框架的class文件的JAR包和Spring所依赖的comrnons-logging-1.2. j ar复制到Web应用的lib文件夹下
4.总结:
Controller接口的实现类只能处理一个单一请求动作,而Spring2.5之后新增的基于注解的控制器可以支持同时处理多个请求动作,并且无须实现任何接口,其更加好用。下一篇说明DispateherServlet又是如何分派请求的呢?