Java Server Pages是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。它使用JSP标签在HTML网页中插入Java代码。标签通常以
<%
开头以%>
结束。
JSP 处理
以下步骤表明了 Web 服务器是如何使用JSP来创建网页的:
-
浏览器发送一个 HTTP 请求给服务器。
-
Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。
-
JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码。
-
JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。
-
Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
-
Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。
-
最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。
中文编码问题
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
语法
两种表达方式等效
<% 代码片段 %> //方法:脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
<jsp:scriptlet>
代码片段
</jsp:scriptlet>
<%! 代码片段 %> //成员:一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用
<jsp:declaration>
代码片段
</jsp:declaration>
<%= 表达式 %> //输出:不能使用分号来结束表达式。
<jsp:expression>
表达式
</jsp:expression>
<%-- 该部分注释在网页中不会被显示--%>
JSP行为
jsp:include 用于在当前页面中包含静态或动态资源
jsp:useBean 寻找和初始化一个JavaBean组件
jsp:setProperty 设置 JavaBean组件的值
jsp:getProperty 将 JavaBean组件的值插入到 output中
jsp:forward 从一个JSP文件向另一个文件传递一个包含用户请求的request对象
jsp:plugin 用于在生成的HTML页面中包含Applet和JavaBean对象
jsp:element 动态创建一个XML元素
jsp:attribute 定义动态创建的XML元素的属性
jsp:body 定义动态创建的XML元素的主体
jsp:text 用于封装模板数据
<jsp:useBean>动作元素
jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean。
在类载入后,我们既可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和检索bean的属性。
<jsp:useBean id="name" class="package" />
属性 描述
class 指定Bean的完整类名。
type 指定将引用该对象变量的类型。
beanName 通过 java.beans.Beans 的 instantiate() 方法指定Bean的名字。
<jsp:setProperty>动作元素
jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。
首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" property="someProperty" value="菜鸟" .../>
第二种用法是把jsp:setProperty放入jsp:useBean元素的内部
<jsp:useBean id="myName" ... >
...
<jsp:setProperty name="myName" property="someProperty" value="菜鸟" .../>
</jsp:useBean>
<jsp:getProperty>动作元素
jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。语法格式如下:
<jsp:useBean id="myName" ... />
...
<jsp:getProperty name="myName" property="someProperty" .../>
<jsp:forward> 动作元素
jsp:forward动作把请求转到另外的页面。jsp:forward标记只有一个属性page。
page的值既可以直接给出,也可以在请求的时候动态计算,可以是一个JSP页面或者一个 Java Servlet.
<jsp:forward page="相对 URL 地址" />
JSP隐含对象
request HttpServletRequest类的实例,request对象提供了一系列方法来获取HTTP头信息,cookies,HTTP方法等等。
response HttpServletResponse类的实例,可以添加新的cookies,时间戳,HTTP状态码等等。
out PrintWriter类的实例,用于把结果输出至网页上
方法描述
out.print(dataType dt) 输出Type类型的值
out.println(dataType dt) 输出Type类型的值然后换行
out.flush() 刷新输出流
session HttpSession类的实例,session对象用来跟踪在各个客户端请求间的会话。
application 直接包装了servlet的ServletContext类的对象,是javax.servlet.ServletContext 类的实例。
这个对象在JSP页面的整个生命周期中都代表着这个JSP页面,在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
config ServletConfig类的实例,直接包装了servlet的ServletConfig类的对象。
pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问,用来代表整个JSP页面。
这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
page 类似于Java类中的this关键字,它可以被看做是整个JSP页面的代表。
Exception Exception类的对象,exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。
控制流语句
<%
if (day == 1 | day == 7) { %>
<p>今天是周末</p>
<% }
else { %>
<p>今天不是周末</p>
<% }
%>
合起来
<% if (day == 1 | day == 7) %>
<p>今天是周末</p>
<% %>
循环语句
<%
for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
<font color="green" size="<%= fontSize %>">
菜鸟教程
</font><br/>
<%}
%>
JSP 指令
<%@ page ... %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入标签库的定义
Page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
<%@ page attribute="value" %>
属性 描述
buffer 指定out对象使用缓冲区的大小
autoFlush 控制out对象的 缓存区
contentType 指定当前JSP页面的MIME类型和字符编码
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends 指定servlet从哪一个类继承
import 导入要使用的Java类
info 定义JSP页面的描述信息
isThreadSafe 指定对JSP页面的访问是否为线程安全
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行EL表达式
isScriptingEnabled 确定脚本元素能否被使用
Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
<%@ include file="文件相对 url 地址" %>
Taglib指令
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
<%@ taglib uri="uri" prefix="prefixOfTag" %>