JAVA WEB---ServletConfig,ServletContext,AJAX

1.ServletConfig

package com.hxuner.web;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 ServletConfig
  代表當前Servlet在web.xml中的配置信息
 
  1.概念:
  	        當web容器加載一個Servlet的類時,會掃描web.xml中對該Servlet的配置,創建一個ServletConfig對象,封裝這些配置信息,
  	        並在調用該Servlet實例的init()方法時,將ServletConfig對象傳入.
  
  2.獲取ServletConfig對象:
 		Servlet接口定義了5個抽象方法,其中2個方法:
 	   			init(ServletConfig config)    getServletConfig()   
 	
 		GenericServlet對這兩個方法提供了實現:
 				1. GenericServlet聲明瞭一個實例成員 ServletConfig config
 				2. GenericServlet實現了init(ServletConfig config){ this.config=config;},使用方法傳入的config對象給自己的實例成員賦值
 				3. GenericServlet實現了getServletConfig(){return this.config},			返回自身的實例成員config
 				
 	
  
  3.用途:獲取web.xml中該Servlet配置的初始化參數
                注意:這樣配置的初始化參數,僅對當前Servlet有效
  		
  		3.1配置當前Servlet
  			web.xml
  			
  			<servlet>	
    		<!--配置當前Servlet的初始化參數 ServletConfig -->
	    		<init-param>
	    			<param-name>name</param-name>
	    			<param-value>張三</param-value>
	    		</init-param>
	    	</servlet>
	    	
	    	注意:如果有多個初始化參數,可添加多對<init-param>
	    	
	    3.2獲取ServletConfig對象
	    	this.getServletConfig()
	    
	    3.3通過Servletconfig對象獲取初始化參數
	        .getInitParameter("參數名")
	        
	        
  
  
 */
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletConfig01
public class ServletConfig01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//request請求亂碼-Post  
		request.setCharacterEncoding("utf-8"); 
		//response應答亂碼-不管字符還是字節流
		response.setContentType("text/html;charset=utf-8");
		
		
		//1.獲取ServletConfig對象,該對象代表了當前Servlet在web.xml的配置信息
		//this.getServletConfig();
		ServletConfig config=this.getServletConfig();
		
		//2.通過config對象獲取初始化參數
		//.getInitParameter()
		String namevalue=config.getInitParameter("name");
		String agevalue=config.getInitParameter("age");
		
		
		
		//需求:每次用戶訪問時,返回今天值班的人的姓名
		response.getWriter().write("今天是"+namevalue+"值班,他的年齡是"+agevalue);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.hxuner.web;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
 ServletConfig
  代表當前Servlet在web.xml中的配置信息
 
  1.概念:
  	        當web容器加載一個Servlet的類時,會掃描web.xml中對該Servlet的配置,創建一個ServletConfig對象,封裝這些配置信息,
  	        並在調用該Servlet實例的init()方法時,將ServletConfig對象傳入.
  
  2.獲取ServletConfig對象:
 		Servlet接口定義了5個抽象方法,其中2個方法:
 	   			init(ServletConfig config)    getServletConfig()   
 	
 		GenericServlet對這兩個方法提供了實現:
 				1. GenericServlet聲明瞭一個實例成員 ServletConfig config
 				2. GenericServlet實現了init(ServletConfig config){ this.config=config;},使用方法傳入的config對象給自己的實例成員賦值
 				3. GenericServlet實現了getServletConfig(){return this.config},			返回自身的實例成員config
 				
 	
  
  3.用途:獲取web.xml中該Servlet配置的初始化參數
                注意:這樣配置的初始化參數,僅對當前Servlet有效
  		
  		3.1配置當前Servlet
  			web.xml
  			
  			<servlet>	
    		<!--配置當前Servlet的初始化參數 ServletConfig -->
	    		<init-param>
	    			<param-name>name</param-name>
	    			<param-value>張三</param-value>
	    		</init-param>
	    	</servlet>
	    	
	    	注意:如果有多個初始化參數,可添加多對<init-param>
	    	
	    3.2獲取ServletConfig對象
	    	this.getServletConfig()
	    
	    3.3通過Servletconfig對象獲取初始化參數
	        .getInitParameter("參數名")
	        
	        
  
  
 */
//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletConfig01
public class ServletConfig01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//request請求亂碼-Post  
		request.setCharacterEncoding("utf-8"); 
		//response應答亂碼-不管字符還是字節流
		response.setContentType("text/html;charset=utf-8");
		
		
		//1.獲取ServletConfig對象,該對象代表了當前Servlet在web.xml的配置信息
		//this.getServletConfig();
		ServletConfig config=this.getServletConfig();
		
		//2.通過config對象獲取初始化參數
		//.getInitParameter()
		String namevalue=config.getInitParameter("name");
		String agevalue=config.getInitParameter("age");
		
		
		
		//需求:每次用戶訪問時,返回今天值班的人的姓名
		response.getWriter().write("今天是"+namevalue+"值班,他的年齡是"+agevalue);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

2.ServletContext

package com.hxuner.web;


import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
      需求:
  		需要在web.xml中配置一個變量,可以在整個web應用中所有組件中,都能訪問到該變量,比如整個項目使用的字符集
  		ServletConfig做不到
  	解決:
  		ServletContext不適合存放每個用戶特有的數據,適合存放通用的數據,比如全局的字符編碼
  
  	問題:ServletContext作用域是否可以替代request作用域
  	----------------------?????----------------------------
 */

/*
 * ServletContext
   每一個web應用加載完成後都會創建一個ServletContext對象唯一代表該web應用
 
  1.概念:
   		作用範圍:
				整個web應用
   		生命週期:
				當服務器啓動web應用加載後立即創建代表這個web應用的ServletContext對象,一直駐留在內存中,唯一的代表這個web應用;
				直到服務器關閉或web應用被移除出容器時,隨着web應用的銷燬,ServletContext對象銷燬。
			
  2.獲取ServletContext
       2.1this.getServletContext()
       			->GenericServlet提供的方法,方法內部其實是調用了下面這個方法
       			
       2.2this.getServletConfig().getServletContext()
       			->通過ServletConfig對象獲取ServletContext對象	
		
  
  
  3.ServletContext作用
  
  ---------------ServletContext作用1:獲取web應用的初始化參數----------------
  
	  1.配置當前web應用
		   	<context-param>
				<param-name>encode</param-name>
				<param-value>utf-8</param-value>
		  	</context-param>
		   <servlet>
		   </servlet>
		   
		     
	  
	  2.獲取ServletContext對象
	 		this.getServletContext();
	 		this.getServletConfig().getServletContext();
	 
	  3.通過ServletContext獲取初始化信息
	  		.getInitParameter("參數名")
	  
 
 */

//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletContext01
public class ServletContext01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//1獲取ServletContext的API
		//1.1GenericServlet中提供了便捷的getServletContext()   
		ServletContext sc1=this.getServletContext();    	//內部其實是this.getServletConfig().getServletContext();
		
		//1.2在ServletConfig對象身上提供了getServletContext()方法可以用來獲取ServletContext對象。
		ServletContext sc2=this.getServletConfig().getServletContext();
		
		System.out.println(sc1==sc2);  //輸入true,兩種方法獲取的ServletContext是同一個
		
		
		//2.獲取初始化信息    getInitParameter("encode")
		String code=sc1.getInitParameter("encode");
		System.out.println(code);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.hxuner.web;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


//---------------ServletContent作用2:作爲作用域對象----------------
/* 
        1.ServletContext作用域也稱爲application作用域
 		
 		2.作用範圍:
				整個web應用
   			生命週期:
				當服務器啓動web應用加載後立即創建代表這個web應用的ServletContext對象,一直駐留在內存中,唯一的代表這個web應用;
				直到服務器關閉或web應用被移除出容器時,隨着web應用的銷燬,ServletContext對象銷燬。
		
		3.作用
			共享一些通用的配置
	    
	    4.API
	    	與其他作用域的api是一致的
 
 */


//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletContext02
public class ServletContext02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		/*	-------------------獲取總的訪問次數---------------------------------------
		//獲取存儲在ServletContext作用域中的count變量
		Integer count=(Integer) this.getServletContext().getAttribute("count");  //第一次訪問可能是null,int包裝類對象Integer是對象可以是null,而int不能爲null
		if(count==null){	//第一次訪問
			count=1;
		}else{
			count++;   //訪問次數加+1
		}
		System.out.println("訪問次數count="+count);
		//將新的count變量存入ServletContext作用域
		this.getServletContext().setAttribute("count", count);		
 		*/	
		
		
		//-----------------獲取ServletContext作用域中所有變量的name--------------------------
		// 獲取ServletContext作用域中所有變量的name
		Enumeration<String> names=this.getServletContext().getAttributeNames();
		// 遍歷輸出ServletContext作用域中所有的鍵值對
		while(names.hasMoreElements()){
			String name=names.nextElement();
			System.out.println("name="+name+",value="+this.getServletContext().getAttribute(name));
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.hxuner.web;

import java.io.File;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//---------------ServletContent作用3:獲取一個文件的真實路徑----------------
/*
 * 
 */

//輸入localhost/day011JavaWebServlet_Ajax/servlet/ServletContext03
public class ServletContext03 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		
		//希望獲取配置文件config.xml的絕對路徑
		
		
		/*
		 * 路徑難問題:
		 
				在web環境中讀取資源時,如果寫的是相對路徑,則在tomcat/bin目錄下尋找資源。   
									   如果寫的是絕對路徑,則在tomcat所在目錄的根目錄下尋找資源。
									   如果寫的是盤符開始的絕對路徑可以正確找到資源,但是一旦改變了發佈環境路徑很可能是錯的。
				我們發現無論怎麼寫路徑都有問題。
		 */
		
		//如果寫的是絕對路徑,則在tomcat所在目錄的根目錄下尋找資源   
		File file1=new File("/config.xml");
		System.out.println(file1.getAbsolutePath());  		//輸出E:\config.xml
		
		
		//如果寫的是相對路徑,則在tomcat/bin目錄下尋找資源。
		File file2=new File("config.xml");
		System.out.println(file2.getAbsolutePath());		 //輸出E:\ChenXun\Tomcat\tomcat7\bin\config.xml
		
		
		
		
		//-------------ServletContext獲取資源的絕對路徑---------------------------------------
		/*
		 	ServletContext.getRealPath("xxxx");
			這個方法會在傳入的路徑前拼接當前web應用的硬盤路徑,從而拼接出資源的硬盤路徑,從而可以找到資源。
			這種方式沒有將web應用的硬盤路徑寫死,所以即使換了一個發佈環境,路徑也是正確的
		*/
		ServletContext sc=this.getServletContext();
		//返回一個文件的絕對路徑,方法參數中param傳入的路徑是相對於WebRoot根目錄的路徑
		String path=sc.getRealPath("/WEB-INF/classes/config.xml");          //例如src文件夾下放了一個config.xml
																			//該文件在MyEclipse部署應用時,會被放入classPath下
																			//web應用的classpath實際上指的是WEB-INF/classes
																			//因此獲取該文件的絕對路徑-sc.getRealPath("/WEB-INF/classes/config.xml")
		
										
		System.out.println(path);                    //輸出E:\ChenXun\Tomcat\tomcat7\webapps\day011JavaWebServlet_Ajax\WEB-INF\classes\config.xml
		
		
		
		
		
		//----------------補充:沒有ServletContext的情況下,通過classloader獲取資源的絕對路徑-----------------
		/*
		 		可以通過類加載器ClassLoader去獲取     this.getClass().getClassLoader();
		 		classLoader.getResouce("資源名稱").getPath(), 該方法默認從classpath下開始尋找->web應用默認是WEB-INF/classes
		 */
		
		//通過當前對象獲取classloader對象
		ClassLoader loader=this.getClass().getClassLoader();
		//getResource()方法可以根據資源的名稱找到對應的資源
		//是從classpath下去找對應的資源,web應用默認是WEB-INF/classes
		String path2=loader.getResource("config.xml").getPath();
		System.out.println(path2);               //輸出/E:/ChenXun/Tomcat/tomcat7/webapps/day011JavaWebServlet_Ajax/WEB-INF/classes/config.xml
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

3.AJAX

package com.hxuner.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AJAX extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*
		 AJAX  異步JS And XML  
		   	
		   	1.概念:
				     通過1.瀏覽器實現異步請求+2.應答結果局部刷新的解決方案
				     通過js來實現發送異步請求,接收應答內容,將應答內容通過局部刷新的方式在瀏覽器上顯示
				   xml用來承載應答返回的結構化的數據.   目前這一功能在逐步被json取代  異步JS And Json->AJAJ->AJ
			
			
			
			2.同步請求和異步請求
				   2.1同步請求:當瀏覽器發出一次請求後,在收到服務器的應答之前,瀏覽器處於阻塞狀態,不能進行任何的操作
				    
				   2.2異步請求:當發送一次請求後,瀏覽器可以繼續操作,甚至再次發送多個請求
				   
				           		優勢:1. 增加了用戶體驗
				           			 2. 由於可以實現局部刷新,所以服務器只需要返回一部分內容即可,降低了服務器應答的帶寬壓力
				           			 
				           		劣勢:1. 用戶可能發送多次請求,增加了服務器響應用戶請求的壓力
				           			 2. 不是所有的場景都適用,比如支付時,就必須使用同步請求
				
				
				           			 
		    3.基於javaScript實現AJAX請求(瞭解)4步
		    	3.1  獲取XMLHttpRequest對象
					var xmlHttp = ajaxFunction();
				
				3.2.建立連接
				
					xmlHttp.open(method, url, async);
						method: 請求方式, 可以是GET或POST
						url: 所要訪問的服務器中資源的路徑 如: /Day10/servlet/AServlet
						async: 是否爲異步傳輸, true 表示爲異步傳輸 一般都是true
				
					xmlHttp.open("POST", "${ pageContext.request.contextPath }/servlet/AjaxTestServlet", false);
				
				
				
				3.3發送請求
				xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  //通知服務器發送的數據是請求參數
				xmlHttp.send("i="+(++i));   //注意, 如果不給參數可能會造成部分瀏覽器無法發送請求
							 > 參數: 
									如果是GET請求, 可以是null, 因爲GET提交參數會拼接在url後面
									如果是POST請求, 傳入的就是請求參數 "username=張飛&psw=123"
									
				3.4註冊監聽
						>在XMLHttpRequest對象的一個事件上註冊監聽器: 	
							onreadystatechange
						一共有五個狀態:(xmlHttp.readyState)
							0狀態: 表示剛創建XMLHttpRequest對象, 還未調用open()方法
							1狀態: 表示剛調用open()方法, 但是還沒有調用send()方法發送請求 
							2狀態: 調用完了send()方法了, 請求已經開始
							3狀態: 服務器已經開始響應, 但是不代表響應結束 
							4狀態: 服務器響應結束!(通常我們只關心這個狀態) 
						> 獲取xmlHttp對象的狀態:
							var state = xmlHttp.readyState;//可能得到0, 1, 2, 3, 4 
						> 獲取服務器響應的狀態碼
							var status = xmlHttp.status;
						> 獲取服務器響應的內容
							var data = xmlHttp.responseText;//得到服務器響應的文本格式的數據  

						xmlHttp.onreadystatechange = function(){
									//當服務器已經處理完請求之後
								if(xmlHttp.readyState == 4){
									if( xmlHttp.status == 200 ){
										//獲取響應數據
										var result = xmlHttp.responseText;
										result = xmlHttp.responseXML;
									}
								}
						}
				
				
				xmlHttp.onreadystatechange = function(){
					//時刻監聽服務器處理請求的過程(狀態), 但是我們只關心爲4的狀態
					if(xmlHttp.readyState == 4){
						//如果請求處理成功了才獲取響應結果
						if(xmlHttp.status == 200){
							//獲取響應結果
							var result = xmlHttp.responseText;
							if(result == "true"){
								setMsg("username", "用戶名已存在");
							}else{
								setMsg("username", "恭喜, 用戶名可以使用");
							}
						}
					}
				}
				
		    
		    4.jQuery實現AJAX
		    
				4.1 load方法
					$(selector).load(url,data,callback);
						selector -- 選擇器, 將從服務器獲取到的數據加載到指定的元素中
						url -- 發送請求的URL地址
						data -- 可選, 向服務器發送的數據 key/value數據 如:{"username" : "張飛", "psw" : "123"}
						callback -- 可選, load方法完成後所執行的函數
					示例:
						$("#username_msg").load("<%= request.getContextPath() %>/AjaxCheckUsernameServlet", {"username": username});
					
					特點1:如果添加data,就是post請求,不加data,就是get請求
					特點2:服務器返回的數據會直接添加到selector選擇的組件內部
					
				4.2 $.get方法
					$.get(url, [data], [callback]);
						url -- 發送請求的URL地址
						data -- 可選, 向服務器發送的數據
						callback -- 可選, 請求成功後所執行的函數
					示例:
						$.get("<%= request.getContextPath() %>/AjaxCheckUsernameServlet", {"username": username}, function(result){
							$("#username_msg").html("<font style='color:red'>"+result+"</font>");
						});
				4.3 $.ajax方法
					$.ajax(url, [data], [async], [callback]);
						url -- 發送請求的URL地址
						data -- 可選, 發送至服務器的key/value數據
						async -- 可選, 默認爲true, 表示異步交互
						type -- 可選, 請求方式 , 默認爲"GET"。
						success -- 可選, 請求成功後執行的函數, 函數參數:
						result -- 服務器返回的數據
					示例: 
						$.ajax({
							"url" : "<%= request.getContextPath() %>/AjaxCheckUsernameServlet",
							"data" : {"username": username},
							"async" : true,
							"type" : "POST",
							"success" : function(result){
								$("#username_msg").html("<font style='color:red'>"+result+"</font>")
							}
						});
				    
		 */
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
	//爲username輸入框添加輸入鼠標焦點的事件
				$("input[name='username']").blur(function(){
					//執行非空驗證
					var flag=formObj.checkNull("username","用戶名不能爲空");
					//flag爲true,說明用戶名不爲空,執行AJAX請求
					
					
					if(flag){
						var url="/AjaxCheckUsernameServlet";
						//獲取當前input框中的值
						var name=$(this).val();
						
						//1.$(selector).load  會將返回的內容直接添加到選擇器
						//$(selector).load(url,data,callback);
						/*
							$(selector).load(url,data,callback);
								selector -- 選擇器, 將從服務器獲取到的數據加載到指定的元素中
								url -- 發送請求的URL地址
								data -- 可選, 向服務器發送的數據 key/value數據 如:{"username" : "張飛", "psw" : "123"}
								callback -- 可選, load方法完成後所執行的函數
							
					              特點1:如果添加data,就是post請求,不加data,就是get請求
					              特點2:服務器返回的數據會直接添加到selector選擇的組件內部
						*/
					    //$("#msg_username").load(url,{"username":name});
						
						
						//2.
						/*
						 	$.get方法
							$.get(url, [data], [callback]);
								  url -- 發送請求的URL地址
								  data -- 可選, 向服務器發送的數據
								   callback -- 可選, 請求成功後所執行的函數
								   
							
						*/
						//function就是callback,當頁面收到服務器返回的應答後,會自動調用
						// function方法,其參數result,就是服務器返回的內容
						$.get(url,{"username":name},function(result){
							$("#msg_username").html(result);
						});
						
						
					}
					
				});
			});
			
package com.hxuner.web;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hxuner.util.JDBCUtils;

public class AjaxCheckUsernameServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
				// 獲取全局的字符集編碼
				String encode=this.getServletContext().getInitParameter("encode");
				// 1. 處理亂碼
				// 請求亂碼 post
				// req.setCharacterEncoding(encode);
				// 應答亂碼
				response.setContentType("text/html;charset="+encode);
				// 2. 獲取請求參數
				String username=request.getParameter("username");
				// 手動編解碼處理get請求亂碼
				username=new String(username.getBytes("iso8859-1"),encode);
				// 3. 表單驗證(略)
				// 4. 執行邏輯
				String sql="select * from user where username=?";
				Connection conn=null;
				PreparedStatement ps=null;
				ResultSet rs=null;
				
				try {
					conn=JDBCUtils.getConn();
					ps=conn.prepareStatement(sql);
					ps.setString(1, username);
					rs=ps.executeQuery();
					if(rs.next()){
						// 數據庫中存在該用戶名
						// 5. 根據執行結果,返回應答內容
						response.getWriter().write("很抱歉,用戶名已存在");
					}else{
						response.getWriter().write("恭喜您,用戶名可以使用");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}finally{
					JDBCUtils.close(conn, ps, rs);
				}
		
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

 

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