Ajax
Ajax学习1:
1)什么是Ajax
异步刷新技术,用来在当前页面内响应不同的请求内容
2)为什么需要Ajax?
①需求:
有的时候我们需要将本次的响应结果和前面的响应结果内容在同一个页面中展现给用户
②解决:
方法一:在后台服务器端将多次响应的内容重新拼接陈一个jsp页面,响应。
但是这样会造成很多响应内容被重复的响应,资源浪费
方法二:使用Ajax技术
3)使用Ajax
Ajax的访问原理:是浏览器端页面的一个对象
Ajax的基本使用流程:
function getData(){
//创建ajax引擎对象
var ajax;
if(window.XMLHttpRequest){
ajax=new XMLHTTPRequest();
}else if(window.ActiveXObject){
ajax=new ActiveXObject(“Msxm12.XMLHTTP”);}
//覆写onreadystatement函数
ajax.onreadystatechange=function(){
//判断Ajax状态码
if(ajax.readyState4){ //五种状态
//判断响应状态码
if(ajax.status200){
//获取响应内容
var result=ajax.responseText;
alert(result);
//获取元素对象
var showdiv=document.getElementById(“showdiv”);
showdiv.innerHTML=result;
}else if(ajax.status404){
//获取元素对象
var showdiv=document.getElementById(“showdiv”);
showdiv.innerHTML=“请求资源不存在”;
}else if(ajax.status500){
var showdiv=document.getElementById(“showdiv”);
showdiv.innerHTML=“服务器繁忙”;}}}
//发送请求
ajax.open(“get”,“ajax”);
ajax.send(null);}
Ajax的状态码
Ajax的异步和同步
Ajax的请求
Ajax的响应数据类型
Ajax的封装
Ajax的案例
Ajax学习2:
1)ajax的概念:
局部刷新技术。不是一门新技术,是多种技术的组合。是浏览器端的技术。
2)ajax的作用:
实现在当前结果页中显示其他请求的响应内容
3)ajax的使用:
ajax的基本流程:
//创建ajax引擎对象
//覆写onreadystatement函数
//判断ajax状态码
//判断响应状态码
//获取响应内容(响应内容的格式)
①普通字符串
②json(重点)
json格式:
var 对象名={
属性名:属性值,
属性名:属性值,
…}
可以用Gson来将JAVA中一个类的数据转成Json,
new Gson().toJson(u);
再在js里面var result=ajax.responseText;
eval(“var =u”+result);
③XML数据:responseXML,返回document对象
通过document对象将数据 从xml中取出来
//处理响应内容(js操作文档结构)
//发送请求
ajax的状态码:
readyState:0,1,2,3,4
4:表示响应内容被成功接收
响应状态码:
status:
200:表示一切OK
404:资源未找到
500:内部服务器错误
ajax的异步和同步
ajax.open(method,url,async)
async:设置同步代码执行还是异步代码执行
true代表异步,默认是异步(异步线程分开,同步一个线程走下去)
false代表同步
Ajax发送请求:
1)get方式:请求实体拼接在URL后面
var uname=document.getElementById(“uname”).value;
ajax.open(“get”,“ajax?”+data);
ajax.send(null);
2)post方式:请求实体需要单独的发送
ajax.open(“post”,“ajax”);
ajax.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);//关系到提交方式,是键值对还是字节码
ajax.send(“name=张三&pwd=123”)
EL学习
El表达式学习:
1)传统方式获取作用域数据
缺点一:需要导入包
缺点二:需要强转
缺点三:获取数据的代码过于麻烦
①什么是EL表达式:
全程:Expression Language,一种写法非常简介的表达式。语法简单易懂,便于使用。表达式语言的灵感来自于ECMAScript和XPath表达式语言。
②EL表达式的作用:
作用:让jsp书写起来更加的方便。简化在jsp中获取作用域或者请求数据的写法。也会搭配Jstl来使用
③使用EL表达式:
语法结构:${表达式},提供.和[]两种运算符来存取数据。
表达式:
获取请求数据:
request对象存储了请求数据—>param.键名
request对象存储了请求数据—>paramValues.键名 返回的是数组
通过setAttribute方法存储到作用域对象中的数据:
${键名} 返回键名所对应的值。
注意:
如果存储的是普通字符串则直接返回。
如果存储的是对象,则返回的是对象。
获取对象中的数据:
普通对象:
键
名
.
属
性
名
.
属
性
名
.
.
.
集
合
对
象
:
l
i
s
t
集
合
−
−
−
>
{键名.属性名.属性名...} 集合对象: list集合--->
键名.属性名.属性名...集合对象:list集合−−−>{键名[角标]}
map集合—>${键名.map集合存储的键名}
使用EL表达式获取作用域数据:
作用:获取作用域对象中的数据。
注意:获取的是pageContext、request、session、application四个对象中的数据,其他数据一概不理会。找到了则获取返回,找不到则什么都不做,也不报错。
作用域查找顺序:
默认查找顺序:pageContext–>request–>session–>application
注意:每次查找都是从小到大进行查找,找到了则获取,不再继续找了
指定查找:
p
a
g
e
S
c
o
p
e
.
h
e
l
l
o
−
−
>
{pageScope.hello}-->
pageScope.hello−−>{requestScope.hello}–>
s
e
s
s
i
o
n
S
c
o
p
e
.
h
e
l
l
o
−
−
>
{sessionScope.hello}-->
sessionScope.hello−−>{applicationScope.hello}
EL表达式的逻辑运算:
${逻辑表达式}:&& || !
${算术表达式}:+ - * /
&{关系表达式}:><>= <= != == %
${sex==1?‘男’:‘女’}
注意:+表示加法运算,不表示字符链接。使用EL表达式进行字符链接会报错。
EL的空值判断:
${empty 键名}
作用:判断键名对象的值是否存有数据
EL获取请求头数据和Cookie数据
h
e
a
d
e
r
−
−
{header}--
header−−{headerValues[“accept-language”][0]}
c
o
o
k
i
e
−
−
{cookie}--
cookie−−{cookie.JSESSIONID}–
c
o
o
k
i
e
.
J
S
E
S
S
I
O
N
I
D
.
n
a
m
e
−
−
{cookie.JSESSIONID.name}--
cookie.JSESSIONID.name−−{cookie.JSESSIONID.value}
JSTL
JSTL学习:
作用:提高在jsp中的逻辑代码的编写效率,使用标签。
使用:
JSTL的核心标签库(重点)
JSTL的格式化标签库
JSTL的SQL标签库
JSTL的函数标签库
JSTL的XML标签库
JSTL的核心标签库:
①导入jar包
②声明jstl标签库的引入(核心标签库)
<%@taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
③内容:
基本标签:
<c:out value=“数据” default=“默认值”></c:out>
数据可以为常量值也可以是EL表达式。
作用:将数据输出给客户端。
<c:set var=“hello” value=“hello pageContext” scope=“page”></c:set>
作用:存储数据到作用域对象中
var:表示存储的键名
value:表示存储的数据
scope:表示要存储的作用域对象 page request session application
<c:remove var=“hello” scope=“page”/>
作用:删除作用域中的指定键的数据。
var:表示要删除的键的名字
scope:表示要删除的作用域(可选)
注意:如果在不指定作用域的情况下使用该标签删除数据,会将四个作用域对象中的符合要求的数据全部删除。
逻辑标签:
<c:if test="
表
达
式
"
>
前
端
代
码
<
/
c
:
i
f
>
注
意
:
逻
辑
判
断
标
签
需
要
依
赖
于
E
L
的
逻
辑
运
算
,
也
就
是
表
达
式
中
涉
及
到
的
数
据
必
须
从
作
用
域
中
获
取
。
<
c
:
c
h
o
o
s
e
>
<
c
:
w
h
e
n
t
e
s
t
=
"
E
L
表
达
式
判
断
"
>
执
行
内
容
<
/
c
:
w
h
e
n
>
<
c
:
w
h
e
n
t
e
s
t
=
"
"
>
执
行
内
容
<
/
c
:
w
h
e
n
>
.
.
.
<
c
:
o
t
h
e
r
w
i
s
e
>
<
/
c
:
o
t
h
e
r
w
i
s
e
>
<
/
c
:
c
h
o
o
s
e
>
作
用
:
用
来
进
行
多
条
件
的
逻
辑
判
断
,
类
似
j
a
v
a
中
的
多
分
支
语
句
注
意
:
条
件
成
立
只
会
执
行
一
次
,
都
不
成
立
则
执
行
o
t
h
e
r
w
i
s
e
循
环
标
签
:
<
c
:
f
o
r
E
a
c
h
b
e
g
i
n
=
"
1
"
e
n
d
=
"
4
"
a
r
w
p
=
"
2
"
>
循
环
体
<
/
c
:
f
o
r
E
a
c
h
>
作
用
:
循
环
内
容
进
行
处
理
使
用
:
b
e
g
i
n
:
声
明
循
环
开
始
位
置
e
n
d
:
声
明
循
环
结
束
位
置
s
t
e
p
:
声
明
步
长
v
a
r
S
t
a
t
u
s
:
声
明
变
量
记
录
每
次
循
环
的
数
据
(
角
标
,
次
数
,
是
否
是
第
一
次
循
环
,
是
否
是
最
后
一
次
循
环
)
注
意
:
数
据
存
储
在
作
用
域
中
,
需
要
使
用
E
L
表
达
式
获
取
。
例
如
:
{表达式}"> 前端代码 </c:if> 注意: 逻辑判断标签需要依赖于EL的逻辑运算,也就是表达式中涉及到的数据必须从作用域中获取。 <c:choose> <c:when test="EL表达式判断">执行内容</c:when> <c:when test="">执行内容</c:when> ... <c:otherwise></c:otherwise> </c:choose> 作用:用来进行多条件的逻辑判断,类似java中的多分支语句 注意:条件成立只会执行一次,都不成立则执行otherwise 循环标签: <c:forEach begin="1" end="4" arwp="2"> 循环体 </c:forEach> 作用:循环内容进行处理 使用: begin:声明循环开始位置 end:声明循环结束位置 step:声明步长 varStatus:声明变量记录每次循环的数据(角标,次数,是否是第一次循环,是否是最后一次循环) 注意:数据存储在作用域中,需要使用EL表达式获取。 例如:
表达式">前端代码</c:if>注意:逻辑判断标签需要依赖于EL的逻辑运算,也就是表达式中涉及到的数据必须从作用域中获取。<c:choose><c:whentest="EL表达式判断">执行内容</c:when><c:whentest="">执行内容</c:when>...<c:otherwise></c:otherwise></c:choose>作用:用来进行多条件的逻辑判断,类似java中的多分支语句注意:条件成立只会执行一次,都不成立则执行otherwise循环标签:<c:forEachbegin="1"end="4"arwp="2">循环体</c:forEach>作用:循环内容进行处理使用:begin:声明循环开始位置end:声明循环结束位置step:声明步长varStatus:声明变量记录每次循环的数据(角标,次数,是否是第一次循环,是否是最后一次循环)注意:数据存储在作用域中,需要使用EL表达式获取。例如:{vs.index}–
v
s
.
c
o
u
n
t
−
−
{vs.count}--
vs.count−−{vs.first}–${vs.last}
items:声明要遍历的对象。结合EL表达式获取对象
var:声明变量记录每次循环的结果。存储在作用域中,需要使用EL表达式获取(.key,.value)
过滤器
过滤器学习
问题:Servlet的作用是针对浏览器发起的请求,进行请求的处理。通过Servlet技术我们可以灵活的进行请求的处理,但是我们不但要对请求进行处理,我们还需要对服务器的资源进行统一的管理,比如请求编码格式的统一设置,资源的统一分配等等,这个时候该怎么办呢?
作用:对服务器资源进行管理,保护Servlet
使用:
①配置过滤器
在web.xml中配置过滤器
myFilter
<com.nick.filter.MyFilter
myFilter
</
②创建一个实现了Filter接口的普通Java类
③覆写接口的方法:
init方法:服务器启动立即执行。资源初始化。
doFilter方法:拦截请求的方法,在此方法中可以对资源实现管理
注意:需要手动对请求进行放行。chain.foFilter(request,response)
destory方法:服务武器关闭执行。
注意:
url-pattern:/
表示拦截所有的请求
url-pattern:/.do
表示拦截所有以.do结尾的请求。一般是用来进行模块拦截处理
url-pattern:/ts
表示拦截指定url的请求。针对某个servlet的请求进行拦截,保护servlet
过滤器的生命周期:
服务器启动到服务器关闭。
总结:过滤器程序员声明和配置,服务器根据请求中的uri信息调用。
执行:浏览器发起请求到服务器,服务器接收到请求后,根据URI信息在web.xml中找到对应的过滤器执行doFilter方法,该方法对此次请求进行处理后如果符合要求则放行,放行后如果还有符合要求的过滤则继续进行过滤,找到执行对应的servlet进行请求处理。servlet对请求处理完毕后,也就service方法结束了。还需继续返回相应的doFilter方法继续执行。
案例:
统一编码格式设置。
session管理
权限管理
资源管理(统一水印,和谐词汇***)
监听器
监听器的使用:
作用:监听作用域对象request、session、application的创建、销毁和内容的改变
使用:创建一个实现了指定接口的java类
监听request–>ServletRequestListener
requestInitialized(ServletRequestEvent sre)//创建
requestDestroyed(ServletRequestEvent sre)//销毁
注意:形参可以获取监听的request对象
sre.getServletRequest();
监听request–>ServletRequestAttributeListener 监听request作用域数据的变更。
attributeAdded(ServletRequestAttributeEvent srae)//监听数据添加
attributeRemoved(ServletRequestAttributeEvent srae)//移除
attributeReplaced(ServletRequestAttributeEvent srae)//更改
注意形参可以获取被监听的数据
srae.getName();获取监听数据的键
srae.getValue();获取监听数据的值
监听session–>HttpSessionListener
监听session的创建和销毁
sessionCreated(HttpSessionEvent )//创建
sessionDestroyed(HttpSessionEvent )//销毁
在web.xml中配置监听器类
com.nick.lis.MyListener
常见状态码
常见状态码:
1)200 OK 客户端请求成功
2)400 Bad Request 客户端请求有语法错误,不能被服务器所理解
3)401 Unauthorized 请求未经授权,这个状态码必须和WWWAuthenticate报头域一起使用
4)403 Forbidden 服务器收到请求但是拒绝服务
5)404 Not Found 请求资源不存在,eg:输入了错误的URL
6)500 Internal Server Error 服务器发生了不可预期的错误
7)503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
404错误:资源未找到
1)原因一:请求地址中的servlet的别名书写错误。
2)原因二:虚拟项目名称拼写错误。
500错误:内部服务器错误
1)ClassNotFoundException:XXX
解决:在web.xml中校验servlet类的全限定路径是否拼写错误
2)因为service方法体的代码执行错误导致
解决:根据错误提示对service方法体中的代进行错误更改
批注:servlet做逻辑判断,jsp做页面处理。