首页

Click here to read ！
中 华 电 脑 书 库
http://www.pcbookcn.com
声明：本站所制作的书籍仅供个人学习,交流,研究之用。版权归原 作者和原出版物所有。如要作其它用途请直接与版权所有者联系。


(1)熟悉JSP服务器

JSP由浅入深(1)—— 熟悉JSP服务器
编译：ZSC/太平洋网络学院

熟悉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://）中浏览它，这个步骤对应不同的网络服务器是不同的，所以你需要参看网络服务器的文档并找出答案。

[下一页]


(2)第一个JSP

JSP由浅入深(2)—— 第一个JSP

第一个JSP

实际上，JSP只是简单地将Java放到HTML网页中去而已。你可以将现有的HTML网页将它们的扩展名由“.html”改为“.jsp”，这是一个创建第一个JSP最好的方法。

我们可以将上一个练习中的文件将它的扩展名由“.html”改为“.jsp”。然后在浏览器中装载新的文件，即以“.jsp”为扩展名的文件。

此时，你可以看到的输出，但是它需要更长的时间。这个现象也只发生在你第一次装载它的时候。如果你重新装载它，速度就正常了。

到底出现的什么事情了？原来是你的JSP被转变成Java文件，并且被编译以及装载。而编译只进行一次，所以第一次装载的时候时间会长一点，原来是花在了编译上了。而在第二次装载的时候它不再需要编译，所以器装载速度就回复正常了。这里要提醒的是，当将HTML格式的文件转变成JSP格式的文件，都需要重新编译。

当然，只是编写HTML网页再将其转变成.jsp扩展名的文件是没有用的，在后面的教程中你将学到什么才能使JSP变得有用。


(3)通过表达式增加动态内容

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等等。


(4)Scriptlets

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的功能，你可以参见服务器文档来查看是否有这种功能。


(5)Scriptlets和HTML的混合

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处在一个循环中它就会在每一次的循环中执行一次。


(6)JSP声明

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。


(7)JSP Directives

JSP由浅入深(7)—— JSP Directives

在前面的教程中，我们已经使用了java.util.Date。可以有人就会问：为什么不只使用import java.util.*呢？其实，在JSPs中也可以使用import语句，但是它的语法跟普通的Java是有些差别的。下面给出一个例子：

<%@ page import="java.util.*" %>

<HTML>

<BODY>

<%

System.out.println( "Evaluating date now" );

Date date = new Date();

%>

Hello! The time is now <%= date %>

</BODY>

</HTML>

上面的代码中第一行我们调用了一个“directive”。这个JSP“directive”是以<%@字符为开头的。这是一个"page directive"。这个"page directive"可以包含所有的引入的项目。假如你为了引入多于一个的项目，你就可以利用逗号（，）来分隔项目，比如 ：

<%@ page import="java.util.*,java.text.*" %>

在"page directive"中可以有多个JSP directives。除了"page directive"以外，其它有用的directives有include 和 taglib。在后面的教程中我们再对taglib进行详细的讨论。这里只讨论include directive。


(8)JSP Tags

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标志。


(9)JSP Sessions

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”属性。


(10)Beans and Forms处理

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; }

}


(11)标记库

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的数据自动显示在输入区域中。所以现在用户可以编辑数据了。


(12)表单编辑

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由浅入深”系列教程到此全部结束，希望对你有帮助。

[上一页]


酷站推荐

◎->露点美女秀 http://mnxiu.126.com 或 http://mnshow.myetang.com
简介：收集了超过1000M的中日明星写真照片及性感壁纸，张张都精彩！

◎->QQ贴图宝库 http://qqpic.126.com
简介：2000余款聊天室专用贴图，让你充满自信！

◎->中华特效王 http://cntxking.126.com
简介：1000余个网页特效代码 + 在线演示， 让你的主页动起来！新手不可错过哦^o*