JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

1、JSP运行原理

  当用户第一次访问JSP页面时,该页面会被JSPServlet翻译成一个Servlet源文件,然后将源文件翻译成.class文件。Servlet源文件和.class文件一般放在当前Work Space下的.metadata中,可以在该目录下搜索对应的Servlet源文件和.class文件。以下是一个简单的JSP程序,文件名称为index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" %>

<html>
<head>
<title>servlet学习</title>
</head>
<body>
<% out.println(new java.util.Date().toLocaleString()); %>
</body>
</html>

  搜索对应的Servlet源文件和.class文件,文件结构如下所示:

  可以看出,index.jsp文件被翻译成了index_jsp.java和index_jsp.class,打开index_jsp.java文件,翻译后的Servlet源码如下:

/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.0.30
* Generated at: 2016-05-27 01:49:52 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp; import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports { private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
} private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
} public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
} public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
} public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
} public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
} public void _jspInit() {
} public void _jspDestroy() {
} public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
} final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null; try {
response.setContentType("text/html; charset=utf-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("\t<title>servlet学习</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\t");
out.println(new java.util.Date().toLocaleString());
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}

  从代码中看出,index.jsp翻译后的Servlet类为index_jsp,其并没有实现Servlet接口,但是继承了org.apache.jasper.runtime.HttpJspBase类,在Tomcat源文件中查看HttpJspBase类源码可以得出:HttpJspBase继承了HttpServlet,也就是说index_jsp类也是一个Servlet。HttpJspBase中的service()直接调用了_jspService()方法,也就是调用了index_jsp中的_jspService()方法。

2、JSP基本语法

JSP表达式

  JSP表达式用于将程序数据输出到客户端,它将要输出的变量或者表达式直接封装在以"<%= expression %>"结尾的标记中。

<%= expression %>

JSP脚本片段

  JSP脚本片段是指嵌套在"<%"和"%>"之中的一条或多条Java程序代码,这些Java代码必须遵循Java语法规范,否则编译报错。

<%
int num = 1;
out.println(num);
%>

JSP声明

  当JSP页面被翻译成Servlet程序时,JSP包含的脚本片段、表达式、模板元素都将转换为Servlet中_jspService()方法的程序代码,这是,JSP脚本片段中定义的变量都将成为_jspService()中的程序代码,这时,JSP脚本片段中定义的方法都将插入到_jspService()中,这显然会引起语法错误。为了解决这个问题,在JSP提供了声明,以"<%!"开头,"%>"结尾。格式如下:

<%!
java代码
%>

JSP注释

  JSP有自己的注释方式,语法格式如下:

<%-- 注释信息 --%>

3、JSP指令

  JSP2.0中定义了page、include和taglib三种指令,每种指令都定义了各自的属性。

page指令

<%@ page 属性名="属性值" %>

page指令的主要常用属性

属性名称 气质范围 功能
language java jsp文件采用的语言,默认Java
import 任何报名、类名 指定导入的包或类
session true或false JSP是否内置session对象,默认session属性为true
buffer none或者数字+kb 指定缓存大小,也就是out缓冲区大小
isErrorPage true或者false 该页面是否是错误处理页面
errorPage 某个JSP页面的路径 制定一个错误处理页 

使用page指令程序示例

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.Date" %> <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>servlet学习</title>
</head>
<body>
<%= new Date() %>
</body>
</html>

include指令

  有时在JSP页面上需要包含一个HTML文件、文本文件时,可以通过include指令来实现,语法格式如下:

<%@ include file="relativeURL" %>

4、JSP隐式对象

  JSP页面中,有一些对象需要频繁使用,因此,JSP提供了9个隐式对象,他们是JSP默认创建的,可以直接在JSP页面上使用,以下是JSP的9个隐式对象。

隐式对象名称 类型 功能
out javax.servlet.jsp.JspWriter 页面输出
request javax.servlet.http.Request 得到用户请求信息
response javax.servlet.http.Response 服务器响应信息
config javax.servlet.ServletConfig 服务器配置,可获取初始化参数
session javax.servlet.http.HttpSession 保存用户信息
application javax.servlet.ServletContext 所有用户共享的信息
page java.lang.Object 当前页面转换后的Servlet类实例
pageContext javax.servlet.jsp.PageContext JSP页面容器
exception java.lang.Throwable JSP页面发生的异常,只在错误页起作用

out对象

  JSP页面中,需要向客户端发送文本内容时,可以使用out对象来实现,其是javax.servlet.jsp.JspWriter的实例对象,作用和ServletResponse.getWrite()返回的PrintWrite对象类似。不同的是,out对象是一种带缓存功能的PrintWrite,其缓冲区大小可以有page指令来设置。

  注意:out对象通过print写入数据后,知道整个JSP页面结束,out对象输入缓冲区的数据才真正写入到Servlet提供的缓冲区中,而Response.getWrite().print语句是直接把内容写入到Servlet提供的缓冲区中的。

pageContext对象

  JSP页面中要想获取隐式对象,可以使用pageContext对象,它是javax.servlet.jsp.PageContext的实例,代表当前JSP页面的运行环境,并提供了一些列用于获取其他隐式对象的方法。

方法 功能
JspWrite getOut() 获取out隐式对象
Object getPage() 获取page隐式对象
ServletRequest getRequest() 获取request隐式对象
ServletResponse getResponse() 获取response隐式对象
HttpSession getSession() 获取session隐式对象
Exception getException() 获取exception隐式对象
ServletConfig getServletConfig() 获取config隐式对象
ServletContext getServletContext() 获取application隐式对象

参考资料

  1、Java Web之Servlet技术

  2、《Java Web程序开发入门》 第7章节

  3、javaweb学习总结(十四)——JSP原理

Java Web之JSP技术的更多相关文章

  1. Java Web之会话技术

    客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据J ...

  2. java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)

    java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...

  3. java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  4. java web中jsp,action,service,dao,po分别是什么意思和什么作用

    JSP:全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动 ...

  5. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  6. 复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  7. Java Web(六) JSP

    现在的Java Web开发已经很少使用JSP脚本了,业务逻辑都交给Servlet处理,JSP只负责显示视图,所以接下来的内容就对JSP脚本不做叙述了... JSP概述 JSP全名为Java Serve ...

  8. 第一章 Java Web应用开发技术

    Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支 ...

  9. Java web应用开发技术

    Java web应用程序供用户通过浏览器发送请求,程序通过执行产生web页面,并将页面传递给客户机器上的浏览器,将得到的web页面呈现给用户. 一个完整的Java web应用程序通常由许多组件构成的, ...

随机推荐

  1. SWFObject Flash 增强插件

    SWFObject 2提供两种优化flash播放器的嵌入方法:基于标记的方法和依赖于js的方法. SWFObject 2提供一个js的API,为嵌入SWF文件和获取Flash播放器的相关信息提供了一个 ...

  2. Strip JS – 低侵入,响应式的 Lightbox 效果

    Strip  是一个灯箱效果插件,显示的时候只会覆盖部分的页面,这使得侵扰程度较低,并留出了空间与页面上的大屏幕,同时给予小型移动设备上的经典灯箱体验.Strp JS 基于 jQuery 库实现,支持 ...

  3. Echo.js – 简单易用的 JavaScript 图片延迟加载插件

    Echo.js 是一个独立的延迟加载图片的 JavaScript 插件.Echo.js 不依赖第三方库,压缩后不到1KB大小. 延迟加载是提高网页首屏显示速度的一种很有效的方法,当图片元素进入窗口可视 ...

  4. ZedGraph饼图---傻瓜版

    GraphPane pGraphPane=this.zedGraphControl1.GraphPane;//调用饼图类 pGraphPane.Title.Text = "重金属含量分析图& ...

  5. 规划在sharepoint中使用安全组

    简介 如果将权限级别分配给组而非单个用户,那么管理 SharePoint 网站用户其实很简单.SharePoint 组是一组单独的用户,它还可以包含 Active Directory 组.在 Acti ...

  6. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q66-Q68)

    Question 66 You are designing an application that will use a timer job that will run each night to s ...

  7. APP One Link ,android and ios qrcode merge as One QRCode and one short link

    Adroid and ios qrcode merge as One QRCode and one short link is publish , the web site is www.appone ...

  8. 操作系统开发系列—13.a.进程 ●

    进程的切换及调度等内容是和保护模式的相关技术紧密相连的,这些代码量可能并不多,但却至关重要. 我们需要一个数据结构记录一个进程的状态,在进程要被挂起的时候,进程信息就被写入这个数据结构,等到进程重新启 ...

  9. Mac电脑清理硬盘"其他"

    作为一个MacBook的使用者,无不感受到苹果对于系统和硬件的完美匹配. 苹果电脑不适合玩游戏,所以我只用它开发iOS使用.电脑里除了Xcode和常用办公软件与通讯软件以外,我没有装其他的任何大应用. ...

  10. Android Sqlite基本命令

    要查看数据库,首先必须要找到db文件,如果拷贝到电脑上,查看的方法比较多,在手机上,用命令查看比较直接和方便. 首先要找到数据库的位置,一般数据库时存放在程序的私有目录,所以要获取root权限. 确保 ...