-
初始化过程:
-
在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。
-
接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。
-
接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。
-
容器创建<listener></listener>中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
-
在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。
-
得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。
-
由上面的初始化过程可知容器对于web.xml的加载过程是context-param >> listener >> fileter >> servlet
1.<context-param>
作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值
Web.xml配置详解之context-param-阿里云开发者社区 (aliyun.com)
2.<listener>
<listener-class>
(99条消息) JavaWeb之监听器Listener_XeonYu的博客-CSDN博客
监听器实际上就是接口回调。
作用:
在JavaWeb中Listener是Servlet规范定义的一种特殊类,主要用于监听3个作用域的创建、销毁,以及其属性变更
Servlet中的三个作用域分别为:
HttpServletRequest
HttpSession
ServletContext
注意pageContext表示jsp整个页面,不属于Servlet中的作用域
应用场景:
统计在线人数
页面访问量
应用启动时做一些初始化工作等等
(1)创建
listener.java
(2)实现
默认实现了ServletContextListener、HttpSessionListener和**HttpSessionAttributeListener **3个接口,这3个接口是比较常用的,所以IDE自动帮我们实现了这些接口。
实际上3个作用域对应的监听器是不一样的
HttpServletRequest作用域对应的监听器是**ServletRequestListener(监听request的创建和销毁)和ServletRequestAttributeListener(监听request中属性的变更)**
HttpSession作用域对应的监听器是**HttpSessionListener(监听session的创建)和HttpSessionAttributeListener(监听session中属性的变更)**
ServletContext作用域对应的监听器是**ServletContextListener(监听servletContext的创建于销毁)和ServletContextAttributeListener(servletContext中属性的变更)**
listener-class标签是我们什么的listener的全路径,该类需要实现系统已经实现的listener接口。
(99条消息) web学习:web.xml使用:listener标签的使用_程序员小孩的博客-CSDN博客_listener-class
3. <filter>
<filter-mapping>
filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。
(99条消息) Java Web之过滤器(Filter)_XeonYu的博客-CSDN博客_java过滤器
过滤器(Filter)
过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
大概流程图如下
应用场景:
自动登录
统一设置编码格式
访问权限控制
敏感字符过滤等
(1创建Filter
Java中Servlet Filter配置(web.xml详解) (51gjie.com)
XML或者filter.java
1. icon 可选元素,它声明IDE能够使用的一个图象文件。
2. filter-name 必需元素,它给过滤器分配一个选定的名字。
3. display-name 可选元素,它给出IDE使用的短名称。
4. description 可选元素,它给出IDE的信息,提供文本文档。
5. filter-class 必需元素,它指定过滤器实现类的完全限定名。
6. init-param 可选元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。
输入过滤器名称,跟创建Servlet一样,这里我们直接使用 @WebFilter 注解,不再去web,xml中进行配置了。
(2 顺序
BFilter和AFilter是在web.xml中声明的,且BFilter的<filter-mapping>在前,故BFilter在AFilter之前执行。
ABFilter和CharsetFilter是通过注解声明的,故他俩在BFilter和AFilter之后执行,但是ABFilter的名称以A开头,故在CharsetFilter之前执行
(3访问权限控制
- 登录时将登录的账号密码保存到cookie中,下次访问时携带账号和密码,过滤器中进行校验
- 用户没有登录直接访问主页时,要跳转到登录页面
- 登录过滤器不对登录页面进行过滤
这里主要看一下LoginFilter的代码
我们在LoginFilter中对非登录页面的其他jsp都会进行过滤,判断cookie中是否携带了account和pwd。
如果有这两个数据表示之前登录过,那么对数据进行校验,正确的话就进行下一个操作。
否则的话,跳转到登录界面
4.
<servlet>
<servlet-mapping>
Servlet配置
配置Servlet有两种方式:
(1). 在Servlet类中使用@WebServlet Annotation进行配置。
(2). 在web.xml文件中进行配置。
web.xml servlet、servlet-mapping配置 - 炎泽 - 博客园 (cnblogs.com)
5.
<welcome-file-list>
welcome-file-list的工作原理是,按照welcome-file的.list一个一个去检查是否web目录下面存在这个文件,如果存在,继续下面的工作,先去webcontent(这里是Eclipse的工程目录根目录)下是否真的存在index.html这个文件,如果不存在去找是否存在index.jsp这个文件,以此类推。
还要说的是welcome-file不一定是html或者jsp等文件,也可以是直接访问一个action。就像我上面配置的一样,但要注意的是,一定要在webcontent下面建立一个index.action的空文件,然后使用struts配置去跳转,不然web找不到index.action这个文件,会报404错误,原因就是我之前说的那样。
如果配置了servlet的url-pattern是/*,那么访问localhost:8080/会匹配到该servlet上,而不是匹配welcome-file-list;如果url-pattern是/(该servlet为默认servlet),如果其他匹配模式都没有匹配到,则会匹配welcome-file-list。如果访问到了welcome-file,项目会自动跳转到欢迎页!
/和 /* 对于所用请求都拦截,但是 / 对于 .jsp 的不拦截,直接访问到真实的jsp页面。