web.xml文件解析,以及tomcat啓動常見錯誤總結一哈。






【1.在web.xml裏配置Listener】


xml 代碼如下: 
  <listener>  
        <listener-class>
		org.springframework.web.context.ContextLoaderListener 
	</listener-class>   
   </listener>    
如果在web.xml裏給該Listener指定要加載的xml,如:


xml代碼如下:


<!-- spring config -->


      <context-param>


           <param-name>contextConfigLocation</param-name>  


           <param-value>classpath:applicationContext*.xml</param-value>


      </context-param>


則會去加載相應的xml,而不會去加載/WEB-INF/下的applicationContext.xml。


但是,如果沒有指定的話,默認會去/WEB-INF/下加載applicationContext.xml。


以前經常報org.springframework.web.context.ContextLoaderListener這個錯誤
是因爲src下的applicationContext*.xml文件沒有加載到tomcat,而且所有的java文件
也沒有重新編譯。所以纔出現這個錯誤。


【2.src 與  WEB-INF 的區別。】
   根據上面的例子:在<context-param>contextConfigLocation</context-param>標籤中,如果不指定
	<param-value>的值,則默認是加載WEB-INF/下的applicationContext.xml文件。
	上面指定爲src目錄下的所有以applicationContext開頭的xml文件
   下面來看一下log4jConfigLocation
   一般我們直接將log4j.properties放置在src目錄下,這樣系統自動會找到的,
   其實就是放在WEB-INF/classes文件下。這個路徑在classpath下,所以直接就能找到。


   在web.xml中配置servlet,並將log4jConfigLocation加入到Servlet中,讓其Server啓動即運行:
	<servlet>
		<servlet-name>your servlet</servlet-name>
		<servlet-class>your servelt class</servlet-class>
		<init-param>
			 <param-name>log4jConfigLocation</param-name>
			 <param-value>/WEB-INF/log4j.properties</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	這時log4j.properties文件放在WEB-INF目錄下。
【3.下面我們來深入瞭解一下<context-param> 與 <init-param>】


   其實一目瞭然<init-param>是tomcat服務器,創建servlet的時候才加載。
   而<context-param>是tomcat啓動之後就加載。
   context-param 是ServletContext 創建的,屬於整個tomcat服務器中。


   init-param 是有servlet創建的。
   init-param屬於一個servlet所有,
   context-param屬於整個應用程序所有 ,不僅是在servlet中可以得到,jsp文件中也可以得到.
   在jsp中config就相當於這裏的servletContext.


   web.xml裏面可以定義兩種參數:
     (1)application範圍內的參數,存放在servletcontext中,在web.xml中配置如下:
     xml 代碼
	<context-param>  
           <param-name>context/param</param-name>  
           <param-value>avalible during application</param-value>  
	</context-param>  
     (2)servlet範圍內的參數,只能在servlet的init()方法中取得,在web.xml中配置如下:
    xml 代碼
	<servlet>  
		<servlet-name>MainServlet</servlet-name>  
		<servlet-class>com.wes.controller.MainServlet</servlet-class>  
		<init-param>  
		<param-name>param1</param-name>  
		<param-value>avalible in servlet init()</param-value>  
		</init-param>  
		<load-on-startup>0</load-on-startup>  
	</servlet>  
【web.xml】
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	<context-param>

		<param-name>contextConfigLocation</param-name> 

		<param-value>classpath:conf/applicationContex*.xml</param-value>

	</context-param>
	<context-param>  

		<param-name>log4jConfigLocation</param-name> 

		<param-value>classpath:conf/log4j.properties</param-value>

	</context-param>
	
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
		

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>MainServlet</servlet-name>
    <servlet-class>com.feihuale.test.MainServlet</servlet-class>
    <init-param>
			<param-name>contextConfigLocation_init-param</param-name>
			<param-value>WEB-INF/applicationContext-mvc.xml</param-value>
		</init-param>
		<load-on-startup>0</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>



根據上面的xml文件可以通過java代碼獲取
	//----------------------------------------------------------
	public class MainServlet extends HttpServlet {


	
	public void init() throws ServletException {  
		
		
		
        System.out.print("contextConfigLocation參數是存放在servletcontext中的---->");   
        System.out.println(getServletContext().getInitParameter("contextConfigLocation"));  
        
        System.out.print("log4jConfigLoction參數是存放在servletcontext中的---->");   
        System.out.println(getServletContext().getInitParameter("log4jConfigLocation"));
        
        System.out.print("contextConfigLocation_init-param參數是在servlet中存放的---->");   
        System.out.println(this.getInitParameter("contextConfigLocation_init-param"));  
        
        
     } 
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {


		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		
	}


	}
	//----------------------------------------------------------


【4.常見的tomcat啓動錯誤。】
在做struts+hibernate+spring項目時,啓動程序後,發現錯誤 :


org.springframework.beans.factory.BeanDefinitionStoreException: 
IOException parsing XML document from ServletContext resource 
[/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: 
Could not open ServletContext resource [/WEB-INF/applicationContext.xml]


這是因爲程序默認會在WEB-INF目錄下查找applicationContext.xml文件,而現在程序找不到了,所以報錯了。


解決方法有兩個:


1. 把applicationContext.xml文件人工拷貝到WEB-INF目錄下。


2. 在配置文件中指定applicationContext.xml文件的位置:修改web.xml文件,添加行:




<context-param>


    <param-name>contextConfigLocation</param-name>


    <param-value>classpath:applicationContex*.xml</param-value>


</context-param >
//最後我還發現了一個問題<param-name>必須命名爲contextConfigLocation,
連大小寫也不能錯,不信你試試。
推薦使用方法2。



參考地址:http://my.oschina.net/wxyplj/blog/14333 

                 http://www.fansoo.com/blog/tag/applicationcontext-xml/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章