web.xml,一个Tomcat工程中最重要的配置文件。web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器、监听器、Servlet等等
在启动一个WEB项目的时候,WEB容器(比如tomcat)会去读取它的配置文件web.xml,读取到不同的节点时,WEB容器就会创建相应的过滤器、监听器等为这个web项目服务。
如果你之前学过servlet肯定知道web.xml的加载顺序为:context-param->listener->filter->servlet。
在ssm-crud项目下打开web.xml
如下代码:
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值
contextConfigLocation 参数定义了要装入的 Spring 配置文件。
与Spring相关的配置文件必须要以"applicationContext-"开头,要符合约定优于配置的思想
看到有一篇相关的详解:https://blog.csdn.net/tiantiandjava/article/details/8964912
和contextConfigLocation配合使用的是ContextLoaderListener
在myeclipse中使用快捷键 ctrl+shift+t
可以直接打开它的源码文件,如图:
可以看到,它是一个继承于ContextLoader
和实现了ServletContextListener
接口的一个类。如有需要可以它们的源码,这里不关注。
那么ContextLoaderListener的作用是什么?
ContextLoaderListener的作用就是启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。
简单来说,就是上面这段配置为项目提供了spring支持,初始化了Ioc容器。作者:walidake 链接:https://www.jianshu.com/p/523bfddf0810 來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
当然添加了以上配置后,还有在 src/main/resourse
目录下新建一个applicationContext.xml
文件(new spring bean Definition)。
applicationContext.xml配置信息会在下一篇文章。
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
配置DispatcherServlet表示,该工程将采用springmvc的方式。启动时也会默认在/WEB-INF目录下查找XXX-servlet.xml作为配置文件.
dispatcherServlet是名字名字,该文件中将配置两项重要的mvc特性:HandlerMapping,负责为DispatcherServlet这个前端控制器的请求查找Controller;
这里有一篇对于dispatcherServlet更详细的文章:https://juejin.im/post/58eb3c34b123db1ad06796c6
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
<init-param>
<param-name>forceRequestEncodingparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
过滤器基础知识
指定一个过滤器。
用于为过滤器指定一个名字,该元素的内容不能为空。
元素用于指定过滤器的完整的限定类名。
元素用于为过滤器指定初始化参数,它的子元素
指定参数的名字,
指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称。该值必须是在
元素中声明过的过滤器的名字
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
CharacterEncodingFilter类注释源码译文片段:
Servlet过滤器,允许用户为请求指定字符编码。
*这很有用,因为当前的浏览器通常不设置字符
*编码,即使在HTML页面或表单中指定。
*如果请求尚未应用,则此过滤器可以应用其编码
*指定编码,或在任何情况下强制执行此过滤器的编码
*(“forceEncoding”=“true”)。 在后一种情况下,编码也将是
*作为默认响应编码应用(虽然这通常会被覆盖
*通过视图中设置的完整内容类型)。
一句话总结:使用过滤器设置项目的编码默认使用utf-8,至于其中的两个参数forceRequestEncoding
,forceResponseEncoding
,是该类的逻辑要求,可以参考源码:CharacterEncodingFilter
一篇关于filter 过滤器
的文章:Filter 过滤器
<filter>
<filter-name>HiddenHttpMethodFilterfilter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilterfilter-name>
<servlet-name>/*servlet-name>
filter-mapping>
HiddenHttpMethodFilter类注释源码译文片段:
- {@link javax.servlet.Filter}将发布的方法参数转换为HTTP方法,可通过{@link HttpServletRequest#getMethod()}检索。由于浏览器目前只有 *支持GET和POST,这是一种常见技术 -
- 例如Prototype库使用 - 是使用带有附加隐藏表单字段的普通POST(
_method code>)
传递“真正的”HTTP方法。此过滤器读取该参数并进行更改 * {@link HttpServletRequestWrapper#getMethod()}相应地返回值。
它的文章:HiddenHttpMethodFilter
在ssm-crud的web.xml下添加如下:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>ssm-cruddisplay-name>
<welcome-file-list>
<welcome-file>index.htmlwelcome-file>
<welcome-file>index.htmwelcome-file>
<welcome-file>index.jspwelcome-file>
<welcome-file>default.htmlwelcome-file>
<welcome-file>default.htmwelcome-file>
<welcome-file>default.jspwelcome-file>
welcome-file-list>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<servlet>
<servlet-name>springDispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
<init-param>
<param-name>forceRequestEncodingparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilterfilter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilterfilter-name>
<servlet-name>/*servlet-name>
filter-mapping>
web-app>
END