JSP

一、JSP入门

  • 建立对JSP的直观认识
        JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件。
        JSP页面的文件扩展名必须为.jsp。
        在JSP页面中编写的Java代码需要嵌套在<%和%>中,
            嵌套在<%和%>之间的内容被称之为脚本片段(Scriptlets),
            没有嵌套在<%和%>之间的内容被称之为JSP的模板元素。
        脚本片段被当做Java程序代码被解释执行,模板元素则被原封不动的输出给浏览器。
        脚本片段中的Java程序代码可以执行普通Java程序一样的功能,
            可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,
            也可以使用System.out.println语句将它们打印到命令行窗口。
        JSP文件就像普通的HTML文件一样,
            它们可以放置在Web应用程序中的除了WEB-INF及其子目录外的其他任何目录中。
            JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样,
            即由Web应用程序的访问路径加上JSP文件在该应用程序中的目录路径组成。
        JSP表达式简化了将一个Java变量或表达式的计算结果输出到客户端的方式,
            只需将要输出的变量或表达式直接封装在<%= 和 %>之中,
            就可以向客户端输出这个变量或表达式的运算结果。
  • JSP的运行原理
        Web容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,
            它将把该访问请求交给JSP引擎去处理,JSP引擎负责解释和执行JSP页面。
        以.jsp为扩展名的URL的访问请求由org.apache.jasper.servlet.JspServlet
            负责处理,所以,Tomcat的JSP引擎就是这个Servlet程序。
        每个JSP页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,
            接着再把这个Servlet源程序编译成Servlet的class类文件,
            然后再由Web容器(Servlet引擎)像调用普通Servlet程序一样的方式
            来装载和解释执行这个由JSP页面翻译成的Servlet程序。
        Tomcat5.x把为JSP页面创建的Servlet源文件和class类文件放置在
            “<TOMCAT_HOME>\work\Catalina\<主机名>\<应用程序名>\”目录中。
        Tomcat将JSP页面翻译成的Servlet的包名为
            org.apache.jsp.<JSP页面在Web应用程序的目录名>。
        在JSP页面每次被访问时,JSP引擎默认都会检测该JSP文件和编译成的
            Servlet类的最后更改时间,如果JSP文件自上次编译以后又发生了修改,
            JSP引擎将重新编译该JSP文件。
  • 分析JSP所生成的Servlet代码
        HttpJspBase继承HttpServlet实现HttpJspPage
            实现了jspInit和jspDestroy方法,
            实现的init和destroy和service方法都使用final修饰符声明,
            其JSP子类实现_jspInit和_jspdestroy和_jspService方法。
            init方法内部调用了jspInit和_jspInit方法,
            destroy方法内部调用了jspDestroy和_jspDestroy方法,
            service方法内部调用了_jspService方法。
            _jspInit和_jspDestroy方法是保留给JSP引擎使用的。
            _jspService方法是保留给Servlet引擎使用的。
            如果要在JSP页面中完成Servlet的init或destroy方法的功能,
            只能覆盖jspInit方法和jspDestroy方法。
  • JSP隐式对象
        为了简化JSP表达式和脚本片段代码的编写,JSP一共提供了9个预先定义的变量,
            这些变量也被称之为隐式对象,一些书籍也将它们称之为JSP内部对象。
            这9个隐式对象分别是request,response,out,session,application,
            config,pageContext,page和exception。
  • 注册与配置JSP页面的访问路径
        JSP页面也可以像Servlet程序一样在web.xml文件中进行注册,包括宣称它可以
            处理的URL和设置供ServletConfig.getInitParameter方法调用的初始化参数。
        在web.xml文件中注册JSP页面的方式与Servlet类似,
            只需将<servlet-class>元素修改为<jsp-file>元素。
            <servlet>
                <servlet-name>SimpleJspServlet</servlet-name>
                <jsp-file>/jsp/simple.jsp</jsp-file>
                <load-on-startup>1</load-on-startup>
            </servlet>
            <servlet-mapping>
                <servlet-name>SimpleJspServlet</servlet-name>
                <url-pattern>/xxx/yyy.html</url-pattern>
            </servlet-mapping>
            其中,JSP文件的路径必须以“/”开头,
            这个“/”表示JSP文件所在的Web应用程序的根目录。
  • JSP与JavaScript的综合应用
        JavaScript和JSP的关系犹如HTML代码和JSP的关系,即JavaScript代码
            是JSP程序输出的一段可以被浏览器解释执行的特殊文本内容。
        如果要让浏览器窗口中显示的邮件列表条目能够随着邮件服务器上的邮件信息
            而改变,那么就必须将html页面中的内容改为使用JSP页面来输出。
  • JSP与Servlet的应用比较
        由于JSP引擎可以自动将JSP页面翻译和编译成Servlet程序运行,JSP几乎提供了
            Servlet的所有好处,同时,JSP相对Servlet还有如下诸多优点:
            (1)JSP是一种以产生网页显示内容为中心的Web开发技术,
                它可以直接使用模板来产生网页文档的内容。
            (2)JSP页面的源文件要比Servlet源文件简单,
                并且JSP页面的开发过程要比Servlet的开发过程简单得多。
                JSP页面不用手工进行编译和在Web部署描述符文件中进行设置就可以执行。
            (3)JSP引擎可以对JSP页面的修改进行检测,
                并自动重新翻译和编译修改过的JSP文件。
            (4)在JSP中使用JavaBean和自定义标签,
                可以分离用于表现外观的HTML文本内容和用于处理业务逻辑的Java代码。
        在大型Web应用程序的开发中,Servlet与JSP经常要混合使用,各司其职,
            Servlet通常用做控制组件,并处理一些复杂的后台业务,JSP则作为显示组件。

二、JSP基本语法

  • JSP页面中可以包含模板元素、脚本元素、指令、EL(Expression Language)表达式、
        行为元素和注释内容。有三种类型的脚本元素:JSP脚本片断、JSP表达式和JSP声明,
        它们内部使用的都是Java脚本代码。
  • JSP模板元素
        JSP页面可以按照编写HTML页面的方式来编写,其中可以包含HTML文件的所有静态内容,
            在静态的HTML内容之中可以嵌套JSP的其他各种元素来产生动态内容和执行业务逻辑,
            JSP页面中的静态HTML内容称之为JSP模板元素。
            JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观。
  • JSP表达式
        JSP表达式(expression)提供了将一个Java变量或表达式的计算结果输出到
            客户端的简化方式,它将要输出的变量或表达式直接封装在<%=和=>之中。
            JSP表达式中的变量或表达式的计算结果将被转换成一个字符串,
            然后被插入进整个JSP页面输出结果的相应位置处。
        JSP表达式中的变量或表达式后面不能有分号(;),
            JSP表达式被翻译成Servlet程序中的一条out.print(...)语句。
  • JSP脚本片段
        JSP脚本片段(script)是指嵌套在<%和%>之中的一条或多条Java程序代码。
            在JSP脚本片断中,可以实现定义变量、执行基本的程序运算、调用其他Java类、
            访问数据库、访问文件系统等普通Java程序所能实现的功能。
        在JSP脚本片断中可以直接使用JSP提供的隐式对象来完成Web应用程序特有的功能。
        JSP脚本片断中的Java代码必须严格遵循Java语法。
        在一个JSP页面中可以有多个脚本片断,
            在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
        多个脚本片断中的代码可以互相访问,犹如将所有的代码放在一对<% %>之中的情况。
        单个脚本片断中的Java语句可以是不完整的,
            但是,多个脚本片断组合后的结果必须是完整的Java语句。
  • JSP声明
        JSP声明将Java代码封装到<%!和%>之中,它里面的代码将被插进Servlet的
            _jspService方法的外面,所以,JSP声明可以用于定义JSP页面转换成的
            Servlet程序的静态代码块、成员变量和方法,并且JSP声明中的Java代码
            只能是静态代码块、成员变量和方法的定义。
        多个静态代码块、成员变量和方法可以定义在一个JSP声明中,
            也可以分别单独定义在多个JSP声明中。
        由于JSP隐式对象的作用范围仅限于Servlet的_jspService方法,
            所以在JSP声明中不能使用这些隐式对象。
  • EL表达式
        EL(Expression Language)表达式语言可以非常方便的访问JSP页面相关的数据
            和支持基本的算术、关系和逻辑运算。EL表达式的基本语法格式为“${表达式}”,
        它可以出现在JSP自定义标签和标准标签的属性值中,
            其计算结果将作为标签的属性值或属性值的一部分;
        EL表达式也可以出现在模板元素中,其计算结果将插入进当前的输出流中。
        EL表达式相比JSP脚本元素而言,具有以下优点:
            (1)使用EL表达式可以非常方便地访问JSP页面相关的数据。
            (2)如果表达式的计算结果为null,JSP脚本表达式将输出内容为“null”的
                字符文本,而EL表达式会将它强制转换成空字符串("")后再输出。
            (3)在EL表达式中还可以使用empty操作符来判断一个参数是否为null,
                某个集合或字符串中的内容是否为空。
            (4)EL表达式还具有JavaScript等脚本语言的优点,能够对字符串、
                数字等各种类型的数据进行自动转换。
  • JSP注释
        与其他各种编程语言一样,JSP也有自己的注释方式,其格式如下:
            <%-- 注释信息 --%>
        JSP注释与JSP页面中的Java注释和HTML注释的区别:
            JSP引擎在翻译JSP页面时,将忽略JSP注释中的所有内容。
            在JSP引擎看来,出现在JSP脚本元素中的Java注释属于Java代码的一部分,
                它们将被原封不动地插入进Servlet源文件中,
                但在Servlet源文件被编译成class文件时由Java编译程序忽略。
            在JSP引擎看来,JSP页面中的HTML注释就是一段文本,其处理方式
                与普通的文本内容完全一样,都被转换成out.print语句输出到客户端。
  • 特殊字符序列的转义处理
        1、EL表达式内的转义
            EL表达式内的任何字符系列都不需要进行转义处理,
            其中的“${”和“}”与普通字符序列的处理方式完全相同。
        2、JSP脚本元素内的转义
            因为脚本元素开始处已经使用了字符序列“<%”来表示脚本元素的开始,
            JSP引擎不会再把脚本元素内的字符序列“<%”当做脚本元素的开始分界符处理,
            所以,脚本元素内部可以直接使用字符序列“<%”来表达其字面意义。但是,
            为了JSP引擎不要把脚本元素内的字符系列“%>”当做脚本元素的结束分界符处理,
            要在脚本元素内表达字面意义上的“%>”,必须用“%\>”进行转义。
            如果要表达字面意义上的“%\>”,应该使用“%\\>”。
        3、JSP模板元素内的转义
            为了让JSP引擎不要把JSP模板元素内的字符序列“<%”当做脚本元素的开始,
            要在JSP模板元素内表达字面意义上的“<%”,必须用“<\%”进行转义。
            因为在模板元素中,JSP引擎还没有遇到脚本元素的开始分界符,
            它不会把“%>”当做脚本元素的结束分界符处理,所以,
            JSP模板元素内可以直接使用字符序列“%>”来表达其字面意义。
            如果要表达字面意义上的“<\%”,应该使用“<\\%”。
            为了让JSP引擎不要把JSP模板元素内的字符序列“${”当做EL表达式的开始,
            在支持EL表达式的JSP页面中,如果要表达字面意义上的“${”,这时候就必须
            使用“\${”。如果表达字面意义上的“\$”,必须使用“\\$”。
        4、JSP标签的属性内的转义
            如果使用单引号(')将属性值部分引起来,那么属性值中的单引号要用“\'”表示。
            如果使用双引号(")将属性值部分引起来,那么属性值中的双引号要用“\"”表示。
            反斜杠(\)要用“\\”表示。
            在支持EL表达式的JSP页面中,“$”可以使用“\$”来表示。
            “<%”要用“<\%”表示。
            “%>”要用“%\>”表示。
  • 如何查找JSP页面中的错误
        当客户端访问一个JSP页面时,JSP引擎将对相应的JSP文件进行
            修改检查,如果发生过修改则重新翻译和编译该JSP文件。
            在JSP引擎对一个JSP页面执行这样的检查后的一个时间段内,
            如果客户端又访问该JSP页面,JSP引擎将不再进行修改检查,
            而是直接查找该JSP页面生成的Servlet字节码,无论新旧,
            只要找到,JSP引擎就调用该Servlet字节码对客户端进行响应。
            当修改一个JSP页面错误后,不要快速连续刷新浏览器对它的访问,
            而是每次等待一会后再进行刷新,就能查看到其真实的错误信息。

三、JSP指令

  • JSP指令简介
        JSP中还定义了一种称之为JSP指令(directive)的元素,
            JSP指令是为了JSP引擎而设计的,它们并不直接产生任何可见输出,
            而只是告诉引擎如何处理JSP页面中的其余部分。
            JSP指令必须嵌套在<%@和%>之中,其基本语法格式如下:
            <%@ 指令 属性名="值" %>
            其中,属性名是大小写敏感的。
        在JSP2.0中,定义了page、include和taglib三种指令。
        如果要在一个JSP页面中设置同一条指令的多个属性,
            可以使用多条指令语句单独设置每个属性,
            也可以使用同一条指令语句设置该指令的多个属性。
  • page指令
        page指令用于定义JSP页面的各种属性。
        无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。
        page指令最好是放在JSP页面的起始位置。
        JSP2.0规范中定义的page指令的完整语法如下:
            <%@ page
                [ language="java" ]
                [ extends="package.class" ]
                [ import="{package.class | package.*}, ..." ]
                [ session="true | false" ]
                [ buffer="none | 8kb | sizekb" ]
                [ autoFlush="true | false" ]
                [ isThreadSafe="true | false" ]
                [ info="text" ]
                [ errorPage="relative_url" ]
                [ isErrorPage="true | false" ]
                [ contentType="mimeType [ ;charset=characterSet ]" | 
                    "text/html ; charset=ISO-8859-1" ]
                [ pageEncoding="characterSet | ISO-8859-1" ]
                [ isELIgnored="true | false" ]
            %>
        1、language属性
            language属性用来说明JSP页面所使用的脚本语言,其默认值为java。
        2、extends属性
            extends属性用来指定JSP页面翻译成的Servlet所继承的父类,
            一般不要设置这个属性,而是让JSP引擎自行处理就可以了。
        3、import属性
            import属性指定在JSP页面翻译成的Servlet源文件中导入的包或类。
            JSP引擎自动导入下面的包:
                java.lang.*
                javax.servlet.*
                javax.servlet.jsp.*
                javax.servlet.http.*
        4、session属性
            session属性用于指定在JSP页面翻译成的
            Servlet中是否预先创建好session隐式对象,
            也就是指定在JSP脚本元素中是否可以使用session隐式对象。
        5、buffer属性
            buffer属性用于指定out隐式对象的缓冲区大小,其默认值因服务器而定,
            一般是8KB。如果将buffer属性设置为none,则out对象不使用缓冲区。
        6、autoFlush属性
            autoFlush属性用于设置当out隐式对象的缓冲区已满时,
            是将其中的内容刷新到客户端,还是抛出缓冲区的异常,其默认值为true,
            表明缓冲区已满时刷新其中的内容。如果将buffer属性设置为了none,
            那么就不能把autoFlush属性设置为false了。
        7、isThreadSafe属性
            isThreadSafe属性用于设置JSP页面是否是线程安全的,
            是否还需要让JSP页面翻译成的Servlet实现SingleThreadMode接口。
            其默认值true,表明JSP页面开发者已经考虑了线程安全的问题,
            即已经对共享资源的访问进行了同步处理,
            不需要JSP引擎对当前JSP页面翻译成的Servlet做线程安全的处理。
        8、info属性
            info属性用于将一个文本字符串定义为JSP页面翻译成的Servlet的描述信息,
            Web容器可以通过Servlet.getServletInfo方法获得该文本字符串。
        9、errorPage属性
            errorPage属性用于设置另外一个JSP页面来处理当前JSP页面发生的异常。
            如果设置了某个JSP页面的errorPage属性,
            那么在web.xml文件中设置的异常错误处理将不对该页面起作用。
        10、isErrorPage属性
            isErrorPage属性用于设置当前页面是否是专门用于处理
            其他页面的未捕获异常的JSP页面,其默认值为false。
            只有明确地将page指令的isErrorPage属性设置为true,
            当前页面才能被用做异常处理的JSP页面,
            脚本元素中才可以使用exception隐式对象。
        11、contentType属性
            contentType属性用于设置响应正文的MIME类型和说明JSP文件中的
            文本内容的字符集编码。contentType属性的默认MIME类型为text/html,
            默认字符集为ISO-8859-1。
            page指令的contentType属性还具有说明JSP源文件的字符编码的作用,
            但这是在页面中没有通过其他方式指定JSP源文件的字符集编码时
            才起作用的一个次要功能。
        12、pageEncoding属性
            pageEncoding属性用于指定JSP源文件中的字符所使用的字符集编码。
            如果在JSP页面中没有设置page指令的contentType属性,
            那么page指令的pageEncoding属性还具有指定Servlet运行时
            输出给客户端的响应正文的字符集编码的作用。
        13、isELIgnored属性
            isELIgnored属性用于指定当前JSP页面中是否支持EL表达式。
  • include指令
        include指令用于通知JSP引擎在翻译当前JSP页面时
            将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,
            这种在源文件级别进行引入的方式称之为静态引入。
            当前JSP页面与静态引入的页面紧密结合为一个Servlet。
            使用include指令的语法如下:
            <%@ include file="relativeURL"%>
            (1)被引入的文件必须遵循JSP语法。
            (2)被引入的文件可以使用任意的扩展名,
                JSP引擎也会按照处理JSP页面的方式处理它里面的内容,
                JSP规范建议使用.jspf(JSPfragments)作为静态引入文件的扩展名。
            (3)在将JSP文件翻译成Servlet源文件时,
                JSP引擎将合并被引入的文件与当前JSP页面中的指令元素,
                所以,除了import和pageEncoding属性之外,
                page指令的其他属性不能在这两个页面中有不同的设置值。
            (4)除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,
                插入位置与include指令在当前JSP页面中的位置保持一致。
            (5)引入文件与被引入文件是在被JSP引擎翻译成Servlet的过程中进行合并的,
                而不是先合并源文件后再对合并的结果进行翻译。
            (6)Web容器在访问JSP页面时,可以检测它所引入的其他文件是否发生了修改,
                如果发生了修改,则重新编译当前JSP页面。
            (7)file属性的设置值必须使用相对路径,如果以“/”开头,
                则表示相对于当前Web应用程序的根目录,否则,表示相对于当前文件。

四、out对象

  • 在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。
        out对象是通过调用pageContext对象的getOut方法返回的。
        JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法
        返回的PrintWriter对象前面的缓冲包装类对象,
        只有向out对象中写入了内容,且满足如下任何一个条件时,
        out对象才去调用ServletResponse.getWriter方法,
        并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容
        真正写入到Servlet引擎提供的缓冲区中:
            设置page指令的buffer属性关闭了out对象的缓冲功能
            写入到out对象中的内容充满了out对象的缓冲区
            整个JSP页面结束。

五、pageContext对象

  • pageContext对象简介
        pageContext对象是javax.servlet.jsp.PageContext类的实例对象,
            javax.servlet.jsp.PageContext类是javax.servlet.jsp.JspContext的子类。
            pageContext对象封装了当前JSP页面的运行信息,
            它提供了返回JSP页面的其他隐式对象的方法。
            pageContext对象是通过调用JspFactory.getPageContext方法返回的,
            getPageContext方法的完整语法如下:
            public PageContext getPageContext(
                javax.servlet.Servlet servlet,
                javax.servlet.ServletRequest request,
                javax.servlet.ServletResponse response,
                javax.lang.String errorPageURL, boolean needsSession,
                int buffer, boolean autoflush)
            其中第一个参数代表当前JSP页面所翻译成的Servlet;
            第二个参数和第三个参数分别是当前的请求对象和响应对象;
            第四个参数为错误处理页;第五个参数表示是否创建session对象;
            第六个参数为out对象的缓冲区大小;第七个参数表示缓冲区已满时是否自动刷新。
        PageContext类中也提供了一些方法来调用其他隐式对象的方法。
        PageContext类中定义了一个setAttribute方法来将对象存储进
            pageContext对象内部的一个HashMap对象中,同时也定义了一个
            getAttribute方法来检索存储在该HashMap对象中的对象。
  • 获得其他隐式对象
        PageContext类中定义了如下一些方法来分别返回JSP页面中的其他隐式对象:
            getException方法返回exception隐式对象;
            getPage方法返回page隐式对象;
            getRequest方法返回request隐式对象;
            getResponse方法返回response隐式对象;
            getServletConfig方法返回config隐式对象;
            getServletContext方法返回application隐式对象;
            getSession方法返回session隐式对象;
            getOut方法返回out隐式对象。
  • 引入和跳转到其他资源
        PageContext类中定义了一个forward方法和两个include方法来分别简化和代替
            RequestDispatcher.forward方法和RequestDispatcher.include方法的调用,
            它们的完整定义语法如下:
            public void forward(java.lang.String relativeUrlPath)
                throws javax.servlet.ServletException, java.io.IOException
            public void include(java.lang.String relativeUrlPath)
                throws javax.servlet.ServletException, java.io.IOException
            public void include(java.lang.String relativeUrlPath, boolean flush)
                throws javax.servlet.ServletException, java.io.IOException
            传递给这些方法的资源路径都只能是相对路径,如果路径以“/”开头,
                表示相对于当前Web应用程序的根目录,
                否则,表示相对于当前JSP所映射到的访问路径。
            第一个include方法在引入资源前先将out对象中的内容
                刷新到Servlet引擎提供的缓冲区中;第二个include方法则通过
                一个参数来决定在引入资源前是否刷新out对象中的内容。
            forward方法在将请求转发给其他资源之前,先清空out对象中已写入的内容,
                然后在调用RequestDispatcher.forward方法执行请求转发。
  • 访问各个域范围中的属性
        在application,session,request,pageContext对象中都可以调用
            setAttribute方法和getAttribute方法来设置和检索属于各自域范围内的属性,
            在这4个对象中设置的属性对象的作用域是不同的。
            存储在application对象中的属性可以被同一个Web应用程序中的
                所有Servlet和JSP页面访问;
            存储在session对象中的属性可以被属于同一个会话的
                所有Servlet和JSP页面访问;
            存储在request对象中的属性可以被属于同一个请求的
                所有Servlet和JSP页面访问;
            存储在pageContext对象中的属性仅可以被
                当前JSP页面的当前响应过程中调用的各个组件访问。
        1、setAttribute方法
            setAttribute方法有两种重载形式,它们的语法定义如下:
            public void setAttribute(
                java.lang.String name, java.lang.Object value)
            public void setAttribute(
                java.lang.String name, java.lnag.Object value, int score)
            第一个setAttribute方法用于将一个对象与一个名称关联后
                存储进当前的PageContext对象中。
            第二个setAttribute方法用于将一个对象与一个名称关联后
                存储进scope参数指定的域范围中,域范围用PageContext类中定义的
                4个整数常量来表示,它们分别是:APPLICATION_SCOPE,
                SESSION_SCOPE,REQUEST_SCOPE,PAGE_SCOPE。
        2、getAttribute方法
            getAttribute方法有两种重载形式,它们的语法定义如下:
            public java.lang.Object getAttribute(
                java.lang.String name)
            public java.lang.Object getAttribute(
                java.lang.String name, int scope)
            第一个getAttribute方法用于从当前pageContext对象中
                返回指定名称的属性对象;
            第二个getAttribute方法用于从scope参数指定的域范围中
                返回指定名称的属性对象。
        3、removeAttribute方法
            removeAttribute方法有两种重载形式,它们的语法定义如下:
                public void removeAttribute(java.lang.String name)
                public void removeAttribute(java.lang.String name, int scope)
            第一个removeAttribute方法用于从当前PageContext对象中
                删除指定名称的属性;
            第二个removeAttribute方法用于从scope参数指定的域范围中
                删除指定名称的属性。
        4、getAttributeNamesInScope方法
            getAttributeNamesInScope方法用于返回某个域范围的所有属性名,
            这些属性名将被包含在一个Enumeration对象中返回。
        5、findAttribute方法
            findAttribute方法用于一次从page、request、session、application
            4个域范围中查找某个指定名称的属性。
  • pushBody方法与popBody方法
        PageContext类中有一对方法,
            即pushBody方法与popBody方法来管理嵌套的JspWriter流,
            以便支持扩展标签的功能。
            PageContext对象内部使用一个“out”属性来指向一个JspWriter对象,
            PageContext.getOut()方法的返回值就是“out”属性所指向的JspWriter对象,
            在第一次调用pushBody方法前,“out”属性指向JSP页面的隐式out对象。
            pushBody方法用于返回一个新产生的BodyContent对象,
            并让PageContext对象中的“out”属性指向这个新产生的BodyContent对象
            和将“out”属性原来指向的JspWriter对象保存起来,
            此后的PageContext.getOut()方法返回的结果
            将是pushBody方法内产生那个BodyContent对象。
            BodyContent是JspWriter的一个子类。
            对于每一个pushBody方法调用,
            最后都要调用一个对应的popBody方法来恢复pushBody方法调用前的状态,
            popBody方法将PageContext对象中的“out”属性重新指向
            上次的pushBody方法保存起来的JspWriter对象,并返回这个JspWriter对象。

六、JSP标签

  • JSP规范中定义了一些标准的Action元素,
        这些元素的标签名都是以jsp作为前缀,并且全部采用小写。
  • <jsp:include>标签
        <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,
            这种在JSP页面执行时的引入方式称之为动态引入,其语法如下:
            <jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
            其中,page属性用于指定被引入资源的相对路径,它也可以通过执行
            一个表达式来获得。flush属性指定在插入其他资源的输出内容时,
            是否先将当前JSP页面的已输出的内容刷新到客户端,其默认值是“false”。
            下面是<jsp:include>标签与include指令的比较:
            (1)<jsp:include>标签是在当前JSP页面的执行期间插入被引入资源的输出内容,
                当前JSP页面与被动态引入的资源是两个彼此独立的执行实体,
                被动态引入的资源必须是一个能独立被Web容器调用和执行的资源。
            (2)<jsp:include>标签的作用与运行原理类似RequestDispatcher.include方法,
                被引入页面不能改变响应状态码,也不能设置响应头,
                以此相关的语句的执行结果将被忽略。include指令没有这方面的限制。
            (3)<jsp:include>标签的执行效率要比include指令稍微差一点,
                但它的灵活性却要好得多。
            (4)使用<jsp:include>标签和include指令
                都可以把一个页面的内容分成多个组件来生成。
            (5)<jsp:include>标签对JSP引擎翻译JSP页面的过程没有影响,
                include指令对JSP引擎翻译JSP页面的过程起作用。
            (6)<jsp:include>标签可以传递参数信息
                和接受通过表达式动态产生的被引入资源的名称。
            (7)<jsp:include>标签的page属性的设置值必须使用相对路径,如果以“/”开头,
                表示相对于当前Web应用程序的根目录(注意不是站点根目录),
                否则,表示相对于当前页面。
  • <jsp:forward>标签
        <jsp:forward>标签用于把请求转发给另外一个资源,其语法如下:
            <jsp:forward page="relativeURL | <%=expression%>" />
            其中,page属性用于指定请求转发到的资源的相对路径,
            它也可以通过执行一个表达式来获得。
  • <jsp:param>标签
        当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给的资源
            是一个能动态执行的程序时,例如Servlet和JSP页面,那么,
            还可以使用<jsp:param>标签向这个程序传递参数信息。语法:
            <jsp:param name="paramName" value="paramValue | <%=expression%>" />
            在<jsp:include>和<jsp:forward>标签中可以
            使用多个<jsp:param>标签来传递多个参数。
  • <jsp:plugin>标签
        <jsp:plugin>标签用来根据浏览器的类型,
            在当前JSP页面产生的网页文档内容中插入调用Java Applet的语句,
            即生成引用Java Applet的<OBJECT>或<EMBED>元素内容。其语法如下:
            <jsp:plugin 
                type="bean | applet" 
                code="classFileName" 
                codebase="classFileDirectoryName"
                [ name="instanceName" ]
                [ archive="URIToArchive, ..." ]
                [ align="bottom | top | middle |left | right" ]
                [ height="displayPixels" ]
                [ width="displayPixels" ]
                [ hspace="leftRightPixels" ]
                [ vspace="topBottomPixels" ]
                [ jreversion="JREVersionNumber" ]
                [ nspluginurl="URLToPlugin" ]
                [ iepluginurl="URLToPlugin" ] >
                [ <jsp:params>
                    <jsp:param name="name" value="value | <%= expression%>" />
                    ...
                </jsp:params> ]
                [ <jsp:fallback> text message for user </jsp:fallback> ]
            </jsp:plugin>
            (1)type="bean|applet"
                type属性用于指定插件对象的类型。
            (2)code="classFileName"
                code属性用于指定浏览器要调用的Applet或Bean的Java类名。
            (3)codebase="classFileDirectoryName"
                codebase属性用于指定Applet或Bean的Java Class文件所在的目录。
            (4)jreversion="JREVersionNumber"
                jreversion用于指定运行Applet或Bean的插件的JRE的版本。
            (5)nspluginurl="URLToPlugin"
                nspluginurl用于指定Netscape Navigator浏览器下载JRE插件的地址。
            (6)iepluginurl="URLToPlugin"
                iepluginurl用于指定IE浏览器下载JRE插件的地址。
            (7)<jsp:params>标签
                嵌套在<jsp:plugin>标签中的<jsp:params>和<jsp:param>标签
                用于向Applet或Bean传递参数。
            (8)<jsp:fallback>标签
                <jsp:fallback>标签用于设置浏览器不能正常显示Applet或Bean时,
                显示一段替代的文本给用户。
  • 脚本元素标签
        JSP2.0规范中定义了一些标签来替代JSP页面中脚本片断、JSP声明、JSP表达式,
            以便这些脚本元素都可以采用XML的语法编写,具体的替代方式如下:
            <% code %>可替代为<jsp:scriptlet> code </jsp:scriptlet>
            <%! code %>可替代为<jsp:declaration> code </jsp:declaration>
            <%= express %>可替代为<jsp:expression> express </jsp:expression>
  • 指令标签
        JSP2.0规范中定义了<jsp:directive.directiveType>标签
            来替代<%@ directive... %>语句,以便采用XML的语法格式来定义JSP指令。
            <jsp:directive.directiveType>标签的语法如下:
            <jsp:directive.directiveType attribute="value" />
            下面是一些采用XML语法定义JSP指令的例子:
            <%@ page import="java.util.*"%>
                可替换为<jsp:directive.page import="java.util.*" />
            <%@ include file="b.spf" %>
                可替换为<jsp:directive.include file="b.jspf" />
  • <jsp:text>标签
        JSP2.0规范中定义了一个<jsp:text>标签,
            可以将JSP页面中的模板内容封装在这个标签当中,
            嵌套在<jsp:text>标签中的内容将被作为模板内容输出给客户端。
            <jsp:text>标签中不能嵌套任何形式的子标签,
            如果输出给客户端的内容中包含HTML标签或XML语法规定的特殊字符,
            应将这些内容封装在CDATA区中,或用预定义实体替代特殊字符。
  • 完全使用标签编写JSP页面

七、JSP的中文乱码问题

  • JSP中文乱码的根源
        JSP程序中出现中文乱码的各种可能性:
        (1)Servlet程序从请求消息中获取请求参数和从数据库、文件、
            键盘等外设中读取一个字符串时都要将底层的字节流转换成字符串,
            但转换过程中指定的字符集编码与外设所输入内容的字符集编码不一致。
        (2)Servlet程序将字符串输出到浏览器、屏幕、文件和数据库时都要
            将字符串转换成底层的字节流,但转换过程中指定的字符集编码
            与外设所能显示的字符集编码不一致。
        (3)JSP引擎将JSP源文件翻译成Servlet源文件时,其选择的字符集编码
            与JSP源文件实际使用的字符集编码不一致。
        (4)JSP引擎编译由JSP源文件翻译成的Servlet源文件时,其选择的
            字符集编码与Servlet源文件的字符集编码不一致。
  • JSP引擎翻译JSP页面时的中文乱码问题
        当JSP引擎要确定某个JSP文件的字符集编码时,首先在Web应用程序的
            部署描述符中查找是否有与该JSP文件匹配的<page-encoding>元素设置,
            如果没有找到则在JSP源文件中查找page指令的pageEncoding属性。
            如果没有找到<page-encoding>元素设置和page指令的pageEncoding属性,
            JSP引擎接着在page指令的contentType属性中查找字符集编码,
            如果还没找到则使用默认的ISO8859-1作为JSP源文件的字符集编码。
  • 静态引入时的中文乱码问题
        引入和被引入的页面都设置page指令的contentType属性可解决。
  • <jsp:param>标签传递中文参数时的问题
        <%request.setCharacterEncoding("GB2312");%>
        在server.xml文件中设置<Connector>元素的useBodyEncodingForURI属性为true。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值