ServletCofig和ServletContext与ajax
其实09与10期间还有一个网页项目,因为还没做完,暂时就不发了
-
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.javaimport 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()
-
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.javaimport 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); } }
-
功能三–获取资源路径
a. 相对路径
conf.properties
直接书写要获取的资源路径名称,再通过File读取,发现读取的路径结果,是tomcat启动的目录路径,这个路径是错误,所以在读取文件的时候,不能够直接书写某一个文件的相对路径。
b. 绝对路径
/conf.properties
使用绝对路径获取资源路径名称,再通过File读取,读取结果为盘符加上文件名称,从磁盘的根目录寻找对应路径的文件,这种文件读取路径也是错误的。所以在读取文件时,不能直接书写绝对路径。
c. 全路径
书写从盘符到文件的全路径名称,的确可以获取到指定路径的文件,但是如果路径稍作修改,获取存放文件的路径发生改变,则所有用到全路径的位置都需要修改,十分不便。所以尽管可以得到正确的路径,也不推荐使用。
d. ServletContext获取路径
可以获取到从盘符到web应用名称的全路径。在getRealPath()中添加上web应用内的文件相对路径,即可获取到当前文件的全路径名称。这种获取方式获取到的路径是正确的,并且也是动态获取的(如果路径修改,此处获取的路径也会跟着修改)。所以推荐使用这种形式。
e. 通过类加载器获取文件路径
使用类的字节码,获取类加载器,再获取src目录,最后读取目录中的某一个文件。这种读取方式可以获取到盘符到当前文件的全路径,而且是全部动态获取,可以便捷的得到文件路径。所以推荐使用这种方式来获取文件路径名称。
ServletContext.class.getClassLoader().getResource(“fileName”).getPath() -
ajax概述
AJAX asynchronous js and xml: 异步的js和xml
AJAX是一个异步请求的操作,可以在页面大部分内不变情况下完成局部刷新的操作。
ajax是通过js来实现的。其中异步请求发送的数据是xml格式的数据。
随着技术的发展,ajax发送和接收的数据格式有以下几种:
xml
json 字符串
text 纯文本
ajaj -> aj -
ajax运行原理
同步交互:
请求发出,浏览器必须得到响应结果之后,才可以继续发送下一次的请求,在等待过程中,浏览器不能进行任何操作。
异步交互:
请求发出,浏览器可以继续进行更多的操作,不必等待响应结果,仍然可以发送更多的请求。服务器会根据每一个请求依次作出响应。浏览器在这个过程中,可以任意操作。
a. 实践场景:
异步:
搜索框 、注册–用户名是否存在校验
同步:
百度搜索框后的按钮
b. 异步请求
优点:
用户体验较好。减少服务器访问压力。
缺点:
增加服务器访问压力。 -
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; } } }
-