2.3 指令与动作组件
2.3.1 page指令
page指令的基本语法为:
<%@ page 属性1="属性1的值" 属性2="属性2的值"···%>
属性值记得用“”或者‘’括起来,这样写比较规范,不易出错。
举例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
这个指令是用来设置整个JSP页面的相关属性和功能的,作用于整个JSP页面,包括使用include指令而包含在该JSP页面中的其他文件,但是不能作用于动态的包含文件,比如对使用<jsp:include>包含的文件就是无效的。(两个include语法是不同的,后面会介绍)
合法的page属性有:import,contentType,pageEncoding,session,buffer,autoFlush,info,errorPage,isErrorPage,isThreadSafe,language,extends等,下面重点介绍几个常用的:
1)language属性:定义JSP页面的脚本语言,目前属性值只能是java
举例:
<%@ page language="java" %>
2)import属性:为JSP页面引入java核心包中的类,JSP默认import属性已经有:java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*
举例:
<%@ page import="java.io.*","java.util.Date" %>
3)contentType属性:定义页面响应的MIME类型和页面字符的编码,属性值一般为“MIME类型”或者“MIME类型;charset="编码”,默认值是"text/html;charset=ISO-8859-1"。补充知识:charset和pagecoding的区别。
举例:
<%@ page contentType="text/html;charset=GB2312" %>
4)session属性:用于设置是否需要使用内置的session对象,属性值true或false,默认前者。(这个后面会专门介绍,这里知道属性值即可)
举例:
5)buffer属性:内置输出流out负责将服务器的某些信息或运行结果发送到客户端显示,buffer用来指定out设置的缓冲区大小或者不使用缓冲区(取值为none),默认值是8kb.
举例:
<%@ page buffer="24kb" %>
6)autoFlush属性:用于指定当out的缓冲区被填满时,缓冲区是否自动刷新,可以取值true或false,默认前者。当属性值设置为false时,如果缓冲区填满,就会出现缓存溢出异常(这时可以采用手动方式刷新,即out.flush()方法),当buffer设置为none时,autoFlush不能设置为false。
7)isThreadSafe属性:用来设置JSP页面是否可多线程访问。
8)info属性:为页面准备一个字符串,可以在页面中用getServletInfo()方法(当JSP被转译成java文件时,转译成的类是Servlet的一个子类)获得这个字符串。
举例:
<%@ page info="Hedy" %>
9)errorPage属性:当这个属性页面产生异常时,系统会重定位到它属性值的那个页面进行异常处理。(这一块我看别的博客有不同的说法,但是照书上的能运行,别的博客会出错,不知道是服务器版本的原因还是什么)
举例:
处理错误的proExcp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center><h1>出错了!</h1></center>
<blockquote>您访问的页面正在维护中···</blockquote>
</body>
</html>
产生错误的errorPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="proExcp.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%! int i=0; %>
<%=2/i %>
errorPage.jsp:
<%@ page isErrorPage="true" %>
<%= exception %>
</body>
</html>
2.3.2 include指令
include指令会在JSP页面被编译成Servlet时引入其中包含的文件,包含的过程是静态的,也就是说包含的文件会插入到<%@ include %>的地方,但是被包含的文件既可以是静态的HTML文件,也可以是动态的JSP文件,如果是后者的话,会先执行被包含的文件,然后才执行主JSP文件。基本语法为:
<%@ include file="relative URL" %>
注意是相对路径,如果路径以“/”开头,那么该路径等同于参照JSP应用的上下关系路径,如果路径以文件名或者目录开头,那么路径就是当前JSP所在的路径。
举例:在include.jsp中插入computer.jsp文件
include.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>请输入一个正数,单击按钮求这个数的平方根。
<%@ include file="computer.jsp" %>
</body>
</html>
computer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="proExcp.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="" method="post" name="form">
<input type="text" name="ok"><br>
<input type="submit" name="submit" value="计算">
</form>
<%
String a=request.getParameter("ok");
if(a==null)
{
a="1";
}
try{
double number=Integer.parseInt(a);
out.println("计算结果:"+Math.sqrt(number));
}catch(NumberFormatException e){
out.println("请输入数字");
}
%>
</body>
</html>
结果为:
2.3.3 taglib动作组件
后面会详细介绍,这里只需要知道它也是指令之一即可。
2.3.4 动作组件
动作组件是以XML语法格式出现的,所以更加符合页面与业务逻辑分离的编程理念。(这一块不需要你再去学一下XML再回来,你对HTML有一点了解这里就能看懂了)。常见动作组件有:(动作组件标签也要成对出现,下面都只是写的一半,看看给的代码实例就能知道了)
<jsp:include>:也是引入其他文件,但是和前面介绍的实现方法完全不同。
<jsp:forward>:从当前页面转向另一个页面。
<jsp:param>:在前两个动作组件之间传递参数信息。
<jsp:plugin>:在当前页面插入一个特定程序。
<jsp:useBean>:在当前页面实例化一个JavaBean的类。
<jsp:setProperty>/<jsp:getProperty>::设置/获取JavaBean对象的成员属性。
先介绍几个,没介绍的后面还会专门介绍。
1、include动作组件
它是在执行时才对包含的文件进行处理,所以引入的文件都是最新的,是一个包含动态对象的操作,可以翻看一下前面的include体会一下不同,语法格式为:
<jsp:include page="filename" flush="true">
举例:在include2.jsp中引入copyright.jsp
include2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>include动作组件举例</h2>
<br>
<jsp:include page="copyright.jsp" flush="true"/>
</body>
</html>
copyright.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3><font color="pink">Hedy Fighting!</font></h3>
</body>
</html>
结果为:
2、forward动作组件
和include不同的是forward动作会让当前页面完全显示引入的页面,自己的不显示,可以把上面的代码修改对应的那一行看看结果,语法格式为:
<jsp:forward page="filename">
3、param动作组件
不能单独使用,语法格式为:
<jsp:include page="path" flush="true">
<jsp:param name="paramName" value="值"/>
</jsp:include>
或者
<jsp:forward page="filename">
<jsp:param name="paramName" value="值"/>
</jsp:forward>
举例:用sendpara.jsp传递参数;用procpara.jsp接收参数
sendpara.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h4>带参数的加载文件效果:</h4>
<jsp:include page="procpara.jsp">
<jsp:param name="start" value="1"/>
<jsp:param name="end" value="100"/>
</jsp:include>
</center>
</body>
</html>
procpara.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String start=request.getParameter("start");
String end=request.getParameter("end");
int s=Integer.parseInt(start);
int e=Integer.parseInt(end);
int sum=0;
for(int i=s;i<=e;i++)
sum+=i;
%>
<p>从<%=s %>~<%=e %>的连续和是:<%=sum %>
</body>
</html>
结果:
4、plugin动作组件
语法格式为:
<jsp:plugin
type="bean|applet" code="classFileName codebase="classFileDirectoryName"
</jsp:plugin>
type用来指定引入的对象是什么类型的文件,code指定类文件的名称,必须是以.class结尾的文件,codebase指定这个类存在的路径位置,如果把这个类和JSP文件放在一起可以不写codebase属性。
举例:创建一个名为Clock.java的Applet小程序,这个程序可以实时显示时间。创建完毕后便以这个文件,生成Clock.class文件,然后把这个文件复制到项目的Web文件夹。创建页面文件showclock.jsp,在其中使用plugin组件加入Applet小程序。
Clock.java
import java.applet.*;
import java.awt.*;
import java.util.*;
public class Clock extends Applet implements Runnable{
Thread t1,t2;
public void start() {
t1=new Thread(this);
t1.start();
}
public void run() {
t2=Thread.currentThread();
while(t2==t1) {
repaint();
try {
t2.sleep(1000);
}
catch(InterruptedException e) {}
}
}
public void paint(Graphics g) {
Calendar cal=new GregorianCalendar();
String hour=String.valueOf(cal.get(Calendar.HOUR));
String minute=String.valueOf(cal.get(Calendar.MINUTE));
String second=String.valueOf(cal.get(Calendar.SECOND));
g.drawString(hour+":"+minute+":"+second,20,30);
}
}
showclock.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<h4>显示系统时间</h4>
<jsp:plugin type="applet" code="Clock.class" codebase="Clock">
<jsp:fallback>
如果插件在客户端不能正常显示,你就会看见我
</jsp:fallback>
</jsp:plugin>
</body>
</html>
感觉写了一天???黑人问号,开始怀疑这个进度什么时候能写完这个系列了,溜了溜了~~~