Serclet
一.Http协议
基于TCP/IP协议,软件在网络上,浏览器上面运行,背后有一系列自协议其中最重要的就是超文本协议
超文本传输协议
H(Hyper)T(Text)T(Transfer)P(Protocol)
用于在本地和浏览器之间进行超文本的数据传输(音频,文本,图片,)
面向应用层
1.如果我想写一个单机程序读取文本
io
2.c/s进行数据传输,聊天室,JDBC
socket
优点:直接操作数据库服务端
缺点:移植性很差,不适合大型运用
3.三层C/S架构
4.B/S架构
二.Tomcat服务器的配置
2.1Servlet定义
applet:嵌套在网页里面的java代码
server:服务器编程
servlet=serv + let
前sun公司,用来扩展web服务器开发而提供的一组组件规范
1.扩展:早期的web服务器只能处理静态资源,servlet可以处理动态资源
2.组件:符合软件规范,提供的一组软件功能,需要部署到软件服务器容器中
3.容器: 提供组件的运行环境
2.2idea上面配置Tomcat
三.xml
3.1定义
a.可扩展的标记语言
b.遵循w3c标准,类似HTML
c.主要用来做存储和传输,后期更多被用来当做配置文件
3.2xml文件的组成部分
- 文档声明
- 元素
2.1 双标签
2.2 单标签
2.3 只有一个根元素
2.4 xml中出现的所有空格和换行都会被处理- 属性 <姓名 type=“text”>新垣结衣</姓名>
- 注释:类同html
- CDATA区域,特殊字符
<!--CDATA区域的内容不会当做标签去解析,会直接当做文本来进行处理--> <![CDATA[ <Ruandy></Ruandy> ]]]> > > < < & &
- PI指定:给xml指定样式
3.3约束
为了限定xml哪些能写,哪些不满足格式
目前的xml约束方式: DTD和Schemal
四.第一个Servlet
a. 继承HttpServlet
b. 重写里面的请求业务方法
c. 配置请求的url
- 以前配置方式:直观.当servlet较多的时候,非常不方便,而且臃肿,不推荐大家使用
<!-- 配置servlet--> <servlet> <!--servlet类的别名--> <servlet-name>first</servlet-name> <!--servlet类的全名,包含地址--> <servlet->class>com.ruandy.FirstServlet</servl>et-class> </servlet> <servlet-mapping> <!--servlet类的别名--> <servlet-name>first</servlet-name> <!--浏览器请求地址--> <url-pattern>/first</url-pattern> </servlet-mapping> 2. 注解 ```java //注解的方式 @WebServlet("/first") public class FirstServlet extends HttpServlet { @Override public void service(HttpServletRequest req, >HttpServletResponse resp) throwsIOException { //设置响应的类型和编码 resp.setContentType("text/html;charset=utf-8"); //输出流对象 PrintWriter out=resp.getWriter(); //直接给网页响应 //直接将文字内容按照超文本标记语言的格式>写到网页上 out.println("<h1>这是我的第一个servlet小程序></h1>"); } }
4.1常见的错误
a.中文乱码问题
b.HTTP状态码显示
一般由3个数组组成:xxx,第一个数字定义了响应的类型
200
ok 客户端请求成功
400
bad request 客户端请求的语法错误
403
forbidden 服务接受了请求,但是拒绝响应
404
not found 请求资源不存在,或者输入了错误的地址
405
请求方法错误
500
服务器发生了不可预见的错误
4.2HttpServletRequest
4.2.1常见的方法
//设置请求的编码
void setCharacterEncoding(String enc);
//获取请求的参数
// url地址栏: 请求地址?key1=value1&key2&value2
// 网页标签: key值等于该标签的name属性值
// 用户名:<input type="text" name="username">
String getParameter(String key);
String[] getParameterValues(String key);
//一些不常用的方法
//返回服务器名
String getServerName();
//获得端口号
String getServerPort();
//获得应用名称
String getContextPath();
五.转发
5.1定义
web服务器处理请求的时候,有时候需要多个web组件来配合完成业务
一个web组件将没有完成的任务通过容器转交给下一个web组件来进行完成,那么这个转交的过程就叫转发
5.2转发涉及的一些方法
//获得转发器
RequestDispatcher getRequestDispatcher(String URL)
//转发请求
forword(HttpServletRequest req,HttpServletResponse resp);
//request绑定参数
requerst.setAttribute(String key,Object value);
//获取参数
Object getAttribute(String key);
//删除绑定参数
removeAttribute(String key);
5.3需要注意
a.转发只有一次请求响应
b.转发里面共有是同一个request和reponse对象,所以可以进行数据的传递
c.转发的浏览器地址不会发生变化
六.HttpServletResponse
6.1常见方法
//设置响应的类型和编码
void setContType("设置类型");
//text/html;charset=utf-8
//image/jpeg
void setCharacterEncoding("编码");
//获得输出字节流
ServletOutputStream getOutputStream();
PrintWriter getWriter();
//设置头信息
void setHeader("Pragma","nocache");
6.2重定向
花花找飞飞借钱10000,然后飞飞他告诉我没钱,然后告诉我,我们班的超超有钱,并且 告诉了我电话:302
然后我转而向超超借到了10000块
转发:浏览器发送请求给访问组件A,A转而告知容器调用组件B,转发所涉及的2个组件是共用一组request对象和response对象
定义:浏览器发送请求给访问组件A,A发送一个状态码302和信息(组件b)响应给浏览器,浏览器会重新
去访问组件B,进而获得响应
一次请求结束:请求–响应
6.3转发和重定向的区别
1.转发是一次请求/响应.重定向是二次请求/响应
2次请求的req和resp不是同一个对象,转发里面是一次请求响应,req和resp是共享的,所以可以在转发的两个组件去共享数据
2.response.sendRedirect(“新的组件地址”);
3.转发可有将组件1的数据传递到组件2,重定向则不行,重定向适合做一个DML操作以后的数据绑定
4.转发浏览器地址栏不会发生变化,重定向由于是新的请求,地址栏会发生变化
七.JSP
7.1将数据渲染到页面
out.println("<h1>"+数据库数据+"</h1>");
渲染简单页面还可以,如果是复杂的???
7.2定义
1.JSP本质就是一个Servlet!!!
2.JSP=java+html
3.运行在服务器端的网页 Java Server Page
相当于程序帮我们做了逐行使用out.println(“”)写入html页面和Java的数据!
7.3jsp里面识别Java
<!---->
<!--Java代码片段-->
<%
Java片段,此处代码不会展现到页面
%>
<!--Java内容:一般用来表示具体的数值,此数值会显示到网页上-->
<%=具体的内容%>
八.EL表达式
8.1定义
一套简单的运算规则,可以用来直接输出,或者给jstl标签赋值
web服务器对于request请求通常是以String的格式来发送参数
String age=request.getParameter(“xx”);
Object obj=request.getAttrebite(“”);
Java需要强转或者转义
如果使用el表达式,就能脱离转换的方式
8.2表达式如何获得值
三个对象范围可以获得绑定的属性值
1. request范围
requestScope.绑定的参数值
2. session范围--后面学习的会话对象
sessionScope.绑定的参数值
3. application范围--后面学习的上下文对象
applicationScope.绑定的参数值
需要注意:
1.访问基本对象需要添加对应的构造器和get/set方法
2.针对一些集合,键值对,建议直接调用方法
九.标准标签库JSTL
有了el表达式,可以轻松的获取绑定任何参数,但是获得参数以后,如何赋值或者说如果判定,el无法完成,这个时候就需要JSTL去进行处理
jstl是由Apache进行维护,是一项开源技术
9.2forEach标签:for循环
<!--
songs
for(Song s:Songs){
}
items:需要循环的目标,一般通过el表达式获取
var:表示每个循环的变量名
varStatus:下标索引对象
-->
<c:forEach items="循环目标" var="s">
<!--需要循环的内容-->
</c:forEach>
9.3if标签:if
<!--方式一-->
<c:if test="${通过el表达式获取值进行判定}">
<!---条件满足就可以显示内部的内容-->
</c:if>
<!--方式二
var 是给test的条件表达式取别名
-->
<c:if test="${u.gender=='男'}" var="rs">
男
</c:if>
<c:if test="${!rs}">
女
</c:if>
9.4choose标签:if…else
<c:choose>
<c:when test="${条件判定1}">内容1</c:when>
<c:when test="${条件判定2}">内容2</c:when>
<!--可以写多个c:when,表示多种条件选择-->
<c:otherwise>以上都不满足,执行此内容</c:otherwise>
</c:choose>
十.Servlet的生命周期
1.容器创建Servlet对象
2.servlet对象的分配
3.准备资源,如何调用对应的方法处理请求
4.对象的销毁
10.1实例化
实例化是servlet生命周期的第一步,由servlet容器调用servlet构造器创建一个具体的servlet对象的过程
一般来说servlet实例需要在获得请求调用以后,才会去实例化创建,但有时候我们需要在容器启动的时候就自动创建
1.web.xml配置:使用一些系统类,第三方的servlet时候,必须要是用web.xml
<servlet>
<!-- 别名-->
<servlet-name>first</servlet-name>
<!-- 类地址-->
<servlet-class>com.example.servlet_day0209.FirstServlet</servlet-class>
<!-- 配置类的加载时机
小于0或者没有指定该行代码的时候,默认机制,不会随容器启动创建
反之会启动,正数值越小,优先级越高
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first2</url-pattern>
</servlet-mapping>
2.注解
@WebServlet(value = "/first",loadOnStartup = 1)
10.2初始化
serlvet在实例化以后,必须要初始化他,而且只会执行一次,在调用init()方法时,这个方法是在servlet接口中定义,
该方法以一个ServletConfig接口作为参数,用来获取一些初始化的数据值,ServletConfig由servlet容器自动创建,他可以读取web.xml中配置init-param的参数,也可以读取注解中的参数
web.xml
<servlet>
<!-- 别名-->
<servlet-name>first</servlet-name>
<!-- 类地址-->
<servlet-class>com.example.servlet_day0209.FirstServlet</servlet-class>
<!-- 配置类的加载时机
小于0或者没有指定该行代码的时候,默认机制,不会随容器启动创建
反之会启动,正数值越小,优先级越高
-->
<init-param>
<param-name>hello</param-name>
<param-value>world</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!-- 初始化-->
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first2</url-pattern>
</servlet-mapping>
</web-app>
注解:
@WebServlet(value = "/first",loadOnStartup = 1,
initParams = {
@WebInitParam(name="coding",value = "utf-8")
})
10.3就绪:servlet()方法
响应请求的业务操作:servie()方法
每响应一次,都会调用一次
实例化和初始化是默认执行的,而且只会执行一次!
就绪状态对应的方法,只要有对应的映射请求,就会响应一次!
10.4销毁:distory()方法
servlet容器在销毁servlet对应的时候会默认调用此方法
1.容器关闭
2.容器重新加载此servlet
此过程一般不需要认为干预
10.5servlet是否是线程安全的?
线程不安全,本质有共享变量存在,而根据servlet的生命周期,发现多个请求会存在共享变量servlet实例被创建以后,再次访问不会重新创建
如何处理?
1.[推荐]通过锁的机制
synchronized
或者使用ReentrantLock
加锁
2.[废弃]实现SingleThreadModel,此接口有漏洞:静态变量依然可以访问
3.尽量避免使用共享变量
十一.Servlet上下文对象
web容器在启动的时候,他会为每一个应用构建一个对应的ServletContext对象,他是全局的环境变量,在该应用中,任何的组件都可以访问这个全局的变量
11.1如何获取
- GenericServlet提供getServletContext();
- SerlvetConfig提供了 getServletContext();
- [后面] HttpSession提供了 getServletContext();
11.2一些常见的业务方法
//1. 绑定对象
void setAttribute(String key ,Object obj);
//2. 获得对象
Object getAttribute(String key);
//3.获得资源,版本,服务器,,,,
String getServerInfo();
//获得web应用的名称
String getServletContextName();
//移除绑定的对象
void removeAttribute(String key);
String getContextPath();//返回web项目的路径 /项目名/login
<%--在jsp里面,上下文对象可以直接使用 application获取--%>
<h1>上下文对象: ${applicationScope.num}</h1>
它可以在多个servlet组件中共享!
十二.状态管理
12.1何为状态
HTTP协议是无状态的:
1.客户端发送请求,服务器响应请求,断开了连接
2.客户端第二次发送请求,服务器继续响应请求,继续断开
我们可以将浏览器与服务器的多次交互(请求-响应)当做一个整体来看待,将多次交互的数据保存下来的过程就叫状态管理!
12.2cookie
理发店做活动,来这里理发1次送1张券,集满五张,免费理发一次!
每一次理发其实都是一个请求/响应
12.2.1概念
a.浏览器(用户)想服务器(理发店)发送请求(理发)时,
b.服务器会将少量的数据以set-cookie消息头的方式发送给浏览器(发一张券)
c.当浏览器再次访问服务器,会将这些数据以cookie消息头的方式发送给服务器
12.2创建与获取
12.3需要注意
1.中文乱码问题
2.cookie的存活时间,可以通过cookie.setMaxAge(int seconds过期秒数)
seconds>0 保存在硬盘上
seconds<0 保存在内存上
seconds=0 删除cookie的一种方式
3.cookie是可以禁止的
4.cookie大小是有限的(4kb),数量大概最多300个
5.cookie是不安全的
12.4session
12.4.1什么是session
浏览器(你)访问服务器(理发店),服务器会创建一个session对象(会员卡),该对象有唯一的id(会员卡卡号),一般称之为sessionId,在服务器的默认请款下,会将sessionID以cookie的机制发给浏览器,当我们再去去访问服务器(理发),会将sessionid发给服务器,服务器根据sessionID去找到对应的session对象,通过这种方式,服务器和浏览器的状态就被保存下来了
12.4.2如何获取session
HttpSession session=request.getSession(boolean flag);
//一.flag=true
服务武器会首先看请求中是否有sessionID,如果没有id,会创建一个session对象,
如果有,直接根据sessionID去找到对应的session
//二.flag=false
服务武器会首先看请求中是否有sessionID,如果没有id,返回null
如果有,直接根据sessionID去找到对应的session
HttpSession session=request.getSession();//不写参数,相等于参数为true
12.4.3HttpSession的一些方法
el: {requestScope}:每一次请求
{sessionScope}: 每一次会话(一次会话里面可能包括多次请求)
{applicationScope}:整个应用共享一个
//获得sessionID
String getId();
void setAttribute(String key,Object obj);
Object getAttribute(String key);
void removeAttribute(String key);
//session超时
session.setMaxInactiveInterval(int 设置存活时间);
//或者通过web.xml进行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
//session可以删除
session.invalidate();
12.4.4如果cookie被禁用了怎么办?
解决方案:url重写
1.什么叫url重写?
如果要访问web组件需要session和cookie的机制支持,如果cookie被禁用,使用服务器声明一个链接带有session的地址
login.do
login.do?sessionId=ID值…
//使用重定向
String response.encodeRedirect("地址");
String id=req.getSession().getId();
String url=resp.encodeRedirectURL("count?id="+id);
resp.sendRedirect(url);
System.out.println(url);
十三.过滤器
13.1什么是过滤器?
是servlet组件定义的一种可以插入的web组件,用来拦截servlet请求和响应的过程,获取或者操作B/S请求响应中交换的数据和资源,这里面过滤的对象是客户端访问的web资源,可以理解为一种预处理手段
13.2如何定义一个过滤器
1.实现servlet提供过滤器接口方法
2.配置处理机制
web.xml配置方式: 如果不是自定义过滤器,需要使用此方式
<!-- 过滤器配置-->
<filter>
<filter-name>mylogin</filter-name>
<filter-class>FirstFilter</filter-class>
<!-- 可以配置初始化的参数-->
<init-param>
<param-name>myencoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>mylogin</filter-name>
<!-- 表示需要过滤器的请求名, /*表示通配-->
<url-pattern>/login</url-pattern>
</filter-mapping>
注解:
@WebFilter("/login")
13.3过滤器的生命周期
参考servlet的生命周期
初始化:在容器启动的时候,执行一次
doFilter():每当执行一次过滤器,被调用一次
destory():当容器重新加载项目,或者关闭的时,.被执行一次
13.4优点
a.可插拔性:类似U盘,减少或者增加某个模块,不影响程序的整体功能
b.可以将多个相同的逻辑预处理,提前封装到过滤器中,方便代码的维护,比如编码的设置
c.AOP面向切面编程的思想
十四.监听器
14.1什么是监听器
servlet规范里面的一类特殊组件,用来监听servlet容器产生的时间,进行响应的处理
14.2常见的监听器
14.2.1生命周期相关的监听器
//request:请求
//捕鱼达人: MouseListener
interface ServletRequestListener{
void requestDestory(ServletRequestEvent e);
void requestInitialized(ServletRequestEvent e);
}
//session:会话
interface HttpSessionListener{
void sessionCreated(HttpSessionEvent e);//创建会话
void sessionDstoryed(HttpSessionEvent e);//销毁会话
}
//servletcontext:上下文
interface ServletContextListener{
void contextInitialized(ServletContextEvent e);
void contextDestory(ServletContextEvent e);
}
14.3如何实现监听器
- 实现对应的监听器接口,重写里面的抽象方法
- 配置
2.1 web.xml方式<listener> <listener-class>com.ruandy.filter.MySessionListener</listener-class> </listener>
2.2 注解方法
@WebListener
十五.JOSN
15.1定义
数据交换标准, 一般用于浏览器和服务器之间进行数据转换
javascript Object notation
eg:可以将Java对象转换成浏览器能够识别的js对象
{“属性名”:“属性值”}
let person={“name”:“张三”,“age”:22}
fastjson.jar
JSON是js里面的内置对象
15.2将一个Java对象转换为一个json字符串
xhr.responseText
//将对象转成JSON字符串
JSON.toJSONString(Object obj);
City c1=new City();
c1.setCityName("wh");
c1.setCityValue("武汉");
//使用json去转换为字符串
String str1= JSON.toJSONString(c1);
System.out.println(str1);
City c2=new City("sh","上海");
City[] cs=new City[]{c1,c2};
//转数组
String str2=JSON.toJSONString(cs);
System.out.println(str2);
//转集合
List<City> list=new ArrayList<>();
list.add(c1);
list.add(c2);
System.out.println(JSON.toJSONString(list));
//JSON字符串true
System.out.println(JSON.toJSONString(true));
//KPI: A B C D
15.3将传递的JSON字符串转为java对象
String str1="{'cityName':'wh','cityValue':'武汉'}";
//使用fastjson.jar将json字符串转为javabean对象
City c1=JSON.parseObject(str1,City.class);
System.out.println(c1);
//
String str2="[{\"cityName\":\"wh\",\"cityValue\":\"武汉\"},
{\"cityName\":\"sh\",\"cityValue\":\"上海\"}]";
List<City> list1=JSON.parseObject(str2,List.class);
//解析为具体的集合类型:ArrayList
List<City> list2=JSON.parseObject(str2,
new TypeReference<ArrayList<City>>(){});
System.out.println(list2);
十六.jQuery
16.1定义
jQuery 是一个快速、小型且功能丰富的 JavaScript 库。它使 HTML 文档遍历和操作、事件处理、动画和 Ajax 之类的事情变得更加简单,它具有易于使用的 API,可在多种浏览器中工作
别人给你写好的一个js文件,里面有很多方便调用的js函数
16.2优点
1.体积小,压缩后只有100kb左右
2.强大的选择器
document.getElementById(“d1”);
$(“#d1”)
3.出色的DOM封装
4.可靠的事件处理机制
5.浏览器兼容
6.丰富的插件支持
7.使用隐式迭代简化编程
16.3版本
1.x :目前最流行和稳定的版本,包含对一些低版本浏览器的支持
2.x:版本比较少,兼容性比较差,不建议使用
3.x:移动端的主要版本,体积也很小,目前正在更新的版本,不支持低版本的浏览器
16.4原生js和jQuery的一些需要注意的点
window.onload :等待图片加载完成以后才执行
jQuery:在dom元素加载以后,不需要等待图片加载完成就可以执行
16.5jQuery对象和js对象
//dom对象---jQUERY
let divObj=document.getElementById("d1");
//所有的jQuery对象命名:都建议将变量名首字母写成$
let $divObj=$(divObj);
//jQuery对象--dom对象
let obj=$divObj.get(0);
//$divObj.get()[0];
//onload 页面加载自动完成
//window.οnlοad=function(){};
//jQuery写法1:
$(document).ready(function(){
alert(1);
});
//jQuery写法2:
jQuery(function(){
alert(2);
});
//可以将$ 改为单词: jQuery
16.6选择器
16.6.1基本选择器
//id选择器
$("#id值");
//类选择器
$(".class值");
//元素选择器
$("标签名")
//selector1,select2
$("div,p,#id")
拓展:循环
//1:foreach循环 : k-v
$.each(循环目标,function(循环下标/属性名,下标/属性对应的值){
console.log(value+"="+index);
});
//2.map循环 : v-k
$.map(obj,function (下标/属性对应的值,循环下标/属性名){
console.log(value+"="+index);
});
16.6.2层次选择器
// .c1 p
//s1下面的所有后代元素
s1 s2
//s1下面的子代元素
s1>s2
//紧跟着s1后面兄弟元素s2
s1+s2
//紧跟着s1后面的所有同辈s2兄弟元素
s1~s2
16.6.3属性选择器
//选择一个标签属性名和属性值都满足的
标签名[属性名='属性值']
//选择一个标签名,属性名不等于属性值
标签名[属性名!='属性值']
//属性名以属性值开头的
标签名[属性名^='属性值']
//属性名以属性值结尾的
标签名[属性名$='属性值']
//有这个属性的
标签名[属性名]
16.7jQuery对于DOM的操作
//1.利用选择器查到节点设置或者获取节点内容
//innerText :设置或者获得文档内容
text();
//innerHTML:设置或者获得选择器的 超文本内容
html();
//value
val();
//setAttrebute
attr();
//以下的方法都可以使用json的语法设置多个属性
attr({"属性1":"属性值1","属性2":"属性值2"...})
//2.对于样式的设置
css("样式名","样式值");
attr("样式名","样式值");
addClass("样式名");
removeClass("样式名");//多个 removeClass("样式1 样式2")
hasClass("样式名");
//3.节点操作
//删除节点 a.remove()
remove();
//删除 a.remove(选择器定位元素删除)
remove(选择器);
//清空 a.empty()
empty();
//获得儿子节点对象,还可以获得指定儿子
children(选择器)
next();
prev();
siblings(选择器);//所有同备份的兄弟元素
find(选择器);//
//节点的添加
append()
prepend()
after()
before()
16.8jQuery事件
16.8.1事件绑定
<input id="d1" type="button" value="测试">
<!--
1.添加一个属性onclick
2.通过DOM操作获得对象,然后修改对象的属性
-->
<script>
$(function(){
});
$(document).ready(function(){
});
//jQuery语法格式:
//写法1: 对象.事件名(function(){});
//写法2: 对象.on(事件名,function(){});
// 对象.on(事件名,'子对象',function(){});
//两者的区别:
// on适合动态创建的js对象绑定事件,普通绑定只适合静态(页面最开始就已经定义好标签的对象)
</script>
16.8.2删除绑定事件
$("选择器").off();//移除当前选择器对应对象的所有事件
$("选择器").off('事件名');//移除当前选择器对应对象的事件,比如事件名等于click,表示移除点击事
件
$("选择器1,选择器2").off('事件名');//移除多个对象的事件
$('选择器').off('事件1 事件2','子标签');
$('#d2').off('mouseover mouseout','ul li');
//移除d2里面ul li上面的鼠标进入/移出的事件
16.8.3事件冒泡
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#d1{
width: 200px;
height: 200px;
border: 1px solid red;
}
</style>
<script src="./jquery-1.12.4.min.js"></script>
<script>
//事件冒泡:当我们执行某个操作的时候,有多个事件在监听这个操作(点击--a被click a所在的
div也被click)
// 那么该事件会从最里层的事件逐层向外执行
// 如果想阻止,e.stopPropagation();
//
$(function(){
$("#a1").click(function (e){
e.stopPropagation();
alert(1);
});
$("#d1").click(function(){
alert('你点击了一个div');
});
});
</script>
</head>
<body>
<div id="d1">
<a id="a1" href="javascript:;">click1</a>
</div>
<a class="s1" href="javascript:;">click2</a>
<a class="s1" href="javascript:;">click3</a>
</body>
</html>
16.9jQuery对于ajax的支持
$.ajax(option);
//参数是以json的数据格式
$.ajax({
url:'login'
});
//一些常见的选项参数
参数(类型)
url:字符串类型,表示请求地址
type:字符串,表示GET/POST
data:字符串/对象 发送给服务器的参数 data:{'username':'张三','pwd':'******'}
dataType:字符串 json/xml/html/text
回调函数:
1. success:表示请求成功,他的值为一个function
success: function(data){
}