web容器是部署web网站的容器。一般有tomcat、Jetty等。
作用是对系统端口监听,接收http、https等网络请求,然后交由web程序处理得到响应信息进行返回。
一般默认监听一个80端口,特殊情况可以配置多个端口(一台服务器上面跑多个web容器等,不过这一般使用docker容器做内部端口映射。这种情况是微服务系统架构),然后通过nginx进行反向代理(目的是不暴露应用服务的真实ip,防止ddos攻击到应用服务器)
传统web项目都是一个web容器内部有多个项目,运行再一个JVM内,好处是可以统一资源,比如系统配置、对象共享(统一数据源,或者统一自定义资源对象)
传统框架是三层架构+bean容器,第一层是view层,用于动态生成静态页面,第二层是service层,用于逻辑处理,第三层是dao层,用于与数据库交互(查询数据或者持久化数据),bean容器是对于不同scope下,依赖注入不同的对象。
比如一次请求,他要查询数据并展示出来,那么他会先经过view层,封装请求参数,然后调用service层方法进行参数校验等逻辑处理,然后调用dao层方法查询数据,dao返回数据后,service在对返回数据封装,返回到view层,view层对数据、页面模板动态生成html返回给浏览器显示
(注意:jsp\jsf框架的xhtml等只是页面模板,通过el表达式来判断对于字段显示位置以及页面组件是否加载啥的)
为什么还有个bean容器,因为servlet是只有一个实例对象,view层处理是servlet这里处理的,调用service层方法时候,存在多线程问题(tomcat是一个请求分配一个线程处理),如果在servlet层只定义一个service对象,请求参数是service的属性,那么两个请求(线程)进来,这时候如果第一个先给service设置入参值(123),完了之后还没等处理完,第二个又进来设置(456),然后两个线程去查,结果查出都是参数为456的结果然后返回,这时候就发生了数据越权、错乱等问题。
所以就有了bean容器、CDI的概念,他定义了域,application/session/request 三个域,然后同一域下面,对象是一样的;
service定义成requestScope,view层依赖注入service,这样就可以保证多次request拿到的service都是不一样的,拿取不同请求线程的service对象。这样线程一的查询和线程二的查询就在不同对象里面处理了。
session有状态 session无状态 是指 dao层对象的状态;一般资源session的管理(比如数据库session等),通过httpsessionLister,监听会话的创建与销毁,然后对应的创建、销毁数据库session(hebirnate或者其他jpa框架) 他是sessionscope域的
资源链接的创建、关闭 是applicationscope的 应用启动创建链接或者链接池,然后应用销毁就关闭链接(监听 servletListener)
然后view层的servlet注入service, sevice要注入dao层各种资源session, dao层的实现依赖application环境的各种链接;这些对象注入使用beanManager管理 bean的创建使用beanfacotry实现。