1.线程安全问题
(1)为什么说servlet会有线程安全问题?
a.容器在默认情况下,对于某个类型的servlet,只会创建一个实例。
b.容器收到一个请求,就会启动一个线程来处理该请求。如果有多个请求要访问某个类型的servlet,就有可能有多个线程同时调用某个servlet实例,就有能产生线程安全问题(比如,这些线程要修改该servlet的某个属性)。
(2)如何解决?
a.加锁
使用synchronzied对有线程安全问题的代码加锁。
b.让servlet实现SingleThreadModel接口(不建议使用) 容器会为实现了该接口的servlet创建多个实例(一个线程对应一个)。
2.jsp标签和el表达式
(1)jsp标签是什么?
jsp标签用来替换jsp中的java代码,容器遇到jsp标签之后,会依据标签找到对应的标签类然后执行。
注:
因为jsp当中包含了java代码,美工修改很不方便,所以,sun才制订了jsp标签技术规范。jsp标签类似于html标签(有开始标记,结束标记,有属性)。使用jsp标签,一方面方便页面的维护,另外,也可以方便代码的复用。
(2)el表达式是什么?
是一套简单的计算规则,计算的结果可以用来给jsp标签的属性赋值,也可以直接输出。
(3)el表达式的使用
1)访问bean的属性 (a5.jsp)
a.方式一 ${user.name}
a1.执行过程: 容器依次从pageContext,request,session,application查找绑订名为"user"(getAttribute)的对象,找到之后,调用该对象的getName方法并输出。
a2.优点:
将null转换成""输出。
找不到对象,会输出""。
a3.指定查找范围:
可以使用pageScope,requestScope,sessionScope,applicationScope来指定查找范围,比如${sessionScope.user.name}
b.方式二
${user["name"]}
b1. 允许[]里面出现一个绑订名。
b2.允许[]里面出现从0开始的下标,
用来访问数组中的指定下标的元素。
2)进行一些简单的计算 (a6.jsp)
a. 算术运算 "+","-","*","/","%" 注意,"+"只能求
和。
b.关系运算 ">",">=","<","<=","==","!="
c.逻辑运算 "&&","||","!"
d.empty运算 判断是不是一个空字符串或者是否
是一个空的集合。
3)读取请求参数值 (a7.jsp)
a.${param.username}
等价于
request.getParameter("username");
b. ${paramValues.city}
等价于
request.getParameterValues("city");
(4)jstl (java standard taglib) java标准标签库
1)jstl是什么?
apache开发的一套jsp标签,后来捐献给了sun,
sun将其命名为jstl。
2)如何使用?
step1,将jstl相关的jar文件拷贝到WEB-INF\lib下。
注:如果使用的是javaee5.0,不需要拷贝了,
因为javaee5.0已经包含了jstl相关的jar文件。
step2,使用taglib指令引入要使用的标签。
<%@taglib uri="" prefix=""%>
uri: 指定要引入的标签的命名空间(可参考
.tld文件的描述)。
prefix:命名空间的前缀(别名)
注:
命名空间(namespace): 为了区分同名的元素
而添加的一个前缀。
标签的执行过程:
容器依据标签名称找到标签类(在.tld文件当中
有描述),然后将该标签类实例化,最后调用该
实例的相应方法。
3)jstl核心标签 (a8.jsp)
a. if标签
<c:if test="" var="" scope="">
标签体
</c:if>
a1. 当test属性值为true时,容器会执行
标签体的内容。test属性可以使用el
表达式来赋值。
a2.var属性 指定一个绑订名称。
a3. scope属性 指定绑订范围(page,request,
session,application),绑订值是test
属性值。
b. choose标签 (a9.jsp)
<c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</otherwise>
</c:choose>
b1: when可以出现1次或者多次,表示一个
分支。otherwise可以出现0次或者1次。
b2: 当test属性值为true,会执行该分支的内容。
该属性可以使用el表达式来赋值。
c.forEach标签 (a10.jsp)
<c:forEach items="" var="" varStatus="">
</c:forEach>
c1: 该标签用来遍历集合或者数组。
c2. items属性 指定要遍历的集合或者数组,
可以使用el表达式来赋值。
c3. var属性 指定一个绑订名称,绑订范围
固定是pageContext。
forEach标签执行过程:每次从集合或者
数组当中取一个元素,并且绑订到
pageContext上。
c4. varStatus属性 指定一个绑订名称,绑订
值是一个封装了当前遍历状态的对象,该
对象提供了一些方法,比如
getIndex(): 返回当前正在被访问的
元素的下标(从0开始)。
getCount():返回是第几次访问(从1
开始)。
3. jQuery对ajax编程的支持。
(1)load() order.jsp
1)作用:异步地向服务器发送请求,并将服务器
返回的数据直接添加到符合要求的节点之上。
2)用法:
$obj.load(url,[data]);
url:请求地址。
data:请求参数,可以有两种形式:
请求字符串形式,比如 name=tom&age=22
对象形式,比如{‘name‘:‘tom‘,‘age‘:22}
注:
如果请求参数采取第二种形式发送,则
load方法会发送post请求,否则,会发送
get请求。
(2)$.get()和$.post()
1)作用:异步地向服务器发送请求(get请求或者post请求),并
且可以处理服务器返回的数据。
2)用法:
$.get(url,[data],[callback],[type])
url:请求地址。
data:请求参数。
callback: 回调函数,用来处理服务器返回的
数据,格式如下:
function(data,statusText),其中
data是服务器返回的数据,statusText
是一个描述服务器状态的字符串。
type:服务器返回的数据类型,可以是
text 文本
html html内容
json json字符串
xml xml文档
script javascript脚本
(3)$.ajax(options):options是一个形如
{key1:value1,key2,value2...}的js对象,
用于指定发送请求的选项。
选项参数如下:
url(string):请求地址
type(string):get/post
data(object/string):发送到服务器的参数
dataType(string) :预期服务器返回的数据类型,
success(function):请求成功后调用的回调函数,有两个参数:
function(data,StatusText),其中,
data是服务器返回的数据,
StatusText 描述状态的字符串。
error(function):请求失败时调用的函数。
async: true(缺省)/false ,当值是false时,同步
地发送请求。
4.缓存问题
(1)什么是缓存问题
ie浏览器提供的ajax对象,在发送get请求时,
会检查请求地址是否访问过,如果访问过,则
不再发送请求,而是显示之前访问过的结果。
(2)解决方式
方式一:
在请求地址后面加上随机数。
比如
‘getNumber.do?‘ + Math.random();
方式二:
发送post请求。
原文:http://www.cnblogs.com/zxCoding/p/5220735.html