Servlet第十天

 过滤器的优点

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开始的下标,用于访问数组中的某个元素。

猜你喜欢

转载自blog.csdn.net/anqing_liu/article/details/80636199