SpringMVC学习记录02——使用配置

###0.前言
《Java EE互联网轻量级框架整合开发——SSM框架(Spring MVC+Spring+MyBatis)和Redis实现》

本文主要记录:

  1. SpringMVC的初始化配置流程:
    • 通过xml初始化配置
    • 通过注解初始化配置
  2. 常用注解的使用方法

###1.xml配置SpringMVC
在通过xml配置springMVC框架时,需要配置的文件有:

  • web.xml:Web工程的配置文件
  • dispatcher-servlet.xml:Spring MVC的配置文件
  • applicationContext.xml:Spring IoC的配置文件

Web.xml相关配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <!-- 配置Spring IoC配置文件路径 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <!-- 配置ContextLoaderListener用以初始化Spring IoC容器 -->
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 配置DispatcherServlet -->
    <servlet>
        <!-- 注意:Spring MVC框架会根据servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作为配置文件载入Web工程中 -->
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 使得Dispatcher在服务器启动的时候就初始化 -->
        <load-on-startup>2</load-on-startup>
    </servlet>
    <!-- Servlet拦截配置 -->
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

配置说明:

  • context-param:配置Spring IoC配置文件的路径,默认的路径是/WEB-INF/applicationContext.xml。多个配置文件写法:
    • param-value中以“,”号分隔.eg:/WEB-INF/applicationContext-services.xml,/WEB-INF/....xml
    • param-value中采用通配符.eg:/WEB-INF/applicationContext-*.xml


  • ContextLoaderListener: 实现了ServletContextListener接口,监听了Web容器的初始化和关闭事件。ContextLoaderListener在初始化和关闭事件中调用了以下两个方法:
    • initWebApplicationContext:初始化Spring IoC容器
    • closeWebApplicationContext:释放Spring IoC容器的资源


  • DispatcherServlet:使用SpringMVC必须配置。默认会在WEB-INF文件夹下查找[servlet-name]-servlet.xml配置文件。
    • 不使用默认名称:可以通过<init-param>配置contextConfigLocation修改。(类似context-param
    • load-on-startup:启动优先级,如果为负数或者没有设置,则容器会当Servlet被请求时再加载


  • servlet-mapping:Servlet拦截配置,如上面 配置会拦截URL中带.do的请求。为拦截REST风格的URL可能会配置<url-pattern>/</url-pattern>,从而导致静态文件被拦截
    解决方案:添加多个采用defaultServlet的servlet-mapping

    <servlet-mapping>
       <servlet-name>default</servlet-name>
       <url-pattern>*.png</url-pattern>
    </servlet-mapping>
    

dispatcher-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:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 使用注解驱动 -->
    <mvc:annotation-driven />
    <!-- 定义扫描装载的包 -->
    <context:component-scan base-package="com.*" />
    <!-- 定义视图解析器 -->
    <!-- 找到Web工程/WEB-INF/JSP文件夹,且文件结尾为jsp的文件作为映射 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
    <!-- 如果有配置数据库事务,需要开启注解事务的,需要开启这段代码 -->
    <tx:annotation-driven transaction-manager="transactionManager" /> 
</beans>

配置说明:

  • <mvc:annotation-driven />:SpringMVC的注解驱动,其实就是简化部分初始化配置。实现类:AnnotationDrivenBeanDefinitionParser,主要注册以下实例:
    1. HandlerMapping:将URL映射到指定controller和其中的方法中。
      • RequestMappingHandlerMapping:解析@RequestMapping注解
      • BeanNameUrlHandlerMapping:确定请求Url对应的Handler
    2. HandlerAdapter:执行Controller的方法,不同适配器对应不同类型的Handler
      • RequestMappingHandlerAdapter:处理带注解的Handler
      • HttpRequestHandlerAdapter:处理HttpRequestHandler接口的Handler
      • SimpleControllerHandlerAdapter:处理Controller接口的Handler
    3. HandlerExceptionResolver:处理器异常处理
      • ExceptionHandlerExceptionResolver
      • ResponseStatusExceptionResolver
      • DefaultHandlerExceptionResolver


  • <context:component-scan base-package=”com.*” />:扫描指定包目录下的组件,并注册为bean。
    • 开启扫描带有@controller、@Service、@Repository、@Component等注解的java类
    • 激活annotation-config配置,即包含此标签配置。所以可以使用注解:@Required,@Autowired,@PostConstruct,@PreDestroy,@Resource,@PersistenceContext和@PersistenceUnit


  • ViewResolver:视图解析器,常用InternalResourceViewResolver:将controller返回的str转化为InternalResourceView对象。
    1. p:prefix+[controller中返回的name]+p:suffix -> /WEB-INF/jsp/[name].jsp
    2. 根据路径(/WEB-INF/jsp/[name].jsp)查找对应的JSP文件。

applicationContext.xml配置文件:
Spring IoC容器的相关配置,配置说明查看:Spring-MyBatis配置说明

使用示例:

//注解@Controller表示它是一个控制器
@Controller("myController")
//表明当请求的URI在/my下的时候才有该控制器响应
@RequestMapping("/my")
public class MyController {
    //表明URI是/index的时候该方法才请求
    @RequestMapping("/index")
    public ModelAndView index() {
        //模型和视图
        ModelAndView mv = new ModelAndView();  
        //视图逻辑名称为index
        mv.setViewName("index");
        //返回模型和视图
        return mv;
    }
}

配置说明:

  • @Controller : 标记为一个控制器,可定义别名
  • @RequestMapping:指定该控制器和方法对应的请求的URI
  • ModelAndView:定义视图。

上述例子的含义是:

  • 请求路径为 http://localhost:8080/项目/my/index.do
  • 返回视图的路径为: /WEB-INF/jsp/index.jsp(视图解析器配置)

###2.通过注解配置SpringMVC
Serlvet3.0之后允许取消web.xml配置文件,只使用注解方式配置。通常需要配置:

  • 实现AbstractAnnotationConfigDispatcherServletInitializer接口:配置Spring IoC容器、WebConfig、servlet-mapping等
  • WebConfig类:启用SpringMVC、配置扫描路径和定义视图解析器

AbstractAnnotationConfigDispatcherServletInitializer类相关代码:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
     //Spring IoC容器配置
    @Override
    protected Class<?>[] getRootConfigClasses() {
         //可以返回Spring的Java配置文件数组
        return new Class<?>[] {};
    }

    //DispatcherServlet的URI映射关系配置
    @Override
    protected Class<?>[] getServletConfigClasses() {
         //可以返回Spring的Java配置文件数组
        return new Class<?>[] { WebConfig.class };
    }

    //DispatchServlet[修改为:DispatcherServlet]拦截内容
    @Override
    protected String[] getServletMappings() {
        return new String[] { "*.do" };
    }

}

配置说明:

  • getRootConfigClasses():获取Spring IoC容器的java配置类,用以装载Spring Bean。
  • getServletConfigClasses():获取各类Spring MVC的URI和控制器关系类,用以生成Web请求上下文。
  • getServletMappings():定义DispatchServlet拦截器的请求。

WebConfig类相关代码:

@Configuration
//定义扫描的包,加载控制器
@ComponentScan("com.*")
//启用Spring Web MVC
@EnableWebMvc
public class WebConfig { 
    /***
     * 创建视图解析器
     * @return 视图解析器
     */
    @Bean(name="viewResolver")
    public ViewResolver initViewResolver() {
        InternalResourceViewResolver viewResolver =new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }    
}

配置说明:

  • 组件扫描
  • @EnableWebMvc:启动Spring MVC框架的配置
  • 配置ViewResolver

###3.常用注解

  • @RequestMapping:指定URI与哪个类或者方法关联,该类或者方法作为一个处理请求的处理器。
    • eg:@RequestMapping(value = "/getRole", method = RequestMethod.GET)
  • @RequestParam:获取请求中的参数
    • eg:getRole2(@RequestParam("id") Long id)
    • eg:getRole2(@RequestParam(value = "id",required = false,defaultValue = "0") Long id),允许为空,设置默认值
  • @ResponseBody:返回数据,返回非页面(eg:json、xml等)使用

###4.总结
Spring MVC的初始化配置主要由Spring IoC容器配置DispatcherServlet配置组成。需要注意ContextLoaderListener初始化Spring IoC容器。

END

– Nowy

– 2018.12.20

分享到