扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共19页)
熟悉JSP服务器
本“JSP由浅入深” 系列教程是面向中级和高级用户的,它需要HTML和Java的基础。你应该会将HTML网页连接到一起,并且会利用Java来进行编程。如果你还没有这个基础,建议你还是先打好基础为好。这个系列教程将通过编制简单的例子到复杂的例子来教会你JSP。本系列教程是采用循序渐进的方法来进行阐述的,即由浅入深。为了使你能够获得最大的进步,建议你再学习的过程中将所有的例子自己进行调试。开始的例子可能会很简单,所以开始的时候你要特别耐心,不要认为太简单而跳过。如果你仔细地调试例子,那么你就会很快地熟悉JSP的本质方法。
好吧,开始我们的第一个教程:熟悉JSP服务器。
如果你没有一个JSP网络服务器,那么你在开始教程之前还是先下载它吧。以下的几个服务器可以免费下载或者进行开发:
Blazix (1.5 Megabytes, JSP, Servlets and EJBs)
来自www.blazix.com/blazix.html
ServletExec (3.8 Megabytes, JSP and Servlets)
来自www.unifyeware.com/servletExec/
JRun (11 Megabytes, JSP, Servlets and EJBs)
来自www.jrun.com/
WebLogic(44 Megabytes, JSP, Servlets and EJBs)
来自www.beasys.com/
WebSphere (105 Megabytes, JSP, Servlets and EJBs)
来自www-4.ibm.com/sofeware/webservers/
如果你还没有服务器,那我建议你下载Blazix,因为它包含了标签库(可以用于以后关于标签库的教程)。Blazix同样也是很小的并且它可以很容易地下载,而且可以运行于所有的操作系统,包括处于主流的Windows98。还有一个优点,就是它的安装的速度更块。
为了真正学习JSP,最重要的是,你要在一个真实的服务器来调试教程的例子。最好的方法是通过自己的实践来学习JSP的技巧。如果你现在还没有服务器,那就先下载一个安装它就行了。
装上网络服务器以后,你应该学会以下关于网络服务器的的一些知识:应该在哪里放置文件?怎样访问来自浏览器的文件(是以http:开头的,而不是file:开头)?
你首先要创建以下的简单文件,比如:
<HTML>
<BODY>
Hello, world
</BODY>
</HTML>
怎样放置文件并在浏览器(以http://)中浏览它,这个步骤对应不同的网络服务器是不同的,所以你需要参看网络服务器的文档并找出答案。
JSP由浅入深(2)?? 第一个JSP
第一个JSP
实际上,JSP只是简单地将Java放到HTML网页中去而已。你可以将现有的HTML网页将它们的扩展名由“.html”改为“.jsp”,这是一个创建第一个JSP最好的方法。
我们可以将上一个练习中的文件将它的扩展名由“.html”改为“.jsp”。然后在浏览器中装载新的文件,即以“.jsp”为扩展名的文件。
此时,你可以看到的输出,但是它需要更长的时间。这个现象也只发生在你第一次装载它的时候。如果你重新装载它,速度就正常了。
到底出现的什么事情了?原来是你的JSP被转变成Java文件,并且被编译以及装载。而编译只进行一次,所以第一次装载的时候时间会长一点,原来是花在了编译上了。而在第二次装载的时候它不再需要编译,所以器装载速度就回复正常了。这里要提醒的是,当将HTML格式的文件转变成JSP格式的文件,都需要重新编译。
当然,只是编写HTML网页再将其转变成.jsp扩展名的文件是没有用的,在后面的教程中你将学到什么才能使JSP变得有用。
JSP由浅入深(3)?? 通过表达式增加动态内容
在我们前面的章节中,任何的HTML文件都可以转变成JSP文件,做法是通过改变它的扩展名为.jsp。当然,我们要知道是什么使得JSP有用呢?答案是嵌入Java的能力。将下列文本放置在一个以.jsp为扩展名的文件中,比如说这个文件为myjsp.jsp,然后将这个文件放置到你的JSP目录下并且在浏览器上看它。以下是具体的代码:
<HTML>
<BODY>
Hello! The time is now <%= new java.util.Date() %>
</BODY>
</HTML>
这里要注意,每次你在浏览器中重载网页的时候,它就出现当前时间。字符系列<%= and %>的作用是圈起Java表达式,这个表达式将在运行的时候被计算。
正因为这样,使用JSP产生动态HTML网页来响应用户的动作才变为可能。
好吧,教程结束之后你最好作个练习:为不同的系统属性编写一个JSP用来输出由System.getProperty返回的数值,比如java.version、java.home、os.name、user.home以及user.dir等等。
JSP由浅入深(4)?? Scriptlets
上面的教程我们已经学会了如何在JSP网页中通过在<%= and %>字符系列之间嵌入Java表达式。但是通过将Java表达式放置到HTML进行大量的编程工作是很困难的。
JSP另外允许你编写Java代码块嵌入到JSP中。具体做法是:将Java代码段放置于<% and %>字符之间。其实跟表达式是一样的,只不过在开始的地方没有等号而已。
代码块就是我们熟知的“scriptlet”。如果单单是scriptlet,对于HTML起不了任何作用。而每次scriptlet包含了被执行的Java代码的时候,JSP就被调用。
下面的代码是对上一节JSP教程进行修改后的代码,我们增加了一个scriptlet:
<HTML>
<BODY>
<%
// This is a scriptlet. Notice that the "date"
// variable we declare here is available in the
// embedded expression later on.
System.out.println( "Evaluating date now" );
java.util.Date date = new java.util.Date();
%>
Hello! The time is now <%= date %>
</BODY>
</HTML>
如果你运行上面的例子,你将会注意到“System.out.println”输出在服务器日志中。这是一个方便的方法来作一些简单的调试。有些服务器在IDE中有调试JSP的功能,你可以参见服务器文档来查看是否有这种功能。
JSP由浅入深(5)?? Scriptlets和HTML的混合
在前面的教程中我们已经在一个scriptlet中使用了“out”变量来产生HTML输出。对于更复杂的HTML,如果我们还是使用“out”变量那就会失去JSP编程的许多优势。其实我们可以很简单地就实现Scriptlets 和 HTML的混合。
假如你要在HTML产生一个表格。产生表格是一个普通的操作,在实践中你可能想从一个SQL表格或者从文件的行产生一个表格。为了是所举的例子尽量的简单,我们产生一个表格,使这个表格包含从1到N的数字。虽然以下的例子不是很有用,但是你从中可以学到一些技巧的。以下就是JSP的程序片段:
<TABLE BORDER=2>
<%
for ( int i = 0; i < n; i++ ) {
%>
<TR>
<TD>Number</TD>
<TD><%= i+1 %></TD>
</TR>
<%
}
%>
</TABLE>
在编制代码之前,你应该首先定义一个整型(int)变量“n”,利用这个变量我们要输出“n”行的表格。从上面的代码中我们可以注意到%> 和 <%字符出现在“for”循环中,原来这是为了使你退到HTML然后又回到scriptlet,其实这正是Scriptlets 和 HTML的混合的技巧。
上面的代码其实很简单:可以退出scriptlet的时候,就编写HTML;然后又回到scriptlet中去。任何的循环控制表达式,比如“while”或者“for”循环以及“if”语句都可以控制HTML。如果HTML处在一个循环中它就会在每一次的循环中执行一次。
JSP由浅入深(6)?? JSP声明
现在你所编写的JSP要变成一个类的定义。所有你编写的scriptlets要放置到这个类的一个方法中。同样,你可以增加变量和方法声明到这个类中。当然你也可以从scriptlets和表达式中使用这些变量和方法。
为了增加一个声明,你必须使用<%! and %>来圈起你的声明,比如:
<%@ page import="java.util.*" %>
<HTML>
<BODY>
<%!
Date theDate = new Date();
Date getDate()
{
System.out.println( "In getDate() method" );
return theDate;
}
%>
Hello! The time is now <%= getDate() %>
</BODY>
</HTML>
上面的例子已经声明了变量和方法:一个Date变量theDate以及一个方法getDate。这两个从现在开始在scriptlets和表达式中都是有效的了,因为它们已经定义了。
但是不幸的是,上面的这个例子并不能正常工作:不管你怎么重载网页,日期都是相同的。其中的原因是这些声明,它们只在网页被装载的时候才被计算一次。这一点就象我们在Visual C++中创建一个类并定义变量的初始化值。
本节教程的练习为:修改上面的例子,增加另外一个函数computeDate来重新初始化theDate。并且增加一个scriptlet来每次调用computeDate。
JSP由浅入深(8)?? JSP Tags
JSP另外一个重要的语法是Tags(标记)。JSP Tags不是使用<%,而只是使用<字符。JSP Tag有点象HTML Tag 。JSP tags可以有一个“start tag”、一个“tag body”以及一个“end tag”。开始和结束的标志都可以使用标志的名字,都被圈在<和>字符里面。结束的标志是在字符<后面加一个反斜杆(/)字符。这个标志名字有一个嵌入的冒号(:)字符在里面,其中冒号前面的部分描述了标志的类型。举个例子吧:
<some:tag>
body
</some:tag>
如果标志不需要一个主体,那么开始和结束标志可以合成在一起,比如 :
<some:tag/>
这里我们利用一个/>替代了>字符,这样我们就可以快速地结束标志而不需要一个实体。这条语法跟XML的是一样的。
标志可以分成两种类型:一种是从外部标志库中转载的,另外一种是预先定义的标志。预先定义的标志是以jsp:字符开始的。举个例子吧,jsp:include是一个预先定义的标志,它用于包括其它的网页。
在前面的教程我们已经学习了“include directive”。其实它跟jsp:include是很相似的。它们都不是在原始文件中装载被包含的文件的文本,而是在运行的时候调用被包括的标志。下面是一个jsp:include 使用的例子:
<HTML>
<BODY>
Going to include hello.jsp...<BR>
<jsp:include page="hello.jsp"/>
</BODY>
</HTML>
现在将上面代码中的“jsp:include”改为“jsp:forward”看看它们有什么区别。其实这两个预先定义的标志是很有用的。
再给出本节的练习吧,编写一个JSP,使之根据一个布尔型(boolean)变量来对一个包含的文件。这里还是提示一下吧,要用到HTML和scriptlets的混合编程来处理JSP标志。
JSP由浅入深(9)?? JSP Sessions
在经典的网站上,访问者可以浏览几个网页并执行一些交互的行为。如果你在编写这样的网站,利用每一个用户的一些数据是非常有用的。为了这个目的,我们可以使用JSP中的"sessions"。
Session是一个跟用户相关的对象。当用户访问网站的时候,一些数据就被存放于session中,并在需要的时候从中取出数据。Session为不同的用户保存了不同了数据。
以下的网页将用户的名字放置于session中,并可以在其它地方来显示它。首先我们要制作一个表单,然后将它命名为GetName.html
<HTML>
<BODY>
<FORM METHOD=POST ACTION="SaveName.jsp">
What´s your name? <INPUT TYPE=TEXT NAME=username SIZE=20>
<P><INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
这个表单的目标是“SaveName.jsp”,它在session保存了用户的名字。
<%
String name = request.getParameter( "username" );
session.setAttribute( "theName", name );
%>
<HTML>
<BODY>
<A HREF="NextPage.jsp">Continue</A>
</BODY>
</HTML>
SaveName.jsp在session保存了用户了名字,并连接到另外一个网页NextPage.jsp。NextPage.jsp 显示了怎样取出被保存的名字:
<HTML>
<BODY>
Hello, <%= session.getAttribute( "theName" ) %>
</BODY>
</HTML>
如果你打开两种不同的浏览器,或者从两台不同的机器上运行两个浏览器,你可以在一个浏览器中放置一个名字,而在另外一个浏览器中放置另外的名字,但是两个名字都将被跟踪。Session保持跟踪直到超时,这时它就会假设用户没有访问网站了,所以就取消了session。
最后再布置一下本教程的联系:利用session,在上面的例子中增加一个用户的“age”属性。
JSP由浅入深(10)?? Beans and Forms处理
表单(Forms)是在网站交互的一个很普通的方法。JSP使表单处理更加简单。在JSP中处理表单的标准方法是定义一个“bean”。这个“bean”不是一个完全的Java bean。你只需在定义一个类使它有个区域,这个区域跟表单中的每一个区域相对应。这个类区域必须有“setters”来匹配表单区域的名字。举个例子,让我们修改一下前面教程的GetName.html并且收集Email地址和用户的年龄。具体代码修改如下:
<HTML>
<BODY>
<FORM METHOD=POST ACTION="SaveName.jsp">
What´s your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR>
What´s your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR>
What´s your age? <INPUT TYPE=TEXT NAME=age SIZE=4>
<P><INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
为了收集数据,我们要定义一个Java类,使它有“username”、“email”、“age”的区域,并且我们要提供“setter”方法“setUsername”、“setEmail”和“setAge”。这个“setter”方法只是一个以“set”开始其后是区域名的一种方法。区域名字的第一个字母要用大写的。所以如果区域为“email”,它的“setter”方法就为“setEmail”。同样的,“Getter”方法也类似定义,它只不过是用“get”来代替“set”而已。并且要使得setters和getters必须为公共的(public)。例如:
public class UserData {
String username;
String email;
int age;
public void setUsername( String value )
{
username = value;
}
public void setEmail( String value )
{
email = value;
}
public void setAge( int value )
{
age = value;
}
public String getUsername() { return username; }
public String getEmail() { return email; }
public int getAge() { return age; }
}
JSP由浅入深(11)?? 标记库
JSP 1.1提出了一种扩展的JSP标志的方法,这种方法命名为“标志库”。这些库允许另外的一些类似于jsp:include 或者jsp:forward的标志,但是它们不是以jsp:为前缀的并且还附件一些特性。
为了介绍标志库,在本教程中我们使用Blazix标志库作为例子。这个标志库只能用在Blazix服务器中,这个服务器你可以免费下载。
每一个标志库都有它自己的标志库特殊的文档。为了使用标志库,你可以使用"taglib" directive来指出标志库“description”处在什么地方。对于Blazix标志库而言,directive如下:
<%@ taglib prefix="blx" uri="/blx.tld" %>
上面者句中“uri”就是指出了标志库描述所在的地方。标志库的前缀是不同的。这个指令的意思是说我们可以使用blx:来使用库中的标志。Blazix标志库提供了一个blx:getProperty标志。这个标志可以允许用户编辑表单数据。现在,在GetName.jsp文件中,我们增加一个jsp:useBean并且将表单放置在blx:getProperty中:
<%@ taglib prefix="blx" uri="/blx.tld" %>
<jsp:useBean id="user" class="UserData" scope="session"/>
<HTML>
<BODY>
<blx:getProperty name="user" property="*">
<FORM METHOD=POST ACTION="SaveName.jsp">
What´s your name? <INPUT TYPE=TEXT NAME=username SIZE=20><BR>
What´s your e-mail address? <INPUT TYPE=TEXT NAME=email SIZE=20><BR>
What´s your age? <INPUT TYPE=TEXT NAME=age SIZE=4>
<P><INPUT TYPE=SUBMIT>
</FORM>
</blx:getProperty>
</BODY>
</HTML>
从上面的代码中我们可以发现blx:getProperty不是以/>结尾的,而是用</blx:getProperty>来结尾。这条语句将所有的表单输入区域输入到blx:getProperty中,这样它们就可以被标志库正确地修改。
接着建立一个从GetName.jsp到NextPage.jsp的连接,你将发现bean的数据自动显示在输入区域中。所以现在用户可以编辑数据了。
JSP由浅入深(12)?? 表单编辑
比如来自Blazix服务器的标志库在你的系统环境中不能使用,那么不使用标志库来实现相似的功能呢?本教程就是为这个问题而提出的。这个问题是可以解决的,只是代码要长一点。主要地,你必须亲自编辑HTML标志,然后将它设置缺省值。从下面的例子的例子中我们可以学到怎样修改GetName.jsp以提供类似于blx:getProperty的特性,但是我们只能手工地编辑HTML标志:
<jsp:useBean id="user" class="UserData" scope="session"/>
<HTML>
<BODY>
<FORM METHOD=POST ACTION="SaveName.jsp">
What´s your name? <INPUT TYPE=TEXT NAME=username
SIZE=20 VALUE="<%= user.getUsername() %>"><BR>
What´s your e-mail address? <INPUT TYPE=TEXT
NAME=email SIZE=20
VALUE="<%= user.getEmail() %>"><BR>
What´s your age? <INPUT TYPE=TEXT NAME=age
SIZE=4 VALUE=<%= user.getAge() %>>
<P><INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>
如上面的代码所示,它只简单地在INPUT标志上增加一个“VALUE”区域,并且用一个表达是初始化这个区域。
为了处理在输入过程中的异常错误,我们可以在bean中使用“String”区域并且将它转换为目标数据类型就可实现。所以这样也可以处理异常错误。
作为课后练习,我们可以将前面教程中的例子改成不用Blazix标志库。
至此,本“JSP由浅入深”系列教程到此全部结束,希望对你有帮助。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者