JSP(Java Server Page)是Sun公司制定的一种服务器端动态页面技术的组件规范。用来解决servlet中大量网页拼接困难的问题。JSP作为简化Servlet开发的一种技术,实质上最终依然要转变为Servlet才可能运行,只不过这个转变过程由Servlet容器来完成。
JSP页面主要由:指令标签、HTML标记语言、注释、嵌入的java代码(java小脚本)、JSP动作标签等五部分构成。如所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP页面基本构成title>
head>
<body>
<%
Date date =new Date();
String dateStr;
dateStr=String.format("%tY年%tm月%td日", date,date,date);
%>
当前日期是:<%=dateStr%>
<br>
body>
html>
以下对JSP页面的五个部分做一个详细介绍
指令标签不会产生任何内容输出到页面中,它的主要作用:声明页面使用的语言、导入的类包、指定错误处理页面。做如下解析:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ %> : 标签头,表示这是一个指令标签
page : 指令类型为page指令
language: 页面使用的编程语言
import: 导入页面的包
pageEncoding: 页面的编码格式
属性 | 定义 |
---|---|
language | 指定JSP Container用什么语言来编译,目前只支持JAVA语言。默认为JAVA |
extends | 定义此JSP网页产生的Servlet是继承哪个 |
import | 定义此JSP网页要使用哪些Java API |
session | 决定此页面是否使用session对象。默认为true |
buffer | 决定输出流(Input stream)是否又缓冲区。默认为8kb |
autoFlush | 决定输出流的缓冲区慢了后是否需要自动清除,缓冲区慢了后会产生异常错误(Exception).默认为true |
isThreadSafe | 是否支持线程。默认为true |
errorPage | 如果此页发生异常,网页会重新指向一个url |
isErrorPage | 表示此页面是否为错误处理页面。默认为false |
contentType | 表示MIME类型和JSP的编码方式。”text/html;charset=gb2312” |
pageEncoding | 编码方式。”ISO-8859-1” |
isELLgnored | 表示是否在此JSP页面中EL表达式。true则忽略,反之false则支持。默认为false |
include指令用于指定定一个JSP页面包含另外的一个文件。注意:被包含的文件(include引入的文件)只能是静态的,也就是说,这个文件中有代码将不被执行。这个文件可以是:Java代码、HTML代码、JSP页面。
<%@include file=”date.jsp”%>
date.jsp页面:
<%@page pageEncoding="GB18030" %>
<%@page import="java.util.Date"%>
<%
Date now = new Date();
String dateStr;
dateStr = String.format("%tY年%tm月%td日", now, now, now);
%>
<%=dateStr%>
index.jsp页面:
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
<html>
<head>
<title>include指令演示title>
head>
<body>
当前日期是:
<%@include file="date.jsp"%>
<br>
body>
html>
该标签用来加载用户自定义的标签,自定义标签后面讲解。
<%@taglib prefix=”fix” uri=”/WEB-INF/tags/view.tld”%>
语法讲解:
taglib :表示加载的是自定义的标签
prefix :表示设置加载自定义标签的前缀
uri :指定自定义标签的描述文件位置
在JSP页面中嵌入JAVA代码有三种方式:代码脚本、声明脚本、JSP表达式。下面将对,每种情况都进行讲解。
代码片段(脚本片段、java脚本):本质就是在JSP页面内直接嵌入的一段JAVA代码,在请求处理期间被执行。代码片段使用 <% %>来包含。
九九乘法表Multiplication .jsp:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<html>
<head>
<title>JSP的代码片段title>
head>
<body>
<%
long startTime = System.nanoTime(); // 记录开始时间,单位纳秒
%>
输出九九乘法表
<br>
<%
for (int i = 1; i <= 9; i++) { // 第一层循环
for (int j = 1; j <= i; j++) { // 第二次循环
String str = j + "*" + i + "=" + j * i;
out.print(str + " "); // 使用空格格式化输出
}
out.println("
"); // HTML换行
}
long time = System.nanoTime() - startTime;
%>
生成九九乘法表用时:
<%
out.println(time / 1000); // 输出用时多少毫秒
%>
毫秒。
body>
html>
结果如下图所示:
声明脚本用于在整个JSP页面中定义一个全局的成员变量或者方法,可以被整个JSP页面访问。当JSP页面被翻译为Servlet时,生命脚本将会转化为类的成员。声明脚本使用:<%! %>包含。
声明一个变量:
<%! long startTime=System.nanoTime(); %>
声明一个方法:
<%!
int getMax(int a,int b){
int max=a>b?a:b;
return max;
}
%>
JSP表达式可以将java表达式的结果直接输出到JSP页面,表达式最终的结果将被转化为String,因为在JSP页面中所有的文字都是String。语法如下:
<%= 表达式 %>
例如:
圆周率是:<%= Math.PI %>
JSP页面有:HTML注释、JSP注释、代码注释组成。
不执行,但,会随着页面发送到前端。
不执行,但,不会随着页面发送到前端。
<%-- 注释文本 --%>
不执行,但,不会随着页面发送到前端。本质就是将java脚本注释掉。
<%
//单行代码
/*
多行代码
*/
%>
动作标签是在请求处理阶段按照动作标签在JSP页面出现的顺序被执行,JSP动作标签的优先级低于指令标签,在JSP页面在被翻译阶段将首先翻译指令标签,将他们转化为Servlet,从而设置整个页面。
include动作标签可以将一个文件包含到当前的JSP页面中。被包含的文件可以是静态的文本,也可是动态文本。该标签会将动态资源的返回结果放到当前页面。它的语法如下:
<jsp:include page="url flush="true|false">
或者
<jsp:include page="url flush="true|false">
子标签
jsp:include>
语法解释:
page属性:生命被包含文件的相对路径
flush属性:是否冲刷缓冲区,默认值为false
注意:
被包含的文件中不能有 < HTML>、< body>等HTML语言的结构标签,她会破坏原先的页面结构。源文件和被包含文件也不要同名的变量和方法,因为它们最后会被编译为一个Servlet,重名导致错误发生。
< jsp:forward >是转发标签,将当前页面接受到的请求转发个其他资源,例如:Servlet、JSP页面、HTML页面。当前页面只是一个转发的动作。
addUser.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<html>
<head>
<title>JSP的include动作标签title>
head>
<body>
<form action="index.jsp" method="post">
<table align="center">
<tr>
<td align="center" colspan="2">
<h3>添加用户h3>
td>
tr>
<tr>
<td>姓名:td>
<td><input name="name" type="text">td>
tr>
<tr>
<td>性别:td>
<td>
<input name="sex" type="radio" value="男" checked="checked">
<input name="sex" type="radio" value="女">
td>
tr>
<tr>
<td align="center" colspan="2">
<input type="submit" value="添加">
<input type="reset" value="重置">
td>
tr>
table>
form>
body>
html>
add.jsp页面:
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<html>
<head>
<title>添加title>
head>
<body>
<jsp:forward page="addUser.jsp">
<jsp:param name="userName" value="mingri"/>
jsp:forward>
body>
html>
这个标签可以作为其他动作标签的子标签,为其他标签传递参数,语法如下:
< jsp:parama name="name" value="杨胖子">
语法解析:
name:参数名
value:参数值
例如:
<jsp:forward page="addUser.jsp">
<jsp:param name="userName" value="mingri"/>
jsp:forward>