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等

[Servlet&amp;JSP] 从JSP到Servlet的更多相关文章

  1. JSP转译成Servlet详细过程

    很多人都会认为JSP的执行性能会和Servlet相差很多,其实执行性能上的差别只在第一次的执行.因为JSP在执行第一次后,会被编译成 Servlet的类文件,即.class,当再重复调用执行时,就直接 ...

  2. Servlet3.0 jsp跳转到Servlet 出现404错误的路径设置方法

    最近又遇到了这种问题,百度了好久,发现有人说要在action的路径里面写Servlet文件的绝对路径,比如说,单独打开servlet的地址为http://localhost:8080/TomcatTe ...

  3. Servlet,jsp,JSP技术 ,JSP编程

     一.Servlet 思考 1 浏览器可以直接打开JAVA/class文件吗? 不可以 2浏览器可以打开HTML.JS 文件吗? 可以 3 JAVA程序可以生成HTML文件吗?可以的,用IO流. 4 ...

  4. 【JSP】JSP基础学习记录(四)—— Servlet

    序: 众所周知JSP的基础也就是Servlet,如果单纯用Servlet类来响应用户的HTTP请求可以吗?答案是肯定的.JSP中的9个内置对象只是自动帮我们初始化的,没有他们一样可以实现web.只是工 ...

  5. Servlet的生命周期,并说出Servlet和CGI的区别,Servlet与JSP的区别

    一.Servlet 生命周期 1.加载 2.实例化 3.初始化 4.处理请求 5.销毁 二.Servlet与cgi的区别: Servlet处于服务器进程中,它通过多线程方式运行其service方法,一 ...

  6. jsp页面编译成Servlet类文件

    package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.js ...

  7. Servlet跳转到Jsp的指定div

    问题: 首页点击一个连接,切换div(id = cc_bi)             <div id="K_a">                 <a href ...

  8. jsp页面转发到servlet

    一个简单的例子来了解一下jsp页面转发到servlet的过程,环境 eclipse.tomcat 1.工程目录结构如下 2.各部分代码如下 1>index.jsp <%@ page lan ...

  9. tomcat各版本和jsp、jstl、servlet的依赖关系(转)

    Servlet / JSP / Tomcat  Version  Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...

  10. Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File &quot;/pageFoo

    1.错误描述 Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/ ...

随机推荐

  1. 关于ios 和 android 录音(语音)对聊文件格式问题

    关于ios 和 android 录音(语音)对聊文件格式问题 在做语音对讲的时候,将会碰到录制语音格式的问题,这些需要跨平台我们可能需要使用双方平台都支持的格式,或者执行编码转换 解决方式如下: wa ...

  2. 大数据学习——scala函数与方法

    package com /** * Created by Administrator on 2019/4/8. */ object TestMap { def ttt(f: Int => Int ...

  3. 【LeetCode】Binary Tree Preorder Traversal(二叉树的前序遍历)

    这道题是LeetCode里的第144道题. 题目要求: 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很 ...

  4. PHPStorm.WebStrom等系列官方开发工具配置本地项目与运程服务器同步

    PHPStorm.WebStrom配置本地项目与运程服务器同步 说明:PHPStorm.WebStrom等官方的系统开发工具配置本地项目与运程服务器同步的方法都基本一致没有,几乎没有什么不同之处,我们 ...

  5. Oracle实例和数据库区别

          什么是数据库,其实很简单,数据库就是存储数据的一种媒介.比如常用的文件就是一种,在Oracle10G中,数据的存储有好几种.第一种是文件形式,也就是在你的磁盘中创建一批文件,然后在这些文件 ...

  6. 测试openssl_encrypt

    <?php //$string = 'It works ? Or not it works ?'; //$pass = '1234'; //$method = 'aes128'; // // / ...

  7. hdu6078[优化递推过程] 2017多校4

    这道题一眼看过去好像和最长公共子序列有点像. 一开始只想到暴力的推法, 令dp[i][j][k]表示 a[i]=b[j](即以ai,bj为结尾的波浪序列的方案数), 且最终状态为k(0,1分别代表下降 ...

  8. 开发者选择短视频SDK,为何青睐七牛云?

    从文字到图片再到视频的互联网内容媒介发展途径,随着 5g 技术的逐渐落地愈发清晰.短视频市场中的角力也随着诸多资本和创业者的涌入,进入到白热化阶段.这样的情况下,选择合适的短视频SDK产品就显得尤为重 ...

  9. NOIP2017赛前模拟(3):总结

    题目: 1.购买板凳(100) 大意:区间修改最后查询全局最大值; 2.新排序(40分暴力) 大意:给一串长度小于100000的数列···每次操作找出序列中严格小于其左边的数字或者严格大于其右边的数字 ...

  10. NOIP2017赛前模拟1:总结

    题目: 1.造盒子 题目描述 企鹅豆豆收到了面积为 K 的一块橡皮泥.但是他没有合适的盒子来装下这个橡皮泥.所以他打算造一个盒子. 制造台是有方形网格的平台,每个小正方形边长为 1 .现在豆豆有两类木 ...