一、web.xml
1.web容器,跟随tomcat启动。
(1)<!-- spring的配置文件-->
<
context-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:applicationContext.xml</
param-value
>
</
context-param
>
<context-param>:在这里是指定了applicationContext.xml的地址,但这个标签本质上是一组键值对,通过<param-name>和<param-value>来表示键值,则在程序中即可以通过name取到value,说白了,他就相当于设定了一个固定值,我们可以在程序中去使用它。就这么个作用。下面列举一个取值的栗子:
<context-param>
<param-name>home-page</param-name>
<param-value>home.jsp</param-value></context-param>
取值:String HomePage = getServletContext().getInitParameter("home-page");
通过上面这句代码,我们就可以取得web.xml中配置的home.jsp这个值。
(2)配置监听:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
<
listener
>
<
listenerclass
>org.springframework.web.context.ContextLoaderListener</
listener-class
>
</
listener
>
(3)<!-- 配置servlet,spring mvc核心:分发servlet -->
<
servlet
>
<
servlet-name
>mvc-dispatcher</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
>
<!-- spring mvc的配置文件 -->
<
init-param
>
<
param-name
>contextConfigLocation</
param-name
>
</
init-param
>
<
load-on-startup
>1</
load-on-startup
>
</
servlet
>
注1:<servlet-name>的名字随便起,但是class必须是org.springframework.web.servlet.DispatcherServlet,而且这里的<servlet-name>名字和下面的mapping的<servlet-name>名字需要一致,<init-param>classpath:springMVC.xml(如果springMVC.xml直接在src下面的写classpath:文件名即可,如果还有一层包,那就写classpath:包名/spring-config.xml)
注2:<init-param>和<context-param>一样都是上下文参数,但是区别在于范围和使用方式不同。
<context-param>是application范围内的初始化参数,用于向servlet-context提供键值对,即应用程序的上下文信息,listener、filter等初始化时会用到这些信息
<init-param>是servlet范围内的参数,只能在servlet类的init()方法中取得。
注3:<loda-on-startup>:在servlet的配置当中,<load-on-startup>1</load-on-startup>的含义是标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载,正数的值越小,启动该servlet的优先级越高。
(4)Servlet的映射地址:Servlet在编写完毕后,必须先在web.xml中配置才能访问。在配置时,需要指定一个 Servlet的访问地址。
<
servlet-mapping
>
<
servlet-name
>mvc-dispatcher</
servlet-name
>
<
url-pattern
>/</
url-pattern
>
</
servlet-mapping
>
二、applicationContext.xml
1.<!-- 声明注解 -->
<context:annotation-config />
<context:component-scan base-
package
=
"com.how2java.service"
/>
<context:annotation-config/>:作用是向Spring容器注册以下四个BeanPostProcessor:
- AutowiredAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor
- PersistenceAnnotationBeanPostProcessor
- RequiredAnnotationBeanPostProcessor
那么,为什么要注册这四个BeanPostProcessor呢?是为了让系统能够识别相应的注解。
如果按照传统的方式进行配置将会非常繁琐,所以Spring给我们提供了一个简便的方式:<context:annotation-config/>,使用该元素可以自动声明以上注解。
注:由于<context:component-scan base-package=”xx.xx”/>也包含了自动注入上述Bean的功能,所以<context:annotation-config/> 可以省略。如果两者都进行了配置,则只有前者有效。
2.<!-- 配置数据源 -->
<bean id=
"dataSource"
class
=
"org.springframework.jdbc.datasource.DriverManagerDataSource"
>
<property name=
"driverClassName"
>
<value>com.mysql.jdbc.Driver</value>
</property>
<property name=
"url"
>
<value>jdbc:mysql:
//localhost:3306/bpm?characterEncoding=UTF-8</value>
</property>
<property name=
"username"
>
<value>root</value>
</property>
<property name=
"password"
>
<value>cictec</value>
</property>
</bean>
3.
<!-- 扫描存放sql语句的category.xml -->
<bean id=
"sqlSession"
class
=
"org.mybatis.spring.SqlSessionFactoryBean"
>
<property name=
"typeAliasesPackage"
value=
"com.how2java.pojo"
/>
<property name=
"dataSource"
ref=
"dataSource"
/>
<property name=
"mapperLocations"
value=
"classpath:com/how2java/mapper/*.xml"
/>
</bean>
4.<!-- 扫描com.how2java.mapper -->
<bean
class
=
"org.mybatis.spring.mapper.MapperScannerConfigurer"
>
<property name=
"basePackage"
value=
"com.how2java.mapper"
/>
</bean>
注:ApplicationContext.xml中的配置信息,是将CategoryMapper和Category.xml关联起来。
三、springMVC.xml
1.<!-- 声明注解 -->
<context:annotation-config/>
2.<!-- 扫描包,获取controller下面的注解声明 -->
<context:component-scan base-
package
=
"com.how2java.controller"
>
<context:include-filter type=
"annotation"
expression=
"org.springframework.stereotype.Controller"
/>
</context:component-scan>
3.<!-- 注解驱动 -->
<mvc:annotation-driven />
4.<!-- 访问静态页面 -->
<mvc:default-servlet-handler />
5.<!-- 视图定位 -->
<bean
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<property name=
"viewClass"
value=
"org.springframework.web.servlet.view.JstlView"
/>
<property name=
"prefix"
value=
"/WEB-INF/jsp/"
/>
<property name=
"suffix"
value=
".jsp"
/>
</bean>
四、原理解析
1. 首先浏览器上访问路径 /listCategory
2. tomcat根据web.xml上的配置信息,拦截到了/listCategory,并将其交由DispatcherServlet处理。
3. DispatcherServlet 根据springMVC的配置,将这次请求交由CategoryController类进行处理,所以需要进行这个类的实例化
4. 在实例化CategoryController的时候,注入CategoryServiceImpl。 (自动装配实现了CategoryService接口的的实例,只有CategoryServiceImpl实现了CategoryService接口,所以就会注入CategoryServiceImpl)
5. 在实例化CategoryServiceImpl的时候,又注入CategoryMapper
6. 根据ApplicationContext.xml中的配置信息,将CategoryMapper和Category.xml关联起来了。
7. 这样拿到了实例化好了的CategoryController,并调用listCategory方法
8. 在listCategory方法中,访问CategoryService,并获取数据,并把数据放在"cs"上,接着服务端跳转到listCategory.jsp去
9. 最后在listCategory.jsp 中显示数据