Spring学习五

1: servlet生命周期:  Servlet加载    ->   实例化->   服务 ->  销毁

2:Servlet重要函数: 

  init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

  service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。对请求方式进行了匹配,比如doGet, doPost,doput, dodelete,必须实现doGet, doPost

  destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。

3:WEB容器创建servlet对象的时机(  Tomcat是web容器 也是Servlet容器):

       Servlet容器启动时:读取web.xml 配置文件中的信息,构造指定的Servlet对象,创建servletconfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。

       在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户请求创建httpRequest, HttpResponse对象,从而调用Servlet对象的service方法。

        

<load-on-startup>1</load-on-startup>// tomcat启动的时候就实例化servlet;  否则要等到第一个请求servlet的时候才会初始化servlet.

<servlet-name>Init</servlet-name><servlet-class>org.xl.servlet.InitServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>

下面是指定Servlet请求的映射:

<servlet>
    <servlet-name>hello</servlet-name> 
    <servlet-class>HelloWorldServlet</servlet-class>  // 类名称
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>  
    <url-pattern>/hello</url-pattern>     // 指定什么样的URL可以访问前面定义的servlet    
</servlet-mapping>

4: Spring  MVC 6个步骤:

   1) 客户发起HTTP请求。

   2)dispatcherservlet拦截请求,寻找恰当的映射处理器处理请求。

         dispatcherservlet 间接的继承了HttpServlet, 是 SPring MVC的入口,实际上是一个Servlet, 在web.xml中定义,并且配置URL-mapping.  

  处理器映射(将web请求映射到正确的处理器上)

         可以用Spring提供的,也可以自己定义。

         dispatcherServlet首先将请求交给处理器映射,由它对请求进行检查并找到一条匹配的处理器执行链,然后执行这条链上定义的处理器和拦截器。

       最常用的处理器映射是: 

        BeanNameUrlHanderMapping(默认) :   定义URL和哪个controller能mapping上。

        SimpleUrlHandlerMapping :   指定URL和controller的bean名字的mapping.

   3)dispatcherservlet根据处理器映射HandlerMapping,来选择并决定把请求发给哪个Controller

   4)Controller接收到DispatcherServlet请求后,以ModelAndView的形式返给DispatcherServlet,( 典型的情况是以JSP的形式返回。

   5)返回的不一定是JSP,可能是一个逻辑视图名,通过它可以找到实际的视图。 dispatcherservlet通过查询viewResolver对象将

        从controller逻辑视图名解析为一个具体的视图实现。

   6)dispatcherservlet找到视图,将视图返回给客户端,否则抛出异常。

          视图解析器:

         Spring处理视图的两个重要类ViewResolver和View。

          UrlBasedViewResolver: 指定前缀和后缀 + view 名称 = 就可以得到view的具体路径了。(并且和前台的具体用的技术结偶)

5: web.xml定义如下内容:

  dispatcherServlet定义: 略
  servlet  mapping: 略
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
   </context-param>
   <!--设置监听器-->
   <listener>
      <listener-class> org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

作用:该元素context-param用来声明应用范围(整个WEB项目)内的上下文初始化参数:

    param-name 设定上下文的参数名称。必须是唯一名称

    param-value 设定的参数名称的值

初始化过程:

(1)在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。

(2)接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。

(3)接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。

(4)容器创建<listener></listener>中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。

(5)在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。


(6)得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。

   由上面的初始化过程可知容器对于web.xml的加载过程是context-param     >>     listener     >>    filter     >>    servlet

mvc-dispatcher-servlet.xml的内容如下:

<!--指定注入Bean时Spring要查找的包-->
<context:component-scan base-package="com.spring3.controller" />
<!--配置视图解析器,使用InternalResourceViewResolver 类作为视图解析器。
Controller回传ModelAndView,DispatcherServlet将其交给ViewResolver解析。-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--指定目录前缀--> property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <!--指定文件后缀--> <property name="suffix"> <value>.jsp</value> </property>
</bean>

用注解 “@Controller”  和 在XML中定义bean的效果是一样的,都是交给Spring容器管理bean.

@RequestMapping 将web请求mapping到controller.

   类级别:

        方法级别:

6:  如何将Spring 框架集成到Web应用中。 

在web.xml中声明ContextLoaderListener和DispatcherServlet即可。

 DispatcherServlet: 接管Servlet

ContextLoaderListener: 用来初始化参数这是Spring配置文件的位置和名称,默认情况使用Servlet名称-servlet.xml命名,默认在web-INF文件夹下。

 7: handlerMapping

  (1)BeanNameUrlHandlerMapping:  用URL和bean的name进行匹配。

          浏览器输入:http://localhost:8888/SpringWorld/user/login.do?username=liuxi&pwd=8888

  <bean name="/user/login.do" class="com.spring.web.controller.LoginController"/>
  <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

        (2)SimpleURLHandlerMapping: 也是用URL和bean name匹配,但是比BeanNameUrlHandlerMapping功能多

                     

<beans ...>
 
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
        <props>
           <prop key="/welcome.htm">welcomeController</prop>
           <prop key="/*/welcome.htm">welcomeController</prop>
           <prop key="/helloGuest.htm">helloGuestController</prop>
         </props>
       </property>
    </bean>
    
    <bean id="welcomeController" 
        class="com.mkyong.common.controller.WelcomeController" />
        
    <bean id="helloGuestController" 
        class="com.mkyong.common.controller.HelloGuestController" />
        
</beans>

        (3)RequestMappingHandlerMapping:  针对注解  @RequestMapping

        (4)<context:component-scan base-package="com.myPackage"/>     告诉SPring扫描这个包,因为这个包是用注解定义的controller , 而不是 XML中的bean.

           mvc:annotation-driven 即告诉 spring mvc 使用注解的方式进行URL路由配置。controller 类上加上 @Controller 告诉 spring mvc 此类是 controller,同时方法上的 @RequestMapping 注解告诉 spring mvc 这里有一个请求映射到这个方法。 

8: Spring 核心配置文件:

1.     <!-- 配置spring核心servlet -->    
2.        <servlet>    
3.            <servlet-name>spring</servlet-name>    
4.            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
5.            <load-on-startup>1</load-on-startup>    
6.        </servlet>    
7.        <!-- url-pattern配置为/,不带文件后缀,会造成其它静态文件(js,css等)不能访问。如配为*.do,则不影响静态文件的访问 -->    
8.        <servlet-mapping>    
9.            <servlet-name>spring</servlet-name>    
10.            <url-pattern>/</url-pattern>    
11.        </servlet-mapping>    
1.      <context-param>   <!-- context-param元素声明应用范围内的初始化参数 -->
2.            <param-name>contextConfigLocation</param-name>    
3.            <!-- 应用上下文配置文件 -->    
4.            <param-value>/WEB-INF/spring-servlet.xml</param-value>    
5.        </context-param>
6.       <listener>    
7.            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
8.        </listener>    
9.    


spring-servlet.xml 用于开启基于注解的spring MVC 功能,照web.xml中设定,路径为WEB-INF下。
            <beans>  
1.             <!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射-->    
2.             <mvc:annotation-driven />    
3.             <!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean -->    
4.             <context:component-scan base-package="com.mvc.rest" />    
5.             <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->    
6.             <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp" />    
    </beans>  

9:  ContextLoaderListener 作用:

        在web容器启动时,自动装配ApplicationContext的配置信息。  因为它实现了ServletContextListener接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

         ApplicationContext.xml这个配置文件:如果在web.xml中不写任何配置信息,默认的路径是/WEB-INF/applicationContext.xml。  如果要自定义问价名称和路径,可以在web.xml中这样配置:

<context-param> 
   <param-name>contextConfigLocation</param-name> 
   <param-value> 
        /WEB-INF/classes/applicationContext-*.xml      <!-- 如果有多个文件,可以用逗号分隔; 这里用的通配符>
   </param-value> 
</context-param>

 

           

原文地址:https://www.cnblogs.com/liufei1983/p/7554930.html