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. HTML+AngularJS+Groovy如何实现登录功能

    AngularJS是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS核心特性有:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入等.AngularJS认为声明 ...

  2. MixItUp:超炫!基于 CSS3 & jQuery 的过滤和排序插件

    MixItUp 是一款轻量,但功能强大的 jQuery 插件,提供了对分类和有序内容的美丽的动画过滤和排序功能.特别适合用于作品集网站,画廊,图片博客以及任何的分类或有序内容. 它是如何工作的? Mi ...

  3. At.js – 用于 Web 应用程序的自动完成库

    At.js 是一个自动完成库,用来实现自动完成提示,表情等,就像你在 Github 或 Twitter 上看到的一样.它支持 HTML5 contentEditable 元素.你可以听任何字符,而不仅 ...

  4. ShareDrop – 苹果 AirDrop 服务的 HTML5 实现

    ShareDrop 是苹果 AirDrop 服务的 HTML5 版本,你可以直接在设备之间传输文件,而无需先上传到任何服务器.它使用 WebRTC 来实现安全的点对点文件传输.目前 ShareDrop ...

  5. requirejs:让人迷惑的路径解析

    接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模块依赖声明都是很重要的一步.而其中涉及到的模块路径解析,对于新手来说,有的时候会让人觉得 ...

  6. ArcGis 001270 : 合并数据失败

    描述 工具无法将服务所需的数据和资源打包. 如果用于发布 GIS 资源的路径或要向服务器复制的数据的路径大小超出了操作系统的限制,则当您向 ArcGIS 服务器复制数据时会发生此错误. 此路径包括过渡 ...

  7. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q56-Q58)

    Question 56You work for a manufacturer who needs to advertise its catalog of products online using a ...

  8. OC笔记

    self的概念:指向了当前对象(方法的调用者) self的用途 可以利用  self -> 成员变量名  访问当前对象内部的成员变量 [self 方法名];  调用其他对象方法或者类方法 所有继 ...

  9. Android SurfaceView的生命周期

    本文利用SurfaceView来实现视频的播放 本文地址:http://www.cnblogs.com/wuyudong/p/5851156.html,转载请注明源地址. 在main.xml布局文件添 ...

  10. 【代码笔记】iOS-对iphone手机进行判断的一些函数

    代码: #import "RootViewController.h" //为判断手机的型号 -(NSString*)deviceString添加头文件 #import " ...