###0.前言
《Java EE互联网轻量级框架整合开发——SSM框架(Spring MVC+Spring+MyBatis)和Redis实现》
本文主要记录:
- SpringMVC的初始化配置流程:
- 通过xml初始化配置
- 通过注解初始化配置
- 常用注解的使用方法
###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
- param-value中以“,”号分隔.eg:
- 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,主要注册以下实例:
- HandlerMapping:将URL映射到指定controller和其中的方法中。
- RequestMappingHandlerMapping:解析@RequestMapping注解
- BeanNameUrlHandlerMapping:确定请求Url对应的Handler
- HandlerAdapter:执行Controller的方法,不同适配器对应不同类型的Handler
- RequestMappingHandlerAdapter:处理带注解的Handler
- HttpRequestHandlerAdapter:处理
HttpRequestHandler接口
的Handler - SimpleControllerHandlerAdapter:处理
Controller接口
的Handler
- HandlerExceptionResolver:处理器异常处理
- ExceptionHandlerExceptionResolver
- ResponseStatusExceptionResolver
- DefaultHandlerExceptionResolver
- HandlerMapping:将URL映射到指定controller和其中的方法中。
- <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对象。p:prefix+[controller中返回的name]+p:suffix
->/WEB-INF/jsp/[name].jsp
- 根据路径(
/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)
- eg:
- @RequestParam:获取请求中的参数
- eg:
getRole2(@RequestParam("id") Long id)
- eg:
getRole2(@RequestParam(value = "id",required = false,defaultValue = "0") Long id)
,允许为空,设置默认值
- eg:
- @ResponseBody:返回数据,返回非页面(eg:json、xml等)使用
###4.总结
Spring MVC的初始化配置主要由Spring IoC容器配置和DispatcherServlet配置组成。需要注意ContextLoaderListener
初始化Spring IoC容器。
END
– Nowy
– 2018.12.20