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);
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值