四、Servlet基础 -- web.xml

一、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>

三、生命周期

3.1 ServletContext对象
3.2 Servlet生命周期
3.3 过滤器生命周期
3.4 监听器生命周期
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值