Posts Tagged ‘教程’

html label标签的使用教程

星期三, 06月 4th, 2008

在Dreamweaver8中,只要一加入表单或表单对象,文本框等等,就会在相关代码中加入一个<label></label>,一直没明白这个label是做什么de,今天正好看到了解释:
Label 中有两个属性是非常有用de,一个是FOR、另外一个就是ACCESSKEY了.
FOR属性
功能:表示Label标签要绑定deHTML元素,您点击这个标签de时候,所绑定de元素将获取焦点.
用法:<Label FOR=”InputBox”>姓名</Label><input ID=”InputBox” type=”text”>
ACCESSKEY属性:
功能:表示访问Label标签所绑定de元素de热键,当您按下热键,所绑定de元素将获取焦点.
用法:<Label FOR=”InputBox” ACCESSKEY=”N”>姓名</Label><input ID=”InputBox” type=”text”>
局限性:accessKey属性所设置de快捷键不能与浏览器de快捷键冲突,否则将优先激活浏览器de快捷键.
注释
要将 LABEL 绑定到其它de控件,请将 LABEL 元素de FOR 属性设置为与该控件de ID 相同.将 LABEL 绑定到控件de NAME 属性毫无用处.但是,要提交表单,您必须为 LABEL 元素所绑定到de控件指定NAME.
有两种方法给所指定de快捷键添加下划线.LABEL 元素de rich text 支持可以在 ACCESSKEY 属性所指定de快捷键字符两侧加上 U 元素.如果您更愿意使用样式表(CSS)来应用样式,可以将该字符包含在 SPAN 中,并设置样式为“text-decoration: underline”.
如果用户单击 LABEL,则会先触发 LABEL 上de onclick 事件,然后触发由 htmlFor 属性所指定de控件上de onclick 事件.按下 LABEL 设定de快捷键将设置焦点但并不触发 onclick 事件.
需要注意de地方:
1、标签不允许嵌套.
2、此元素在Internet Explorer 4.0 及以上版本de HTML 和脚本中可用.
3、此元素是内嵌元素.
4、此元素需要关闭标签.
元素示例相关代码
下面de例子使用了 LABEL 元素和 ACCESSKEY 属性设置文本框de焦点.
<LABEL FOR=”oCtrlID” ACCESSKEY=”1″>
<SPAN style=”text-decoration:underline;”>名字</SPAN>: <font color=”#999999″>按ALT 1到文本框</font>
</LABEL>
<INPUT TYPE=”text” NAME=”TXT1″ VALUE=”阿会楠” SIZE=”20″ TABINDEX=”1″ ID=”oCtrlID”>
演示:
点击运行可以看到效果:
[Ctrl A 全选 提示:您可先修改部分相关代码,再按运行]

CSS制作树状目录教程

星期三, 06月 4th, 2008

本篇详细介绍如何利用CSS能方便地控制对象de“显示”和“隐藏”属性原理,制作一个树状目录,用CSS制作这样de树状目录,方法简单,相关代码也比较少,所以把它写出来,给网友们共亨,以便在需要de时候也可动手做一个.

索易电子杂志大多采用树状目录,当鼠标点击主目录时,展开子目录;当再次点击主目录时,则关闭子目录.显得简捷明快,朴实无华.
制作这种树状目录de方法较多,最近我先看下面de示例:当用鼠标在主目录上点一下,就下拉出相应de子目录,再点一下,又恢复原状,其效果与索易电子杂志上de目录效果完全一致.


   制作方法:
   我先把产生这种效果de相关代码复制如下,然后结合相关代码讲制作方法:
〈div id=”main1″ style=”color:blue” onclick=”document.all.child1.style.display=(document.all.child1.style.display ==”none”)?””:”none”” 〉
主目录1〈/div〉
〈div id=”child1″ style=”display:none”〉
〈a href=”#”〉- 子目录1〈/a〉 〈br〉
〈a href=”#”〉- 子目录2〈/a〉 〈br〉
〈a href=”#”〉- 子目录3〈/a〉 〈br〉
〈a href=”#”〉- 子目录4〈/a〉
〈/div〉
〈div id=”main2″ style=”color:blue” onclick=”document.all.child2.style.display=(document.all.child2.style.display ==”none”)?””:”none”” 〉
主目录2 〈/div〉
〈div id=”child2″ style=”display:none”〉
〈a href=”#”〉- 子目录1〈/a〉 〈br〉
〈a href=”#”〉- 子目录2〈/a〉 〈br〉
〈a href=”#”〉- 子目录3〈/a〉
〈/div〉
   注:“ ”表示一个字符空格
   1、先定义两个DIV,一个用于主目录,取名为:main1;另一个用于相应de子目录,取名为:child1.  2、在main1deDIV中写上“ 主目录1”,并在它de上面加载一个鼠标单击事件:onclick 和一小段Javascript程序:document.all.child1.style.display= (document.all.child1.style.display ==”none”)?””:”none”.这段程序de作用是,当鼠标在main1deDIV上(也就是在“ 主目录1”上)单击时,如果child1deDIV是隐藏de,让它显示;若是显示de,则让它隐藏.
   3、在child1deDIV上写上子目录,并 把它设置成超级链接,我在上面de示例中是设置了空链接,实际制作时把它改为实链接,以让它指向链接目标.在child1deDIV定义中加上一个CSS: style=”display:none”,其目de是使子目录开始时处于隐藏状态.
   其它目录de制作只是重复上面de三步而已.按F12就可看到 效果了.这种方法主要是利用了CSSde显示属性:display,它有一个特点就是当对象被隐藏后,对象所占据de页面空间将自动让出.我知道CSS还一 个属性:visibility也具有显示和隐藏de对象de功能,但不能用来制作上面de树状目录.因为Visibility在隐藏对象后,对象所占据de空间并 不释放,也就是当隐藏子目录时,子目录de位置只是一片空白而已位置并没有让出来,因此另一个主目录也就无法靠拢.所以它只能用于那些需要固定页面元素位置 de地方.

动态CSS站点教程:多个页面样式提供浏览者选择

星期三, 06月 4th, 2008

在cnbruce’’s blog上看到这个即时换STYLEde相关代码,觉得不错就COPY过来备用.
在见de例子就是:一个站点上有多个页面样式提供浏览者选择.同时,在选择了某样式后,再次打开该页面时,将仍然保持该样式.自然会想到了Cookie技术.


程序相关代码
<HTML>
<HEAD>
<link ID=”skin” rel=”stylesheet” type=”text/css”>
<TITLE>换肤技术</TITLE>
<SCRIPT LANGUAGE=javascript>
<!–
function SetCookie(name,value){
var argv=SetCookie.arguments;
var argc=SetCookie.arguments.length;
var expires=(2<argc)?argv[2]:null;
var path=(3<argc)?argv[3]:null;
var domain=(4<argc)?argv[4]:null;
var secure=(5<argc)?argv[5]:false;
document.cookie=name “=” escape(value) ((expires==null)?”":(”; expires=” expires.toGMTString())) ((path==null)?”":(”; path=” path)) ((domain==null)?”":(”; domain=” domain)) ((secure==true)?”; secure”:”");
}

function GetCookie(Name) {
var search = Name “=”;
var returnvalue = “”;
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search);
if (offset != -1) {
offset = search.length;
end = document.cookie.indexOf(”;”, offset);
if (end == -1)
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset,end));
}
}
return returnvalue;
}

var thisskin;
thisskin=GetCookie(”nowskin”);
if(thisskin!=”")
skin.href=thisskin;
else
skin.href=”css.css”;

function changecss(url){
if(url!=”"){
skin.href=url;
var expdate=new Date();
expdate.setTime(expdate.getTime() (24*60*60*1000*30));
//expdate=null;
//以下设置COOKIES时间为1年,自己随便设置该时间..
SetCookie(”nowskin”,url,expdate,”/”,null,false);
}
}
//–>
</SCRIPT>
</HEAD>
<BODY>

<P>请选择下面de下拉菜单测试换肤效果</P>

<a href=# onclick=”changecss(”css.css”)”>css.css</a>
<a href=# onclick=”changecss(”css1.css”)”>css1.css</a>
<a href=# onclick=”changecss(”css2.css”)”>css2.css</a>
<a href=# onclick=”changecss(”css3.css”)”>css3.css</a>
<br>

<select onchange=”changecss(this.value)”>
<option>选择样式单文件</option>
<script language=”javascript”>
var csss=new Array();
csss[0]=”css.css”;
csss[1]=”css1.css”;
csss[2]=”css2.css”;
csss[3]=”css3.css”;
var i;
for(i=0;i<4;i )
if(thisskin==csss[i])
document.write(”<option value=\”" csss[i] “\” selected>” csss[i] “样式单文件</option>”);
else
document.write(”<option value=\”" csss[i] “\”>” csss[i] “样式单文件</option>”);
</script>
</select>
</BODY>
</HTML>

ASP.NET与MySQL数据库简明图示入门教程

星期二, 06月 3rd, 2008

  作者: CRYSTAL编译

  在ASP时代,如果我要建立一个数据库驱动deweb站点,那么您可以选择环很多钱de微软SQL SERVER数据库或者选择要花很多时间来寻找达到性能和稳定性统一deACCESS数据库,但在.NET时代您有另一种选择,那就是:MySQL数据库
  什么是MySQL数据库?
  MySQL数据库是一种开放源相关代码de数据库,通过获得授权来保持源相关代码de官方支持,同时可以自由修改源相关代码,目前许多公司和组织都采用了这种数据库.对此详细信息您可以访问MySQLde官方站点.
  第一步 下载和安装
  与大多数软件一样,首先是得到并安装mysql数据库软件,获得Mysql数据库de方很简单,在mysql.com/downloads/index.html”>http://dev.mysql.com/downloads/index.html . 上可以自由下载,本文采用de是Mysql4.1,当然读者也可以下在其他版本,不过我要推荐给读者de是最好下载预编译de二进制de文件.我de操作平台是Windwos XP,所以我选择de是包括安装文件deWindows版,这个版本大约35M,所以下载de时间不是很长,除非您de网络有问题.
  安装非常简单,按照安装步骤不会导致任何问题,如下图:


MySQL Server安装

MySQL Server安装

MySQL Server安装

MySQL Server安装

  如图所示,在安装完成de最后一步,系统会问您是否要配置MySQL服务器,如果选择现在配置MySQL服务器,那么系统将自动运行MySQL实例配置向导,于是您将进入下一步.

  第二步 配置
  MySQL服务器实例配置向导使配置服务器变得非常简单,按照配置向导一步一步de走,绝大多数时候都选择缺省配置.


MySQL服务器配置向导

MySQL服务器配置向导

  如上图,读者可以自行选择是安装在专用de数据库服务器上或是共享de服务器,由于我使用de笔记本电脑,所以我选择是最简单de”Developer Machine”,这个设置不能提供同样de性能,而且也不能使用很多系统资源

MySQL服务器配置向导—选择数据库de用途

MySQL服务器配置向导—指定TCP/IP和端口号

  必须确保响应TCP/IP网络协议,以保证Web页载需要de时候Web服务器能连接数据库;如果您de数据库和web服务器安装在同一台服务器上,那么可以禁用这个选项以防止来自网络de访问.
  MySQL服务器配置向导—设置默认字符串类型


MySQL服务器配置向导

MySQL服务器配置向导—安装服务

MySQL服务器配置向导—设置SQL连接密码

MySQL服务器配置向导—即将完成配置

  第三步 MySQL Administrator
  也许您认为可以不需要这个东西,但我还是要建议您下载并使用MySQL Administrator,它提供图形界面以帮助您管理MySQL数据库,Windows用户可以通过命令提示行运行MySQL Administrator,在余下时间里我假定您已经安装了MySQL Administrator,并且将使用相关图例.


MySQL Administrator主界面


  第四步 创建数据库
  要创建数据库,我必须首先连接服务器.运行MySQL Administrator并登陆服务器.


运行MySQL Administrator并登陆服务器


  选择MySQL Administrator左侧底部de”Catalogs”,然后在管理器de右侧会出现目前服务器上已经有de数据库目录,右击Schema窗口de”mysql“,选择”Create New Schema”.


创建一个新de数据库


  系统将提示您输入数据库de名称,这里我使用”mydatabase”,在本文以后也将使用这个名称.


输入数据库名称


  一旦创建后,新数据库就将与服务器中de其他数据库一起出现在Schema窗口,选择它后,在右侧窗口将出现它de详细资料.

完成新数据库de创建:


新de数据库创建完成了


  现在这里面还没有更多de东西,因为目前数据库还是空de.下面我就为数据库添加点东西.
  第五步 创建表
  创建表很简单,只需要点击”Create Table”按钮,于是将出现下面de对话框:


创建表


  如图所示,我已经给表取名为”mytable”,有四个域,其中id域为自动增量de主键、一个整数域、一个文本域和一个时间/日期域.
  在完成这些后,点击”Apply Changes”按钮,将出现如下图de窗口,窗口中de是创建表deSQL语句,同时询问是否执行,当然点击”Execute”.


确认并执行表中deSQL语句


  到目前为止,我已经创建了一个包含名为”mytable”de表de名为”mydatabase”de数据库,下面我要做de就是为数据库添加点数据.

  第六步 添加数据
  在真实情况中,添加数据是通过应用程序来实现de,但现在仅仅是要添加几个样本数据,所以我将在MySQL客户端命令中使用SQL语句deinsert语句来实现,如果现在您还在MySQL Administrator中,那么可以通过菜单”tools”来访问命令行(Tools -> MySQL Command Line Client),否则可以通过开始菜单deMySQL组来访问.


通过命令行语句来实现添加数据


  图中de第一行是告诉服务器我将使用那个数据库,第二和第三仅仅是简单de向数据库插入数据.
  现在数据表中有两个样本数据,到目前为止,我de数据库服务器已经建立并运行了,里面有一个数据库,一个数据表,一些数据.
  第七步 创建新deMySQL用户账号
  要添加用户账号需要再一次运行并登陆MySQL Administrator,在MySQL Administrator窗口de左边选择”User Administration”,同时右边将显示服务器现行账号de信息(这里通常是所谓deroot),右击下面小窗口里de账号,选择”Add new User”.


再次运行MySQL Administrator,并添加一个用户帐号


  接下来系统将提示您输入新用户de详细信息,我给新用户取名为”15secs”,口令设置为”password”.


设置用户名、密码等常规选项


  完成这些后,点击”Apply Changes”按钮以保存输入.
  第八步 给用户账号授权
  缺省状况下de新用户几乎什么都做不了,要允许新用户连接MySQL数据库必须在”Schema Privileges”中进行授权,这一切将在MySQL Administrator.中de”Schema Privileges”中完成.


为新开帐号设置权限


  注意上图还没有为用户进行任何授权,由于后面de相关代码需要查询数据库,故需要授予用户”select”权限,然后点击”Apply Changes”按钮保存.

进行授权:


进行授权


  也许应用程序需要更多de权限,如:”INSERT”, “UPDATE”, 和 “DELETE”等等,您可以用同样de方法授予给用户,但要注意de是,权限越多安全越小,您必须对每个用户都实行控制.

  第九步 ASP.NET页连接数据库服务器
  在.NET中连接MySQL数据库有两种方法:MySQL Connector/ODBC 和 MySQL Connector/Net,ODBC连接器是符合ODBC标准de交互平台,是.NET访问MySQL数据库de最好de选择.
  下载MySQL Connector/Net,然后直接安装,如下图:


MySQL Connector/Net安装图

MySQL Connector/Net安装图

MySQL Connector/Net安装图

MySQL Connector/Net安装图

  注意:我选择了register Connector/NET in the Global Assembly Cache,但我发现它已经被安装了,但我不能使用import语句,找不到Connector/NETde名称空间,直到将MySql.Data.dll文件拷贝到/bin目录下后才解决这个问题,系统报出de错误是:

BC30466: Namespace or type specified in the Imports ‘MySql.Data.MySqlClient’ cannot be found
  我相信这个问题依然存在,只能暂时用手工将文件从安装位置拷贝到相应de目录中,如:C:\Program Files\MySQL\MySQL Connector Net 1.0.4\bin\.NET 1.1\,拷贝到C:\Inetpub\wwwroot\bin\,就可以解决这个问题.
  第十步 示例程序
  至此我de数据库终于完成,MySQL Connector/Net也安装成功,我该做点其他什么事情了.下面我将提供一段简单de脚本,在这段脚本中,我将连接和查询数据库中de数据,输入数据不是脚本de要点. MySQL.aspx
<%@ Page Language=”VB” debug=”true” %>
<%@ Import Namespace = “System.Data” %>
<%@ Import Namespace = “MySql.Data.MySqlClient” %>
<script language=”VB” runat=”server”>
Sub Page_Load(sender As Object, e As EventArgs)
 Dim myConnection As MySqlConnection
 Dim myDataAdapter As MySqlDataAdapter
 Dim myDataSet As DataSet
 Dim strSQL As String
 Dim iRecordCount As Integer
 myConnection = New MySqlConnection(”server=localhost; user id=15secs; password=password; database=mydatabase; pooling=false;”)
 strSQL = “SELECT * FROM mytable;”
 myDataAdapter = New MySqlDataAdapter(strSQL, myConnection)
 myDataSet = New Dataset()
 myDataAdapter.Fill(myDataSet, “mytable”)
 MySQLDataGrid.DataSource = myDataSet
 MySQLDataGrid.DataBind()
End Sub
</script>
<html>
 <head>
  <title>Simple MySQL Database Query</title>
 </head>
<body>
 <form runat=”server”>
  <asp:DataGrid id=”MySQLDataGrid” runat=”server” />
 </form>
</body>
</html>

  在上面de脚本中黑体字部分将随您采用de平台不同而进行修改,如采用SQL Server应用System.Data.SQLClient来替换MySql.Data.MySqlClient,这只是一点,更详细de本文就不讨论了.下图是脚本运行结果:

脚本运行结果

  结论:
  我希望本文能对读者理解数据库服务器有所帮助,当您打算从access或SQL Server上升级de时候,MySQL是一个不错de选择,尽管它是开放源相关代码de,而且还有些缺陷,但它与.NETde结合能做许多工作,另外MySQL Administrator使管理数据库服务器不再是管理员de噩梦.

JSP简明教程:对比与总结

星期一, 06月 2nd, 2008

JSP、SSJS与NAS
  JSP不会取代或威胁到SSJS作为一种web开发平台de地位,它们拥有各自de市场.尽管JSP比SSJS更强大,更灵活,但是要编写脚本相关代码您就必须学习Java――至少在某个厂商推出像JavaScript这样de更加简单de语言之前是这样.同时,SSJS仍然提供简单强大deJavaScript语言,它比Java易学而且在某些方面更灵活,因为它可以被松散地键入.从NAS被人们注意时起,就可以肯定JSP不可能取代NAS提供de强大功能.JSP是一种先进de表达层技术,它可以很好地与NAS体系结构共存.NAS现在使用一种独有de标识语言用于构建表单层模板.这种标识语言有些“顽固",它不允许在页面内加入脚本,这一点显然不如JSP灵活.在NAS4.0中,网景公司将引入JSP作为一种可选择de标识语言与同样要在NAS4.0中引入de底层NAS servlet模型一起工作.事实上,JSPde出现对于NAS开发者来说是个好消息.
JSP与XML
  JSP与XML有着有趣de联系.一方面,您可以把JSP和XML混合使用,就像混合JSP与HTML一样,这样一来就那用JSP来动态生成XML页.换句话说,您可以用JSP编写原始XML文档.JSP在几种特殊类中提供了这一功能,但这并不是它特有de.理论上,您可以使用任何脚本语言,包括CGI、SSJS和ASP,来动态生成XML页,与生成HTMLde方法一样.在JSP规范中明确声明了JSP支持动态生成XML文档,并且证实这种生成动态内容de方法不违反任何XML规则.
  另一方面,JSP页本身可被解释为XML文档.JSP规范中定义了XML适用de标签和XML不适用标签可供选择.比如,脚本片断(写在<%…%>中)同样可以写在XML适用标签<jsp:sriptlet>和</jsp:scriptlet>之间.显然,当您手工书写JSP相关代码时,前一种方法比XML格式更容易.然而,在IDE(集成开发环境)或其他JSP开发工具中,使用XML书写格式能够更容易地生成有效deJSP页.关于JSP和XML关系de详细资料,请参阅JSP规范.
结束语
  JSP一定会理所当然地受到各种各样deweb开发人员de关注,因为它不仅通过标签de使用对初级de程序员通过支持,还适用于高级de脚本编写者和Java开发者.实际上,除网景以外de其他厂商也已经提供了这样或那样deJSP开发工具.尽管Sun还没有正式发布JSP1.0规范(写本文时发布deJSP1.0还只是一个草案),IBM、BEAWebLogic和LiveSystems已经在他们de应用服务器中实现了JSP.由于JSP是一个开放de标准,它允许用其他语言(如JavaScript)代替Java,所以它将会在行业中赢得更为广泛de支持.前面提到过,网景公司已经宣布NAS4.0将支持JSP和Javaservlets.
  JSP与生俱来de灵活性、对组件为中心程序设计de支持、以及它de跨平台性使它成为Netscape跨平台服务体系de完美补充.由于NAS本身就是一个以组件为中心de支持Javade服务系统,JSP看来将会成为与未来版本deNAS相匹配de最理想de表单层技术.如果您已经或即将成为NAS程序员,我强烈建议您下载Sun发行deJSP reference implementation并从现在开始学习它.这个工具不是作为生产软件产品使用de,但您可以用它构建和运行一些简单de应用程序,借此来熟悉JSP.其中还包括了一些示例程序,它们将和本文一起引导您走向JSP开发之路.

JSP简明教程:令人兴奋的脚本编程

星期一, 06月 2nd, 2008

如果您是直接使用Java servlets,那您将不得不在Java类中处理HTTP输入和HTML输出,您需要丰富deJava编程经验来构建复杂de应用程序.JSPde加入,使您可以把HTMLde表达逻辑从植入servlets中de复杂de商务逻辑区分开来.这意味着可以由有经验de脚本编写者来编写表达层相关代码,而高级deJava开发者能够集中精力去解决servlets和bean中更为复杂de问题.
  不管您有没有Java编程知识,都能够使用JSP.JSP包含了一些服务器端de标签,使得不用写一行Java相关代码就能显示动态数据.您可以直接访问bean来完成操作,然后使用JSP标签把结果显示为动态内容.您还可以用servlets生成bean,servlets 操作de运算结果存于其中,然后再使用JSP标签显示结果,同样不需要在JSP页中写Java相关代码.
  有三种方式可以用来在您de网页中加入Java相关代码:
  1、使用declarations(声明),可以定义全局变量或是在页内任何地方都可以访问deJava方法.声明被包含在标记<%!…%>中.
  2、使用scriptlets(脚本片断),您能书写页内处理所需de任何逻辑,它们包含在<%…%>标记内.
  3、Expressions(表达式),包含于<%=…%>中.它提供一种简单de方法来显示Java表达式de结果.被附加上de表达式将被计算并在页面上显示出来,就好像您已经在相关代码中明确写出了运算结果de数值一样.
  在您自己编写de相关代码中,可以使用一些隐含变量(implicit variables)――JSP提供de预定义deJava对象.另外,通过使用JSPde指令(directives), 还可以包含非Java相关代码模块,比如来自其他文件deHTML文本.
  下面我来仔细看一看这些脚本元素,在编写您自己deJSP脚本时将会经常用到它们.
Directives(指令)
  JSP定义了三个页内指令用于设置JSP参数或扩充相关代码.它们是 page,include和taglib,必须写在JSP页de第一行.语法如下:
  <%@ directive attribute="value" … %>
  page指令允许您为网页设定一些基本参数,包括设置所用脚本语言de参数(默认为Java)、您de脚本片断中引入deJava类、设置输出缓冲区等等.完整depage指令参数表见《JSP Specification Version 1.0》(《JSP规范1.0》)de2.8.1章.
  使用include指令,可以包含其他文件de内容,比如存于单独文件中deHTML报头和页脚.
  taglib指令用于扩充标准deJSP标签集,这超出了本文de讨论范围.然而,了解JSP定义了一种扩充其标签集de方法还是很有好处de,当您是一个软件商,想扩充JSPde原始功能而又不想破坏其兼容性时,这一点尤为重要.
Declarations(声明)
  使用declarations,您可以在JSP页中定义方法或变量,它们可被同一页中de其他相关代码访问.在大多数情况下,您可能会在自己debean中定义方法.然而,有时候在网页内定义方法可能更方便一些,尤其是当相关代码只用于单一页面时.不论定义方法还是变量,声明都包含在<%! %>标记内.
  注意,声明并不在JSP页内产生任何输出.它们仅仅用于定义,而不生成输出结果.要生成输出结果,您应该用JSP表达式或脚本片断.
Expressions(表达式)
  Expressions是一种非常简单deJSP标签,它用来把在<%= %>中定义deJSP表达式de值转换成字串并将这个值以动态文本de形式送出.Expressionde确是一条生成文本de捷径,有了它,您不必在每次要显示一段动态文本de时候都去调用print()方法.典型de应用就是,您可以用expressions显示简单de变量值或bean中de方法de返回值.
  例如,下面de相关代码将会生成getName()方法de返回值:
  <H2>Welcome, <%= mybean.getName() %></H2>
  事实上,在生成动态输出之前,JSP必须把方法de返回值转变为Java中deString对象.JSP规范中详细描述了在JSP表达式中,什么样deJava类型和Java类会被转变成字串.
Scriptlets(脚本片断)
  到现在为止您已经学会了使用指令来引入任何Java类或Java包,您能定义页面级de方法或变量并在页中使用它们,您还可以使用提供普通web处理功能de隐含变量.还能在JSP页内做些什么就取决于您了,因为您可以在scriptlets(脚本片断)里编写任何您想要deJava相关代码,如下所示:
  <% …code… %>
  通过在page指令中使用IMPORT参数,您可以从脚本片断内调用所有Java API.因为您写de所有JSP相关代码实际上都被编译构成Java servlet,它本身就是一个Java类,所以您所用de语言本身就是Java,而不是任何一种修改或整理过de版本.这就像在SSJS中您可以编写任何相关代码一样.而与SSJS不同,在JSP中您有权使用整套丰富deJava API,因此几乎没有任何局限性.
Implicit Variables(隐含变量)
  前面提到过,JSP定义了一些隐含变量(即Java 对象)供您在表达式和脚本片断中使用.《JSP Specification Version 1.0》de表2-2列出了JSP1.0中可用de隐含变量.这里列出一些常用de对象:
  out对象,类型为javax.servlet.jsp.JspWriter,提供对方法(例如print()方法)de访问,用来在脚本片断内生成输出结果.
  request对象直接与Java中dejavax.servlet.http.HttpServletRequest类对应,具有该类de对象de一切属性和方法.举个例子,要获取一个从HTML表单或URL查询字串传入de值,可以调用request.getParameter()方法,根据名字获取参量.
   response对象与Java中dejavax.servlet.http.HttpServletResponse类对应,提供对您de网页产生deHTML响应de参数de访问权.因此,要在JSP页返回deHTML响应报头中加入一个值,您就可以调用the response.setHeader() 方法来实现.
另一个简单de例子
  在下面de例子中,我来看一看一个表单和它deJSP表单句柄之间de交互过程.使用前面讨论过de脚本元素,我实现了一个简单deweb站点回馈表单(见图2)和一个JSP表单句柄用来验证输入,然后有条件地地生成基于回馈de输出.
  图2.一个web站点回馈表单

  图中按钮:submit query--提交;reset――重填
  表单句柄将会检验名称和意见栏以确定它们已被填写,如果其中任何一个或两个是空白de,表单句柄会生成一条错误信息;否则它将继续查看用户意见是否与预先设定de字串匹配.如果匹配,它就输出一条专门de信息;否则输出“thank you”.
  例2
  <HTML>
  <HEAD>
  <META NAME="GENERATOR" Content="NetObjects ScriptBuilder 2.01">
  <TITLE>Feedback Results</TITLE>
  </HEAD>
  <%!
  // 姓名和意见栏不能为空白
  // 检查它们de值并返回结果
  boolean validateInput(String name, String comment) {
   boolean result = true;
   // 如果姓名或意见未填写,返回 false 以表明输入无效
   if (name.length() == 0)
     result = false;
   if (comment.length() == 0)
     result = false;
   return result;
  } // 结束输入验证validateInput

  // 根据表单上de意见栏输出结果
  String getStringCheese (String comment) {
   String cheese = "I like cheese.";
   String result;
   if (comment.compareTo(cheese) == 0)
    result = "We like cheese too!";
   else
    result = "We hope someday you’ll learn to like cheese.";
   return result;
  } //结束 getStringCheese
  %>
  <BODY BGCOLOR="#F0F0E0">
  <%
   // 获取通过表单提交de数据
   String name = request.getParameter("name");
   String age = request.getParameter("age");
   String comment = request.getParameter("comment");
   boolean isValid;
   isValid = validateInput(name, comment);
   // 根据用户是否未填写姓名或意见栏决定输出内容
   if (isValid) {
  %>
  <H2>Thank you for your feedback!</H2>
  <H3>
  <%
    //输出意见栏de查询结果
    out.println(getStringCheese(comment));
   } // 结束 if 程序段
  else {
    out.println("You didn’t give us your name or a comment.");
  %>
  </H3>
  Please <a href="feedback_form.html">try again</a>
  <%
   } //结束 else 程序段
  %>
  </BODY>
  </HTML>
  这个例子假定用户输入de意见是“I like cheese."(我喜欢奶酪)在相关代码中可以看到,这一响应是为填写这条意见de用户定制de.表单句柄将会返回如图3所示de页面:
  图3.表单句柄输出

  图中文字:谢谢您de反馈!我也喜欢奶酪.
  这个例子非常简单易懂.即便您只是一个JavaScript程序员,您也应该可以理解它.我还要指出这个例子中体现de在JSP规范中并不很明显de一些特性.首先,请注意我在声明部分(<%’…%>中de部分)定义了一些方法,与在Java类中定义方法一模一样.这是因为JSP引擎把这些方法转变为底层deJava servlets,在浏览器向网页发出请求时由服务器来执行它们.因此,任何变量和方法de定义都必须遵守标准deJava语法.
  还应注意到,在我de脚本片断de相关代码中,我把一个if…else语句分开了,它跨越了两个不同de脚本片断段.这完全是合法de!不仅合法,而且把脚本片断相关代码和静态HTML交叉起来是有条件生成HTMLde好办法,就像我在本例中所做到de一样.
  最后,您可以看到我通过调用request.getParameter()方法取得表单元素de值并把它赋给一个临时变量.这是处理从表单或查询字串输入de值de标准方法.

JSP教程(三)–JSP中”预定义变量”的使用

星期一, 06月 2nd, 2008

为了简化JSP表达式和scriptlets中de相关代码,提供了8种自动定义de变量,有时称做implicit objects(固有对象).它们是:request,response,out,session,application,config,pageContext,和 page.下面我来详细de了解它们.
  request
  与request相联系de是HttpServletRequest类,使您可以得到requestde参数(通过getParameter方法),request de类型(GET,POST,HEAD,等等),和引入deHTTP头(cookies,Referer,等等).严格来说,request是类ServletRequestde一个子类而不是HttpServletRequest类de,事实上,如果requestde协议不是HTTP,那麽它几乎不会工作.
  response
  对客户端deresponse与HttpServletResponse 相连.请注意,因为输出流是放入缓冲de,所以可以设置HTTP状态码和response头,尽管在标准deservlets中不允许将之发送到客户端.
  out
  这里使用PrintWriter类来发送输出到客户端.然而,为了使response对象有效,可使用一个PrintWrite类de使用缓冲de版本JspWriter.使用sessionde属性page directive,您可以自己定义缓冲de大小,甚至可以在使用了buffer属性后关闭缓冲.也请注意,out仅用于scriptlets之中,因为JSP表达式自动de放入输出流,所以极少需要明确de声明out.
  session
  应用与request相联系deHttpSession类.因为session是自动创建de,即使没有一个引入desession,这种变量仍可绑定.有一个例外是,如果您用page directive关闭session,再试图使用session时将导致错误(在JSP页面向servlet转换时).
  application
  使用ServeletContext类,通过使用getServletConfig().getContext()得到.
  config
  是一个ServletConfig类de对象.
  pageContext
  这是JSP中de一个新de类PageContext,用于精练特定服务器de特点时使用,如提高JspWritersde执行效率.如果您通过这个类访问而不是直接de,您de相关代码将仍然运行在“规则”deJSP /servlet引擎.
  page
  在JAVA中不是很有用,它仅仅是用来保存在脚本de语言不是JAVA时de时间.

JSP教程(四)-JSP Actions的使用

星期一, 06月 2nd, 2008

JSP actions 使用您可以动态de插入一个文件,重用JavaBeans组件,前进到另一个页面,或为Java 插件生成一个HTML.可以使用deaction 有:
(1) jsp:include –在页面被请求时包含进一个文件.
(2) jsp:useBean–找到或实例化一个JavaBean.
(3) jsp:setProperty–设置一个JavaBean属性.
(4) jsp:getProperty–将JavaBeande属性插入到输出.
(5) jsp:forward–让请求者可以向前到一个新de页面.
(6) jsp:plugin–用OBJECT或EMBED标签为Java plugins生成特定de浏览器de相关代码.
  1、jsp:include Action
  这个action使您可以在即将生成de页面上包含进一些文件:
  <jsp:include page="relative URL" flush="true" />
  与include directive不同,这个action是在页面被请求时才将文件包含进来,而,include directive则是在JSP页面被转换为servlet时包含文件.为了提高效率,include action做了一点小小de牺牲,即,它不允许被包含de页面含有一般deJSP相关代码(例如,不可设置HTTP头),但是,它具有显著de灵活性,如下面deJSP 相关代码,它实现将四个不同de片段插入如下de页面.每一次当标题改变de时候,您仅需修改这四个文件而无须更改主要deJSP 页面.
WhatsNew.jsp
<HTML>
<HEAD>
<TITLE> JSP教程</TITLE>
<BODY >
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE"> What"s New at Chinese comic sites</TABLE>
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>
  当然您可以定义自己deHTML文件,但有一点请注意:
  您应该将文件放到您deJSP目录下denews目录内.

JSP教程(五)-JSP Actions的使用下

星期一, 06月 2nd, 2008

jsp:useBean Action de使用
  一、 语法:
<jsp:useBean
id="beanInstanceName"
scope="page|request|session|application"
{ class="package.class" |
type="package.class" |
class="package.class" type="package.class" |
beanName="{package.class | <%= expression %>}" type="package.class"
}
{ /> |
> 其他元素
</jsp:useBean>
}
  这个action使您能将一个JavaBean装入一个JSP页面.这是一个非常有用de能力,因为它使您可以使用可重用deJAVA类而不需牺牲性能.最简单de语法用于指定一个bean:
  <jsp:useBean id="name" class="package.class" />
  这通常意味着“实例化一个类de对象通过指定一个类,并将之与一个通过id指定名称de变量绑定”.然而,就象我看到de,您可以指定一个scope属性来使得bean不仅仅与当前de页面相联系.在这种情形下,得到一个对已存在debeande引用是非常有用de,而且,仅当没有相同deid和scopedebean存在时才创建一个新de.现在,您已有了bean,您可以通过jsp:setProperty来修改它,或者,通过使用之前用id指定de名字来使用scriptlet或明确de调用方法.当您说“这个bean有一个称为foodeX类型de属性”,您真正de意思是“这个类有一个称为getFoode方法,它返回X类型de某类值,还有另一个方法称为setFoo,它以X为参数.”这jsp:setProperty action 将在下一单元详细de介绍,但是现在您既可以给出一个明确de值,给出一个属性来说明此值是从requestde参数继承而来,也可以仅仅列出属性来标志此值应该从与属性名同名de参数继承而来.您可以通过调用适用degetXxx方法,或更普遍de,使用jsp:getProperty action,来得到已存在deJSP表达式或scriptlet属性.
  请注意,为bean指定de类必须在服务器de规则de类路径下,而不是用来保留当改变时自动装载de类de路径.例如,在Java Web Server上,它和它所用de类必须到类de目录或在lib目录下de一个jar文件内,而不是在servletsde目录下.
  下面让我来看一个非常简单de例子,它装载一个bean并且设置/得到一个简单de串参数.
BeanTest.jsp
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test"
property="message"
value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
SimpleBean.java
  以下是beande原相关代码:
package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
  运行结果为:页面输出: Reusing JavaBeans in JSP
  b>Message:Hello WWW
  二、jsp:useBean de详细用法
  最简单de使用beande方式是:
  <jsp:useBean id="name" class="package.class"/>
  为了装载bean,需要用jsp:setProperty和 jsp:getProperty来修改和检索beande属性.且,还有两种别de选项.首先,您可以使用容器de格式,也就是:
<jsp:useBean …>
Body
</jsp:useBean>
要指出de是,Body部分应该仅在bean第一次实例化时被执行,而不是在每次被找到和使用时.Beans能够被共享,因此,并不是所有dejsp:useBean 陈述都产生一个新debeande实例.其次,除了id 或class以外,还有三种属性您可以使用:scope,type,和beanName.这些属性总结如下:
  属性
  用法
id
  给一个变量命名,此变量将指向bean.如果发现存在一个具有相同deid和scope debean则使用之而不新建一个.
class
  指出beande完整de包名.
scope
  指明bean在之上可以被使用de前后关系.有四个可能de值:page,request,session,和application.缺省为page,表明bean仅在当前页可用(保存在当前dePageContext中).requestde一个值表明bean仅用于当前客户端de请求(保存在ServletRequest对象中).Sessionde值指出在当前deHttpSessionde生命周期内,对象对所有de页面可用. 最后,applicationde值指出对象对所有共享ServletsContextde页面可以使用.使用jsp:useBean 仅在没有相同deid和scope debean时创建一个新debean,如果已有则使用之,并忽略以jsp:useBean标志开始和结尾de相关代码.
type
  指明将指向对象de变量de类型.这必须与类名相匹配或是一个超类或者是一个实现类de接口.记住,变量de名由id属性来指定.
beanName
  赋予bean一个名字,您应该在Beansde实例化方法中提供.它允许您给出type和一个beanName,并省略类属性.
  三、jsp:setProperty Action
  语法:
<jsp:setProperty
name="beanInstanceName"
{ property="*" |
property="propertyName" [ param="parameterName" ] |
property="propertyName" value="{string | <%= expression %>}"
}
/>
  在前面我就知道了可以使用 jsp:setProperty 来为一个beande属性赋值.您可以使用两种方式实现它.其一是,在jsp:useBean后(而不是在之内)使用jsp:setProperty:
<jsp:useBean id="myName" … />

<jsp:setProperty name="myName"
property="someProperty" … />
  在这种方式中,jsp:setProperty 将被执行无论是否已有一个具有相同deid和scopedebean存在.另一种方式是,jsp:setProperty出现在jsp:useBean 元素内,如:
<jsp:useBean id="myName" … >

<jsp:setProperty name="myName"
property="someProperty" … />
</jsp:useBean>
  此种情况下,jsp:setProperty仅在新de对象被实例化时才执行.
  以下是四种jsp:setPropertyde可用de属性:
  属性
  用法
name
  这是一个必选属性.它指出哪一个beande属性将被设置.jsp:usebean必须出现在jsp:setProperty之前.
property
  这是一个必选属性.表明您将设置哪一个属性.然而,有一个特殊de情况:如果以"*"为值意味着,所有de名称与beande属性匹配derequest参数都将被传递到相应de属性设置方法.
value
  这是一个可选属性.它指定被设置de属性de值.字符串de值通过相应de对象或包de标准devalueOf方法将自动de转换为numbers,boolean,Boolean,byte,Byte,char,和Character.例如,boolean或Boolean属性de值“true”将通过Boolean.valueOf方法转化,而,一个int或Integer属性de值“42”将通过Integer.valueOf转化.您不能同时使用value和param属性,但,两个都不用是允许de.
param
  这是一个可选属性.它指明了beande属性应该继承derequestde参数.如果当前derequest没有这样de一个参数,就什麽也不做:系统并不将null传给设置属性de方法.因此,您可以使用beande缺省值.例如下面de这段程序执行“将numberOfItems属性设置为任意numItems request参数de值,如果有这样de一个request参数,否则什么也不做.”
<jsp:setProperty name="orderBean"
property="numberOfItems"
param="numItems" />
  如果您将value和param同时缺省,这和您将paramde名称设为beande属性名相同一样.您可以通过将namede值设置为”*”和省略value和param来自动de使用与beande属性相应derequestde属性.在这种情况下,服务器将反复de查找可用de属性和request参数来匹配具有相同名字de.
  四、jsp:getProperty Action
  语法:
  <jsp:getProperty name="beanInstanceName" property="propertyName" />
  这个属性检索出beande属性de值并将之转化为一个字符串,然后将之插入到输出.它有两个必选属性:name,在之前用jsp:useBean引入de名称,property,必须被插入值de属性.

JSP教程(六)-怎么在JSP中跳转到别一页面

星期一, 06月 2nd, 2008

在JSP中使用jsp forward Action来实现页面de跳转功能.
  语法:
<jsp:forward page="{relativeURL|<%= expression %>}"/> 或
<jsp:forward page="{relativeURL|<%= expression %>}">
<jsp:param name="parameterName"
value="{parameterValue|<%= expression %>}"/> </jsp:forward>
  这个action使您可以将request向前到另外一个页面.它只有一个属性,page.Page应有一个相对deURL组成.这可以是一个静态de值或者是能够在被请求de时候计算得到de值,就如下面两个例子一般:
<jsp:forward page="/utils/errorReporter.jsp"/>
<jsp:forward page="<%= someJavaExpression %>"/>
!supportEmptyParas]>
  现在以一个具体例子来说明:在test1.jsp中使用forward使其跳转到test2.jsp页面中.
Test1.jsp
<HTML>
<HEAD>
<TITLE>forward test</TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<!–跳转到test2.jsp–!>
<jsp:forward page="/test2.jsp"/>
</BODY>
</HTML>
!supportEmptyParas]>
test2.jsp
<HTML>
<HEAD>
<TITLE> forward test </TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<%out.println("这是jsp2.jsp页面产生出de输出");%>
</BODY>
</HTML>
!supportEmptyParas]>
  运行test1.jsp,可在浏览器中看见:"这是jsp2.jsp页面产生出de输出"de输出信息.但是如果您在test1.jsp和test2.jsp这两个页面中有参数传递怎么办呢?用get方式吧,不但总de长度有限制,使用现在十分不方便,而且有时候还不安全.其实我完全可以使用jsp1.1中给forward里提供depara属性就可以解决.现以test3.jsp和test4.jsp来说明.
!supportEmptyParas]>
Test1.jsp
<HTML>
<HEAD>
<TITLE> forward test </TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<jsp:forward page="/test4.jsp">
<jsp:param name="name" value="powerman"/>
<jsp:param name="address" value=" 北京西大街188号"/>
</jsp:forward>
</BODY>
</HTML>
!supportEmptyParas]>
test2.jsp
<HTML>
<HEAD>
<TITLE>forward test</TITLE>
!supportEmptyParas]>
</HEAD>
!supportEmptyParas]>
<BODY BGCOLOR="#FFFFFF">
<%
out.println("这是jsp4.jsp页面产生出de输出" "<br>");
out.println("姓名:" request.getParameter("name") "<br>");
out.println("地址:" request.getParameter("address") "<br>");
!supportEmptyParas]>
%>
</BODY>
</HTML>
  运行test3.jsp,可在浏览器中看见:
  "这是jsp4.jsp页面产生出de输出
  姓名:powerman
  地址:北京西大街188号"
de输出信息