zoukankan      html  css  js  c++  java
  • [Servlet&JSP] 从JSP到Servlet

    JSP与Servlet是一体的两面,JSP最后都会被容器转译为Servlet源码,自己主动编译为.class文件,载入.class文件然后生成Servlet对象。

    由容器转译后的Servlet类具有_jspInit()、_jspDestroy()、_jspService()等方法,名称中有下划线前缀,表示这些方法都是容器转译时维护的,我们不应该从写这些方法。假设想要做些JSP初始化或收尾的工作。则应定义jspInit()或jspDestryoy()方法。

    指示元素

    JSP指示(Directive)元素的主要目的在于。指示容器将JSP转译为Servlet源码时,必须遵守的一些信息。

    指示元素的语法例如以下:

    <%@ 指示类型 [属性="值"]* %>

    在JSP中有三种经常使用的指示类型:page、include和taglib。

    • page指示类型告知容器怎样转译当前的JSP网页。
    • include指示类型告知容器将别的JSP页面包含进来进行转译。
    • taglib指示类型告知容器怎样转译这个页面中的标签库(Tag Library)。

    指示元素中能够有多对属性/值,必要时。同一个指示类型能够用数个指示元素来设置。

    <%@ page import="java.util.Date" %>
    <%@ page language="java" contentType="text/html; utf-8"
        pageEncoding="utf-8"%>

    page指示类型中的import告知容器,转译JSP时必须在源码中包含的import语句。

    也能够在一个import语句中。使用逗号分隔开数个import的内容;page指示类型中的contentType属性告知容器,在转译JSP时,必须使用HttpServletRequest的setContentType(),调用方法时传入的參数就是contentType的属性值;pageEncoding属性则是告知容器转译和编译时怎样处理这个JSP网页中的文字编码。以及内容类型附加的charset设置。假设网页中包含非ASCII编码范围内的字符(如中文),就要指定正确的编码格式。才不会出现乱码。

    能够在使用page指示类型时一行一行的编写,也能够编写在同一个元素中。

    page指示类型另一些能够设置的属性,概略说明例如以下:

    • info属性
      用于设置当前JSP页面的基本信息,这个信息最后会转换为Servlet成U型中使用getServletInfo()所取得的信息。

    • autoFlush属性
      用于设置输出流时候要自己主动清除。默觉得true。

      假设设置为false,当缓冲区满了又没调用flush()把数据送出到client时,就会产生异常。

    • buffer属性
      用于设置到client的输出串流缓冲区的大小,设置时必须指定单位,流入buffer=”16kb”。默认是8kb。

    • errorPage属性
      用来设置当JSP执行错误而产生异常时。该转发哪一个页面处理这个异常。

    • extends属性
      用来指定JSP网页转译为Servlet程序之后。应该继承哪一个类。以Tomcat为例。默认是继承至HttpJspBase(它继承至HttpServlet)。这个属性非常少会使用到。

    • isErrorPage属性
      设置JSP页面是否为处理异常的页面。这个属性要与errorPage配合使用。

    • language属性
      指定容器使用哪种语言的语法来转译JSP网页,只是其实眼下仅仅能使用Java的语法且是默认的。

    • session属性
      设置在转译后的Servlet源码中是否具有创建HttpSession对象的语句。

      默认是true,若有些页面不需作会话管理。设为false能够添加一些性能。

    • isELIgnored
      设置JSP网页中是否忽略表达式语言,默认是false。

      这个设置会覆盖web.xml中的<el-ignored>设置。

    • isThreadSafe属性
      告诉容器在编写JSP时是否注意到线程安全。默认值为true。

      假设设置为false,则转译之后的Servlet会实现SingleThreadMOdel接口。每次请求时将创建一个Servlet实例来服务请求,尽管能够避免线程安全问题,但这会影响到性能,极度不建议设置为false。

    incude指示类型用来告知容器将包含另一个网页的内容进行转译。

    <%@include file="/WEB-INF/header.jsp" %>
    <%@include file="/WEB-INF/foot.jsp" %>

    使用命令元素include来包含其它网页内容时,因为是在转译时期就决定了转译后的Servlet内容,是一种静态的包含方式。<jsp:include>标签则是在执行时将别的网页动态包含进来进行响应的方式。

    声明、Scriptlet与表达式元素

    JSP网页会转译为Servlet类,转译后的Servlet类应该包含哪些类成员、方法声明或是哪些语句,在编写JSP时,能够使用声明(Declaration)元素、Scriptlet元素以及表达式(Expression)元素来指定。

    声明元素

    声明元素的语法例如以下:

    <%! 类成员或方法声明 %>

    <%!%>之间声明的程序代码,都将转译为Servlet中的类成员或方法。

    在使用<%!%>声明变量时,必须小心数据共享与线程安全的问题。

    容器默认会使用同一个Servlet实例来服务不同用户的请求。每一个请求就是一个线程,而<%!%>之间声明的变量相应至类变量成员,因此会有线程共享訪问的问题。

    假设有一些初始化操作想要在JSP载入时执行。则能够重写jspInit()方法,也能够用jspDestroy()定义结尾动作。定义这两个方法就是在<%!%>之间进行的,这样转译后的Servlet源码就会有相相应的片段出现。

    Scriptlet元素

    Scriptlet元素语法例如以下:

    <% Java语句 %>

    在Scriptlet元素中能够编写Java语句。就如同在Java的方法中编写语句一样,其实,当中所包含的内容将被转译为Servlet源码的_jspService()方法中的内容。

    直接在JSP中编写的HTML。都会变成out对象所输出的内容。Scriptlet出现的顺序,也就是在转译为Servlet后,语句出如今_jspService()中的顺序。

    表达式元素

    表达式元素语法例如以下:

    <%= Java表达式 %>

    表达式运算的结果将直接输出为网页的一部分。在表达式元素中不用加上分好(;)。

    隐含对象

    隐含对象 说明(转译后对象的对象)
    out JspWriter–>PrintWriter
    request HttpServletRequest
    resposne HttpServletResponse
    config ServletConfig
    application ServletContext
    session HttpSession
    pageContext pageContext,它提供了JSP页面资源的封装
    exception Throwable,它代表JSP页面抛出的异常对象
    page this



    能够通过pageContext设置四种范围属性,而不用使用个别的pageContext、request、session、application来进行设置。以pageContext提供单一的API来关系属性的作用范围。能够使用下面的方法来进行设置。

    getAttribute(String name, int scope)
    setAttribute(String name, Object value, int scope)
    removeAttribute(String name, int scope)

    scope能够使用下面常数来指定:

    • pageContext.PAGE_SCOPE
    • pageContext.REQUEST_SCOPE
    • pageContext.SESSION_SCOPE
    • pageContext.APPLICATION_SCOPE

    其实,非常少会使用到pageContext,pageContext主要是在转译JSP为Servlet时。提供给容器一个单一訪问的界面。

    错误处理

    JSP终究会转译为Servlet,所以错误可能发生在下面三个时候:

    1. JSP转换为Servlet源码时
      语法错误等
    2. Servlet源码进行编译时
      忘记部署相关的类等
    3. Servlet载入容器进行服务单发生执行时错误
      如NullPointerException等
  • 相关阅读:
    Golang 学习之路
    Kubernetes 资源对象之DaemonSet
    Spring Cloud服务注册中心交付至kubernetes
    自动化运维之Ansible入门
    MySQL 高可用之主从复制
    Kubernetes 强大的namespace
    SaltStack RESTful API操作
    Kubernetes 服务自动发现CoreDNS
    2个月……
    一次游玩与这两周的一些感想
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7225659.html
Copyright © 2011-2022 走看看