JSP 基本语法
JSP 文件中除了可以直接包括 HTML 文本以外,还可以包含以下的内容:
- JSP 指令(指示)语句
- JSP 声明语句
- JSP 脚本程序(Scriptlet)片段
- JSP 表达式
- JSP 行为指令语句
- JSP 隐含对象
JSP 脚本程序片段
脚本程序可以包含任意量的Java语句、变量、方法或表达式,JSP的行为标签,表达式语句,JSTL 都可以看成是基于脚本程序的模板语言;
语法格式:
<% 代码片段; %>
以上的语法等同于以下的 XML 语句:
<jsp:scriptlet>
代码片段;
<jsp:scriptlet>
简单示例:
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
</body>
</html>
中文编码问题
如果要在页面中正确地显示中文,需要在 JSP 文件头部添加以下的指令语句:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
等同于在 Servlet 中设置 response 对象的contentType、characterEncoding属性;
流程控制
JSP 中输出流程控制类似于 PHP 中的输出方式,如一个简单的循环输出如下:
...
<p>loop output test</p>
<% for(int i=0;i<10;i++){ %>
<p>Count:<%= i %></p>
<% } %>
...
等同于:
<p>loop output test</p>
<% for(int i=0;i<10;i++){
out.println("<p>Count:"+i+"</p>");
} %>
JSP 声明语句
JSP 的声明语句用于声明与 JSP 对应的 Servlet 类的成员变量和方法,而在 JSP scriptlet 中声明的变量只是 JSP 对应 Servlet 类的 service() 方法中的局部变量;
语法格式:
<%! 声明语句[,声明语句,声明语句 ]; %>
等同于以下 XML 标签
<jsp:declaration>
声明语句;
<jsp:declaration>
示例
<%! int i=0; %>
<%! int a,b,c %>
<%! List<Integer> list = new ArrayList<Inetger>(); %>
<%! public int sum(int a,int b){
return a+b;
}%>
JSP 表达式语句
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方;
表达式元素中可以包含任何符合Java语言规范的表达式,但是
不能使用分号来结束表达式;
语法格式:
<%= 表达式 %>
等同于以下 JSP 脚本程序片段
<% out.print(表达式) %>
等同于以下 XML 标签
<jsp:expression>
表达式
</jsp:expression>
示例:
<p> Today is <%= new SimpleDateFormat("yyyy-MM-dd").format(new Date()) %> </p>
JSP 注释语句
JSP注释语句用于注释 .jsp 文件中的各种 JSP 语句
语法格式
<%-- 注释 --%>
在注释中如果要输出一些特殊常量的转义量:
<% | <\% |
%> | %\> |
' | \' |
" | \'' |
JSP 指令语句
JSP指令语句用于设置与整个 JSP 页面相关的属性,页面编码,Java类库导入,与 JSP 对应的 Servlet 实现的接口等,一般放置在 JSP 文件的最开头部分
;
语法格式:
<%@ directive attribute="value">
主要的 directive 指令标签包括以下3种:
<%@ page ... %>
|
定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
|
<%@ include ... %>
|
包含其他文件
|
<%@ taglib ... %>
|
引入 JSTL 标签库的定义,也可以是自定义标签
|
Page 指令
page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
<%@ page attribute="value">
等同于以下XML 标签
<jsp:directive.page attribute="value" />
主要 attribute 属性参数如下:
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 | 确定脚本元素能否被使用 |
示例
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8"
import="java.io.*;java.util.List.*" %>
Include 指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行;
语法格式:
<%@ include file="文件的相对URL路径" %>
等同于以下XML语句
<jsp:directive.include file="文件的相对URL路径" %>
具体关于JSP的转发和包含见:
03. JSP 请求转发&包含
Taglib 指令
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签;
语法格式:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
等同于以下XML标签
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
具体用法见:
09. JSP 标准标签库 JSTL
JSP 行为标签
JSP行为标签使用 XML 语法结构来控制 servlet 引擎,它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等;
JSP 行为标签严格遵守 XML 格式,其语法如下:
<jsp:action_name attribute="value" />
动作元素基本上都是预定义的函数,JSP规范定义了一系列的标准动作,它用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 隐含对象
JSP 隐式对象 是 JSP 容器为每个页面提供的 Java Servlet 元素对象,可以直接使用它们而不用显式声明,隐式对象也被称为预定义变量;
JSP所支持的9大隐式对象:
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
application对象
- application对象直接包装了 javax.servlet.ServletContext 类的对象实例;
- 这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。
- 通过向application中添加属性,则所有组成 web 应用的 JSP 文件都能访问到这些属性;
pageContext 对象
- pageContext 对象是 javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面,该对象主要用来访问页面信息;
- PageContext 对象存储了 request , response 对象的引用;application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
- pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL, 页面scope 等。
PAGE_SCOPE |
页面范围:(这是默认值)指定引用在此 PageContext 中继续可用,直到从当前 Servlet.service() 调用中返回。
|
REQUEST_SCOPE |
请求范围:指定引用在与 Servlet 关联的 ServletRequest 中继续可用,直到当前请求完成
|
SESSION_SCOPE |
会话范围(仅在此页面参与会话时有效):指定引用在与 Servlet 关联的 HttpSession(如果有)中继续可用,直到 HttpSession 无效
|
APPLICATION_SCOPE |
应用程序范围:指定引用在 ServletContext 中继续可用,直到它被回收。
|
pageContext 对象 中的大部分方法引用自 javax.servlet.jsp.PageContext,在 JSP 中作为隐含对象中添加的比较的重要的方法有
removeArribute() ,用于移除 pageContext 中储存的对象的4个上面定义的字段;
如: pageContext.removeArribute("session"),移除
pageContext 中的 PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE 字段;
pageContext.removeArribute("session",
PAGE_SCOPE
) ,只移除其中的
PAGE_SCOPE 字段;