Java-Servlet

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文件的组成部分

  1. 文档声明
  2. 元素
    2.1 双标签
    2.2 单标签
    2.3 只有一个根元素
    2.4 xml中出现的所有空格和换行都会被处理
  3. 属性 <姓名 type=“text”>新垣结衣</姓名>
  4. 注释:类同html
  5. CDATA区域,特殊字符
<!--CDATA区域的内容不会当做标签去解析,会直接当做文本来进行处理-->
<![CDATA[
<Ruandy></Ruandy>
]]]>
> &gt;
< &lt;
& &amp;
  1. PI指定:给xml指定样式

3.3约束

为了限定xml哪些能写,哪些不满足格式
目前的xml约束方式: DTD和Schemal

四.第一个Servlet

a. 继承HttpServlet
b. 重写里面的请求业务方法
c. 配置请求的url

  1. 以前配置方式:直观.当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如何获取

  1. GenericServlet提供getServletContext();
  2. SerlvetConfig提供了 getServletContext();
  3. [后面] 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如何实现监听器

  1. 实现对应的监听器接口,重写里面的抽象方法
  2. 配置
    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){
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走高冷路线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值