过滤器的优点
a.在不修改原有代码的基础上,为系统增加一些新的简单的功能。
b.将多个模块相同的功能集中写在一个类里面,方便代码的维护。
1.Servlet线程安全问题
(1)为什么说Servlet会有线程安全问题?
a.容器只会创建一个servlet实例。
b.容器收到一个请求,就会启动一个线程,由这个线程来调用servlet
实例来处理请求。
这样一来的话,就有可能有多个线程同时去调用某个servlet实例,
就有可能发生线程安全问题(比如说,这些线程要修改某个属性值)。
(2)如何解决?
使用synchronized对有可能产生线程安全问题的代码块加锁。
注:
加锁之后,会影响性能。
3. jsp基础
(1)什么是jsp?
sun公司制订的一种服务器端动态页面技术规范。
注:
jsp是一个以.jsp为后缀的文件,内容主要是html和少量的
java代码。容器会将该文件转换成一个对应的servlet然后执行,所以,jsp的本质就是一个servlet。
(2)如何写一个jsp文件?
step1.添加一个以.jsp为后缀的文件。
step2.在该文件当中,可以使用以下元素:
1)html (css,js)
直接写即可。
2)java代码
a. java代码片断
<% java代码 %>
b. jsp表达式
<%= java表达式 %>
c. jsp声明 (a1.jsp)
<%! 声明一个方法或者变量 %>
3)指令
a.什么是指令?
通知容器,在将jsp转换成servlet时,做一些额外的处理,比如导包。
b.语法
<%@ 指令名 属性=值 %>
c.page指令
import属性:指定要导入的包。
pageEncoding属性:告诉容器,jsp文件的编码。
contentType属性:设置setContentType方法的参数。
session属性: (a2.jsp)
缺省值是true,如果设置为false,则不能够使用session隐含对象了。
errorPage属性:(a3.jsp)
用来指定一个异常处理页面,当jsp运行出错,容器会调用异常处理页面。
isErrorPage属性:(a4.jsp)
缺省值是false,如果值为true,则可以使用exception隐含对象。
d.include指令
file属性:指定被包含的文件。
e.taglib指令
用于导入jsp标签。
4)隐含对象
a.什么是隐含对象?
b.为什么可以直接使用这些隐含对象?
c.有哪些隐含对象?
out,request,response,session,application
exception: 只有在isErrorPage="true"时才能使用。
pageContext: (a6.jsp,a7.jsp)
c1. pageContext是什么?
容器会为每一个jsp实例都会创建一个唯一的一个符合PageContext接口要求的对象。
c2. 特点
唯一性:一个jsp实例对应一个pageContext。
持久性:只要jsp实例还在,则pageContext会一直存在。
c3. 作用
作用1:绑订数据。
注:绑订到pageContext上的数据,只有对应的jsp实例能访问到。
作用2: 提供了获得其它所有隐含对象的方法。
config: (a5.jsp)
ServletConfig
page: jsp实例本身。
jsp对应的那个servlet实例。
5)注释 (a8.jsp)
a. <!-- 注释内容 -->
注:
如果注释的内容是java代码,则java代码会执行。
b. <%-- 注释内容 --%>
注:
如果注释的内容是java代码,不会执行。
(3)jsp是如何运行的?
1)阶段一 容器将jsp转换成一个servlet
html -----> service方法里,使用out.write输出。
<% %> ---> service方法里,照搬。
<%= %> ---> service方法里,使用out.print输出。
<%! %> ----> 为servlet增加新的属性和方法。
2)阶段二 容器调用该servlet
4. jsp标签和el表达式
(1)jsp标签是什么?
sun公司制订的一种用来替换jsp中java代码的技术,语法类似于
html标签,容器遇到jsp标签之后,会找到标签对应的标签类然后执行。
注:
a.因为直接在jsp文件中写java代码,不利于jsp文件的维护,
比如,将包含有java代码的jsp交给美工去修改就很不方便。
所以,sun才制订了jsp标签技术规范。
b.使用jsp标签,jsp文件会变得更简洁,方便维护,同时,方便代码的复用。
(2)el表达式是什么?
是一套简单的运算规则,用于给jsp标签的属性赋值。也可以脱离jsp标签直接使用。
(3)el表达式的使用
1)访问bean的属性
注(了解):
如果一个java类满足如下几个条件,就可以称之为javabean:
public class
public 构造器
implement Serializable
属性
get/set方法
方式一 (e1.jsp)
${user.username}
注:
a.执行过程:
容器依次从pageContext->request->session->
application中查找绑订名称为"user"的对象(
即调用getAttribute方法),找到该对象之后,调用
getUsername方法,然后输出计算结果。
b.会将null转换成""输出。
c.如果依据绑订名找不到对应的对象,不会报空指针异常,
仍然输出""。
d.可以使用pageScope、requestScope、sessionScope、applicationScope来指定查找范围。比如,从session对象中查找: ${sessionScope.user.username}
方式二 (e1.jsp)
${user['username']}
注:
a.执行过程:
同方式一。
b.允许[]里面使用绑订名。
c.允许[]里面使用从0开始的下标,用于访问数组中的某个元素。