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. Repeater分页代码

    //ASP.NET中的DataList和Repeater提供了简单快速的方法來显示,其间,我们可以使用<ItemTemplate>更是使我们能随心所欲的控制数据的排放样式! //.可惜的是 ...

  2. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  3. 实现a标签中的各种点击(onclick)事件的方法

    我们常用的在a标签中有点击事件:1. a href="javascript:js_method();"这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题, ...

  4. 如何在SharePoint2010中创建自定义电子邮件警报处理程序

    字段,如项目名称字段中,将被截断到的电子邮件通知中的 70 个字符.要解决 70 个字符的限制,请使用"更多信息"一节中的介绍的方法. 要嵌入电子邮件通知中的其他内容. 您想要更改 ...

  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q49-Q51)

    Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...

  6. 如何更好的通过Inflate layout的方式来实现自定义view

    本篇文章讲的是如何用现有控件产生一个组合控件的方法,十分简单实用.现在开始! 一.需求 我们要实现一个有红点和文字的按钮控件,就像下面这样: 二.实现 我的思路是让一个button和一个textvie ...

  7. 自定义有监听器的ScrollView

    public class ObservableScrollView extends ScrollView { public ObservableScrollView(Context context) ...

  8. Source Insight基本使用和快捷键

    Source Insight基本使用和快捷键 为什么要用Source Insight呢?貌似是因为比完整的IDE要更快一些,比较利于查看大量的代码. 软件的安装很简单,设置好安装目录. 配置好文档路径 ...

  9. 【C语言】外部函数和内部函数

    目录 [外部函数]  [内部函数] 1.外部函数  定义的函数能被本文件和其它文件访问(默认). 注:不允许有同名的外部函数. 2.内部函数  定义的函数只能被本文件访问,其它文件不能访问. 注:允许 ...

  10. Android 实现图片画画板

    本文主要讲述了Android 实现图片画画板 设计项目布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...