发表于: 2018-01-28 22:42:25

1 630


一.今日完成

整理补讲小课堂

1.背景介绍

web.xml作用

当我们用IDEA创建一个webapp项目时,往往在WEB-INF文件夹下,会生成一个web.xml文件,这个配置文件的作用,就是初始化配置信息的。比如:Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。如果工程不需要上述配置时,则web.xml就不是必需的了。

2.知识剖析

web.xml配置元素

(1)根元素

web.xml的模式文件是由Sun公司定义的,每个web.xml文件的根元素中, 都必须标明这个web.xml使用的是哪个模式文档。其它的元素都放在之中,也是根节点。

(2)上下文参数

含有一对或多对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的, 在web应用的整个生命周期中上下文初始化参数都存在,Servlet和jsp任何时候可以对其进行访问。

(3)监听器

Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

在application,session,request三个对象创建、销毁或者属性变动时自动执行代码的功能组件。

常见的listener有:ServletContextListener、ServletRequestListener、HttpSessionListener等。

(4)过滤器

过滤器对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。 它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。

(5)servlet

servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。 Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

servlet后常跟servlet-mapping,该元素在Servlet和URL样式之间定义一个映射,即servlet类提供一个url,在地址栏输入对应的映射路径就可以访问servlet。

3.常见问题

web.xml的加载过程,元素的加载顺序怎样?

4.解决方案

WEB容器启动时,加载过程如下:

(1)启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取和两个结点。

(2)然后,容器创建一个ServletContext,这个web项目的所有部分都将共享这个上下文。

(3)容器将转换为键值对,并交给servletContext。

(4)容器创建&lft;listener>中的类实例,创建监听器。

首先可以肯定的是,加载顺序与它们在web.xml文件中的先后顺序无关。即不会因为filter写在listener的前面而会先加载filter。 同时还存在着这样一种配置节:context-param,它用于向ServletContext提供键值对,即应用程序上下文信息。

web.xml的加载顺序是:context-param->listener->filter->servlet而同个类型之间的实际程序调用的时候的顺序是根据对应的mapping的顺序进行调用的。

load-on-startup元素标记容器是否在启动的时候就加载这个servlet,当配置了多个servelet的时候,容器就需要读取它的值来决定加载顺序。当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet。正数的值越小,该servlet的优先级越高,应用启动时就越先加载。所以,x,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。

5.扩展思考

filter、listener、interceptor之间的区别

filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应: 在执行servlet之前,首先执行filter程序,并为之做一些预处理工作; 根据程序需要修改请求和响应; 在servlet被调用之后截获servlet的执行

listener的作用则与接口类型有关,监听器是在发生关注的事件后回调开发者提供的方法。

interceptor 拦截器,类似于filter,不过它不在web.xml中配置,跟使用的框架有关,如果使用Spring框架则在spring容器指定的配置文件中配置;并且不是针对URL的,而是针对action,当页面提交 action时,进行过滤操作.

6.参考文献

https://www.cnblogs.com/shangxiaofei/p/5328377.html

http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html

7.更多讨论

问:Spring MVC中常见filter的用法是怎样的?

答:

(1)AbstractRequestLoggingFilter及其子类 

AbstractRequestLoggingFilter类定义了两个方法beforeRequest和afterRequest分别用于设定过滤前后执行的操作,它有三个子类,分别是CommonsRequestLoggingFilter、ServletContextRequestLoggingFilter和Log4jNestedDiagnosticContextFilter,这三个子类分别实现了各自的beforeRequest和afterRequest。其中,CommonsRequestLoggingFilter在过滤前后分别打印出一段debug的信息;ServletContextRequestLoggingFilter在过滤前后分别向日志文件中写入一段日志信息,日志文件可由log4j.properties等指定;Log4jNestedDiagnosticContextFilter则将日志信息存储到NDC中,NDC采用了一个类似栈的机制来push和pot上下文信息,每一个线程都独立地储存上下文信息,比如说一个servlet就可以针对 每一个request创建对应的NDC,储存客户端地址等信息。

(2)CharacterEncodingFilter

该过滤器是配置编码格式的.

(3)HiddenHttpMethodFilter

html中form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。

(4) HttpPutFormContentFilter

由HiddenHttpMethodFilter可知,html中的form的method值只能为post或get,我们可以通过HiddenHttpMethodFilter获取put表单中的参数键值对,而在Spring3中获取put表单的参数键值对还有另一种方法,即使用HttpPutFormContentFilter过滤器。

HttpPutFormContentFilter过滤器的作为就是获取put表单的值,并将之传递到Controller中标注了method为RequestMethod.put的方法中。

(5)RequestContextFilter

这是在Spring2.0时添加的类,通过LocaleContextHolder和RequestContextHolder把Http request对象基于LocalThread绑定到请求提供服务的线程上。现在一般使用DispatcherServlet这个中央分发器。现在RequestContextFilter过滤器主要用于第三方的Servlet,如JSF的FacesServlet。


二.明日计划

今天身体情况逐步恢复,计划明天把后台剩下的15个接口业务逻辑全部理清楚.


三.遇到问题

暂无,


四.收获

以上.


返回列表 返回列表
评论

    分享到