天天看点

web基础day10ServletCofig和ServletContext与ajax

ServletCofig和ServletContext与ajax

其实09与10期间还有一个网页项目,因为还没做完,暂时就不发了

  1. ServletConfig

    代表web.xml中当前servlet的初始化配置信息的对象。

    在每一个servlet身上的注册servlet标签中都可以添加一些初始化配置信息参数,这些参数可以在访问时,通过ServletConfig获取。

    a. 功能一:获取初始化配置信息

    i. 获取方式:

    1) 重写init方法,获取ServletConfig对象。虽然可以得到,但是它是一个局部变量,如果要在全局操作,则需要将其转换为全局变量。并且若有多个servlet都需要获取初始化配置信息,多次重写init方法,十分不便。不推荐使用。

    2) 通过当前对象调用getServletConfig()方法,可以直接获取一个ServletConfig对象,并且可以在任意的位置调用。

    ii. 获取ServletConfig对象的api

    this.getServletConfig()

    iii. 获取初始化参数的api

    this.getServletConfig().getInitParameter(String name)

    iv. 代码实现

    1) 创建SConfigDemo.java

    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对象
     			public class SConfigDemo2 extends HttpServlet {
     			
     			        public void doGet(HttpServletRequest request, HttpServletResponse response)
     			                throws ServletException, IOException {
     			                ServletConfig config = this.getServletConfig();
     			                String driver = config.getInitParameter("driver");
     			                //获取第二个初始化配置信息
     			                String url = config.getInitParameter("url");
     			                System.out.println("driver:"+driver+">>url:"+url);
     			        }
     			
     			        public void doPost(HttpServletRequest request, HttpServletResponse response)
     			                throws ServletException, IOException {
     			                doGet(request, response);
     			
     			        }
     			
     			}
     		2) 修改web.xml文件
     			 <servlet>
     			    <servlet-name>SConfigDemo2</servlet-name>
     			    <servlet-class>cn.tedu.SConfig.SConfigDemo2</servlet-class>
     			 	<init-param>
     			  		<param-name>driver</param-name>
     			  		<param-value>com.mysql.jdbc.Driver</param-value>
     			  	</init-param>
     			  	<init-param>
     			  		<param-name>url</param-name>
     			  		<param-value>localhost:3306/mydb1</param-value>
     			  	</init-param>
     			  </servlet>
     	v. 可以在每一个servlet身上添加多个初始化配置信息参数。通过来初始化参数名称,依次获取。
     	vi. 注意:每一个servlet只能获取当前servlet身上的初始化配置参数。其他的servlet无法获取。
     b. 功能二--获取ServletContext对象
     	this.getServletConfig().getServletContext()
               
    1. ServletContext对象

      代表当前web应用的对象

      若有多个Servlet同时需要同一份配置信息,可以把这些信息配置为一个全局的配置信息,这样web应用范围内的全部servlet都可以读取到。

      a. 获取ServletContext对象

      this.getServletConfig().getServletContext()

      this.getServletContext()

      b. 功能一:获取全局初始化配置信息

      SerlvetContext.getInitParameter(String name)

      i. 代码实现:

      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;
       	//获取全局初始化配置信息
       	public class SContextDemo1 extends HttpServlet {
       	
       	        public void doGet(HttpServletRequest request, HttpServletResponse response)
       	                throws ServletException, IOException {
       	//		获取ServletContext对象
       	        ServletContext sc = this.getServletConfig().getServletContext();
       	        ServletContext sc1 = this.getServletContext();
       	        //获取全局配置信息
       	//		String name = sc.getInitParameter("name");
       	//		System.out.println("name:"+name);
       	        String name = sc1.getInitParameter("name");
       	        System.out.println("sc1:name:"+name);
       	        }
       	
       	        public void doPost(HttpServletRequest request, HttpServletResponse response)
       	                throws ServletException, IOException {
       	                doGet(request, response);
       	
       	        }
       	
       	}
       ii. 全局配置信息
       	<!-- 当前web应用的全局配置信息 -->
       	  <context-param>
       	  	<param-name>name</param-name>
       	  	<param-value>value</param-value>
       	  </context-param>
                 

      c. 功能二:作为域对象使用

      i. 域对象:如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,那么这个对象就可以称之为域对象。

      ii. 域对象的API:

      setAttribute(String name,Object obj) 设置域属性

      getAttribute(String name) 获取域属性

      removeAttribute(String name) 删除域属性

      getAttributeNames() 获取全部域属性的名称

      iii. 生命周期

      随着web应用的加载,ServletContext对象创建。

      随着web应用的销毁,ServletContext对象销毁。

      iv. 作用范围

      整个web应用。

      v. 主要功能

      在整个web应用的范围内共享数据。

      1) 代码实现

      a) 创建ServletContextDemo2.java

      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应用范围内共享数据
       			public class SContextDemo2 extends HttpServlet {
       			
       			        public void doGet(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			                //1.获取代表web应用的域对象
       			                ServletContext sc = this.getServletContext();	
       			                //2.向域中设置域属性
       			                sc.setAttribute("name", "曹洋");
       			        }
       			
       			        public void doPost(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			                doGet(request, response);
       			
       			        }
       			
       			}
       		b) 修改ServletContextDemo1:
       			package cn.tedu.SContext;
       			
       			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;
       			//获取全局初始化配置信息
       			public class SContextDemo1 extends HttpServlet {
       			
       			        public void doGet(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			        
       			        
       			        //读取web域属性
       			        ServletContext sc = this.getServletContext();
       			        String name = (String) sc.getAttribute("name");
       			        System.out.println("name:"+name);
       			        
       			        }
       			
       			        public void doPost(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			                doGet(request, response);
       			
       			        }
       			
       			}
                 
    2. 功能三–获取资源路径

      a. 相对路径

      conf.properties

      直接书写要获取的资源路径名称,再通过File读取,发现读取的路径结果,是tomcat启动的目录路径,这个路径是错误,所以在读取文件的时候,不能够直接书写某一个文件的相对路径。

      b. 绝对路径

      /conf.properties

      使用绝对路径获取资源路径名称,再通过File读取,读取结果为盘符加上文件名称,从磁盘的根目录寻找对应路径的文件,这种文件读取路径也是错误的。所以在读取文件时,不能直接书写绝对路径。

      c. 全路径

      书写从盘符到文件的全路径名称,的确可以获取到指定路径的文件,但是如果路径稍作修改,获取存放文件的路径发生改变,则所有用到全路径的位置都需要修改,十分不便。所以尽管可以得到正确的路径,也不推荐使用。

      d. ServletContext获取路径

      可以获取到从盘符到web应用名称的全路径。在getRealPath()中添加上web应用内的文件相对路径,即可获取到当前文件的全路径名称。这种获取方式获取到的路径是正确的,并且也是动态获取的(如果路径修改,此处获取的路径也会跟着修改)。所以推荐使用这种形式。

      e. 通过类加载器获取文件路径

      使用类的字节码,获取类加载器,再获取src目录,最后读取目录中的某一个文件。这种读取方式可以获取到盘符到当前文件的全路径,而且是全部动态获取,可以便捷的得到文件路径。所以推荐使用这种方式来获取文件路径名称。

      ServletContext.class.getClassLoader().getResource(“fileName”).getPath()

    3. ajax概述

      AJAX asynchronous js and xml: 异步的js和xml

      AJAX是一个异步请求的操作,可以在页面大部分内不变情况下完成局部刷新的操作。

      ajax是通过js来实现的。其中异步请求发送的数据是xml格式的数据。

      随着技术的发展,ajax发送和接收的数据格式有以下几种:

      xml

      json 字符串

      text 纯文本

      ajaj -> aj

    4. ajax运行原理

      同步交互:

      请求发出,浏览器必须得到响应结果之后,才可以继续发送下一次的请求,在等待过程中,浏览器不能进行任何操作。

      异步交互:

      请求发出,浏览器可以继续进行更多的操作,不必等待响应结果,仍然可以发送更多的请求。服务器会根据每一个请求依次作出响应。浏览器在这个过程中,可以任意操作。

      a. 实践场景:

      异步:

      搜索框 、注册–用户名是否存在校验

      同步:

      百度搜索框后的按钮

      b. 异步请求

      优点:

      用户体验较好。减少服务器访问压力。

      缺点:

      增加服务器访问压力。

    5. AJAX实现

      a. .JavaScript实现AJAX(只需四步)

      i. 第一步, 获取XMLHttpRequest对象

      var xmlHttp = ajaxFunction();

      function ajaxFunction(){

      var xmlHttp;

      try{

      //现代浏览器(IE7+、Firefox、Chrome、Safari 和 Opera)都有内建的 XMLHttpRequest 对象

      xmlHttp = new XMLHttpRequest();

      }catch(e){

      try{

      //IE6.0

      xmlHttp = new ActiveXObject(“Msxml2.XMLHTTP”);

      }catch(e){

      try{

      //IE5.0及更早版本

      xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);

      }catch(e){

      alert("…");

      throw e;

      }

      }

      }

      return xmlHttp;

      }

      第二步, 打开与服务器的连接
      
       xmlHttp.open(method, url, async);
       	> method: 请求方式, 可以是GET或POST
       	> url: 所要访问的服务器中资源的路径 如: /Day10/servlet/AServlet
       	> async: 是否为异步传输, true 表示为异步传输 一般都是true
       iii. 第三步, 发送请求
       xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");	//通知服务器发送的数据是请求参数
       xmlHttp.send("xxx"); //注意, 如果不给参数可能会造成部分浏览器无法发送请求
       > 参数: 
       	如果是GET请求, 可以是null, 因为GET提交参数会拼接在url后面
       	如果是POST请求, 传入的就是请求参数
       		"username=张飞&psw=123"
       iv. 第四步, 注册监听
       > 在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;
       			}
       		}
       	}