JSP入门教程
JavaServer Pages (JSP)是基于Java的技术,用于创建可支持跨平台及跨Web服务器的动态网页。;
JSP可与微软的Active Server Pages (ASP)相媲美,但JSP使用的是类似于HTML的标记和Java 代码片段而不是用VBScript。当你使用不提供ASP本地支持的Web服务器(例如 Apache或Netscape服务器)时,你就可以考虑使用JSP了。你虽然也可以为这些服务器弄一个ASP附加软件模块,但是太昂贵了。现在Sun公司并不会因你使用JSP向你收费(虽然将来可能要收),况且用于Solaris、 Linux以及Windows系统的组件都很容易获得。;
不要把JSP与服务器端的javascript语言搞混了。Web服务器自动将通过JSP生成的Java代码片段转换成Java 片段(servlets)。 JSP也可自动控制许多功能,如过去用Perl脚本编写功能程序或像ASP这样的服务器专用API(应用编程接口)。;
我们马上就要开始帮助你建立一个使用JSP 技术的网站范例了。;
准备好计算机以使用JSP;
你需要Java2软件开发工具箱(J2SDK),过去称之为Java开发工具箱(JDK)、JavaServer 网络开发工具箱(JSWDK)、Tomcat,或者其它能支持JSP的Web服务器。升阳公司为Windows、Solaris以及 Linux平台提供免费的J2SDK和JSWDK。;
如果你想在现有的Web服务器上使用JSP,而此服务器本身不支持JSP和Java 代码片段,可以试用Allaire公司的Jrun。它可以为Netscape的Enterprise Server和Fasttrack Server、微软的Internet Information Server(IIS)和Personal Web Server(PWS)、Apache以及其他服务器充当Web服务器附件。你也可以使用Apache服务器的Java版,其中包含最新的JSWDK。;
下载并安装所需的软件;
目前,版本号为1.2.2-001的J2SDK可下载版以可安装的归档文件形式出现。这个大约20MB的下载量软件可提供一个彻底的Java开发环境,让你创造任何基于Java并且利用了而标准核心API的解决方案。其实,你的Web服务器使用JSP的唯一条件是要有Java编辑器。要让Web服务器知道编辑器的位置,需要JAVA_HOME 环境变量设置为J2SDK安装目录。如果你已经在Windows系统中进行了安装并且接受了默认目录, 请将“set JAVA_HOME=C:1.2.2添加到你的“autoexec.bat文件中,然后重新启动。;
安装J2SDK后,下载并安装JSWDK或者是Tomcat β版,即基于Java的Apache Web服务器的β版。你把JSWDK放在什么地方是无关紧要的,只要你以后能找到它就行。通常,将其放在顶层目录中,这样你在替换JSWDK或JSDK时无需删除另一个软件。安装好这个文件后,准备工作已经就绪,你可以开始JSP开发工作了。;
正确地安装JSWDK后,请运行“startserver脚本程序,以启动Web服务器,使其按照默认情况监听8080端口。你要在启动服务器之后查看您是否已正确地安装了此工具,请加载一个JSP样本文件(http://locahost:8080/examples/jsp/)。如果你能成功地运行这些样本文件,说明你已经正确地安装了这个软件。如果你在用来启动服务器的控制台窗口中看到报错信息,你就需要做些修改。最经常发生的问题是没有设置或不正确地设置了JAVA_HOME环境变量。要看到当前环境变量设置情况,要请在DOS提示符下键入“set设置。;
开始;
在解释 JSP语法前,创建一个快捷网页,显示目当前的日期和时间,并然后将之其保存为sample.jsp:;
<html>;
<head>;
<title>First Page</title>;
</head>;
<body>;
<H3>Today is:;
<%= new java.util.Date() %>;
</H3>;
</body>;
</html>.;
把这个文件以及你所有的HTML 和 JSP 页面放在JSWDK安装目录下的网页目录里。你可以从http://localhost:8080/sample.jsp加载此网页。该网页首次被访问时,Web服务器会把JSP编译成Java代码片段,这样你就能够看到当前的日期和时间了。;
你已经下载、安装并配置好了开发环境,你可以开始学习JSP语法并创建自己的基于JSP的解决方案了。
JSP基本语法;
讲完安装问题后,现在进入来讨论JSP语法。一个投机取巧的办法是下载语法卡片。如果你不熟悉Java编程,也许你想看一下Sun的指南 。然而网页创建者并不需要进行太多的Java开发。除了一些方法调用,在你的JSP网页里应尽可能少用Java代码。;
记住以上提示,我们首先来看一看JSP指令和脚本元素,之后我们会解释JavaBeans和隐含对象。共有五种JSP指令和脚本元素。在JSP 1.0版中,大部分JSP被一个以“<% 开头和以“%>结尾的的标记括在其中。在更新的JSP 1.1规范出台后,就有了与XML兼容的版本。;
JSP指令和脚本元素;
Directives <%@ directive %>;
Declarations <%! declaration %>;
Expressions <%= expression %>;
Code Fragment/Scriptlet <% code fragment %>;
Comments <%-- comment --%>;
指令;
JSP指令是为JSP引擎而设计的。他们并不直接产生任何可见输出,而只是告诉引擎如何处理其余JSP页面。这些指令始终被括在 “<%@ ?%>标记中。两个最重要的指令是“pagePage和“Include。“Taglib指令不在讨论之列,但是在用JSP1.1创建自定义标记可以使用它。;
几乎在所有JSP页面顶部都会看到“Page指令。尽管不是必须的,但它可以让你指定:;
到何处查找起支持作用的Java类别:;
<%@ page import="java.util.Date" %>,;
出现Java运行问题时,将网上冲浪者引向何处:;
<%@ page errorPage="errorPage.jsp" %>,;
还有你是否需要管理用户的会话级信息,这些信息可能来自多个网页(在下面的JavaBeans一节将对此做进一步讲)述:;
<%@ page session="true" %>.;
“Include指令可以把你的内容分成更多可管理的元素,比如包括一个普通页面页眉或页脚的元素。包含的网页可以是一个固定的HTML 页面或更多的JSP内容:;
<%@ include file="200453092147.htm.jsp" %>;
声明;
JSP声明用来让你定义页面级变量,以保存信息或定义JSP页面的其余部分可能需要的支持方法。如果你发现代码太多,通常最好把它们写成一个独立的Java类别。声明一般都在“<%! ?%>标记中。一定要以分号(;)结束变量声明,因为任何内容都必须是有效的Java语句:;
<%! int i=0; %>。;
表达式;
有了JSP表达式,表达式评估结果会被转换成一个字符串,并且被直接包括在输出页面之内。JSP 表达式包含在“<%= ?%> 标记中,没有分号,除非在加引号的字符串部分使用分号。;
<%= i %>;
<%= "Hello" %> .
代码片段/脚本片段;
代码片段/脚本片段(Scriptlets) JSP代码片段或脚本片段是嵌在“<% ?%>标记中的。这种Java代码在Web服务器响应请求时就会运行。在脚本片段周围可能是原始的HTML或XML语句,在这些地方,代码片段可以使你创建条件执行代码,或要用到另外一段代码的代码。例如,以下的代码组合使用表达式和代码片段,显示H1、H2、H3和H4标记中的字符串“Hello。代码片段并不局限于一行源代码:;
<% for (int i=1; i<=4; i++) { %>;
<H<%=i%>>Hello</H<%=i%>>;
<% } %>.;
注释;
最后一个主要的JSP元素是嵌入式注释。尽管你始终可以在文件中加入HTML注释,但用户在查看页面源代码时会看到这些注释。如果你不想让用户看到它,你就应该将其嵌入“<%-- ?--%> 标记中:;
<%-- comment for server side only --%>.;
带JavaBean 的JSP;
虽然你可以把大段的代码放在脚本片段(scriptlet)内,但是绝大多数的Java代码属于可重复使用的名为JavaBea的组件。JavaBean类似于ActiveX控件:他们都能提供常用功能并且可以重复使用。;
JavaBean的值是通过一些属性获得的,你可通过这些属性访问JavaBean设置。以一个人来打比方,这个人就是一个JavaBean,这个人的名字、身份证号码以及住址就是其属性。在JSP网站,你基本上就是通过玩“Connect the beans)来使你的网站动态化。;
假设JavaBean先于网站被创建出来,你需要做的第一件事就是告诉JSP页面它将要用到一个“Bean。你可以用“<jsp:useBean>标记来做到这一点:;
<jsp:useBean id="localName" class="com.jguru.Person" scope="application" />。;
“<jsp:useBean>标记要求你用“id属性来识鉴别Bean。这里你提供一个名字来JSP页面其余部分的Bean。除了“id属性,你还须告诉网页面从何处查找Bean,或者它的Java类别名是什么。这种类别属性提供确 认Bean的功能,其他一些方法也可以做到这一点。最后一个必需的元素是“scope属性。有了“scope属性的帮助,你就能告诉Bean为单一页面(默认情况)[scope="page"]、为[scope="request"]请求为会话[scope="session"],或者为整个应用程序[scope="application"]保持留信息。有了会话范围,你就能非常容易地在JSP网页面上维护购物车等项目。;
一旦你声名了一个JavaBean,你就可以访问它的属性来定制它。要获得属性值,请用“<jsp:getProperty>标记。有了这个标记,你就能指定将要用到的Bean名称(从useBean的"id"字段得到)以及你想得到其值的属性。实际的值被放在输出中:;
<jsp:getProperty id="localName" property="name" />。;
要改变JavaBean属性,你必须使用“<jsp:setProperty>标记。对这个标记,你需要再次识别Bean和属性,以修改并额外提供新值。如果命名正确,这些值可以从一个已提交的表中直接获得:参数获得:;
<jsp:setProperty id="localName" property="*" />;;
可以从一个参数获得,但你必须直接命名属性和参数:;
<jsp:setProperty id="localName" property="serialNumber" value="string" />;
或者直接用一个名字称和值来设置: <jsp:setProperty id="localName" property="serialNumber" value= <%= expression %> />.;
关于JavaBean 的最后一件事: 为了Web服务器能找到JavaBean,你需要将其类别文件放在一个特殊位置。用JSWDK,最 方便的位置是安装目录下的类别目录,如jswdk-1.0.1classes。;
JSP隐含对象;
与JSP语法相关的最后的元素是一些叫做“隐含对象的东西。在JSP代码片段中,你可以利用这些隐含对象与JSP页面的代码片段执行环境产生互动。应尽量少访问这些内置隐含对象。但是,在一某些情况下,访问隐含对象是可被接受的。若要充分利用隐含对象,就需了解最新的Java Servlet API。;
下表列出可用的隐含对象集合。;
隐含对象说明;
request 客户端请求,包括从GET/POST请求传递过来的参数;
response 网页传回客户端的反应;
pageContext 在此管理网页属性;
session 与请求关联的会话;
application 代码片段的运行环境;
out 传送响应的输出流;
config 代码片段配置对象;
page JSP网页本身;
exception 有错的网页中未被捕获的例外;
这些都是用来做什么的,你又如何来使用它们呢?基本上说,在你的脚本片段里,你可以用它们进入执行JSP代码的代码片段。用不着深入了解太多的Servlet API细节,我们来看看能用它们来做到的某些事情:;
你可以不用表达式,直接进入“Out隐含对象,将某些内容输出到响应中:;
<% out.println("Hello"); %>。;
用不着把一个参数直接送到JavaBean,你可以从请求对象获取参数值:;
<% String name=request.getParameter("name"); out.println(name); %>.
在你用JSP进行开发的过程中,进行更多的开发的过程中,如果创建了JavaBeans或发现JSP文件中加入了太多的Java源代码,你就需要创建起支持作用的Java分类(class)了,它可以协助你重复利用源代码并减少JSP网页编译时间。当你需要创建Java分类文件时,你必须:;
将JDSWK installationin目录添加到PATH中。在autoexec.bat文件PATH行的末尾,加入“C:1.2.2/bin。;
用这个命令将JAR文件复制到“jrelibext:目录中: copy c:jswdk-1.0.1libservlet.jar c:jdk1.2.2jrelibext.;
创建一个JSP网站;
现在该是把所有这些JSP语法派上用场的时候了。我们将创建一个网页,它有一个输入表单,可以使用户输入一个股票代号以获得出当前股价(有20分钟)。如果输入有误,则显示报错网页。;
quote.jsp;
首先,用 这个代码 创建一个quote.jsp网页并将其保存在JSWDK安装目录下的网页目录中。大多数的网页是标准的HTML,其间散布着JSP代码。第六行是一个网页指示,表示将把所有错误发送到“errorPage.jsp文中。第13到15行是一个脚本片段,主要说明只有提供“符号参数才会显示表格。“If代码段在32到34行结束。第17行定义了要用的JavaBean,第18行从参数加载JavaBean的符号属性。第27行到29行显示Bean的属性。除了"if "代码段,实际上并不涉及其它Java代码。;
errorPage.jsp;
下一步,将下列JSP源代码保存到网页目录中的“errorPage.jsp文件中。“这是一个错误网页的提示为第一行,它将isErrorPage网页提示属性设置为真。上一页说了明错误网页的位置,本页则说明这就是错误网页。其它JSP文件中的JSP专用代码只有访问隐含例外对象才用到。网页只显示其值:;
<%@ page isErrorPage="true" %>;
<html>;
<head>;
<title>Error Page</title>;
</head>;
<body>;
<h1>Our Error Page</h1></font>;
<!-- Print Exception -->;
We got ourselves an exception:;
<%= exception %>;
<a href="quote.jsp">Restart</a>;
</body>;
</html>。;
Quotes.java;
Quotes JavaBean 利用Yahoo资源来获得股票价格。需要将此 资源保存到JSWDK安装目录下“classescomjguru目录中的“quotes.java文件中。请在此用JSDK中的Javac编辑器来编辑它。;
你的第一个JSP网页。;
创建了这两个JSP文件,建立了JavaBean资源文件并编辑了它后,你就可以从http://localhost:8080/quote.jsp加载“quote.jsp文件以查看结果,假设你没有更改JSWDK安装设置,转而使用别的端口。这个网页当然能做得更漂亮,但是它已实现了需要实现的功能,并且很好地展示了JSP的功能。
欢迎使用JavaServer Pages(以下简称JSP)技术—制作动态内容网页的方法。;
如果你希望学习这篇教程的话,我想你一定是这项技术的新手。你可能想成为一名利用JSP技术开发网络应用程序的程序员或者网页设计师。本教程中包含了一系列JSP的技巧和一些简单的代码的写法,每一步都举了一组例子来讲述原理。;
我建议你在学习本教程之前先去看一看FAQ,了解如果配置你的服务器好让他能支持并运行JSP。那样你就可以跳过前边的内容直接看你感兴趣的内容了。;
OK,费话少说,Let’s go!
第一课:真正的开始;
现在开始做我们的第一个JSP页面。图1-1展示了一个最简单的JSP页面,接下来是两段代码。;
[dukebanner.html];
<table border=0 width=400 cellspacing=0 cellpadding=0>;
<tr>;
<td height=150 width=150> </td>;
<td width=250> </td>;
</tr>;
<tr>;
<td width=150> </td>;
<td align=right width=250>;
<img src=duke.waving.gif></td></tr></table><br>;
helloworld.jsp;
<%@ page info="a hello world example" %>;
<html>;
<head><title>Hello, World</title></head>;
<body bgcolor="#ffffff" background="background.gif">;
<%@ include file="dukebanner.html" %>;
<table>;
<tr>;
<td width=150> </td>;
<td width=250 align=right> <h1>Hello, World!</h1> </td>;
</tr>;
</table>;
</body>;
</html>;
页面说明:;
在很多JSP文件中你都要写上这样的说明。在helloword.jsp中:;
<%@ page info="a hello world example" %>;
傻瓜也看得出来,这句话没什么大用,只是简要的说明一下这段代码的作用。;
你可以在JSP文件中的任何地方写这种代码,但是好的习惯是把他写在最前面,还有,因为他是JSP标签,记住一定要放在<html>前面,呵;
include说明:;
include用来在主JSP文件中调用本地的一个其他文件,通常是一些版权信息啦,脚本语言啦等其他任何你想在其他文件中重复使用的代码。在这个例子中就是调用了一个图片其实。大家明白这个意思就得了。;
随便说两句:;
在JSP中对写法非常敏感,不可以有一点错误。举个例子,把<jsp:useBean>写成<jsp:usebean>那样服务器会出现错误信息。一些如类名,包名,路径名还有其他的敏感的标签等千万不要写错。有一些JSP标签拿不准的话就去查一下JavaServer Pages语法卡片。;
代码写好了,如何试验一下呢?;
我这里写的UNIX下的方法,如果你用Windows,那么换一下路径就可以了;
1、 先建一个目录:../jswdk-1.0/examples/jsp/tutorial/helloworld;
2、 把这些文件拷过去background.gif, duke.waving.gif, dukebanner.html, and helloworld.jsp;
3、 cd ../jswdk-1.0,然后startserver;
4、 开一个浏览器,;
5、 http://yourMachineName:8080/examples/jsp/tutorial/helloworld/helloworld.jsp
第二课:用HTML表单;
大多数情况下,商业的网站都要有一些表单,比如说输入一下消费者的姓名啦,地址啦,或者敲一个词来用搜索引擎来查一下啦,或者市场人员从来访者处收集一些数据供参考什么的。;
那些表单传回的数据怎么处理的?;
来访者通过表单向JSP引擎输入了数据,并保存在了request对象中,那么接下来怎么办?;
图2-1向你展示了数据流是如何在服务器和客户之间传递的(至少在SUN的JSP reference implementation是这么做的,别的JSP引擎工作起来可能会有一点点的不同,其实大同小异,都差不多);
字儿太小了,可能看不大清吧?俺来解释一下了只好。;
首先,JSP引擎把存放在request对象中的数据发到JSP页面指定的服务器端的组件(JavaBeans组件, servlet,或者enterprise bean),组件收到这些个数据以后,有可能再存这些数据到数据库或者其他的地方存放起来,同时,返回一个response对象给JSP引擎。JSP引擎再把response对象传给JSP页面,这时的页面包含了定义好的格式和从服务器端得到的数据。这时JSP引擎和Web服务器再发送一个整理好的完整的页面给客户,也就是这们在浏览器上看到的结果。客户和服务器间的通信协议可以用HTTP,当然也可以用其他的。;
Request和Response对象在你制作的JSP原代码中起作用。到于request对象到底怎么用,我要在接下来详细的讲给你听。;
如何创建表单;
用HTML定义一些有代表性的表单做成一个JSP文件,然后用JSP标签在表单和服务器端对象(通常都用Bean)传递数据。一般情况下是这么干的:;
1、 写JSP原文件,创建一些HTML的表单并命名。;
2、 在Java文件里写Bean,定义属性,GET或者SET方法来配合已经被你指定好名字的表单。;
3、 回到JSP原文件中,增加<jsp:useBean>标签来创建一个或者调用一个现成的Bean。;
4、 增加<jsp:setProperty>标签设置HTML表单中需要SET方法的Bean的属性。;
5、 增加<jsp:getProperty>标签设置HTML表单中需要GET方法的Bean的属性。;
6、 如果需要处理更多的用户数据,用request对象。;
说了半天你可能看不懂,其实看一个例子你就懂了。;
先看一个简单的hello的例子吧:;
这段程序其实还是计算机程序里那个最经典的“hello,world的程序,只不过呢,我使他挠了一点弯儿,使他看起来比较智能和复杂。首先你输入你的名字,然后Duke跟你说:“hello!
看看代码吧:;
dukebanner.html;
<table border="0" width="400" cellspacing="0" cellpadding="0">;
<tr>;
<td height="150" width="150"> </td>;
<td width="250"> </td>;
</tr>;
<tr>;
<td width="150"> </td>;
<td align="right" width="250">;
<img src="duke.waving.gif"> </td>;
</tr></table><br>;
主JSP文件:hellouser.jsp;
<%@ page import="hello.NameHandler" %>;
<jsp:useBean id="mybean" scope="page" class="hello.NameHandler" />;
<jsp:setProperty name="mybean" property="*" />;
<html>;
<head><title>Hello, User</title></head>;
<body bgcolor="#ffffff" background="background.gif">;
<%@ include file="dukebanner.html" %>;
<table border="0" width="700">;
<tr><td width="150"> </td>;
<td width="550">;
<h1>My name is Duke. What's yours?</h1></td></tr>;
<tr><td width="150" </td><td width="550">;
<form method="get">;
<input type="text" name="username" size="25">;
<br>;
<input type="submit" value="Submit">;
<input type="reset" value="Reset">;
</td></tr>;
</form>;
</table>;
<%;
If ( request.getParameter("username") != null );
{;
%>;
<% @ include file="response.jsp" %>;
<% };
%>;
</body></html>;
回应文件:response.jsp;
<table border="0" width="700">;
<tr>;
<td width="150"> </td>;
<td width="550">;
<h1>Hello, <jsp:getProperty name="mybean" property="username" />!;
</h1>;
</td>;
</tr>;
</table>;
处理数据的Bean:(namehandler.java);
package hello;;
public class NameHandler;
{;
private String username;;
public NameHandler() {;
username = null;;
};
public void setUsername( String name ) {;
username = name;;
};
public String getUsername() {;
return username;;
};
};
建立HTML表单;
一个HTML的窗分为三个部分:<form>标签,输入方法,提交按钮发数据到服务器。一般的HTML页面里,是这么写的<form method=get action=someurl>,在其他的页面里的action属性可能是其他特殊的CGI程序或者其他能处理数据的程序,那么在JSP里边是怎么用的呢,呵,如果你想把数据发到Bean里的话那么你可以省略action里边的东里了,直接写<jsp:useBean>标签或者其他特定的JSP文件了。接下来的那些表单和普通的HTML差不多了,<input>的方法,然后加一个提交按钮,可能还有一个Reset按钮,对了,别忘了,还得给每一个input表单加一个名字。;
这么写:<input type="text" name="username">;
使用GET和POST方法;
用GET和POST方法可以发数据到服务器,在JSP程序中GET和POST方法可以发数据到Bean、servlet、或者其他服务器端的组件。;
理论上说,GET是从服务器上请求数据,POST是发送数据到服务器。事实上,GET方法是把数据参数队列(query string)加到一个URL上,值和表单是一一对应的。比如说,name=John。在队列里,值和表单用一个&符号分开,空格用+号替换,特殊的符号转换成十六进制的代码。因为这一队列在URL里边,这样队列的参数就能看得到,可以被记录下来,或更改。通常GET方法还限制字符的大小。事实上POST方法可以没有时间限制的传递数据到服务器,用户在浏览器端是看不到这一过程的,所以POST方法比较适合用于发送一个保密的(比如信用卡号)或者比较大量的数据到服务器。;
写Bean;
如果JSP程序用到了Bean,你就得按照JavaBeans API的说明设计你的Bean。;
记住下面两个关键部分。;
如果JSP程序里用<jsp:getProperty>标签,那你就得在Bean里边配合的GET方法。;
如果JSP程序进而用 <jsp:setProperty>标签,那你就得在Bean里边配合的Set方法。;
设置参数到Bean或者从里边取参数将在以后的部分详细介绍。;
传数据到Bean;
把HTML表单的数据传到Bean里需要两个工作:;
· 用<jsp:useBean>标签创建或者定位到Bean;
· 在Bean里面用<jsp:serProperty>设置属性值;
第一步用<jsp:useBean>标签创建或者定位到Bean一定要用在<jsp:setProperty>之前,<jsp:useBean>首先按照你指定的名字查找Bean,如果没找到,会给你指定一个。允许在一个JSP文件中创建一个Bean,然后再另一个文件中调用,这就给了Bean一个很广泛的运行空间。;
第二步在Bean里面用<jsp:setProperty>设置属性值。最简单的方法是把值定义成与表单名相配合。举个例子,如果你把表单名定义成“username那么,你就在Bean里定义属性“username然后用方法getUsername和setUsername。;
当然也可以定义成不同的名字,只要你不认为麻烦。谁让你记忆力好呢!;
Request对象;
用户输入的数据用来存放在Request对象里,用javax.servlet.HttpServletRequest来执行(你也可以用其他不同的工具来执行,但他们其实都是javax.servlet.HttpServletRequest的子集);
你也可以直接用scriptlet来直接访问Request对象。Scriptlet将在下一讲里边详细的讨论,现在你只需要知道他是用脚本语言写的一段放在<% 和%> 之间的代码就足够了。在JSP 1.0中,你必须用JavaTM程序语言作为你的脚本语言。;
你经常会用到如下方法处理Request对象:;
方法;
说明;
执行结果;
getRequest;
Javax.servlet.jsp.PageContext;
返回当前Request对象;
getParameterNames;
javax.servlet.ServletRequest;
返回当前Request对象参数名;
getParameterValues;
javax.servlet.ServletRequest;
返回当前Request对象参数值;
你将会发现其他方法包括ServletRequest,HttpServletRequest或者其他任何ServletRequest的子集。;
JSP引擎经常在scenes之后使用Request对象,即使你没有明确地在JSP文件中调用。;
从Bean中调数据到JSP页面;
一旦用户的数据被传到Bean,你就想重新得到数据,然后在JSP面页中显示出来。想达到这一步,你就得用到<jsp:getProperty>标签。传Bean名和属性名:;
<h1>Hello, <jsp:getProperty name="mybean" property="username"/>!;
<jsp:useBean>, <jsp:setProperty>, 和 <jsp:getProperty>标签必须相配,举个例子:;
hellouser.jsp:;
<jsp:useBean id="mybean" scope="session" class="hello.NameHandler" />;
<jsp:setProperty name="mybean" property="*" />;
response.jsp:;
<h1>Hello, <jsp:getProperty name="mybean" property="username"/>!;
在这个例子里,标签被放在两个文件中,但是指定的名字都是相同的,如果不同的话,那么系统会返回一个错误信息。;
如何运行例子;
我用的是UNIX主机,如果你用windows,那么改相应的路径即可。;
创建路径../jswdk-1.0/examples/jsp/tutorial/hellouser.;
把文件background.gif, duke.waving.gif, dukebanner.html, hellousr.jsp和response.jsp文件放进去。;
创建一个目录,../jswdk-1.0/examples/WEB-INF/jsp/beans/hello;
把文件NameHandler.java和NameHandler.class放进去。;
cd../jswdk-1.0然后startserver;
打开浏览器http://计算机名:8080/examples/jsp/tutorial/hellouser/hellouser.jsp
使用脚本;
在有些地方,你大概要加一些好的,成熟的程序到你的JSP页里,JSP的标签虽然很强大,但是完成某些工作还是比较费力的困难的。这时你可以使用脚本语言段来补充JSP标签。;
使用的JSP引擎是支持脚本语言的,SUN的JSP参考文说明,必须使用Java程序语言来编写脚本,但是其他第三方的JSP引擎允许使用其他语言来写脚本程。;
如何增加脚本;
首先,你必须了解一些增加脚本元素到JSP页中的一些基本规则;
1、 在JSP页面里用Page指令定义脚本(默认值是Java,一般不需要定义);
2、 声明语法<%!……%>声明变量和方法(函数)。;
3、 表达式语法<%=……%>定义脚本语言表达式;
4、 脚本语法〈%……%>可以操作声明、表达式和其他类型合法的代码段在页脚本语言。;
5、 一定要在结尾加%>标签;
声明、表达式、脚本使用起来有一些相似,但也有一些不同让我们用一些例子来讲述一下相同点和不同点吧。
声明<%!……%>包含了一个或多个变量和方法,结尾以分号分隔。;
例:<%! Int I=0 ; %>;
<%! Int a, b ; double c ; %>;
<%! Circle a = new circle(2.0) ; %>;
在页面中使用变量和方法之前必须声明;
声明的范围通常是JSP页,但如果页面中使用INCLUDE指令包含其他页面,范围应变得扩展到被包含的页面。;
表达式<%=……%>可以在页面中包含任何合法的语言表达式,不用分号。;
例:<%= Math.sqrt(2) %>;
<%= item[I] %>;
<%= a+b+c %>;
<%= new java.util.date() %>;
表达式和脚本的一个关键的不同点就是不需要分号。如果你需要在脚本中使用表达式就必须加分号。;
脚本<%……%>允许你写的任何数量的脚本语言;
例:<% String name=null ;;
If (request.getParmeter("name")==null{;
%>;
记住在脚本中必须使用分号结尾。;
猜数字游戏;
猜数字游戏非常的有趣,而且从这里你还可以学到很多表达式的用法。;
代码;
显示用的主屏幕(numguess.jsp);
<!--;
Number Guess Game;
Written by Jason Hunter, CTO, K&A Software;
jasonh@kasoftware.com, http://www.servlets.com;
Copyright 1999, K&A Software;
Distributed by Sun Microsystems with permission;
-->;
<%@ page import = "num.NumberGuessBean" %>;
<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session" />;
<jsp:setProperty name="numguess" property="*" />;
<html>;
<head><title>Number Guess</title></head>;
<body bgcolor="white">;
<font size=4>;
<% if (numguess.getSuccess() ) { %>;
Congratulations! You got it.;
And after just <%= numguess.getNumGuesses() %>tries.<p>;
<% numguess.reset(); %>;
Care to <a href="numguess.jsp">try again</a>?;
<% } else if (numguess.getNumGuesses() == 0) { %>;
Welcome to the Number Guess game.<p>;
I'm thinking of a number between 1 and 100.<p>;
<form method=get>;
What's your guess? <input type=text name=guess>;
<input type=submit value="Submit">;
</form>;
<% } else { %>;
Good guess, but nope. Try <b><%= numguess.getHint() %></b>.;
You have made <%= numguess.getNumGuesses() %> guesses.;
<p>I'm thinking of a number between 1 and 100.;
<p><form method=get>;
What's your guess? <input type=text name=guess>;
<input type=submit value="Submit">;
</form>;
<% } %>;
</font>;
</body>;
</html>;
操作程序(NumberGuessBean.java);
// Number Guess Game;
// Written by Jason Hunter, CTO, K&A Software;
// jasonh@kasoftware.com, http://www.servlets.com;
// Copyright 1999, K&A Software;
// Distributed by Sun Microsystems with permission;
package num;;
import java.util.*;;
public class NumberGuessBean {;
int answer;;
boolean success;;
String hint;;
int numGuesses;;
public NumberGuessBean() {;
reset();;
};
public void setGuess(String guess) {;
numGuesses++;;
int g;;
try {;
g = Integer.parseInt(guess);;
};
catch (NumberFormatException e) {;
g = -1;;
};
if (g == answer) {;
success = true;;
};
else if (g == -1) {;
hint = "a number next time";;
};
else if (g < answer) {;
hint = "higher";;
};
else if (g > answer) {;
hint = "lower";;
};
};
public boolean getSuccess() {;
return success;;
};
public String getHint() {;
return "" + hint;;
};
public int getNumGuesses() {;
return numGuesses;;
};
public void reset() {;
answer = Math.abs(new Random().nextInt() % 100);
+ 1;;
success = false;;
numGuesses = 0;;
};
};
在JSP文件中使用脚本;
numguess.jsp是一个非常有趣儿的用脚本写的例子,你看他的结构其实是一个很大的IF……ELSE结构,但是很一个从句又都是用HTML写的,看起来象一个大的程序段。;
不过你也不一定非得象numguess.jsp那样用HTML和JSP标签一起来写脚本。在<%和%>标签之间,你可以写任意多行的脚本代码,在通常情况下,尽量少用脚本来处理程序,而尽可能的使用servlets或者Beans,这样你的程序看起来会非常的清析,明了。话又说回来,怎么写JSP还得根据你的习惯和爱好,我不强迫非得使用任何一种方法,SUN的JSP详细说明书不规定脚本的长度。;
用标签组合脚本;
使用HTML和JSP标签来写脚本的时候,注意前后的标签不要忘记,一定要“封好。说的不明白,举个例子吧:;
<% } else { %> <!-- 用JSP标签的时候先关上 -->;
... 这时候用JSP标签吧 ...;
<% } %> <!-- 这样你应该看懂了吧?! -->;
开始的时候这种做法看起来可能有一点奇怪,但它以确保你JSP文件编译的时候脚本的成功转换。;
那么,脚本什么时候执行呢?;
一个JSP原文件的处理分为两个阶段:一个是HTTP的编译时候,一个是请求的处理时间。;
HTTP编译的时候,当用户第一次读JSP页面的时候,JSP的原代码被编译成CLASS,通常是servlet。HTML标签和JSP标签在这个时候同时被处理了,这之前用户还没有任何的请求被提交。;
请求处理时间是当用户在JSP页面中提交了一个请求,这时请求由客户端被request对象传到了服务器端,JSP引擎根据用户提交的值执行编译过的JSP文件或者servlet。;
当你在JSP页中使用脚本的时候,你必须知道他们什么时候被执行。声明在HTTP编译阶段就已经被处理了,其他脚本,表达式在编译JSP文件的时候也可用。表达式在HTTP编译的时候也被执行了。表达式的值被转换成了字符串被插入到JSP文件中一块儿被编译。其实在请求阶段,脚本也是可以利用的。;
如何运行例子;
我现在给出的都是在UNIX风格下的路径,如果你用Windows,那么改成Windows风格路径;
1、猜数字游戏在装TOMCAT或者JSWDK的时候就已经装好了。;
2、.jsp和.html文件在../jswdk-1.0.1/examples/num中;
3、.java和.class文件在../jswdk-1.0.1/examples/WEB-INF/jsp/bean/num中;
4、开浏览器,http://机器名/examples/jsp/num/numguess.jsp;
相关文章: