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>

Spring学习五的更多相关文章

  1. spring学习(五) ———— 整合web项目(SSM)

    一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后在编写springmvc. 1.2.开发需求 查询商品列表(从数据库中查询) 1.3.创建web工程 ...

  2. Spring学习五(JDBC支持)

    Spring的jdbc支持 1配置db.properties,将有关JDBC的信息载入 2bean文件配置数据源,这里用e3p0作为数据源载入db.properties 3配置template的bea ...

  3. Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  4. Spring学习五----------Bean的配置之Bean的生命周期

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的生命周期 1.定义 2.初始化 3.使用 4.销毁 初始化和销毁的三种方式 1.实现org.springframework.beans.fa ...

  5. Spring学习(五)--构建Spring Web应用程序

    一.Spring MVC起步 看过猫和老鼠的小伙伴都可以想象Tom猫所制作的捕鼠器:它的目标 是发送一个小钢球,让它经过一系列稀奇古怪的装置,最后触发捕鼠 器.小钢球穿过各种复杂的配件,从一个斜坡上滚 ...

  6. Spring学习(五)

    自动装备 1.定义 自动装配(autowiring): 将某个Bean实例中所引用的其它的Bean自动注入到当前Bean实例中 自动装配就是指由Spring来自动地注入依赖对象,无需人工参与. 自动装 ...

  7. spring学习五:Spring Bean 定义继承

    Bean 定义继承 bean 定义可以包含很多的配置信息,包括构造函数的参数,属性值,容器的具体信息例如初始化方法,静态工厂方法名,等等. 子 bean 的定义继承父定义的配置数据.子定义可以根据需要 ...

  8. spring学习 五 依赖注入的方式

    依赖注入有两种方式: 1 构造注入,如果<bean>标签下使用<contructor-arg>,则是构造注入 2 setter注入,就是调用setter方法注入,如果<b ...

  9. spring 学习(五):spring 事务

    spring 学习(五):spring 事务 事务概要 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同 ...

随机推荐

  1. eclipse中web项目部署到本地tomcat中,但是在本地的tomcat的webapp下找不到发布的项目

    eclipse不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录下 为了使项目默认部署到tomcat安装目录下的webapps中,show view- ...

  2. linux-RabbitMQ安装命令

    一.RabbitMQ 1.安装配置epel源    $ rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.no ...

  3. volume image

    http://docs.openstack.org/user-guide/cli_nova_launch_instance_from_volume.html http://docs.openstack ...

  4. 《Advanced Bash-scripting Guide》学习(二):测试脚本调用的参数是否正确

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 #!/bin/bash E_WRONG_ARGS=85 script_param ...

  5. 【微信小程序+ES6新特性应用】字符串模板:美元符号$+大括号{}变量的写法

    1.字符串模板简介 ES6新特性中的字符串模板允许使用英文字符抑音符号`(提示:这里我们不能将其理解为单引号)来创建字符串,并且在该字符串中可以包含都[美元符号+大括号]包裹的变量 格式:consol ...

  6. SFTP 利用对称公钥免密码的方法

    在客户端的操作: #cd .ssh             进入.ssh目录 #ssh-keygen -t rsa   执行创建密钥对命令 Generating public/private rsa ...

  7. php中实现将姓名拆分为姓氏和名字

    之前有分享了用javascript在客户端进行姓名拆分的方法,后应项目需要,又用PHP实现了,贴出来 跟大家分享交流: /** * 把全名拆分为姓氏和名字 * @param string $fulln ...

  8. Nhibernate系列学习之(五) 存储过程

    NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...

  9. CodeForces - 13D :Triangles(向量法:问多少个蓝点三角形内部无红点)

    Little Petya likes to draw. He drew N red and M blue points on the plane in such a way that no three ...

  10. CodeForces - 150C :Smart Cheater (线段树,求最大连续区间)

    I guess there's not much point in reminding you that Nvodsk winters aren't exactly hot. That increas ...