[Servletamp;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()把数据送出到客户端时,就会产生异常。buffer属性
用于设置到客户端的输出串流缓冲区的大小,设置时必须指定单位,流入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,所以错误可能发生在以下三个时候:
- JSP转换为Servlet源代码时
语法错误等 - Servlet源代码进行编译时
忘记部署相关的类等 - Servlet加载容器进行服务单发生运行时错误
如NullPointerException等
[Servletamp;JSP] 从JSP到Servlet相关推荐
- 只用jsp实现同样的Servlet功能
Jsp最终都会转化成java形式的Servlet执行,因此也可以说Jsp的本质就是Servlet,在jsp执行后,会在服务器上(例如tomcat中)生成.java以及.class文件.具体执行过程如下 ...
- javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/
今天在启动tomcat的时候,出现了这个错误 javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletC ...
- java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/
今天启动tomcat的时候出现了这样的错误 java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationC ...
- jsp stc_为什么说jsp的本质是servlet?
我们知道,一个实现了servlet接口的java类被称为一个servlet,jsp实现了servlet接口,所以说jsp本质上是一个servlet 不过,jsp这个实现接口的方式隐藏得比较深,得从源码 ...
- [JSP暑假实训] 二.JSP网站创建及Servlet实现注册表单提交、计算器运算
本系列文章是作者暑假给学生进行实训分享的笔记,主要介绍MyEclipse环境下JSP网站开发,包括JAVA基础.网页布局.数据库基础.Servlet.前端后台数据库交互.DAO等知识. 本篇文章开始讲 ...
- java jsp常见问题_jsp和servlet常见问题总结
四.jsp/servlet部分 1.Tomcat的优化经验 去掉对web.xml的监视,把jsp提前编辑成Servlet. 有富余物理内存的情况,加大tomcat使用的jvm的内存 2.Tomcat根 ...
- BeginnersBook JSP、JSTL、Servlet 教程
来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request. 请您勇敢地去翻译和改 ...
- 简单介绍分析一下JSP所生成的Servlet代码
以HelloWorld3.jsp为例 <%@ page language="java" contentType="text/html; charset=UTF-8& ...
- maven jsp报错javax.servlet.http.HttpServlet“ was not found on the Java Build Path
maven jsp报错javax.servlet.http.HttpServlet" was not found on the Java Build Path 缺少jar包 <!-- ...
最新文章
- JDK源码解析 Integer类使用了享元模式
- Angular 项目 ng serve 背后发生的事情
- Jenkins进阶系列之——07更改Jenkins的主目录
- Spring定时任务并行(异步)处理
- html轮播图原理,30_用js实现一个轮播图效果,简单说下原理
- Java Web学习总结(35)——HTTP状态码汇总
- 排土场、弃渣场和尾矿库的区别
- python基础(初识Python)
- 人工智能+社交 csdn_关于AI和社交媒体虚假信息,我们需要尽快进行三大讨论
- ppapi,npapi
- 自动驾驶与汽车现状前沿
- 100以内的质数(基础算法)
- 中美日印程序员收入对比
- SpringBoot 项目(若依脚手架)2
- 创建一个字体wx.Font
- MPC (c++) 和 udacity模拟器仿真
- C语言一些有趣的现象(例子) (译)
- 室内定位——如何在微信小程序中获取Beacon的RSSI值
- 数据仓库工具箱 第10节 金融服务
- 三国演义中最具个性的名言