一、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 中显示数据

ssm配置maven_spring