一、web.xml 元素加载顺序
1.1 什么是web.xml
+++ web.xml:
部署到服务下,用来描述整个项目的结构。
一般的web工程中都会用到web.xml,web.xml主要用来配置,可以方便的
开发web工程。web.xml主要用来配置Filter、Listener、Servlet等。但
是要说明的是web.xml并不是必须的,一个web工程可以没有web.xml文件。。
1.2 web.xml中元素的加载顺序
详解:
首先了解下web.xml中元素的加载顺序:
1.启动WEB项目的时候,容器首先会去读取web.xml配置文件中的两个节点:
<context-param> </context-param>
<listener> </listener>
2.紧接着,容器创建一个ServletContext(application),这个web项目的所有部分都将共享这个上下文。
容器解析<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。
3.容器创建<listener></listener>中的类实例,根据配置的class类路径
<listener-class>来创建监听,
1)
在监听中会有初始化方法,启动Web应用时,系统调用Listener的该方法
contextInitialized(ServletContextEvent args),
在这个方法中获得
ServletContext application=ServletContextEvent.getServletContext();
context-param的值= application.getInitParameter("context-param的键");
得到这个context-param的值之后,你就可以做一些操作了。
2)
ServletContextListener是对ServeltContext的一个监听.
servelt容器启动,serveltContextListener就会调用contextInitialized方法.
在方法里面调用event.getServletContext()可以获取ServletContext,
ServeltContext是一个上下文对象,他的数据供所有的应用程序共享,进行一些业务的初始化servelt容器关闭,
serveltContextListener就会调用contextDestroyed.
【实际上ServeltContextListener是生成ServeltContext对象之后调用的。 】
4.接着,容器会读取<filter></filter>,根据指定的类路径来实例化过滤器。
5.如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化
的,而且一般不会被容器销毁,它可以服务于多个用户的请求。
所以,Servlet的初始化都要比上面提到的那几个要迟。
总结:
WEB容器的加载顺序(总结):
1.ServletContext -> context-param -> listener -> filter -> servlet。并且
2.WEB工程加载顺序与元素节点在文件中的配置顺序无关。这些元素可以配置在文件中的任意位置。即不会因为 filter
写在 listener 的前面而会先加载 filter。
3.如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载。
WEB容器的加载顺序(步骤):
1.启动web项目后,web容器读取web.xml文件。创建ServletContext 对象。
并解析<context-param></context-param>,传入该对象中。
2.容器创建listener实例,创建监听器。
ServletContextListener监听器会自动调用contextInitialized方法.
3.容器创建filter实例。
4.如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化
的,
容器加载servlet,加载顺序按照 Load-on-startup 来执行
二、web.xml
2.1 Servlet的配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HelloController.java
servlet继承HttpServlet
public class HelloController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
2.2 Servlet的参数配置(ServletConfig)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<init-param>
<param-name>k1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>k2</param-name>
<param-value>v2</param-value>
</init-param>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HelloController.java
servlet继承HttpServlet
public class HelloController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig sc = this.getServletConfig();
//1.获取所有的servlet参数
Enumeration<String> ens = sc.getInitParameterNames();
while(ens.hasMoreElements()) {
String key = ens.nextElement();
String value = sc.getInitParameter(key);
}
//2.根据key获取value
String value = sc.getInitParameter("k1");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
2.3 ServletContext的参数配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>url</param-name>
<param-value>http://www.baidu.com</param-value>
</context-param>
<context-param>
<param-name>url2</param-name>
<param-value>http://www.baidu.com2</param-value>
</context-param>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HelloController.java
servlet继承HttpServlet
public class HelloController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext sc = this.getServletContext();
//1.获取所有的参数
Enumeration<String> ens = sc.getInitParameterNames();
while(ens.hasMoreElements()) {
String key = ens.nextElement();
String value = sc.getInitParameter(key);
System.out.println(key+":"+value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
2.4 过滤器配置(filter)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 过滤器配置 -->
<filter>
<filter-name>helloF</filter-name>
<filter-class>org.jsoft.demo.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloF</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- servlet配置 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HelloFilter .java
HelloFilter 实现 Filter
public class HelloFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("...");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init(FilterConfig filterConfig)");
}
}
2.5 过滤器的参数配置(FilterConfig)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 过滤器配置 -->
<filter>
<init-param>
<param-name>k1</param-name>
<param-value>v1</param-value>
</init-param>
<filter-name>helloF</filter-name>
<filter-class>org.jsoft.demo.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloF</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- servlet配置 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
HelloFilter .java
HelloFilter 实现 Filter
public class HelloFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//获取这个过滤器的所有初始化参数名
Enumeration<String> ens = filterConfig.getInitParameterNames();
while(ens.hasMoreElements()) {
String key = ens.nextElement();
String value = filterConfig.getInitParameter(key);
System.out.println("filter过滤器初始化参数:"+key+"-"+value);
}
System.out.println("过滤器1初始化完毕");
}
}
2.5 监听器的配置(Listener)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.jsoft.demo.MyHttpSesisonListener</listener-class>
</listener>
<listener>
<listener-class>org.jsoft.demo.MyServletContextListener</listener-class>
</listener>
<!-- servlet配置 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
MyHttpSesisonListener .java
MyHttpSesisonListener 实现 HttpSessionListener
public class MyHttpSesisonListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
}
}
MyServletContextListener .java
MyServletContextListener 实现 ServletContextListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
2.7 指定欢迎页面
下面的例子指定了2个欢迎页面。
显示时按顺序从第一个找起,如果第一个存在,就显示第一个,后面的不起作用。
如果第一个不存在,就找第二个,以此类推。
关于欢迎页面:
访问一个网站时,默认看到的第一个页面就叫欢迎页,一般情况
下是由首页来充当欢迎页的。一般情况下,我们会在web.xml中
指定欢迎页。但web.xml并不是一个Web的必要文件,没有
web.xml,网站仍然是可以正常工作的。只不过网站的功能复杂
起来后,web.xml的确有非常大用处,所以,默认创建的动态web
工程在WEB-INF文件夹下面都有一个web.xml文件。
对于tomcat来说,当你只指定一个web的根名,没有指定具体页面,去访问时一个web时,如果web.xml文件中配置了欢迎页,那么就返回指定的那个页面作为欢迎页,而在文中没有web.xml文件,或虽然有web.xml,但web.xml也没指定欢迎页的情况下,它默认先查找index.html文件,如果找到了,就把index.html作为欢迎页还回给浏览器。如果没找到index.html,tomcat就去找index.jsp。找到index.jsp就把它作为欢迎页面返回。而如果index.html和index.jsp都没找到,又没有用web.xml文件指定欢迎页面,那此时tomcat就不知道该返回哪个文件了,它就显示The requested resource (/XXX) is not available(我就出现过这个问题)的页面。其中XXX表示web的根名。但如果你指定了具体页面,是可以正常访问的。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.jsoft.demo.MyHttpSesisonListener</listener-class>
</listener>
<listener>
<listener-class>org.jsoft.demo.MyServletContextListener</listener-class>
</listener>
<!-- servlet配置 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- 指定欢迎页 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index1.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.8 全局异常统一处理—指定错误页面
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.jsoft.demo.MyHttpSesisonListener</listener-class>
</listener>
<listener>
<listener-class>org.jsoft.demo.MyServletContextListener</listener-class>
</listener>
<!-- servlet配置 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index1.jsp</welcome-file>
</welcome-file-list>
<!-- 指定错误界面 -->
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/error1.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/error2.jsp</location>
</error-page>
</web-app>
2.9 设置session相关配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<listener>
<listener-class>org.jsoft.demo.MyHttpSesisonListener</listener-class>
</listener>
<listener>
<listener-class>org.jsoft.demo.MyServletContextListener</listener-class>
</listener>
<!-- servlet配置 -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.jsoft.demo.HelloController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index1.jsp</welcome-file>
</welcome-file-list>
<!-- 设置会话(Session)过期时间,其中时间以分钟为单位 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>