layout: post title: “AJAX基础操作” date: 2015-02-08 16:18:20 categories: AJAX tags: AJAX —
如果只有一个地方需要变更,但是如果按照原本的方式开发,则所有的数据需要重新通过业务层读取,而后重新利用控制层传输到JSP页面, 而页面再进行内容输出。那么在这样需要进行局部数据更新的情况下,几只有通过AJAX技术实现与服务器端的数据交互, 当数据交互完成之后在客户端利用“JavaScript + DOM解析”的方式重新生成要显示的内容。
所以AJAX的主要作用就是局部刷新,AJAX的全称为“Asynchronous JavaScript AND XML”(异步的JavaScript与XML), AJAX最早的应用是在2006年的时候——Google Map(现在的国内只能够去看Baidu Map),在百度地图操作之中会发现如果要进行放大, 只是局部放大。这样的好处是可以减少数据的网络传输。
从AJAX技术开始,实际上就进入到了WEB 2.0的时代,在WEB 2.0时代开始之后,发现页面的显示越来越丰富, 而后紧接着在国内又开始盛行“DIV + CSS”。再往后的发展就出现了前端开发了,现在开始各种的开发框架也都全部出现了,像著名的:JQuery、ExtJS、EASY UI、AngularJS。从这之后一个非常高端的职位出现——前端开发工程师(基础:JavaScript + DOM)。 最早的AJAX出现主要是与XML操作进行结合使用,但是后来的发展,由于XML传输的体积庞大,而且生成复杂,所以现在的开发都使用了JSON替代。
如果要进行AJAX操作绝对离不开两个核心的概念:JavaScript、服务器(处理WEB请求)。 本次打算实现一个“echo”程序,现在前端传递一个信息数据,而后服务器端接收之后,在这个数据前增加一个“echo : ”的形式返回。
// 声明的时候根本什么意义都不能表述,因为不知道它的类型
var xmlHttpRequest ;
// 定义一个AJAX的核心处理对象
// 一般都会单独定义一个操作函数,这个函数的主要功能是进行xmlHttpRequest对象的实例化
function createXmlHttpRequest() {
if (window.XMLHttpRequest) {
// 表示此时的浏览器是非IE浏览器
xmlHttpRequest = new XMLHttpRequest() ;
// 直接进行对象实例化
} else {
// 如果现在是IE浏览器
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHttp") ;
}
}```
任何情况下只要调用了createXmlHttpRequest()这个函数那么一定可以取得一个实例化完成的xmlHttpRequest对象,
并且所有的操作都通过此对象产生调用。
2. 观察XMLHttpRequest类所提供的操作方法;
abort()
getAllResponseHeaders()
getResponseHeader()
open()
overrideMimeType()
send()
在这个列表之中有以下的两个方法使用最多:
*open():设置请求路径以及请求的模式(get或者是post);
*send():表示进行请求的发送,设置的内容为null。
但是只依靠以上的两个函数实际上还是不能够进行异步请求的处理,
如果要进行AJAX异步数据的处理还需要观察XMLHttpRequest类中提供的几个属性。
onreadystatechange
readyState
response
responseText
responseType
responseXML
status
statusText
timeout
upload
withCredentials
当请求发送到服务器端并且成功处理完毕之后,所返回的数据有两种类型:
* 文本:适合于JSON数据接收;
* XML结构数据:直接转化为XML的DOM对象;
3. 如果要想进行异步处理,那么应该首先准备好服务器端的程序;
* 现在假设客户端传递过来的参数名称为“msg”,所以Servlet里面也要接收msg参数;
### 范例:定义EchoServlet
packagecn.mldn.ajax.servlet; importjava.io.IOException; importjava.io.PrintWriter; importjavax.servlet.ServletException; importjavax.servlet.annotation.WebServlet; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; @SuppressWarnings(“serial”) @WebServlet(urlPatterns = “/EchoServlet”) publicclassEchoServlet extendsHttpServlet { publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { request.setCharacterEncoding(“UTF-8”); response.setCharacterEncoding(“UTF-8”); response.setContentType(“text/html”); PrintWriter out = response.getWriter(); out.println(“ECHO : “ + request.getParameter(“msg”)); }
publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { this.doGet(request, response); } }```
<divid="inputDiv">
<inputtype="text"name="info"id="info">
<inputtype="button"id="sendBut"value="发送信息">
</div>
<divid="echoDiv"></div>
window.onload = function() {
document.getElementById("sendBut").addEventListener("click",sendEcho,false) ;}
function sendEcho() {
// 取出输入的数据内容
var info = document.getElementById("info").value ;
if (info != "") {
// 现在有输入数据
alert("info = "+ info) ;
}
// 当信息处理完成之后原本的数据应该清空
document.getElementById("info").value = "";
}
function sendEcho() {
// 取出输入的数据内容
var info = document.getElementById("info").value ;
if (info != "") {
// 现在有输入数据createXmlHttpRequest() ;
// 调用创建xmlHttpRequest对象的函数
// 设置要提交数据的路径以及定义数据的提交模式,而后使用地址重写的方式传递数据
xmlHttpRequest.open("post","EchoServlet?msg="+ info) ;
xmlHttpRequest.onreadystatechange = sendEchoCallback ;
xmlHttpRequest.send(null) ;
// 发送请求
}
// 当信息处理完成之后原本的数据应该清空
document.getElementById("info").value = "";
}
0:请求未初始化(还没有调用 open())。
1:请求已经建立,但是还没有发送(还没有调用 send())。
2:请求已发送,正在处理中(通常现在可以从响应中获取内容头)
3:请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
4:响应已完成;您可以获取并使用服务器的响应了。
等于1:说明请求已经准备好可以发送
等于2:服务器正在处理请求时会作出响应,响应首部提供了有关响应的信息,并提供一个状态码。
等于3:数据下载到请求对象,但是响应数据还没有完全准备好,还不能使用
等于4:服务器处理完请求,数据可以使用了
function sendEchoCallback() {
// AJAX异步处理的回调函数
if (xmlHttpRequest.status == 200) {
// 服务器端处理正常
if (xmlHttpRequest.readyState == 2 || xmlHttpRequest.readyState == 3) {
alert("请稍后,正在为您进行数据处理!") ;}
if (xmlHttpRequest.readyState == 4) {
// 现在数据已经处理完成了,可以进行页面处理了
var data = xmlHttpRequest.responseText ;
// 接收数据
// 所有的回应数据都应该保存在“echoDiv”元素之中
var divElement = document.createElement("div") ;
divElement.appendChild(document.createTextNode(data)) ;
document.getElementById("echoDiv").appendChild(divElement) ;
}
}
}```
此时代码就可以发现,利用AJAX可以非常方便的进行局部刷新的操作,并且也相当于服务器端与客户端的交互不再局限于表单上了,
利用异步处理也可以完成。虽然AJAX本身具备很强的操作能力,但是由于服务器端开的窗口多了,所以对于数据的验证也需要更加丰富。
## 总结核心结构
var xmlHttpRequest ; // 定义一个AJAX的核心处理对象 // 一般都会单独定义一个操作函数,这个函数的主要功能是进行 xmlHttpRequest对象的实例化function createXmlHttpRequest() { if (window.XMLHttpRequest) { // 表示此时的浏览器是非IE浏览器 xmlHttpRequest = new XMLHttpRequest() ; // 直接进行对象实例化} else { // 如果现在是IE浏览器 xmlHttpRequest = new ActiveXObject(“Microsoft.XMLHttp”) ; } } function 函数Echo(){ createXmlHttpRequest() ; // 调用创建xmlHttpRequest对象的函数 // 设置要提交数据的路径以及定义数据的提交模式,而后使用地址重写的方式传递数据 xmlHttpRequest.open(“post”,”提交路径”) ; xmlHttpRequest.onreadystatechange = 设置回调函数(都加上Callback); xmlHttpRequest.send(null) ; // 发送请求 } function 回调函数Callback(){ // AJAX异步处理的回调函数 if (xmlHttpRequest.status == 200) { // 服务器端处理正常 if (xmlHttpRequest.readyState == 4) { // 现在数据已经处理完成了,可以进行页面处理了 var data = xmlHttpRequest.responseText ; // 接收数据 // 进行返回的数据处理,一般都使用JavaScript + DOM } } } ```
本文将简单扼要地提到javase的主要知识基础点,以便各位初学者复习!!!
首先执行父类静态的内容,父类静态的内容执行完毕后, 接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块, 如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法; 父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。 子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行, 接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
作用域 | 当前类 | 同一包 | 子孙类 | 其他包 | |
---|---|---|---|---|---|
public | 1 | 1 | 1 | 1 | |
protected | 1 | 1 | 1 | 0 | |
friendly | 1 | 1 | 0 | 0 | 没有任何修饰符则默认为friendly |
private | 1 | 0 | 0 | 0 |
作用:将对象转为二进制流用于存储和网络传输
enum sex{
male,female;
}
sex male = sex.male;
for(sex s: sex.values()){
s.ordinal() s.name()
}
setpriority()
MAX_PRIORITY MIN NORM
synchronized(this){}同步代码块 保证数据的合法性,速度慢
同步方法:
public synchronized void sale(){}
public class TestDemo implements Runnable {
static First first = new First() ;
static Second second = new Second() ;
public static void main(String[] args) {
new TestDemo() ;
}
@Override
public void run() {
first.fun(second);
}
public TestDemo() {
new Thread(this).start() ;
second.fun(first);
}
}
string stringbuffer extends charsequence 接口 stringbuffer同步 stringbuilder异步
SimpleDateFormate sdf = new SimpleDateFormate(“yyyy-MM-dd HH:mm:ss.SSS”) sdf.formate(date) ——> string sdf.parse(str) ——> date
new Date(long) date.getTime() 返回值为long util.date 和 sql.date 转换 使用long
T implements Comparable
BigDecimal result = big.divide(new BigDecimal(1), scale, BigDecimal.ROUND_HALF_UP);
class<?> cls = Class.forName("com.demo.Book")
cls.newInstance();
Constuctor<?> cons[] = cls.getConstructors();
Constructor<?> cons = cls.getConstructor(String.class, double.class);
method [] met = cls.getMethods():
Method setMet = cls.getMethod("方法名",
String.class) ;
setmet.invoke("方法实例","方法参数具体");
Field[] field = cls.getDeclaredFields();
Field[] field = cls.getDeclaredField("成员变量名");
field.setAccessible(true);
取消封装才能操作
field.set(obj, "Java开发"); 设置属性内容
field.get(obj)
"".equalsIgnoreCase(className) 不考虑大小写
list想让 remove、contais方法正常操作,必须要覆写 Object 类中的 equals()方法。 vector jdk1.0 同步安全 ArrayList jdk1.2 异步 List 可以重复增加顺序为保存顺序 Set不能重复 想排序就要像对象数组一样实现Comparable或Comparator
treeSet (区分重复 要实现comparable ) 不允许空和不同数据类型
HashSet 异步 (区分重复要 hashCode() ) equals()
hashSet 无序
treeSet有序
方式一:让实体类实现Comparable接口,并且实现这个接口中提供的compareTo排序方法
方式二:额外写一个排序类,该类实现Comparator接口,并且在compare中实现排序
List c = new ArrayList();
Colletions.sort(c,new CardComparator());
Map中key不能重复 两个常用的子类:HashMap jdk1.2开始 异步、 Hashtable jdk1.0开始 不能有空值
Collection 是保存单个数据的,而 Map 是保存一对数据的;
Collection 保存数据的目的是为了输出,而 Map 保存数据的目的是为了查询使用
Itrator hasNext() next() hasprevious() prevoius()
Enumeration hasMoreElements() nextElement()
1.
for (Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+" "+entry.getValue());
2.
for (Integer key : map.keySet()) {
System.out.println(key+" "+map.get(key));}
3.
Set<Integer> set = map.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(map.get(it.next()));
}
4.
Set<Entry<Integer,String>> set1 = map.entrySet();
Iterator it1 = set1.iterator();
while(it1.hasNext()){
System.out.println(((Entry<Integer, String>) it1.next()).getKey());
}
File fiel = new File()
fiel.exites()
file.delete() file.createNewFile()
File.separator File.pathSeparator
file.getParentFile()
file.isDirectory()
file.length() file.lastModified()
1.File可以操作文件以及创建文件目录; 2.OutputStream与InputStream主要操作的字节数据,以文件拷贝为主; 3.如果程序输出数据使用PrintWriter(PrintStream),而输入数据使用Scanner(BufferedReader);
输入流:将数据读入内存的 输出流:将数据从内存中导出的
static transient 修饰的属性不需要序列化 字节流:outputStream inputStream 字符流:writer reader 字节流通向字符流的桥梁:InputStreamReader 反之OutputStreamWriter 缓冲流 打印流 对象流 序列化流 数据流
流的关闭:输入流先低端源头逐步到高端关闭,输出流相反(一句话从源头关闭 ) 高端绑定低端
Properties 继承于 Hashtable a:b 键:值 a=b
Properties p = new Properties();
FileInputStream f = new FileInputStream("d:\\test1.txt");
p.load(f);
String s =(String) p.get("a");
input: FileInputStream->InputStreamReader->BufferedReadr
output: FileOutputStream->OutputStreamReader->BufferedWriter->PrintWriter
File inFile= newFile("E:"+ File.separator+ "hello.jpg") ;// 输入路径
File outFile= newFile("E:"+ File.separator+ "my.jpg") ;// 输出路径
if(!outFile.getParentFile().exists()) {// 输出必须要考虑到目录问题
outFile.getParentFile().mkdirs() ;}
InputStream input = new FileInputStream(inFile) ;
OutputStream output = new FileOutputStream(outFile) ;
bytedata [] = new byte[2048] ;// 每次读取的数据量
int temp = 0 ;// 保存读取的长度
while((temp = input.read(data)) != -1) {// 读取的长度不是-1
output.write(data, 0, temp);}
output.close();
input.close();
PrintStream out= newPrintStream(newFileOutputStream(file)) ;
out.print("Hello World !");
out.close();
Scanner scan= newScanner(newFileInputStream(file)) ;
scan.useDelimiter("\n") ;
while(scan.hasNext()) {
System.out.println(scan.next());}
scan.close();
ServerSocket server = new ServerSocket(8888) ;
System.out.print("等待客户端连接.........");
Socket client = server.accept() ; // 接收客 户端连接
PrintStream out = new PrintStream(client.getOutputStream()) ;
out.println("Hello World ."); // 要输出的信息
out.close() ;
client.close();
server.close();
Socket client = new Socket("localhost",8888) ;
Scanner scan = new Scanner(client.getInputStream()) ;
scan.useDelimiter("\n") ;
if (scan.hasNext()) {
System.out.println(scan.next());
}
scan.close();
client.close();
RuntimeException:NumberFormatException、ArithmeticException、 ClassCastException、NullPointerException ArrayIndexOutOfBoundsException
所有的异常都属于 Throwable 的子类。
Error:指的是 JVM 出错,此时的程序还没有正常执行
Exception 异常的最大父类。Exception 是 RuntimeException 的父类;
e.printStackTrace()
throws 用于方法声明处,表示此方法不处理异常,而交给方法的被调用处进行处理; throw 用于方法之中,进行人为的异常对象抛出。
RuntimeException 可以由用户 选择性的进行处理。 自定义异常 写一个类继承 RuntimeException实现,有构造方法的实现,super(msg);
非运行时异常,异常会强制要求调用者处理异常 运行时异常不会强制要求调用者处理异常,但是运行时会将异常自动抛给调用者
Connection con = null;
PreparedStatement sta = null;
ResultSet result = null;
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:myaql://localhost:3306/base/","root","123");
sta = con.prepareStatement("select * from student where name=?");
sta.setString(1, "zhangsan");
result = sta.executeQuery();
while(result.next()){
System.out.println(result.getString("username"));
}
result.close();
sta.close();
con.close();
addBath(); executeBach() conn.rollback conn.commint setSutoCommit()
使用自身关联