【图片抓取】003-JAVA WEB(上)
本项目主要讲述java web项目的搭建和启动过程,为以后继续图片抓取的业务展示做基础。项目中采用tomcat+spring mvc+spring jdbc+mysql,以最简单的方式搭建;其实java web也在不停的发展,使用spring boot可能会更简单有效的搭建web,结合nodejs实现前后台分离,再较大项目中比较省力。spring boot再方便其实也没有脱离传统web的工作机制,配合本项目简单描述下web的启动过程。
web 容器启动
tomcat可以简单分3个阶段,启动初始化->服务运行(接收,响应http请求)->服务结束;web服务的主体就是接收响应http请求既上右边部分(filter+servlet);有时候我们可能要在服务运行前做一些准备工作,读取配置文件,启动一些非http服务线程等;有时候还需要在web服务停止时做一些事情,释放资源等等,这些就要在启动初始化和服务结束阶段能执行我们的代码,这2个阶段都要用到listener。
1. listener监听器
从web.xml我们可以看出,配置了ContextLoaderListener。需要实现2个方法contextInitialized(ServletContextEvent sce)和contextDestroyed(ServletContextEvent sce),这2个方法分别会在tomcat启动和结束时执行。如果需要的话,通过方法参数ServletContextEvent,我们可以把listener的处理结果放到ServletContextEvent或者从ServletContextEvent拿取数据,通过ServletContextEvent可以和servlet进程做数据交互。
2. filter
Filter用于处理http请求和响应的拦截处理。http请求可以粗略分为3个阶段,
* web容器,接收到http请求后,根据web.xml里配置的路径,匹配Filter和servlet。
* Filter处理链,容器把http请求转入filter处理,filter可以在真正业务处理前做预处理,像日志管理,权限管理等公共的http处理;
* http业务数据处理,servlet真正的业务处理,这里只关心业务逻辑,系统公共的处理,我不关心,加入后面权限认证规则变化,或增加别的处理规则,在filter做;业务逻辑不动,我不动。
这样相比容器直接发到servlet处理,大大减少了代码重复工作而且方便统一管理。
3. servlet
servlet是http的业务处理核心,包括spring mvc也是在servlet里,封装实现自己的处理流程。
spring 上下文关系
从上图可以看出spring主要在listener和servlet两部分做工作。spring mvc对应的分了两大类,既controller标签和非controller的其它标签(servcie,component等);之前项目上看到有人写的web.xml,经常看到 contextloaderlistener和dispatcher都是匹配 spring-*.xml
,或者xml配置扫描时,没有区分controller;这样会导致部分spring bean初始化2次,产生一些不容易发现bug。
结合web容器启动,spring会首先实例化contextloaderlistener,把service,component,或者xml里指定的bean;contextloaderlistener启动完成后,再初始化dispatcher servlet;dispatcher servlet继承contextloaderlistener实例化的bean,这里推测这些bean也是通过ServletContextEvent传入的,具体可看下源码,看源码,看源码,所有的匹配dispatch servlet的配置的url都走向了这里,可以理解成web容器里又放了一个容器,这样spring就可以自定义的扩展,细化http请求的阶段,像interceptor
。
日志打印执行filter和interceptor示例
其它
示例代码
不知这几篇文章是否对大家有所帮助,希望各位看官多提意见,多多交流。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。