JSP脚本元素
1.JSP页面的基本结构
普通的HTML标记符:由客户的浏览器显示
JSP标签(指令标签、动作标签等)
变量和方法的声明
Java的程序片段
Java表达式:由服务器负责计算,把结果转化为字符串,再由浏览器显示
其中我们把后三个基本结构形成的部分称为JSP的脚本部分
示例:
<body><font size=1>
<p>请输入三角形的三边长度
<br>
<form action="text.jsp" method=post name=form>
<input type="text" name="boy">
<input type="submit" value="送出" name=submit>
</form>
<%! double a[] =new double[3];
String answer=null;
%>
<% int i = 0;
boolean b =true;
String s = null;
double result = 0;
double a[] = new double[3];
String answer = null;
s=request.getParameter("boy");
if(s != null){
StringTokenizer fenxi = new StringTokenizer(s,",,");
while(fenxi.hasMoreElements()){
String temp = fenxi.nextToken();
try{
a[i]=Double.valueOf(temp).doubleValue();
i++;
}catch(NumberFormatException e){
out.print("<br>"+"请输入数字字符");
}
}
if(a[0]+a[1] > a[2] && a[0]+a[2] >a[1] && a[1]+a[2] >a[0] && b==true){
double p =(a[0]+a[1]+a[2]) /2;
result = Math.sqrt(p*(p-a[1])*(p-a[2]));
out.print("面积:"+result);
}else{
answer="不能构成一个三角形";
out.print("<br>"+answer);
}
}
%>
<p>您输入的是三边:
<br><%=a[0] %>
<br><%=a[1] %>
<br><%=a[2] %>
</font>
</body>
运行效果:
2. 变量和方法的声明:
2.1 声明变量:
在“<%! %>”标记符间声明变量;变量的类型可以是Java语言允许的任何数据类型,这些变量称为JSP页面的成员变量。
示例1:
<body bgcolor=gray><font size=1>
<!-- 声明变量 -->
<%! int i=0;%>
<% i++; %>
<p>您是第<%=i %>个访问本网站的客户
</font>
</body>
示例2:(解决线程安全问题)
<body>
<!-- 声明变量 -->
<%! Integer number = new Integer(0); %>
<% synchronized(number){
int i = number.intValue();
i++;
number=new Integer(i);
}
%>
<p>您是第<%=number.intValue() %>个访问本网站的客户
</body>
2.2 声明方法
在“<%! %>”标记符间声明方法,该方法在整个JSP页面有效,但是在该方法内定义的变量只在方法内有效
示例1:(通过synchronized方法操作成员变量实现计数器)
<!-- 声明方法 -->
<%! int number = 0;
synchronized void countPeople(){
number++;
}%>
<% countPeople(); %><!-- 在程序片段中调用方法 -->
<p><p>您是第<%=number %>个访问本网站的客户
示例2:(使用Java的输入输出流技术,把计数保存到文件中)
<!-- 声明方法 -->
<body BGCOLOR=cyan><font Size=1>
<%! int number=0;
synchronized void countPeople(){ //计算访问次数的同步方法
if(number==0){
try{
FileInputStream in = new FileInputStream("count.txt");
DataInputStream dataIn = new DataInputStream(in);
number = dataIn.readInt();
number++;
in.close();
dataIn.close();
}catch(FileNotFoundException e){
number++;
try{
FileOutputStream out = new FileOutputStream("count.txt");
DataOutputStream dataOut = new DataOutputStream(out);
dataOut.writeInt(number);
out.close();
dataOut.close();
}catch(IOException ee){ }
}catch(IOException ee){}
}else{
number++;
try{
FileOutputStream out = new FileOutputStream("count.txt");
DataOutputStream dataOut = new DataOutputStream(out);
dataOut.writeInt(number);
out.close();
dataOut.close();
}catch(FileNotFoundException e){}
catch(IOException ee){}
}
}
%>
<% countPeople(); %>
<p><p>您是滴<%=number%>个用户
</body>
2.3 Java程序片段
在“<%! %>”标记符间声明Java程序片段
示例:(打印一周7天的信息)
<!-- Java程序片段 -->
<h2>
Display weekdays in Chinese:<br/>
<%
DateFormatSymbols Dfs = new DateFormatSymbols(Locale.CHINA);
String[] weekdays = Dfs.getWeekdays();
for(int i = 1; i<weekdays.length;i++){
out.println(weekdays[i]+"<br/>");
}
%>
</h2>
运行结果:
2.4 表达式:
在"<%= %>“之间插入表达式(不可插入语句,且“<%”和”="之间不可以有空格)。这个表达式必须可以求值,值由服务器负责计算,并将结果用字符串形式发送到客户端显示。
示例:
<!-- 表达式 -->
<h2>
Current time:<%= new Date() %><br/>
Random number:<%= Math.random() %><br/>
Simple string:<%="Hello,world" %><br/>
Simple statement:1+1=<%=1+1 %> <br/>
Visit implicit object:remote host is <%=request.getRemoteHost() %>
</h2>
运行结果:
2.5 JSP中的注释
HTML注释:
JSP注释:<%–注释内容–%>
JSP引擎忽略JSP注释,即在编译JSP页面忽略JSP注释
示例:
<p>请输入三角形三边a,b,c,的长度:
<br>
<!-- 以下是HTML表单,向服务器发送三角形三边的长度 -->
<form action="text7.jsp" method=post name=form>
<p>请输入三角形边a的长度:
<input type="text" name="a">
<br>
<p>请输入三角形边b的长度:
<input type="text" name="b">
<br>
<p>请输入三角形边c的长度:
<input type="text" name="c">
<br>
<input type="submit" value="送出" name=submit>
</form>
<%-- 获取客户提交的数据 --%>
<%
String string_a=request.getParameter("a"),
string_b = request.getParameter("b"),
string_c = request.getParameter("c");
double a=0,b=0,c=0;
%>
<%-- 判断字符串是否是空对象,是空对象就初始化 --%>
<% if(string_a == null){
string_a="0";
string_b="0";
string_c="0";
} %>
<%-- 求出边长,计算面积 --%>
<% try{
a=Double.valueOf(string_a).doubleValue();
b=Double.valueOf(string_b).doubleValue();
c=Double.valueOf(string_c).doubleValue();
if(a+b>c&&a+c>b&&b+c>a){
double p =(a+b+c)/2.0;
double mianji = Math.sqrt(p*(p-a)*(p-b)*(p-c));
out.println("<br>"+"面积:"+mianji);
}else{
out.println("<br>"+"无法构成三角形");
}
}catch(NumberFormatException e){
out.println("<br>"+"请输入数学字符");
} %>
2.6 JSP指令标签
2.6.1 page指令:定义整个JSP页面的属性和属性值
格式:
<%@ page 属性1="属性1的值" 属性2="属性2的值"...%>
Page指令的属性有:
(1)language属性:用于定义JSP页面使用的脚本语言,该属性的值目前只能取“java”
(2)import属性:为JSP页面导入java核心包中的类
(3)contentType属性:定义页面响应的MIME类型和页面字符的编码
<%@ page contenType="text/html" charest="UTF-8"%>
(4)session属性:用于设置是否需要使用内置的session对象,默认是true
(5)buffer属性:用来指定out设置的缓冲区的大小或者不使用缓冲区,默认是8kb,也可以是none
(6)auotFlush属性:指定缓冲区被填满时,缓冲区是否会自动刷新,默认值是true。当auotFlush属性取值false,如果缓冲区填满,就会出现缓存溢出异常。当buffer值是none是,auotFlush属性就不能设置为false
(7)errorPage属性:用于设置当前页面出现错误时所指向的页面。IsErrorPage用于设置当前页面为出错页面,默认值是false。若将当前页面设置为出错页面,设置isErrorPage=true
示例:(求商,若除数为0,页面报错,跳转到出错信息页面)
表单输入页面:
<body bgcolor="#FFFFFF">
<div align="center">
<form action="Divide.jsp" method="post">
<p>---整数除法---<p>
被除数<input type="text" name="value1">
除数<input type="text" name="value2">
</p>
<p>
<input type="submit" name="Submit" value="计算">
</p>
</form>
</div>
</body>
除法运算页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="error.jsp" pageEncoding="UTF-8"%>
<body bgcolor="#FFFFFF">
<center>
<br>
<h1>
<%
int dividend = 0;
int divisor = 0;
int result = 0;
try{
dividend = Integer.parseInt(request.getParameter("value1"));
}catch(NumberFormatException nfex){
throw new NumberFormatException("被除数不是整数");
}
try{
divisor = Integer.parseInt(request.getParameter("value2"));
}catch(NumberFormatException nfex){
throw new NumberFormatException("除数不是整数");
}
result = dividend / divisor;
out.println(dividend+"/"+divisor+"="+result);
%>
</h1>
<br>
<br>
<br>
<a href="javascript:history.back();">返回</a>
</center>
</body>
显示错误信息页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true"
pageEncoding="UTF-8"%>
<!--isErrorPage的作用是设置当前页面为错误页面,当在别的页面设置ErrorPage="erroe.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>Compute error</title>
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<br>
<br>
<h1>错误信息</h1>
<hr>
<p>
<h3><%=exception.toString() %></h3>
<br>
<br>
<br>
<a href="javascript:history.back();">返回</a>
</div>
</body>
</html>
2.6.2 include指令
include用来包含一个文件,告诉容器在翻译阶段需要将当前JSP文件和其他外部文件合并。可以再JSP文件的任何地方使用这个指令。include指令中文件名是一个相关的URL。
格式:<%@ include file="relative url" >
示例:(使用多页面包含一个通用的头模块和尾模块的内容)
header.jsp
<%!
int pageCount = 0;
void addCount(){
pageCount++;
}
%>
<% addCount(); %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>The include Directive Example</title>
</head>
<body>
<center>
<h2>The include Directive Example</h2>
<p>This site has been visited <%= pageCount %> times.</p>
</center>
<br/><br/>
</body>
</html>
footer.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>The include Directive Example</title>
</head>
<body>
<br/><br/>
<center>
<p>Copyright 2010</p>
</center>
</body>
</html>
main.jsp
<body>
<%@ include file="header.jsp" %>
<center>
<p>Thanks for visiting my page.</p>
</center>
<%@ include file="footer.jsp" %>
</body>
运行效果:
2.7 JSP动作标签
2.7.1 include动作标签
写法:<jsp:include page="文件的名字"/>
<jsp:include page="文件的名字"></jsp:include>
示例:
Hello.txt:
<h4>你好,天天向上
<br>学习JSP需要有Java的基础
<br>学习JSP基本语法
<h4/>
image.html:
<img src="B.jpg">
text9_1.jsp:
<body bgcolor=Cyan><font Size=1>
<p>加载的文件:
<jsp:include page="Hello.txt"></jsp:include>
<p>加载的图像:
<jsp:include page="image.html"></jsp:include>
</body>
2.7.2 param动作标签
经常和 jsp:include、jsp:forward、jsp:plugin 标签一起使用
格式:
<jap:param name="名字" value="指定给param的值"
示例:(加载9_2_1时,将获取param标签中computer的值;9_2用于执行9_2_1)
text9_2.jsp:
<body>
<p>加载文件效果:
<jsp:include page="text9_2_1.jsp">
<jsp:param name="computer" value="300" />
</jsp:include>
</body>
text9_2_1.jsp:
<body>
<%
String str = request.getParameter("computer");// 获取值
int n = Integer.parseInt(str);
int sum = 0;
for(int i=1; i<=n;i++){
sum = sum+i;
}
%>
<p>从1到<%=n %>的连续和时:
<br>
<%=sum %>
</body>
2.7.3 forward动作标签
标签的含义是重定向一个HTML文件、JSP文件,或者是一个程序片段
语法:
<jsp:forward page={"relativeURL"|"<%= expression%>"}/>
示例:(从forwardFrom.jsp提交userName参数到forwardTo.jsp的过程)
forwardFrom.jsp:
<body>
<jsp:forward page="forwardTo.jsp">
<jsp:param value="Jason.D" name="userName"/>
</jsp:forward>
</body>
forwardTo.jsp:
<body>
<%
String userName = request.getParameter("userName");
String outStr = "welcome";
outStr+=userName;
out.println(outStr);
%>
</body>
2.7.4 useBean动作标签
1.用法:
//创建一个由class属性指定的类的实例,将他绑定到其名字由id属性给出的变量上
<jsp.useBean id="" class="" scope=""/>
2.属性用法:
(1)id:命名引用该Bean的变量
(2)class:指定的Bean的完整包名
(3)scope:指定Bean在那种上下文内可用,可以取四个值:
①默认值是page,表示只可在当前页面可用
②request表示在当前的客户请求内有效
③session表示对当前HttpSession内的所有页面有效
④application表示对所有具有相同ServletContext的页面有效
(4)type:指定引用该对象的变量的类型。必须是Bean类的名字、超类名字、该类所实现的接口名字之一。变量名字是由id属性指定的。
(5)beanName:指定Bean的名字。