ajax基础知识01

12年前

 

一、我们应该如何理解struts1.x整个框架是怎么弄得?

 1、首先是前端控制器ActionServlet
 2、配置对象---解析配置文件
   3、Action
 4、ActionForm
 
 这4个之间是怎么协同工作的
 1、首先在应用程序启动的时候,最先实例化是AS(启动加载)
   (1)配置对象实例化;具体就是将配置文件导入到配置对象里面(加载到内存中)(SAX,DOM,digest都可以)
   从此以后看这个配置文件怎么写的,直接看配置对象就行了。
   配置对象包含ActionForward,ActionMapping,ActionMappings,FormBean,FormBeans,StrutsConfig,MessageResources
   (2)AS就等着接收请求,请求来之后,AS解析请求,并根据请求前面的字符串比较配置文件里面的信息
  与哪一个action对应,看看配置文件里面的信息有没有与某一个form关联。如果有的话就做一个form对象,
  并把用户提交的表单信息填充到form中,并把该信息放到request或者session.
  ***只要看配置文件的信息
 2、调用action的执行方法,会有一个String返回值。会通过字符串再通过配置文件再找到一个地址;或者进行重定向
  或者进行转发。
 

二、复习JSP的重点

 jsp里面的很多内容都不用了
 常用的
  <%%>
  <%=%>
  <%@page import=""%>
  <%@page pageEncoding=""%>
  <%@include file=""%>
  <%@taglib uri="" prefix=""%>
常用内建对象
 pageContext     功能:1setAttribute 2getAttribute 3获得其他内建对象
 request
 response
 session
 application
 out输出页面

EL表达式

 ${1+2}
 ${pageScope.msg}
 ${requestScope.msg}
 ${sessionScope.msg}
 ${applicationScope.msg}

${sessionScope.user.name}
${sessionScope.user.salary gt 10000}

JSTL
 <c:if test="">
 </c:if>

 <c:choose>
  <c:when test="${}">
  </c:when
  <c:otherwise test="">
  </c:otherwise>
 </c:choose>


 <c:forEach items="${...}" var="">

 </c:forEach>
 
无body的TagLib

 

 

三、javascripts
 写在jsp里面的javascripts是原封不动地送到客户端的浏览器来使用,但还要与服务器进行一个连接
 这是web编程里面的关键技术

 javascripts是重点
 要尽量的往里钻


1、JavaScript 操作HTML   必须很熟练
2、JavaScript访问服务器Ajax,必须会的技术
3、JavaScript面向对象的一些知识
4、JavaScript框架
  

function f(a,b){

}


在js中,function本身就是一个对象。
 在这个对象中有一个arguments参数属性(数组)
  alert(argument.length)
  argument数组,有多个元素构成
 .length属性返回长度
页面中JS
<script type="text/javascript">
function f(){ 
 //f();可以不传递参数也可以传递参数;如果方法设计了参数:只是为了给参数起一个别名
 //比如f(a,b)的意思是argument[0]别名为a,argument[1]别名为b
 //与JAV语言中的方法是不同的。java中方法是用来传递参数的
 alert(argument.length);
 var sum=0;
 for (i=0;i<arguments.length;i++){
 sum+=arguments[i];
 //window.open表示浏览器的内建对象
 //window.setInterval(function(){
 // alert("hahahha");//方法是用来每秒钟执行个操作
 //},1000);


 }


</script>

 

<input type="button" onclick="f(1,2,3);" value="Click me"/>

 

 

function f(){
 var taskId=window.setInterval(function(){
  alert("haahhaha");
 },1000);//每隔1秒运行1次
 window.setTimeout(function(){},2000);//相当于一个定时器,过多少毫秒之后执行这个方法
 window.clearInterval(taskId);//可以取消掉对应id的方法
}

 

以前我们打开浏览器,输入相应地址,浏览器会与服务器进行通信。
现在呢,我们是希望我们开发的js脚本能直接与服务器进行通信。
js发请求,并拿到服务器的响应,并来处理这个结果。

比如在提交表单时,可以不用更新整个页面,而只是刷新部分小的部件
 主要是为了能考虑性能
常用场景:
 登录页面
 注册页面:验证码等的问题;保证用户名唯一性和验证码符合性
 不是通过浏览器来发送请求而是由js来发送请求,服务器给出对应的响应
 我们可以通过JS来控制验证码不对的话就不能去提交,这样的话:用户体验好;性能好
 比如
  鼠标一离开用户名文本框,就提示用户名已经使用请更换其他用户名
  鼠标一离开电子邮件框体,则提示格式不对等

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>1</title>
  
  <script type="text/javascript">
   function f(){
    //此函数没有形参,有无形参都可以,有也仅是说明传过来的参数有个别名而已
    var sum=0;
    //定义变量用js
    alert(arguments.length);
    //arguments是一个数组;length属性代表数组的元素个数
    // for (i=0;i<arguments.length;i++){
     // sum+=arguments[i];
     // alert(sum);
    // }
    // alert(sum);
    var taskid=window.setInterval(function(){
     //windows代表浏览器;
     //每隔100000秒执行一次这个函数
     alert("hahahhahaha")},100000);
    window.setTimeout(function(){},20000);
    //多长时间之后执行function()
    window.clearInterval(taskid);
    //通过这句可以将taskid的定时函数关闭
    
    //
   }
   
  
   function d(){
    var taskid1=window.setInterval(function(){
     alert("hehehehehe")},1000);
     
    window.setTimeout(function(){
     window.clearInterval(taskid1);
    },10000)
    
    //function d()以上代码的意思是,每秒执行一次代码,执行10次后结束程序
    
   }  
   
四、XMLHttpRequest   
    function testAjax(){
    
    var xmlHttpRequest = null;
    
    //初始化xmlHttpRequest对象
    //不同的浏览器初始化的方式不一样
    //js里面只有对象没有类
                if ((typeof XMLHttpRequest) != 'undefined') {
     // FF(ie的最新版本已经支持以下方式)
                    xmlHttpRequest = new XMLHttpRequest();
                }
                else {
     // IE
                    xmlHttpRequest = new ActiveXObject('Microsoft.XMLHttp');
                }
               
                //创建和服务器的连接
                //arg0: get或post方式
                //arg1: 要连接的地址
                //arg2: 是否是异步的方式连接
               
                var userValue = document.getElementById('user').value;
                var url = 'some?user='+userValue;
                //地址
                xmlHttpRequest.open('GET', url, true);
                //参数的意思:get请求还是post请求;url地址;true采用的是异步方式;
               
               
                // 给onreadystatechange属性赋值了一个函数
                // 注册了一个‘状态监听器’,当xmlHttpRequest的状态
                // 一改变,该函数就调用
                xmlHttpRequest.onreadystatechange = function(){
                    //xmlHttpRequest.readyState属性表示当前的状态码
                    if (xmlHttpRequest.readyState == 4) {
                        //responseText返回文本方式的响应内容
                        var respTxt = xmlHttpRequest.responseText;
                        var d1 = document.getElementById('msg');
                        d1.innerHTML = respTxt;
                       
                    }else {
                       var d1 = document.getElementById('msg');
                          d1.innerHTML = 'loading...';
                    }
             
                };
               
                //向服务器发出请求!!!
                // xmlHttpRequest在和服务器交互的过程中
                // 经历5个状态
                // 0 连接还没有建立
                // 1 连接已经建立,但是还没有发请求
                // 2 请求已经发送
                // 3 正在和服务器正交互
                // 4 响应结束
               
                // 每当状态发生改变的时候,就会调用
                //onreadystatechange所指定的函数
                //也就是会调用4次这个函数
                xmlHttpRequest.send(null);
                //发出请求
                //如果是get请求,这里就是null;如果是post请求,这里就是http提交的表单数据
               
            }
   
   
   
  </script>
  <meta name="author" content="songxl" />
  <!-- Date: 2011-10-29 -->
 </head>
 <body>
  
  <input type="button" onclick="f(1,2,3);" value="click me"/>
  
 </body>
</html>

 


tomcat配置文件的含义
 tomcat ---conf----web.xml文件

请求是发给servlet不是发给jsp


在js里面,任何html元素都被当作对象
document.getElementById("")
d1.innerHTML

<input type="text" id="user" name="user" value="" onblur=""/>
解释:id是了ajax使用的id
   name是提交表单的别名
   两者最好一样
   可以减少接收请求的servlet的代码减少


servlet
 SomeServlet.java    web.xml其路径为/some
 
 package org.whatisjava.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class SomeServlet extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html");
  String user=request.getParameter("user");
  if ("whatisjava".equals(user)){
   System.out.println("ok");
  }else{
   System.out.println("Error");
  }
  
  
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  out.write("<html><body>hello</body></html>");
 }

}


五、json技术
 使用ajax的场景,不要乱用:只刷新页面的很小的局部数据时
 在网络上传输数据一般情况为txt,如果只是字符串的话,相当容易
 如果返回的是多个字符串,可能还有排序等时,最好是返回的xml格式的文件(结构化的文本)
<list>
 <item>Java....</item>
 <item>Java....</item>
 <item></item>
</list>

怎么把这个xml文件解析成可识别的项呢?

xml结构化文件可以表达任何数据
 
 js---->访问服务器---->返回xml---->js需要解析xml文件
 这样的话对js的要求就太高了。
 ----
 从而JSON出现,大量用JSON
 JSON也是一种简单的文本,在ajax场合中,json中应用比xml要多

  AJAX
  AJAS
 
   
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用
完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:


“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),
 结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构
 的编程语言之间交换成为可能

<script type="text/javascript">
 var obj=new Object();//声明一个对象;
 obj.x=100;
 obj.y=200;
 obj.f=function(){
  alert(this.x+this.y);
 }
 
 
 obj.f();//调用f方法;
 obj.x=300;
 obj.f();//可以更改对象的值

</script>


通过js为表格添加一行

function addRow(obj,className){
 var tb=$('tb');
 
 var row=tb.insertRow(tb.rows.length);//表格插入一行,从哪里开始插入,返回值是刚刚插入tr对象
 var id=row.insertCell(row.cells.length);//在tr里面插入单元格,返回值是刚刚插入td的对象
 var name=row.insertCell(row.cells.length);
 var sex=row.insertCell(row.cells.length);
 var age=row.insertCell(row.cells.length);
 id.innerHTML=obj.id;

}

 

js_object.jsp

<%@page pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title></title>
  <script type="text/javascript" src="js/prototype-1.6.0.3.js">
  
  //导入js代码
  //必须是一个专门的script
  </script>
  <script type="text/javascript">
   //var point = {x:100,y:200};//这个对象只有属性没有方法,是一种特殊的语法格式;
   //alert(point.x + point.y);
   
   //var someObj = {v1:100,v2:{x:100,y:200}};//这个对象包含一个属性v1还有一个对象v2
   //alert(someObj.v2.x);//可以通过这种方式来访问其子对象
   
   
   //var str = "{'x':100,'y':200}";//如果js传给服务器是这样的字符串的话,就可以解释成js对象
   //JSON字符串
   
   
   //var obj = str.evalJSON();//通过evalJSON可以把字符串转换成对象;但是字符串必须按照设定的格式写
   //alert(obj.x);
    //prototype,js文件里面的方法
    //添加这个组件后,str里面增加了evaJSON方法;这种扩展方式在java中是不可能的;但在js中是可能的
    
   //用一个json框架:prototype原型(定义了好多函数)
   
   
   function testJSON() {
    var listStr = "[{'id':100,name:'java'},{'id':200, name:'php'}]";
    //以上是数组,有2个元素;
    //最外层如果是[]的话,表示是一个数组
    //如果是{},表示是一个对象
    
    var empList = listStr.evalJSON();
    //prototype,js文件里面的方法
    //添加这个组件后,str里面增加了evaJSON方法;这种扩展方式在java中是不可能的;但在js中是可能的
    
    
    clearTb($('tb'));//清空表格,调用方法
    
    for(i=0;i<empList.length;i++) {
     //document.getElementById('tb');//通过表格的id(‘tb’)获取表格对象
     var tb = $('tb');//与上行代码等价
     
     var tr = tb.insertRow(tb.rows.length);
     
     var td1 = tr.insertCell(tr.cells.length);
     var td2 = tr.insertCell(tr.cells.length);
     
     td1.innerHTML = empList[i].id;
     td2.innerHTML = empList[i].name;
    }
   }
   //清空表格的方法
   //可变对象必须采用这样的方法来做
   function clearTb(tb) {
    for(i=tb.rows.length-1; i>=1; i--) {
     tb.deleteRow(i);
    }
   }
  </script>
  
  
 </head>

 <body>
  <input type="button" onclick="testJSON();" value="Click" />
  <table id="tb" border="1" width="80%">
   <tr>
    <td>
     ID
    </td>
    <td>
     NAME
    </td>
   </tr>
  </table>
 </body>
</html>

 

org.whatisjava.servlet
org.whatisjava.domain
org.whatisjava.test

struts1:对ajax的支持
     由于struts1主要是通过action来进行对页面的转发和重定向的
     而ajax是通过js请求发送给服务器的。
    比如validate.action请求到ActionServlet之后,经过Action的处理在这里返回的是null而非success和fail
    如果返回null的话,则不将其进行转发或者重定向了,可以在action用其他代码来完成工作
    由于action里面包含request和response;也没有必要往request里面去存放数据