这次主要整理下JavaWeb开发过程中所用的配置文件web.xml,web.xml的作用以及常用标签的含义
一、web.xml的作用
web.xml主要用于配置web项目启动时加载的信息,例如
- welcome-file-list 用来配置欢迎页
- context-param 用来配置初始参数
- listener 用来配置监听器
- filter 用来配置过滤器
- servlet 用来配置servlet实例
二、web.xml标签详解
<?xml version="1.0" encoding="UTF-8"?>
- 用于声明xml的版本以及xml传输数据时的字符编码
1、web-app
- xml文件的根标签,用于声明命名空间、schema约束等
xmlns="http://java.sun.com/xml/ns/javaee"
- XML Namespaces,声明了命名空间,用于避免命名冲突,有疑惑的小伙伴可以点击这里
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- XML Schema Instance,声明了web.xml所需要遵循的xml规范
(xsi只是一个别名,可以自行定义,不过约定俗成使用xsi来表示)
- XML Schema Instance,声明了web.xml所需要遵循的xml规范
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- schemaLocation 是xsi的一个子元素,所以以 xsi:schemaLocation 来命名,它由一个 URI引用对 组成,两个URI之间以 空白符 分隔。第一个URI是 命名空间的名字,第二个URI是 模式文档的位置,模式处理器将从这个位置读取模式文档
- 声明了 XML Namespace和对应的 XSD(Xml Schema Definition) 文档的位置,实际上就是声明了该命名空间对应的具体模板是哪个
<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"
version="3.0">
</web-app>
2、icon
- 当使用GUI(Graphic User Interface)工具时,
用于指定web应用的图标,拥有两个字子标签,只支持 gif 和 jpg 格式
<small-icon></small-icon>
- 小图标为 16*16像素
<large-icon></small-icon>
- 大图标为 32*32像素
<icon>
<small-icon>/images/xxx.jpg</small-icon>
<large-icon>/images/xxx.jpg</large-icon>
</icon>
3、display-name
- 当使用GUI(Graphic User Interface)工具时,用于指定web应用的名称
<display-name>xxxxxxxxxxxxxxx</display-name>
4、description
- 用于描述web应用的相关信息
<description>xxxxxxxxxxxxxxx</description>
5、distributable
- 如果在web.xml中指定该标签,则表示应用程序已经可以部署在分布式的servlet容器中了,即此应用程序可以在多个实例之间分发servlet及会话
- 只要看web.xml中是否出现该标签,就可以判断web项目是否具有分布式的功能
<distributable/>
6、context-param
- 初始化参数,应用与整个web项目,有两个子标签
<param-name></param-name>
可以理解为map中的key<param-value></param-value>
可以理解为map中的value
- 在容器启动时,会创建一个 ServletContext(上下文对象,也可以理解为web应用环境对象),然后会去读取 context-param 标签,容器会将 param-name 和 param-value 的值以 key-value 的形式set进ServletContext中
- 在servlet中,通过 this.getServletContext().getInitParameter(“key”) 来获取值value
<context-param>
<param-name>key</param-name>
<param-value>value</param-value>
</context-param>
7、filter
- 过滤器,可以对目标资源的请求和响应进行过滤,主要用于 过滤字符编码,当然你可以自定义过滤器,来处理自己的业务逻辑
<filter-name></filter-name>
过滤器名称,与下文提到的 filter-mapping 标签的 filter-name 相对应<filter-class></filter-class>
过滤器类的完整类名<init-param></init-param>
filter类的初始化参数,有两个子标签
<param-name></param-name>
可以理解为map中的key<param-value></param-value>
可以理解为map中的value
- 在filter中,通过 (request.getServletContext().getInitParameter(“key”); 来获取值value,注意:此处的request为 ServletRequest
8、filter-mapping
- 过滤器的映射,与 filter 标签搭配使用,且必须先配置 filter 再配置 filter-mapping,有两个子标签
<filter-name></filter-name>
过滤器名称,与上文提到的 filter 标签的 filter-name 相对应<url-pattern></url-pattern>
映射路径,所有符合该模式的URL都会应用于该过滤器
Spring提供的字符编码过滤器
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
设置编码格式为UTF-8<param-name>forceEncoding</param-name>
<param-value>false</param-value>
若为true,则表示强制设置 response 的编码与 request 一致- 以下是 CharacterEncodingFilter 的源码,当 forceEncoding 为 true 时,会短路 request.getCharacterEncoding() == null,从而设置 respond 的编码与 request 一致
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
此处表示将所有以 .do 结尾的请求,使用UTF-8编码
9、listener
- 监听器,可以用来监听客户端的请求,服务端的操作等,常用的监听器有
- ServletContext 监听器
ServletContextListener
用于对整个Servlet上下文在 创建、销毁 时进行监听ServletContextAttributeListener
用于对Servlet上下文属性的 增删改 操作进行监听
- Session 监听器
HttpSessionListener
用于对Session在 创建、销毁 时进行监听HttpSessionAttributeListener
用于对Session属性的 增删改 操作进行监听
- Request 监听器
ServletRequestListener
用于对Request在 创建、销毁 时进行监听ServletRequestAttributeListener
用于对Request属性的 增删改 操作进行监听
- ServletContext 监听器
10、servlet
- 用来声明一个servlet数据,常用的有以下几个子标签
<servlet-name></servlet-name>
servlet名称,与下文提到的 servlet-mapping 标签的 servlet-name 相对应<servlet-class></servlet-class>
servlet类的完整类名<init-param></init-param>
servlet类的初始化参数,有两个子标签
<param-name></param-name>
可以理解为map中的key<param-value></param-value>
可以理解为map中的value
<load-on-startup></load-on-startup>
当web应用启动时,用于指定加载servlet的顺序
当值 大于等0 时,web容器会按照值大小 从小到大 顺序加载
当值 为负或未定义 时,web容器会在首次访问该servlet时加载它
- 在servlet中,通过 this.getInitParameter(“key”) 来获取值value
11、servlet-mapping
- servlet的映射,与 servlet 标签搭配使用,且必须先配置 servlet 再配置 servlet-mapping,有两个子标签
<servlet-name></servlet-name>
servlet名称,与上文提到的 servlet 标签的 servlet-name 相对应<url-pattern></url-pattern>
映射路径,使用该路径可以访问到想要访问的 servlet,可自行定义
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.lala.servlet.Login</servlet-class>
<init-param>
<param-name>key</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/servlet/abc</url-pattern>
</servlet-mapping>
- 在页面上,通过简单的form表单就可以访问到对应的servlet
<form action="servlet/abc" method="post">
<input type="submit" value="提交" />
</form>
12、session-config
- 设置 session 超时时间,单位为分钟
<session-config>
<session-timeout>30</session-timeout>
</session-config>
13、welcome-file-list
- 设置欢迎页,若不设置则会默认访问 WEB-INF 下的 index.html 页面
<welcome-file-list>
<welcome-file>index1.html</welcome-file>
<welcome-file>index2.html</welcome-file>
<welcome-file>index3.html</welcome-file>
</welcome-file-list>
- 当访问项目时,容器会按顺序依次搜索页面,如果有对应的页面存在,则显示该页面,若都没匹配到,则会报404错误
14、error-page
- 设置错误页,当404或500或指定异常时可以跳转至指定页面,有三个子标签
<error-code></error-code>
错误码,例如 404, 500等<exception-type></exception-type>
异常类型,例如 java.lang.NullPointerException(空指针异常)<location></location>
用来设置错误页
<error-page>
<error-code>404</error-code>
<location>/error_404.html</location>
</error-page>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error_null.html</location>
</error-page>
此外,如果文章有什么错误之处,还请小伙伴们指出来,我会及时更正的