tomcat启动过程:
1、tomcat可以部署多个web项目,可以说成tomcat容器
2、tomcat自检,会读取tomcat中web.xml,【自检完:“initialization processed in xxx ms”】
3、tomcat自检完毕后,出现:starting Engine:Apache Tomcat/8.0.23说明开始逐渐加载web项目,每个web项目的WEB-INF目录下的web.xml。tomcat会为此web项目分配一个servert context(servlert上下文),而且每一个web项目只有一个servletcontext上下文,上下文中维护的是map集合,实际上是一个容器存储对象
3、servlet开始解析和执行web.xml:
(1)监听器:servlet规范中定义的一种特殊的组件,用来监听servlet容器产生 的事件,并做响应的处理
容器产生的事件有两大类:
生命周期相关的事件
ServletRequestListener request对象的监听器
HttpSessionListener session对象的监听器
sessionCreate方法, 当服务器创建session对象时就调用此方法
sessionDestroyed方法,当session对象销毁时调用此方法
ServletContextListener application对象的监听器
绑定数据相关的事件
当调用了request对象,session对象,
servletContext(application)对象的setAttribute方法
和removeAttribute方法时产生的事件
ServletRequestAttributeListener
attributeAdded方法,当给调用request.setAttribute()方法时触发此方法
attributeRemoved方法,当requset中的对象被移除的时候调用此方法
attributeReplaced方法,当request中的对象被替换的时候调用此方法
HttpSessionAttributeListener
attributeAdded方法
attributeRemoved方法
attributeReplaced方法
ServletContextAttributeListener
attributeAdded方法
attributeRemoved方法
attributeReplaced方法
实现监听器的步骤:
1.新建一个java类要实现上面对应监听器接口
2.编写对应方法的监听逻辑
3.在web.xml中,注册监听器<listener></listener>
容器产生的事件有两大类:
生命周期相关的事件
ServletRequestListener request对象的监听器
HttpSessionListener session对象的监听器
sessionCreate方法, 当服务器创建session对象时就调用此方法
sessionDestroyed方法,当session对象销毁时调用此方法
ServletContextListener application对象的监听器
绑定数据相关的事件
当调用了request对象,session对象,
servletContext(application)对象的setAttribute方法
和removeAttribute方法时产生的事件
ServletRequestAttributeListener
attributeAdded方法,当给调用request.setAttribute()方法时触发此方法
attributeRemoved方法,当requset中的对象被移除的时候调用此方法
attributeReplaced方法,当request中的对象被替换的时候调用此方法
HttpSessionAttributeListener
attributeAdded方法
attributeRemoved方法
attributeReplaced方法
ServletContextAttributeListener
attributeAdded方法
attributeRemoved方法
attributeReplaced方法
实现监听器的步骤:
1.新建一个java类要实现上面对应监听器接口
2.编写对应方法的监听逻辑
3.在web.xml中,注册监听器<listener></listener>
(2)过滤器(Filter(接口)):过滤器就是servlet的一个特例
a、什么是过滤器:是servlet2.3规范中定义的一种小型的,可插入的
web组件,用来拦截servlet容器的请求和响应过程
以便查看,提取或以某种方式操作正在客户端和服务器
之间交换的数据,
过滤器通常是封装了一些web功能的组件,这些功能很重要
但对于处理客户端后发送响应来说不是决定性的
b、 实现过滤器的步骤:
1.创建一个java类,实现javax.servlet.Filter;接口
2.在实现类中doFilter方法添加过滤或拦截的算法
3.在web.xml中添加<filter></filter><filter-mapping></filter-mapping>
c、 过滤器初始化参数:
容器启动之后,会创建过滤器对象,然后会调用init方法,在init方法中
读取web.xml中的初始化参数(包括局部和全局),在执行doFilter方法前
做数据初始化工作。
d、 过滤器的优点:
实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的
正常运行,可以将多个相同处理逻辑的模块集中写在过滤器里,方便维护
e、只要:在需求说明中有这样的词语,“过滤”,“拦截”,“代理”,
“在原有功能基础上添加新功能”,“在主业务之前,之后添加功能”
那么,第一反应用代理模式实现,或(servlet filter)
a、什么是过滤器:是servlet2.3规范中定义的一种小型的,可插入的
web组件,用来拦截servlet容器的请求和响应过程
以便查看,提取或以某种方式操作正在客户端和服务器
之间交换的数据,
过滤器通常是封装了一些web功能的组件,这些功能很重要
但对于处理客户端后发送响应来说不是决定性的
b、 实现过滤器的步骤:
1.创建一个java类,实现javax.servlet.Filter;接口
2.在实现类中doFilter方法添加过滤或拦截的算法
3.在web.xml中添加<filter></filter><filter-mapping></filter-mapping>
c、 过滤器初始化参数:
容器启动之后,会创建过滤器对象,然后会调用init方法,在init方法中
读取web.xml中的初始化参数(包括局部和全局),在执行doFilter方法前
做数据初始化工作。
d、 过滤器的优点:
实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的
正常运行,可以将多个相同处理逻辑的模块集中写在过滤器里,方便维护
e、只要:在需求说明中有这样的词语,“过滤”,“拦截”,“代理”,
“在原有功能基础上添加新功能”,“在主业务之前,之后添加功能”
那么,第一反应用代理模式实现,或(servlet filter)
f、 过滤器的生命周期:当服务启动时,会加载web.xml中的内容 如果文件中有<filter>项,那么读取<filter-class>节点中的内容,然后反射实例化对象,过滤器的的声明周期开始。
如果过滤器类不存在就无法反射,那么就在服务器启动时报异常生命周期开始后会自动调用init方法(只调用一次)
如果<url-patten>节点中放置的是/*,代表所有请求都要被此过滤器拦截,只要请求任何资源都会进入此过滤器的doFilter这个方法,在此方法中做相关检测工作,如果检测成功了,就 可以通过filterChain.doFilter(servletRequest,servletResponse);去寻找下一个过滤器,如果下一个过滤器不存在就直接访问对应的资源
如果存在,就进入下一个过滤器的doFilter方法,执行完后,依次退回。当服务器正常停止的时候,会调用destroy方法,过滤器声明周期结束。如果有多个过滤器就是过滤器链,执行顺序跟web.xml的加载(生命周期)顺序一样
(3)servlet:<load-startup>,声明周期在启动时就开始,但没有工作,只有<url-pattern>*.do</url-pattern>(自定义url),只有请求带有.do的url,servlet才会工作,执行service方法。serlvet生命周期开始,会电泳init做初始化工作,会读取加载解析spring-mvc.xml,说明spring mvc的容器出现了,出现initializing Spring FrameWorkServlet'dispatcher'.spring mvc容器是spring容器的子容器,子容器中存放的是Controller的对象<context:component-scan base-package="com.tarena.controller"/>可以扫描到以下注解的类@Controller("userController")@RequestMapping("user/")而: <!-- 解析注解 @RequestMapping,@ResponseBody 加在方法上,能直接解析到类的方法上--> <mvc:annotation-driven></mvc:annotation-driven>注意:经过测试,5.0.4版本的spring mvcd jar包不需要使用<mvc:annotation-driven></mvc:annotation-driven> ,因为<context:component-scan/>已经包含了它,而4.3.7版本的却不行,必须写<mvc:annotation-driven>才能扫描到类上方法的url。
@Controller("userController_form")
@RequestMapping("user_form/")
public class UserController_Form {
/**
*
* @param userName 对应页面中的表单元素中的input name="userName"
* @param userPassword对应页面中的表单元素中的input name="userPassword"
* @return ModelAndView对象给InternalResourceViewResolver 解析
*/
@RequestMapping(value="login1.do",method=RequestMethod.POST)
public ModelAndView login1(String userName,
String userPassword) {
ModelAndView mv=new ModelAndView();
//获取页面的数据,springmvc帮程序员已经做了
System.out.println("userName="+userName+
" userPassword="+userPassword);
//由程序员自己实现具体的登录业务
boolean flag=true;
//根据业务的返回结果做跳转和绑定数据
//根request.setAttribute("msg","登录成功")
mv.addObject("msg", "登录成功");
mv.setViewName("success");
return mv;
}