JSP概述
JSP是在HTML页面中嵌入Java代码片段,或使用JSP标签。包括用户自己定义标签。动态地提供页面内容。
JSP本质上是Servlet,当用户向指定Servlet发送请求时,Servlet利用输出流动态地生成HTML页面,包括每一个静态的HTML页面中出现的内容。
JSP页面内容主要包括两部分:
- 静态部分:标准的HTML标签、静态的页面内容。这些内容与静态HTML页面同样;
- 动态部分:受Java程序控制的内容,这些内容由Java脚本动态生成。
代码演示样例
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>欢迎</title>
</head>
<body>
欢迎学习Java Web知识。如今时间是:
<%out.println(new java.util.Date());%>
</body>
</html>
当中放在<%和%>之间的代码便是Java脚本,动态部分,这样就把Java代码嵌入HTML页面中,构成一个动态的JSP页面。
JSP页面看书去好像不须要Java类,让人感觉好像全然脱离了Java面向对象的特征。实际上。JSP的本质依旧是Servlet(一个特殊的Java类),每一个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet在负责响应用户请求。Web应用中的每一个JSP页面都会由Servlet容器生成相应Servlet。在tomcat中。JSP页面生成的Servlet放在work路径下相应的Web应用下。如一个test.jsp页面会生成相应的test_jsp.java和test_jsp.class。这两个页面都是由Web容器(如Tomcat)生成的。对照test.jsp和test_jsp.java文件,易知JSP页面全部内容都由test_jsp.java文件的页面流来生成
由此,我们能够得到例如以下结论:
- JSP文件必须在JSPserver内运行;
- JSP文件必须生成Servlet才干运行;
- 每一个JSP 页面的第一个訪问者速度非常慢,由于要等待JSP编译成Servlet;
- JSP页面的訪问者无需安装不论什么client。甚至不须要能够运行Java的运行环境,由于JSP页面输送到client的是标准HTML页面。
运行流程
WEB容器JSP页面的訪问请求时,它将把该訪问请求交给JSP引擎去处理。
Tomcat中的JSP引擎就是一个Servlet程序。它负责解释和运行JSP页面。
每一个JSP页面在第一次被訪问时,JSP引擎先将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件。然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释运行这个由JSP页面翻译成的Servlet程序。
JSP的四种基本的语法
1. JSP凝视
JSP凝视用于标注在程序开发过程中的开发提示。不会输出到client。格式为
<%-- 凝视内容 -->
不同于HTML凝视格式
<!-- 凝视内容 -->
JSP凝视无法通过源码查看到,而HTML凝视能够通过源码查看到。这表明JSP凝视不会被发送到client。
2. JSP声明
JSP声明用于声明变量和方法,JSP声明方法看似不须要定义类就能够直接定义方法,方法好像能够脱离类独立存在。实际上。JSP声明将会转换成相应Servet的成员变量或成员方法,这样JSP声明依旧符合Java语法。
声明演示样例:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>声明演示样例</title>
</head>
<!-- 以下是JSP声明部分 -->
<%!
//声明一个整型变量
public int count;
//声明一个方法
public String info()
{
return "Hello";
}
%>
<body>
<%
//将count的值输出后在加1
out.println(count++);
%>
<br/>
<%
//输出info()方法的返回值
out.println(info());
%>
</body>
</html>
表面上看。这段代码部分证明了一个整型变量和一个普通方法,变量和方法好像不属于不论什么类。似乎能够独立存在,这是假象。打开Tomcat的work里面找到相应的java文件,会看到一段与JSP页面声明变量和方法全然相应的的代码,这表明JSP页面的声明部分转换成相应Servlet的成员变量或成员方法。因此JSP声明部分的变量和方法能够使用private、public等訪问控制符修饰、也能够使用static修饰。将其变成类属性和类方法,但不能用abstract修饰声明部分的方法,由于抽象方法将导致JSP相应的Servlet变成抽象类。从而导致无法实例化。
打开不同浏览器測试代码。会发现不同机器不同client訪问的count值是连续的。全部client共享同一个count变量。由于JSP页面会编译成一个Servlet类。每一个Servlet的容器仅仅有一个实例。在JSP中声明的变量时成员变量,成员变量仅仅在创建实例时初始化,该变量的值将一直被保存,直到实例被销毁。
info()方法的值以能够正常输出,JSP中声明的方法是在JSP声明中生成的Servlet的实例方法,Java的方法是不能独立存在的。即使在JSP中也不行。
3. JSP输出表达式
JSP提供一种输出表达式值的简单方法,输出表达值的语法格式
<%= 表达式 %>
演示样例
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<html>
<head>
<title>声明演示样例</title>
</head>
<!-- 以下是JSP声明部分 -->
<%!
//声明一个整型变量
public int count;
//声明一个方法
public String info()
{
return "Hello";
}
%>
<body>
<!-- 使用表达式输出变量 -->
<%=count++%>
<br/>
<!-- 使用表达式输出方法返回值 -->
<%=info()%>
</body>
</html>
输出表达式语法后不能有分号。
4. JSP脚本
JSP脚本里能够包括不论什么可运行的Java代码,JSP脚本能够控制JSP页面的全部静态内容。JSP脚本编译后将被转换成Servlet里_jspService方法的可运行性代码,由于Java语法不同意在方法里定义方法,所以JSP脚本里不能定义方法。JSP脚本部分也能够声明变量,但在JSP脚本本分声明的变量时局部变量,但不能用public、private、static等訪问控制符等修饰符。
JSP的3个编译指令
JSP的编译指令是通知JSP引擎的消息。不直接生成输出,而是告诉引擎怎样处理JSP页面中的其余部分。编译指令都有默认值。程序猿无需为每一个指令设置值
- page: 针对当前页面的指令。用于定义JSP页面的各种属性,不管page指令出如今JSP页面的什么地方。它都作用于整个JSP页面。通常我们将page指令房在JSP页面的開始位置。
- include:用于指定包括还有一个 。
用于通知JSP引擎在翻译当前JSP页面时将其它文件里的内容合并进当前JSP页面转换成的Servlet源文件里,这样的在源文件进行引入的方式称为静态引入,当前JSP页面与静态引入的页面紧密结合成一个Servlet。
- taglib: 用于定义和訪问自己定义标签。
JSP的7个动作指令
编译指令是通知Servlet引擎的处理消息,而动作指令仅仅是运行时的动作。编译指令在将JSP编译成Ser略同一时候起作用;而处理指令可替换成JSP脚本,它是JSP脚本的标准化写法
- jsp:forward:运行页面转向,将请求的处理转发发到下一个页面。
- jsp:param:用于传递參数,必须与其它支持參数的标签一起使用;
- jsp:include:动态引入一个JSP页面;
- jsp:plugin:用于下载JavaBean或Applet到client进行运行。
- jsp:useBean:创建一个JavaBean实例;
- jsp:setProperty:设置JavaBean实例的属性值;
- jsp:getProperty:输出JavaBean实例的属性值。
JSP脚本中的9个内置对象
JSP中包括9个内置对象,都是Servlet API接口的实例,JSP规范对它们进行了默认初始化(由JSP页面相应Servlet的_jspService()方法来创建这些实例)。即它们已经是对象了。能够直接使用。
- application:java.servlet.ServleContext的实例。该实例代表JSP所属的Web应用本身。可用于JSP页面,或者在Servlet之间交换信息。经常用法有getAttribute(String arrName)、setAttribute(String attName, String attValue)和getInitParameter(String paramName)等;
- config: javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。经常用法有getInitParameter(String paraName)和getInitParameternames()等方法。JSP页面通常无需配置,也就不存在配置信息。
该对象很多其它在Servlet中有效。
- Exception:java.lang.Throwable的实例。该实例代表其它页面中的异常错误。仅仅有当页面是错误处理页面即编译指令page的isErrorPage属性为true时,该对象才干够使用。
经常用法有getMessage()和printStackTrace()等。
- out:javax.servlet.jsp.JspWriter的实例。该对象代表JSP中的输出流,用于内天的输出形成HTML页面。
- page: 代表该页面本身,通常没有太大用处。也就是Servlet的this,其类型就是生成的Servlet类。能用于page的地方就能够用this。
- pageContext: javax.servlet.jsp.PageContext的实例。该对象代表该JSP页面上下文。使用该对象能够訪问页面中的共享数据。经常使用的方法有getServletContext()和getServletConfig()等。
- request: javax.servlet.http.HttpServletRequest的实例。该对象封装了一次请求,client的请求參数都被封装在该对象里。
这是一个经常使用的对象。局偶去client请求參数必须使用该对象。经常使用的方法有getParameter(String paraName)、getAttrbute(String attrName)和setCharacterEncoding(String attrName,Object attrValue)、getAttribute(String attrName)等。
- response: javax.servlet.http.HttpServletResponse的实例,该对象代表server对client的响应。通常非常少使用该对象直接响应,而是使用out对象,除非须要生成非字符串响应。
而response对象经常使用于重定向。经常使用的方法有getOutputString()、sendRedirect(java.lang.String.locaton)等。
- session: javax.servlet.http.HttpSession的实例,该对象代表一次会话。当client浏览器与网站建立连接时,会话開始;当client关闭浏览器时,会话结束。经常使用的方法有:getAttribute(String attrName)、setAttribute(StringName,Object attrValue)等。