posts - 495,  comments - 11,  trackbacks - 0
 

注:本文假设你已经成功安装了Eclipse的tomcat插件sysdeo!

首先创建Tomcat工程:File->New->Other下选择Tomcat Project(图1)
工程名称输入为connMysql(图2)
为方便这里选择can upDate server.xml file(默认值),点击Finish完成工程文件的创建(图3)在connMysql工程中创建java文件。选中connMysql从File->New点击Class(图4)在Package中输入test,Name输入为sqlBean,其它为默认,完成文件创建。sqlBean文件代码如下:
package test;
import java.sql.Connection;
import java.sql.DriverManager;
//sqlBean为一抽象函数,实现数据连接及关闭功能
public abstract class sqlBean {
private String myDriver= "org.gjt.mm.mysql.Driver";
private String myURL= "jdbc:mysql://8.8.8.2:3306/netbilling?user=flux&password=123456";

protected Connection myConn;
public sqlBean(){}

public Void makeConnection() throws Exception{
Class.forName(myDriver).newInstance();
myConn= DriverManager.getConnection(myURL);
}

public abstract void cleanup() throws Exception;
public void takeDown() throws Exception{
cleanup();
myConn.close();
}
}
同样的方法创建dbBean文件。dbBean文件代码如下:
package test;

import java.sql.ResultSet;
import java.sql.Statement;
//dbBean继承自sqlBean实现取数据
public class dbBean extends sqlBean{

String mySQL= "select operatorno,operatorname,description from operator";
ResultSet myResuleSet= null;
Statement stmt= null;
public dbBean(){
super();
}

public Boolean getNextDB() throws Exception{
return myResuleSet.next();
}

public String getColumn(String inCol) throws Exception{
return myResuleSet.getString(inCol);
}

public boolean getData() throws Exception{
String myQuery= mySQL;
stmt= myConn.createStatement();
myResuleSet= stmt.executeQuery(myQuery);
return (myResuleSet!= null);
}

public void cleanup() throws Exception{
stmt.close();
}
}
接下来创建调用这个Bean的JSP文件。这时要注意选中工程文件connMysql然后再创建JSP文件,这样文件直接被创建在connMysql目录下,方便调用。File->New->File(图5)

JSP文件dbquery.jsp文件代码为:
HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">

<head>
<%@ page language="java" %>
<%@ page import= "java.sql.*"%>
<%@ page contentType= "text/html;charset=utf-8"%>


</head>
<body bgcolor="#FFFFFF">
<table border="1" width="400">
<tr>
<td>NO</td><td>NAME</td><td>DESCRIPTION</td>
</tr>
<%
dbbean.makeConnection();
if(dbbean.getData()){
while(dbbean.getNextDB()){
String no= dbbean.getColumn("operatorno");
String name= dbbean.getColumn("operatorname");
String desc= dbbean.getColumn("description");
%>
<tr>
<td><%=no%></td>
<td><%=name%></td>
<td><%=desc%></td>
</tr>
<%
}
}
dbbean.takeDown();
%>
</table>
</body>

到这里基本代码已经完成,但还有很重要的一步,因为这个程序中我们用到了JdbcMysql所以还要把JdbcMysql.jar文件拷贝到WEB-INF目录(Eclipse程序自动创建的)下,否则调用JSP文件时会出现ClassNotFound错误信息。刚开始我以为Eclipse很智能地把文件包含进去呢,因为在Project的Liberaries里我包含了这个Jar文件,谁知结果不是这样,郁闷了我半天。
好了,保存文件,点击Eclipse界面上的那个小老虎图标启动Tomcat(图6)在浏览器中输入http://localhost:8080/connMysql/dbquery.jsp,哈哈,大功告成!

posted @ 2007-08-31 10:45 jadmin 阅读(59) | 评论 (0)编辑 收藏

/**
* @author ××× E-mail:JStudio@qq.com
* @version 创建时间:2007-8-30 下午04:58:52
* 类说明
*/

window->preference->java->code     styple->code     template 当你选择到这部的时候就会看见右侧有一个框显示出code这个选项,你点开这个选项,点一下他下面的New Java    files 然后你点edit按钮,把他的内容换成你的就可以了:(例如)

${filecomment}
${package_declaration}
/**
* @author ××× E-mail:JStudio@qq.com
* @version 创建时间:${date} ${time}
* 类说明
*/
${typecomment}
${type_declaration}

最后点apply ----> OK 成功。。

posted @ 2007-08-30 20:00 jadmin 阅读(137) | 评论 (0)编辑 收藏
  http://www.google.com/microsoft
  微软风格的入口
  
  http://www.google.com/mac
  MAC风格的入口
  
  http://www.google.com/linux
  Linux风格的入口
  
  http://www.google.com/bsd
  FreeBSD风格的入口
  
  Google有各种语言的版本,下面这些语言可能实在是稀罕了点儿
  
  http://www.google.com/intl/xx-klingon/
  克林冈语入口(没看过星际旅行吗?)
  
  http://www.google.com/intl/xx-bork/
  政治入口?
  
  http://www.google.com/intl/xx-elmer/
  宗教入口
  
  http://www.google.com/intl/xx-piglatin/
  小猪入口
  
  http://www.google.com/intl/xx-hacker/
  黑客专用入口
  
  Google里还有一个小小的彩蛋游戏,大家自己去看吧!
  http://www.google.com/Easter/feature_easter.html
  
  
  下面是一此更有用的彩蛋
  
  http://froogle.google.com/
  作用: 通过特殊的搜索引擎,你可以在网上找到你想购物的网站位置。以及你可以很方便的搜索出同类产品的价格。
  
  看看世界各地的商品价格,自己再买的时候心底有数多了把
  
  http://labs.google.com/gviewer.html
  作用:一个小玩具,适合那些连鼠标都懒得动的懒人。当你在google上找到了查询结果后,你可以使用google viewer让结果以自己定义的间隔时间来一条一条自动滚屏。
  
  http://labs.google.com/cgi-bin/webquotes
  作用:可以搜索出你要查询的内容在internet上被多少其他的网站引用过,可以让你知道internet上其他人对你要查询内容的观点,适合写论文和评论以及特殊用途人使用。
  
  http://labs.google.com/glossary
  作用:顾名思义了,就是一个查英语缩写语意的工具,google的词汇表
  
  http://labs1.google.com/gvs.html
  作用:给google打一个电话,说出你要查找的内容,然后google会把你要查询的结果显示出来。 给不识字的人用的
posted @ 2007-08-30 12:01 jadmin 阅读(78) | 评论 (0)编辑 收藏

直接运行这些cpl就可以不用进控制面版了

Internet选项
C:\WINDOWS\System32\inetcpl.cpl
电话和调制解调器选项
C:\WINDOWS\System32\telephon.cpl
电源选项
C:\WINDOWS\System32\powercfg.cpl
辅助功能选项
C:\WINDOWS\System32\access.cpl
管理工具
C:\WINDOWS\system32\main.cpl
键盘
C:\WINDOWS\System32\main.cpl
鼠标
C:\WINDOWS\System32\main.cpl
字体
C:\WINDOWS\system32\main.cpl
区域和语言选项
C:\WINDOWS\System32\intl.cpl
任务计划
C:\WINDOWS\System32\mstask.dll
任务栏和开始菜单
C:\WINDOWS\system32\SHELL32.dll
日期和时间
C:\WINDOWS\System32\timedate.cpl
扫描仪和照相机
wiashext.dll
声音和音频设备
C:\WINDOWS\System32\MMSYS.CPL
添加或删除程序
C:\WINDOWS\System32\appwiz.cpl
添加硬件
C:\WINDOWS\System32\hdwwiz.cpl
网络连接
C:\WINDOWS\system32\netshell.dll
文件夹选项
C:\WINDOWS\system32\SHELL32.dll
无线连接
C:\WINDOWS\System32\irprops.cpl
系统
C:\WINDOWS\System32\sysdm.cpl
用户帐户
C:\WINDOWS\System32\nusrmgr.cpl
显示
C:\WINDOWS\System32\desk.cpl
邮件
C:\Program Files\Common Files\System\Mapi\2052\NT\MLCFG32.CPL
游戏控制器
C:\WINDOWS\System32\joy.cpl
语音
C:\Program Files\Common Files\Microsoft Shared\Speech\sapi.cpl

以上只是在windows xp cn+sp2下找到的地址 非NT下肯定不同
好处么?就是在网吧屏蔽控制面版的时候可以直接调用相应的选项设置

posted @ 2007-08-28 10:31 jadmin 阅读(78) | 评论 (0)编辑 收藏
  Jboss 4.0的开发人员版本是一个开源的应用服务器,他把HypersonicDB作为他的缺省数据库。然而,开发人员也许还要使用除了HypersonicDB以外其他种类的数据库,在这篇文章中我们将看到如何在Jboss上配置使用其他的数据库。

  简介

  Jboss4.0使用了JDBC配置文件来配置数据库连接,它为EJB和其它J2EE应用提供了数据源(data source)进行访问。如果你要使用HypersonicDB以外的数据库你就要修改这个配置文件。这篇文章将着重讲解下面的几个部分:

   Jboss的EJB部署描述符
   Oralce数据库的配置
   MySQL数据库的配置
   Sysbase数据库的配置
   DB2数据库的配置
   Infomix数据库的配置
   Jboss的EJB部署描述符

  standardjaws.xml (位于X:\jboss4\server\default\conf)是一个映射CMP 实体EJB的标准部署描述文件。它用于配置CMP实体EJB,你也可以使用jaws.xml代替。你可以把这个文件copy到ejb .jar文件中的META-INF目录下。这个文件用于描述下面的信息:

   描述一个数据源和映射类型。
   描述EJB映射的表
   描述EJB的finder方法
   描述类型映射

  这里的数据源描述的是一个JNDI名称,可以通过这个JNDI来获得一个数据源连接池。Jboss4缺省的数据源使用的是HypersonicDB。如果使用其他的数据源你需要修改jaws.xml文件。

  standardjbosscmp-jdbc.xml(位于X:\jboss4\server\default\conf)是配置Jboss CMP容器的标准部署描述文件,你也可以使用一个自定义的配置文件--jbosscmp-jdbc.xml来代替它。这个文件也放在EJB.jar文件的 META-INF目录中。缺省使用的还是HypersonicDB作为数据库,这里也需要修改。

  Oracle数据库的配置

  Oracle以它的运行稳定和可靠成为了一个非常受欢迎的企业级数据库。要在Jboss 上配置使用Oracle的话我们要做的第一件事就是把Oracle的JDBC驱动程序复制到ClassPath下。我们把这个JDBC驱动程序复制到 server/default/lib目录下。为了使用Oracle的事务处理数据源我们还要把/docs/examples/jca/oracle- xa-ds.xml复制到/server/default/deploy目录下。如果使用的事非事务处理的数据源,就把 /docs/examples/jca/oracle-ds.xml文件复制到/server/default/deploy目录下。

  下一步,我们需要修改oracle-de.xml配置文件。其中的标签和标签的设置如下:

Oracle OCI Type 2 Driver
  Class: oracle.jdbc.driver.OracleDriver
  URL: jdbc:oracle:oci8:@<database>
  Oracle OCI Thin Type 4 Driver
  Class: oracle.jdbc.driver.OracleDriver
  URL: jdbc:oracle:thin:@<host>:<port>:<database>
  Oracle OCI XA Type 2 Driver
  Class: oracle.jdbc.xa.client.OracleXADataSource
  URL: jdbc:oracle:thin:@<host>:<port>:<database>
  Oracle OCI Type 2 Driver
  Class: oracle.jdbc.driver.OracleDriver
  URL: jdbc:oracle:oci8:@<database>
在Connection
  
  URL中是安装Oracle的计算机主机名,是oracle数据库的端口,是数据库名称。下一步,我们将修改standardjaws.xml 或jaws.xml配置文件,并把 和 元素这只为下面这样:

<jaws>
    <datasource>java:/OracleDS</datasource>
    <type-mapping>Oracle8</type-mapping>
  </jaws>
  
  下一步,再修改standardjbosscmp-jdbc.xml 或 jbosscmp-jdbc.xml配置文件,设置 和 元素使用Oracle。

<jbosscmp-jdbc>
    <defaults>
     <datasource>java:/OracleDS</datasource>
     <datasource-mapping>Oracle8</datasource-mapping>
    </defaults>
  </jbosscmp-jdbc>
  
  最后我们需要修改login-config.xml文件来使用Oracle,下面是login-config.xml文件的元素:

<application-policy name = "OracleDbRealm">
    <authentication>
     <login-module code = 
   "org.jboss.resource.security.ConfiguredIdentityLoginModule"
                flag = "required">
       <module-option name = "principal">sa</module-option>
       <module-option name = "userName">sa</module-option>
       <module-option name = "password"></module-option>
       <module-option name ="managedConnectionFactoryName"> 
            jboss.jca:service=LocalTxCM,name=OracleDS
       </module-option>
     </login-module>
    </authentication>
  </application-policy>
  
  修改了oracle-ds.xml, standardjaws.xml, standardjbosscmp-jdbc.xml,和login-config.xml 文件之后就可以再Jboss4中使用Oracle了。

  MySQL数据库配置

  MySQL是一个开放源代码的数据库,有很多开源项目和小型的社团都在使用它。要在Jboss4中使用MySQL的话首先要把MySQL的JDBC驱动放到CLASSPATH中。同样,把它复制到/server/default/lib目录下,再把/docs/examples/jca/mysql- ds.xml复制到/server/default/deploy目录下。修改mysql-ds.xml文件,设置为 com.mysql.jdbc.Driver再把设置为jdbc:mysql:///,其中是数据库主机名是数据库名。 然后需要设置standardjaws.xml 或 jaws.xml文件的和元素:

<jaws>
   <datasource>java:/MySqlDS</datasource>
   <type-mapping>mySql</type-mapping>
  </jaws>
  
  同样也需要把standardjbosscmp-jdbc.xml 或 jbosscmp-jdbc.xml文件的 和 元素设置为下面这样:

<jbosscmp-jdbc>
    <defaults>
      <datasource>java:/MySqlDS</datasource>
      <datasource-mapping>mySql</datasource-mapping>
   </defaults>
  </jbosscmp-jdbc>
  
  最后再修改login-config.xml文件来使用MySQL:

<application-policy name = "MySqlDbRealm">
    <authentication>
     <login-module code = 
   "org.jboss.resource.security.ConfiguredIdentityLoginModule"
                flag = "required">
       <module-option name ="principal">sa</module-option>
       <module-option name ="userName">sa</module-option>
       <module-option name ="password"></module-option>
       <module-option name ="managedConnectionFactoryName"> 
        jboss.jca:service=LocalTxCM,name=MySqlDS
       </module-option>
     </login-module>
    </authentication>
  </application-policy>
  
  修改了mysql-ds.xml, standardjaws.xml, standardjbosscmp-jdbc.xml,和 login-config.xml 文件就可以在Jboss上使用MySQL了。

  SysBase数据库配置

  Sybase Adaptive Server Enterprises(ASE)是Sysbase公司的数据库服务器。ASE可以在Unix和linux平台上使用。同样我们要把它的数据库驱动放到 CLASSPATH中,把它复制到/server/default/lib目录下,然后把/docs/examples/jca/sybase- ds.xml 复制到/server/default/deploy目录下。修改sybase-ds.xml文件把设置为 com.sybase.jdbc2.jdbc.SybDriver再把设置为 jdbc:sybase:Tds::/,其中分别为主机名、端口名和数据库名。同样需要修改standardjaws.xml 或 jaws.xml 文件的 和 元素:

<jaws>
   <datasource>java:/SybaseDS</datasource>
   <type-mapping>Sybase</type-mapping>
  </jaws>
  
  再修改standardjbosscmp-jdbc.xml 或 jbosscmp-jdbc.xml 文件的 和元素:

<jbosscmp-jdbc>
    <defaults>
     <datasource>java:/SybaseDS</datasource>
     <datasource-mapping>Sybase</datasource-mapping>
    </defaults>
  </jbosscmp-jdbc>
  
  最后修改login-config.xml 文件来使用Sysbase数据库.设置 元素:

  <application-policy name = "SybaseDbRealm">
    <authentication>
     <login-module code = 
   "org.jboss.resource.security.ConfiguredIdentityLoginModule"
                flag = "required">
       <module-option name ="principal">sa</module-option>
       <module-option name = "userName">sa</module-option>
       <module-option name = "password"></module-option>
       <module-option name = "managedConnectionFactoryName"> 
            jboss.jca:service=LocalTxCM,name=SybaseDS
       </module-option>
     </login-module>
    </authentication>
  </application-policy>
  
  修改了sybase-ds.xml, standardjaws.xml, standardjbosscmp-jdbc.xml, 和login-config.xml文件后就可以在JBOSS中使用Sysbase了。

  DB2数据库配置

  IBM的DB2是一个完善、使用方便的数据库服务器,它可以在Linux,UNIX和Windows平台上使用。在JBOSS4上使用DB2只要把 db2java.zip复制到/server/default/lib目录下。然后复制/docs/examples/jca/db2-ds.xml到 /server/default/deploy目录下,然后修改 元素位 COM.ibm.db2.jdbc.app.DB2Driver , 元素为 jdbc:db2:其中的元素代表数据库服务名。

       java:/DB2DS     DB2   
  
  下面是相应的 standardjbosscmp-jdbc.xml (或 jbosscmp-jdbc.xml)文件:

  <jbosscmp-jdbc>
    <defaults>
     <datasource>java:/DB2DS</datasource>
     <datasource-mapping>DB2</datasource-mapping>
    </defaults>
  </jbosscmp-jdbc>
  
  最后在login-config.xml文件中加上下面的内容:

  <application-policy name = "DB2DbRealm">
    <authentication>
     <login-module code = 
   "org.jboss.resource.security.ConfiguredIdentityLoginModule"
                flag = "required">
       <module-option name = 
  "principal">sa</module-option>
       <module-option name = 
  "userName">sa</module-option>
       <module-option name = 
  "password"></module-option>
       <module-option name ="managedConnectionFactoryName"> 
            jboss.jca:service=LocalTxCM,name=DB2DS
       </module-option>
     </login-module>
    </authentication>
  </application-policy>
  
  完成上面的配置就可以在Jboss上使用DB2了

  Informix 数据库配置

  IBM的Infoxmix数据库服务器用于作为数据仓库、分析和报告。在Jboss4上使用Informix数据库,首先要把它相应的数据库JDBC驱动复制到/server/default/lib目录下,然后,把/docs/examples/jca/informix-ds.xml 复制到 /server/default/deploy目录下,如果你使用的是事务的(XA)JDBC就复制那个 /docs/examples/jca/informix-xa-ds.xml文件。

  下一步要作的就是修改这个informix-ds.xml文件,把元素设置为:com.informix.jdbc.IfxDriver把元素设置为jdbc:informix-sqli://::informixserver=, 其中,,,分别代表数据库主机名、数据库端口和数据库服务名。然后修改standardjaws.xml 或 jaws.xml文件的 和 元素:

  <post>
  <jaws>
    <datasource>java:/InformixDS</datasource>
    <type-mapping>InformixDB</type-mapping>
  </jaws>
  
  把standardjbosscmp-jdbc.xml 或 jbosscmp-jdbc.xml文件中的 和 元素设置为下面这样:

  <jbosscmp-jdbc>
    <defaults>
     <datasource>java:/InformixDS</datasource>
     <datasource-mapping>InformixDB</datasource-mapping>
    </defaults>
  </jbosscmp-jdbc>
  
  最后在login-config.xml文件中加入元素:

  <application-policy name = "InformixDbRealm">
    <authentication>
    <login-module code = 
    "org.jboss.resource.security.ConfiguredIdentityLoginModule"
                flag = "required">
       <module-option name = "principal">sa</module-option>
       <module-option name = "userName">sa</module-option>
       <module-option name = "password"></module-option>
       <module-option name ="managedConnectionFactoryName"> 
        jboss.jca:service=LocalTxCM,name=InformixDS
       </module-option>
     </login-module>
    </authentication>
  </application-policy>
  
  这样,你就可以在Jboss4中使用Informix数据库了。

  结论

  Jboss4默认情况下使用的是Hypersonic数据库,但如你所见我们只要简单的修改几个配置文件就可以使用市面上流行的其他数据库了。
posted @ 2007-08-28 09:48 jadmin 阅读(68) | 评论 (0)编辑 收藏
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。在 developerWorks 上其新系列的第一篇文章中,软件工程师 Mark Kolb 向您展示了如何使用 JSTL 标记来避免在 JSP 页面中使用脚本编制元素。您还将了解如何通过从表示层删除源代码来简化软件维护。最后,您将了解 JSTL 经过简化的表达式语言,它允许在不必使用功能齐全的编程语言的情况下对 JSTL 操作指定动态属性值。

   JavaServer Pages(JSP)是用于 J2EE 平台的标准表示层技术。JSP 技术提供了用于执行计算(这些计算用来动态地生成页面内容)的脚本编制元素和操作。脚本编制元素允许在 JSP 页面中包括程序源代码,在为响应用户请求而呈现页面时可以执行这些源代码。操作将计算操作封装到很象 HTML 或 XML 标记的标记中,JSP 页面的模板文本通常包含这些标记。JSP 规范只将几种操作定义成了标准,但从 JSP 1.1 开始,开发人员已经能够以定制标记库的方式创建其自己的操作了。

   JSP 标准标记库(JSTL)是 JSP 1.2 定制标记库集,这些标记库实现大量服务器端 Java 应用程序常用的基本功能。通过为典型表示层任务(如数据格式化和迭代或条件内容)提供标准实现,JSTL 使 JSP 作者可以专注于特定于应用程序的开发需求,而不是为这些通用操作“另起炉灶”。

   当然,您可以使用 JSP 脚本编制元素(scriptlet、表达式和声明)来实现此类任务。例如,可以使用三个 scriptlet 实现条件内容,清单 1 中着重显示了这三个 scriptlet。但是,因为脚本编制元素依赖于在页面中嵌入程序源代码(通常是 Java 代码),所以对于使用这些脚本编制元素的 JSP 页面,其软件维护任务的复杂度大大增加了。例如,清单 1 中的 scriptlet 示例严格地依赖于花括号的正确匹配。如果不经意间引入了一个语法错误,则条件内容中的嵌套其它 scriptlet 可能会造成严重破坏,并且在 JSP 容器编译该页面时,要使所产生的错误信息有意义可能会很困难。

  清单 1. 通过 scriptlet 实现条件内容 <% if (user.getRole() == "member")) { %>

<p>Welcome, member!</p>
<% } else { %>
     <p>Welcome, guest!</p>
<% } %>


  修正此类问题通常需要相当丰富的编程经验。尽管通常会由十分精通页面布局和图形设计 的设计人员来开发和维护 JSP,但是同一页面中的脚本编制元素出现问题时,需要程序员的介入。这种状况将单个文件中代码的责任分担给多人,因而使得开发、调试和增强此类 JSP 页面成为很麻烦的任务。通过将常用功能包装到定制标记库的标准集合中,JSTL 使 JSP 作者可以减少对编制脚本元素的需求,甚至可以不需要它们,并避免了相关的维护成本。

   JSTL 1.0

   JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。

    两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。可以配置 ScriptFreeTLV 验证器以在 JSP 页面中禁用各种类型的 JSP 脚本元素 — scriptlet、表达式和声明。类似地,PermittedTaglibsTLV 验证器可以用来限制可能由应用程序的 JSP 页面访问的定制标记库集(包括 JSTL 标记库)。

   尽管 JSTL 最终将会成为 J2EE 平台的必需组件,但目前只有少数应用程序服务器包括它。JSTL 1.0 的参考实现可作为 Apache 软件基金会(Apache Software Foundation)的 Jakarta Taglibs 项目(请参阅参考资料)的一部分而获得。可以将该参考实现中的定制标记库合并到任何支持 JSP 1.2 和 Servlet 2.3 规范的服务器,以添加对 JSTL 的支持。

   表达式语言

   在 JSP 1.2 中,可以使用静态字符串或表达式(如果允许的话)指定 JSP 操作的属性。例如,在清单 2 中,对 <jsp:setProperty> 操作的 name 和 property 属性指定了静态值,而用表达式指定了其 value 属性。这个操作的效果是将请求参数的当前值赋予命名的 bean 特性。以这种形式使用的表达式被称为请求时属性值(request-time attribute value),这是构建到 JSP 规范中的用于动态指定属性值的唯一机制。

   清单 2. 合并请求时属性值的 JSP 操作

<jsp:setProperty name="user" property="timezonePref"
                  value=~<%= request.getParameter("timezone") %>~/>


  因为请求时属性值是用表达式指定的,所以它们往往有和其它脚本元素一样的软件维护问 题。因此,JSTL 定制标记支持另一种用于指定动态属性值的机制。可以用简化的表达式语言(EL)而不使用完整的 JSP 表达式来指定 JSTL 操作的属性值。EL 提供了一些标识符、存取器和运算符,用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以 EcmaScript(请参阅参考资料)和 XML 路径语言(XML Path Language,XPath)为基础,因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。但是,与 JSTL 标记一起使用时,它就能使用简单而又方便的符号来表示复杂的行为。EL 表达式的格式是这样的:用美元符号($)定界,内容包括在花括号({})中,如清单 3 所示。

   清单 3. 说明 EL 表达式定界符的 JSTL 操作

   <c:out value="${user.firstName}"/>

   此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值,如清单 4 所示。单独的表达式由标识符、存取器、文字和运算符组成。标识符用来引用存储在数据中心中的数据对象。EL 有 11 个保留标识符,对应于 11 个 EL 隐式对象。假定所有其它标识符都引用限制了作用域的变量。存取器用来检索对象的特性或集合的元素。文字表示固定的值 — 数字、字符、字符串、布尔型或空值。运算符允许对数据和文字进行组合以及比较。

   清单 4. 组合静态文本和多个 EL 表达式以指定动态属性值

   <c:out value="Hello ${user.firstName} ${user.lastName}"/>

   限制了作用域的变量

   JSP API 通过 <jsp:useBean> 操作允许从 JSP 容器内的四个不同作用域中存储和检索数据。JSTL 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展这一能力。此外,EL 提供将这些对象作为限制了作用域的变量进行检索的内置支持。特别地,任何出现在 EL 表达式中但不对应于任何 EL 隐式对象的标识符,都被自动假定为引用存储在四个 JSP 作用域的其中某个中的对象,这四个作用域是:

   ·页面作用域

   ·请求作用域

   ·会话作用域

   ·应用程序作用域

   您可能还记得,只有在为特定请求处理页面期间才能检索存储在该页面作用域中的对象。如果对象是存储在请求作用域中的,可以在处理所有参与处理某请求的页 面期间检索这些对象(譬如在对某个请求的处理中遇到了一个或多个 <jsp:include> 或 <jsp:forward> 操作)。如果对象是存储在会话作用域中的,则在与 Web 应用程序的交互式会话期间,可以由用户访问的任何页面检索它(即,直到与该用户交互相关联的 HttpSession 对象无效为止)。可以由任何用户从任何页面访问存储在应用程序作用域中的对象,直到卸载 Web 应用程序本身为止(通常是由于关闭 JSP 容器所致)。

   通过将字符串映射为期望作用域中的对象来将对象存储到该作用域。然后,就可以通过提供相同字符串来从该作用域检索该对象。在作用域的映射中查找字符串,并 返回被映射的对象。在 Servlet API 中,将此类对象称为相应作用域的属性。但是,在 EL 的上下文中,也将与属性相关联的字符串看作变量的名称,该变量通过属性映射的方式获得特定的值。

   在 EL 中,与隐式对象无关联的标识符被认为是存储在四个 JSP 作用域中的名称对象。首先对页面作用域检查是否存在这样的标识符,其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查,然后测 试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法,可以将 EL 标识符看作引用限制了作用域的变量。

   从更技术的方面来说,没有映射到隐式对象的标识符是用 PageContext 实例的 findAttribute() 方法求值的,该实例表示对页面的处理,在该页面上,当前正在处理用于请求的表达式。标识符的名称作为参数传递给这个方法,然后该方法依次在四个作用域中搜 索具有相同名称的属性。并将所找到的第一个匹配项作为 findAttribute() 方法的值返回。如果未在这四个作用域中找到这样的属性,则返回 null。

   最终,限制了作用域的变量是四个 JSP 作用域的属性,这些属性具有可以用作 EL 标识符的名称。只要对限制了作用域的变量赋予由字母数字组成的名称,就可以通过 JSP 中提供的用于设置属性的任何机制来创建它们。这包括内置的 <jsp:useBean> 操作,以及由 Servlet API 中的几个类定义的 setAttribute() 方法。此外,四个 JSTL 库中定义的许多定制标记本身就能够设置作为限制了作用域的变量使用的属性值。

   隐式对象

   表 1 中列出了 11 个 EL 隐式对象的标识符。不要将这些对象与 JSP 隐式对象(一共只有九个)混淆,其中只有一个对象是它们所共有的。

   表 1. EL 隐式对象

   类别    标识符             描述

   JSP    pageContext   PageContext 实例对应于当前页面的处理

   作用域  pageScope     与页面作用域属性的名称和值相关联的 Map 类

        requestScope   与请求作用域属性的名称和值相关联的 Map 类

        sessionScope   与会话作用域属性的名称和值相关联的 Map 类

        applicationScope 与应用程序作用域属性的名称和值相关联的 Map 类

   请求参数 param      按名称存储请求参数的主要值的 Map 类

        paramValues  将请求参数的所有值作为 String 数组存储的 Map 类

   请求头  header     按名称存储请求头主要值的 Map 类

        headerValues 将请求头的所有值作为 String 数组存储的 Map 类

   Cookie  cookie     按名称存储请求附带的 cookie 的 Map 类

   初始化参数 initParam   按名称存储 Web 应用程序上下文初始化参数的 Map 类

      尽管 JSP 和 EL 隐式对象中只有一个公共对象(pageContext),但通过 EL 也可以访问其它 JSP 隐式对象。原因是 pageContext 拥有访问所有其它八个 JSP 隐式对象的特性。实际上,这是将它包括在 EL 隐式对象中的主要理由。

   其余所有 EL 隐式对象都是映射,可以用来查找对应于名称的对象。前四个映射表示先前讨论的各种属性作用域。可以用它们来查找特定作用域中的标识符,而不用依赖于 EL 在缺省情况下使用的顺序查找过程。

    接下来的四个映射用来获取请求参数和请求头的值。因为 HTTP 协议允许请求参数和请求头具有多个值,所以它们各有一对映射。每对中的第一个映射返回请求参数或头的主要值,通常是恰巧在实际请求中首先指定的那个值。每 对中第二个映射允许检索参数或头的所有值。这些映射中的键是参数或头的名称,但这些值是 String 对象的数组,其中的每个元素都是单一参数值或头值。

   cookie 隐式对象提供了对由请求设置的 cookie 名称的访问。这个对象将所有与请求相关联的 cookie 名称映射到表示那些 cookie 特性的 Cookie 对象。

   最后一个 EL 隐式对象 initParam 是一个映射,它储存与 Web 应用程序相关联的所有上下文的初始化参数的名称和值。初始化参数是通过 web.xml 部署描述符文件指定的,该文件位于应用程序的 WEB-INF 目录中。

   存取器

   因为 EL 标识符是作为隐式对象或限制了作用域的变量(通过属性来实现)解析的,因此有必要将它们转换成 Java 对象。EL 可以自动包装和解包其相应的 Java 类中的基本类型(例如,可以在后台将 int 强制转换成 Integer 类,反之亦可),但大多数的标识符将成为指向完整的 Java 对象的指针。

   结果是,对这些对象的特性或(在对象是数组和集合的情况下)对其元素的访问通常是令人满意的。就为了实现这种用途,EL 提供了两种不同的存取器(点运算符(.)和方括号运算符([])),也支持通过 EL 操作特性和元素。

    点运算符通常用于访问对象的特性。例如,在表达式 ${user.firstName} 中,使用点运算符来访问 user 标识符所引用对象的名为 firstName 的特性。EL 使用 Java bean 约定访问对象特性,因此必须定义这个特性的 getter 方法(通常是名为 getFirstName() 的方法),以便表达式正确求值。当被访问的特性本身是对象时,可以递归地应用点运算符。例如,如果我们虚构的 user 对象有一个实现为 Java 对象的 address 特性,那么也可以用点运算符来访问这个对象的特性。例如,表达式 ${user.address.city} 将会返回这个地址对象嵌套的 city 特性。

   方括号运算符用来检索数组和集合的元素。在数组和有序集合(也即,实现了 java.util.List 接口的集合)的情况下,把要检索的元素的下标放在方括号中。例如,表达式 ${urls[3]} 返回 urls 标识符所引用的数组或集合的第四个元素(和 Java 语言以及 JavaScript 中一样,EL 中的下标是从零开始的)。

    对于实现 java.util.Map 接口的集合,方括号运算符使用关联的键查找存储在映射中的值。在方括号中指定键,并将相应的值作为表达式的值返回。例如,表达式 ${commands["dir"]} 返回与 commands 标识符所引用的 Map 中的 "dir" 键相关联的值。

   对于上述两种情况,都可允许表达式出现在方括号中。对嵌套表达式求值的结果将被作为下标或键,用来检索集合或数组的适当元素。和点运算符一样,方括号运算 符也可以递归应用。这使得 EL 能够从多维数组、嵌套集合或两者的任意组合中检索元素。此外,点运算符和方括号运算符还可以互操作。例如,如果数组的元素本身是对象,则可以使用方括号运 算符来检索该数组的元素,并结合点运算符来检索该元素的一个特性(例如 ${urls[3].protocol})。

   假定 EL 充当指定动态属性值的简化语言,EL 存取器有一个有趣的功能(与 Java 语言的存取器不同),那就是它们在应用于 null 时不抛出异常。如果应用 EL 存取器的对象(例如,${foo.bar} 和 ${foo["bar"]} 中的 foo 标识符)是 null,那么应用存取器的结果也是 null。事实证明,在大多数情况下,这是一个相当有用的行为,不久您就会了解这一点。

   最后,点运算符和方括号运算符可能实现某种程度的互换。例如,也可以使用 ${user["firstName"]} 来检索 user 对象的 firstName 特性,正如可以用 ${commands.dir} 获取与 commands 映射中的 "dir" 键相关联的值一样。

   运算符

  EL 还可以通过使用标识符和存取器,遍历包含应用程序数据(通过限制了作用域的变量公开)或关于环境的信息(通过 EL 隐式对象)的对象层次结构。但是,只是访问这些数据,通常不足以实现许多 JSP 应用程序所需的表示逻辑。

   最终,EL 还包括了几个用来操作和比较 EL 表达式所访问数据的运算符。表 2 中汇总了这些运算符。

   表 2. EL 运算符

   类别     运算符

   算术运算符  +、-、*、/(或 div)和 %(或 mod)

   关系运算符  ==(或 eq)、!=(或 ne)、<</code>(或 lt)、>(或 gt)、<=(或 le)和 >=(或 ge)

   逻辑运算符  &&(或 and)、||(或 or)和 !(或 not)

   验证运算符  empty

    算术运算符支持数值的加法、减法、乘法和除法。还提供了一个求余运算符。注:除法和求余运算符都有替代的、非符号的名称(为的是与 XPath 保持一致)。清单 5 中显示了一个演示算术运算符用法的示例表达式。对几个 EL 表达式应用算术运算符的结果是将该算术运算符应用于这些表达式返回的数值所得的结果。

   清单 5. 利用算术运算符的 EL 表达式

${item.price * (1 + taxRate[user.address.zipcode])}


   关系运算符允许比较数字或文本数据。比较的结果作为布尔值返回。逻辑运算符允许合并布尔值,返回新的布尔值。因此,可以将 EL 逻辑运算符应用于嵌套的关系或逻辑运算符的结果,如清单 6 所示。

   清单 6. 利用关系和逻辑运算符的 EL 表达式

${(x >= min) && (x <= max)}


   最后一种 EL 运算符是 empty,它对于验证数据特别有用。empty 运算符采用单个表达式作为其变量(也即,${empty input}),并返回一个布尔值,该布尔值表示对表达式求值的结果是不是“空”值。求值结果为 null 的表达式被认为是空,即无元素的集合或数组。如果参数是对长度为零的 String 求值所得的结果,则 empty 运算符也将返回 true。

   表 3 显示了 EL 运算符的优先级。正如清单 5 和 6 所示,可以用圆括号对表达式分组,高于普通的优先级规则。

   表 3. EL 运算符优先级(自顶到底,从左到右)

[], . 
()
unary -、not、!、empty
*、/、div、%、mod
+、binary -
() <</code>、>、<=、>=、lt、gt、le、ge
==、!=、eq、ne
&&、and
||、or


   文字

   在 EL 表达式中,数字、字符串、布尔值和 null 都可以被指定为文字值。字符串可以用单引号或双引号定界。布尔值被指定为 true 和 false。

   Taglib 伪指令

    正如我们先前讨论的,JSTL 1.0 包括四个定制标记库。为了演示 JSTL 标记和表达式语言的交互,我们将研究几个来自 JSTL core 库的标记。和使用任何 JSP 定制标记库一样,必须在您想要使用这个库标记的任何页面中包括 taglib 伪指令。清单 7 显示了用于这个特定库的伪指令。

   清单 7. 用于 JSTL core 库 EL 版本的 taglib 伪指令

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>


  实际上,对应于 JSTL core 库的 taglib 伪指令有两种,因为在 JSTL 1.0 中,EL 是可选的。所有四个 JSTL 1.0 定制标记库都有使用 JSP 表达式(而不是 EL)指定动态属性值的备用版本。因为这些备用库依赖于 JSP 的更传统的请求时属性值,所以它们被称为 RT 库,而那些使用表达式语言的则被称为 EL 库。开发人员用不同的 taglib 伪指令来区分每个库的这两个版本。清单 8 显示了使用 core 库的 RT 版本的伪指令。但是,由于现在我们讨论的重点是 EL,所以首先需要这些伪指令。

   清单 8. 用于 JSTL core 库 RT 版本的 taglib 伪指令

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %>


   变量标记

  我们首先要考 虑的 JSTL 定制标记是 <c:set> 操作。正如已经说明的,限制了作用域的变量在 JSTL 中起关键作用,<c:set> 操作提供基于标记的机制来创建和设置限制了作用域的变量。清单 9 中显示了该操作的语法,其中 var 属性指定了限制了作用域的变量的名称,scope 属性表明了该变量驻留在哪个作用域中,value 属性指定了分配给该变量的值。如果指定变量已经存在,则简单地将所指明的值赋给它。如果不存在,则创建新的限制了作用域的变量,并用该值初始化这个变量。

   清单 9. <c:set> 操作的语法

<c:set var="name" scope="scope" value="expression"/>


  scope 属性是可选的,其缺省值是 page。

   清单 10 中显示了 <c:set> 的两个示例。在第一个示例中,将会话作用域变量设置成 String 值。在第二个示例中,用表达式来设置数值:将页面作用域内名为 square 的变量赋值为名为 x 的请求参数的值的平方。

   清单 10. <c:set> 操作示例

<c:set var="timezone" scope="session" value="CST"/>
<c:set var="square" value="${param[~x~] * param[~x~]}"/>


  您还可以将限制了作用域的变量的值指定为 <c:set> 操作的主体内容,而不是使用属性。使用这种方法,您可以重新编写清单 10 中的第一个示例,如清单 11 所示。此外,正如我们马上可以看到的,<c:set> 标记的主体内容本身也可以使用定制标记。<c:set> 主体内生成的所有内容都将作为一个 String 值赋给指定变量。

   清单 11. 通过主体内容指定 <c:set> 操作的值

<c:set var="timezone" scope="session">CST</c:set>


  JSTL core 库包含第二个用于管理限制了作用域的变量的标记 — <c:remove>。顾名思义,<c:remove> 操作是用来删除限制了作用域的变量的,它获取两个属性。var 属性指定待删除变量的名称,scope 属性是可选的,它表示待删除变量来自哪个作用域,缺省为 page,如清单 12 所示。

   清单 12. <c:remove> 操作示例

<c:remove var="timezone" scope="session"/>


   输出

  尽管 <c:set> 操作允许将表达式结果赋给限制了作用域的变量,但开发人员通常会希望只显示表达式的值,而不存储它。JSTL <c:out> 定制标记承担这一任务,其语法如清单 13 所示。该标记对由其 value 属性指定的表达式进行求值,然后打印结果。如果指定了可选属性 default,那么,在对 value 属性的表达式求值所得结果为 null 或空 String 的情况下,<c:out> 将打印其值。

   清单 13. <c:out> 操作的语法

<c:out value="expression" default="expression" escapeXml="boolean"/>


  escapeXml 属性也是可选的。它控制当用 <c:out> 标记输出诸如“<”、“>”和“&”之类的字符(在 HTML 和 XML 中具有特殊意义)时是否应该进行转义。如果将 escapeXml 设置为 true,则会自动将这些字符转换成相应的 XML 实体(此处提到的字符分别转换成 &lt;、&gt; 和 &amp;)。

   例如,假定有一个名为 user 的会话作用域变量,它是一个类的实例,该类为用户定义了两个特性:username 和 company。每当用户访问站点时,这个对象被自动分配给会话,但直到用户实际登录后,才会设置这两个特性。假定是这种方案,请考虑清单 14 中的 JSP 片段。在用户登录之后,这个片段将显示单词“Hello”,其后是他/她的用户名和一个惊叹号。但是,在用户登录之前,由这个片段生成的内容则是短语 “Hello Guest!”。在这种情况下,因为 username 特性还有待初始化,所以 <c:out> 标记将转而打印出 default 属性的值(即字符串“Guest”)。

   清单 14. 带缺省内容的 <c:out> 操作示例 Hello

<c:out value="${user.username}" default=="Guest"/>!


  接下来,考虑清单 15,它使用了 <c:out> 标记的 escapeXml 属性。如果在这种情况下已经将 company 特性设置成 Java String 值 "Flynn & Sons",那么,实际上该操作生成的内容将是 Flynn & Sons。如果这个操作是生成 HTML 或 XML 内容的 JSP 页面的一部分,那么,这个字符串中间的“&”符号最终可能被解释为 HTML 或 XML 控制字符,从而妨碍了对该内容的显示或解析。但是,如果将 escapeXml 属性值设置成 true,则所生成的内容将是 Flynn &amp; Sons。浏览器或解析器不会因在解释时遇到这种内容而出问题。假定 HTML 和 XML 是 JSP 应用程序中最常见的内容类型,所以 escapeXml 属性的缺省值是 true 就不足为奇了。

   清单 15. 禁用转义的 <c:out> 操作示例

<c:out value="${user.company}" escapeXml=="false"/>


   用缺省值设置变量

  除了 简化动态数据的显示之外,当通过 <c:set> 设置变量值时,<c:out> 指定缺省值的能力也很有用。正如清单 11 所示,用来赋给限制了作用域的变量的值可以指定为 <c:set> 标记的主体内容,也可以通过其值属性来指定。通过将 <c:out> 操作嵌套在 <c:set> 标记的主体内容中,变量赋值就可以利用其缺省值能力。

   清单 16 中说明了这种方法。外部 <c:set> 标记的行为非常简单:它根据其主体内容设置会话作用域 timezone 变量的值。但是,在这种情况下,主体内容是通过 <c:out> 操作生成的。这个嵌套操作的值属性是表达式 ${cookie[~tzPref~].value},它尝试通过 cookie 隐式对象返回名为 tzPref 的 cookie 值。(cookie 隐式对象将 cookie 名称映射到相应的 Cookie 实例,这意味着必须通过对象的 value 特性使用点运算符来检索储存在 cookie 中的实际数据。)

   清单 16. 合并 <c:set> 和 <c:out> 以提供缺省变量值

<c:set var="timezone" scope=="session">
    <c:out value="${cookie[~tzPref~].value}" default=="CST"/>
</c:set>


  但是,请考虑以下情况,用户是第一次尝试使用这段代码的 Web 应用程序。结果是,请求中没有提供名为 tzPref 的 cookie。这意味着使用隐式对象的查找将返回 null,在这种情况下整个表达式将返回 null。因为对 <c:out> 标记的 value 属性求值的结果是 null,所以 <c:out> 标记会转而输出对其 default 属性求值的结果。在这里是字符串 CST。因此,实际的结果是将 timezone 限制了作用域的变量设置成用户的 tzPref cookie 中存储的时区,或者,如果没有,则使用缺省时区 CST。

   EL 和 JSP 2.0

   目前,表达式语言仅可用于指定 JSTL 定制标记中的动态属性值。但 JSTL 1.0 表达式语言的一个扩展已经被提出,会把它包括到 JSP 2.0 中去,眼下正在进行最后评审。这个扩展将允许开发人员通过自己的定制标记来使用 EL。页面作者将可以在目前允许使用 JSP 表达式的任何地方使用 EL 表达式,譬如将动态值插入模板文本中:<p>Your preferred time zone is ${timezone}</p>。

   这个 JSP 2.0 功能(就象 JSTL 本身一样)将支持页面作者进一步减少对 JSP 编制脚本元素的依赖,从而改进 JSP 应用程序的可维护性。

   结束语

   EL(与四个 JSTL 定制标记库提供的操作结合起来)允许页面作者不使用脚本元素即可实现表示层逻辑。例如,对比本文开头清单 1 中的 JSP 代码和清单 17 中显示的通过 JSTL 实现的同样功能。(JSTL core 库中其余的标记,包括 <c:choose> 及其子标记,将在本系列的下一篇文章中讨论。)尽管显然执行了条件逻辑,但是 JSTL 版本中没有 Java 语言源代码,并且标记之间的关系(尤其是关于嵌套需求)对于任何精通 HTML 语法的人都应该是熟悉的。

   清单 17. 合并 <c:set> 和 <c:out> 以提供缺省变量值

<c:choose><c:when test="${user.role == ~member~}">
     <p>Welcome, member!</p>
   </c:when><c:otherwise>
     <p>Welcome, guest!</p>
   </c:otherwise></c:choose>


  通过提供大多数 Web 应用程序常用功能的标准实现,JSTL 有助于加速开发周期。与 EL 结合起来,JSTL 可以不需要对表示层程序编写代码,这极大地简化了 JSP 应用程序的维护。

   参考资料

   Sun 的 JSP 标准标记库主页是了解关于 JSTL 的更多信息的良好起点。

   JSTL 1.0 规范是关于 EL 和四个 JSTL 标记库的最终权威文本。

   Jakarta Taglibs 项目是 JSTL 1.0 参考实现的起源。

   Shawn Bayern 所著的 JSTL in Action(Manning Publications Co.,2002 年)提供了对所有 JSTL 功能的精彩论述,作者是该参考实现的领导。

   David Geary 是 Java 技术方面很受欢迎的作者,他也写了一本关于 JSTL 的书,书名是 Core JSTL。

   JSPTags.com 是 JSP 技术参考资料的目录,它尤其专注于定制标记库。

   Sun 的 Java Web Services Tutorial 中包含了对 JSTL 的讨论。

   “Using JSPs and custom tags within VisualAge for Java and WebSphere Studio”(WebSphere 开发者园地)是一篇 WBOnline 实用论文,它演示了 servlet、JSP 和定制标记库的使用。

   通过 Jeff Wilson 精彩的文章“使用定制标记控制 JSP 页面”(developerWorks,2002 年 1 月)了解关于定制标记库的一切。

   Noel Bergman 的文章“JSP 标记库:着意设计的更好的可用性”(developerWorks,2001 年 12 月)向您展示了声明性标记是如何帮助提高 JSP 页面的可用性的。

   有关 EcmaScript 的更多详细信息,请参阅 Sing Li 的“快速上手 Java 编程”(developerWorks,2001 年 7 月)。

   在 developerWorks Java 技术专区可以找到多达数百篇的 Java 技术参考资料。
posted @ 2007-08-22 19:52 jadmin 阅读(39) | 评论 (0)编辑 收藏

  第一类情况是,当浏览器的缓存被装满时,“查看源文件”功能将失效。如果你想确定自己的电脑是否属于这类情况,可以点击IE的“工具”菜单中的“Internet选项” “常规”标签,然后,再点击“Internet临时文件”一栏中的“删除文件”按钮。 

  第二类情况,当你打开某些特殊的浏览器窗口(比如说用JavaScript脚本语言编写的网页)时,“查看源文件”功能也会失效。如果你在浏览任何网页时,都无法“查看源文件”,那就不属于这类情况。 

  第三类情况,当一个网页还没有被完全加载到桌面时,“查看源文件”功能也是不能使用的(在这种状态下,“文件”菜单中的“另存为”选项也是屏蔽的)。这也算不上是真正的问题。 

  第四类情况,查看Windows文件夹,如果找不到Notepad.exe,将会导致“查看源文件”功能无法使用。 

  第五类情况,如果TEMP(或TMP)环境变量指向某一个不存在的文件夹,也会导致“查看源文件”功能无法使用。打开命令提示符(command prompt)窗口,键入SET TEMP(或SET TMP),就可以查看到这些变量的值。 

  第六类情况,通过注册表设置也可以限定命令行的有效性。首先,点击“开始”菜单,在运行对话框中键入“REGEDIT”,调出注册表编辑器,点击“HKEY_CURRENT_USER\Software\ Policies\Microsoft\Internet Explorer\ Restrictions”,在右边的窗格中找到一个名为NoViewSource的值,如果当前的数值数据设置为1,则双击它,将数值数据更改为0。

  第七类情况,通过查看注册表设置,你还会发现:如果指定的调用程序不正确,也将导致“查看源文件”功能失灵。调出注册表编辑器,点击“HKEY_LOCAL_MACHINE\Software\ Microsoft\Internet Explorer\View Source Editor\Editor Name”,如果该键存在的话,右边窗格中所显示的默认的“数值名称”应该是记

  事本程序的完整路径,一般以“C:\windows\notepad.exe”的形式表示。如果该键不存在,先核实记事本程序的正确位置,然后双击默认键值,修改错误路径。 

  第八类情况,组策略的设置也有可能会屏蔽“查看源文件”这一菜单项。从“开始”菜单中调出“运行”对话框,键入GPEDIT.MSC。如果桌面上弹出一个提示框,提示该文件名不正确,则说明“查看源文件”功能的失效与组策略的设置无关;否则,桌面上将会弹出一个“组策略编辑器”窗口,点击“User Configuration\Administr-ativeTemplates\Windows Components\Internet Explorer\Browser”,在右边的窗格中找到View menu: Disable Source menu,如果这个键值被设置为“Enabled”,则将它更改为“Disabled”。

  注意,上面介绍的第一类情况(即由于IE所保存的Internet临时文件过多而造成“查看源文件”功能失灵)是最常见的(如图)。如果删除了所有脱机内容之后,该功能仍然无法使用,你再依次检查后面所介绍的几种可能性,直到问题消除为止。

该文章转载自1024k:http://www.1024k.cn/faq/2007/200705/25636.html

posted @ 2007-08-22 19:27 jadmin 阅读(95) | 评论 (0)编辑 收藏

我的xml文件Login.xml如下.
<?xml version="1.0" encoding="utf-8" ?>
<Login>
      <Character>
          <C Text="热血" Value="0"></C>
          <C Text="弱气" Value="1"></C>
          <C Text="激情" Value="2"></C>
          <C Text="冷静" Value="3"></C>
          <C Text="冷酷" Value="4"></C>
      </Character>
      <Weapon>
          <W Text="光束剑" Value="0"></W>
          <W Text="光束配刀" Value="1"></W>
      </Weapon>
      <EconomyProperty>
          <P Text="平均型" Value="0"></P>
          <P Text="重视攻击" Value="1"></P>
          <P Text="重视敏捷" Value="2"></P>
          <P Text="重视防御" Value="3"></P>
          <P Text="重视命中" Value="4"></P>
      </EconomyProperty>
</Login>
现在我需要对这个xml文件的内容进行操作.
首先,我们需要加载这个xml文件,js中加载xml文件,是通过XMLDOM来进行的.
// 加载xml文档
loadXML      = function(xmlFile)
{
      var xmlDoc;
      if(window.ActiveXObject)
      {
          xmlDoc      = new ActiveXObject('Microsoft.XMLDOM');
          xmlDoc.async      = false;
          xmlDoc.load(xmlFile);
      }
      else if (document.implementation&&document.implementation.createDocument)
      {
          xmlDoc      = document.implementation.createDocument('', '', null);
          xmlDoc.load(xmlFile);
      }
      else
      {
          return null;
      }
    
      return xmlDoc;
}

xml文件对象出来了, 接下去我就要对这个文档进行操作了.
比如说,我们现在需要得到节点Login/Weapon/W的第一个节点的属性,那么我们可以如下进行.


// 首先对xml对象进行判断
checkXMLDocObj      = function(xmlFile)
{
      var xmlDoc      = loadXML(xmlFile);
      if(xmlDoc==null)
      {
          alert('您的浏览器不支持xml文件读取,于是本页面禁止您的操作,推荐使用IE5.0以上可以解决此问题!');
          window.location.href='/Index.aspx';
      }
    
      return xmlDoc;
}

// 然后开始获取需要的Login/Weapon/W的第一个节点的属性值
var xmlDoc      = checkXMLDocObj('/EBS/XML/Login.xml');
var v      = xmlDoc.getElementsByTagName('Login/Weapon/W')[0].childNodes.getAttribute('Text')
而我在我的程序中的写法是这样子的,当然我在程序中的写法是已经应用到实际中的了.一并给出来,以供查看
initializeSelect      = function(oid, xPath)
{
      var xmlDoc      = checkXMLDocObj('/EBS/XML/Login.xml');
      var n;
      var l;
      var e      = $(oid);
      if(e!=null)
      {
          n      = xmlDoc.getElementsByTagName(xPath)[0].childNodes;
          l      = n.length;
          for(var i=0; i<l; i++)
          {
              var option      = document.createElement('option');
              option.value      = n[i].getAttribute('Value');
              option.innerHTML      = n[i].getAttribute('Text');
              e.appendChild(option);
          }
      }
}
上面的访问代码中,我们是通过xmlDoc.getElementsByTagName(xPath)来进行的.
还可以通过xmlDoc.documentElement.childNodes(1)..childNodes(0).getAttribute('Text')进行访问.
一些常用方法:
xmlDoc.documentElement.childNodes(0).nodeName,可以得到这个节点的名称.
xmlDoc.documentElement.childNodes(0).nodeValue,可以得到这个节点的值. 这个值是来自于这样子的xml格式:<a>b</b>, 于是可以得到b这个值.
xmlDoc.documentElement.childNodes(0).hasChild,可以判断是否有子节点

根据我的经验,最好是使用getElementsByTagName(xPath)的方法对节点进行访问,因为这样子可以直接通过xPath来定位节点,这样子会有更好的性能.

posted @ 2007-08-22 19:00 jadmin 阅读(73) | 评论 (0)编辑 收藏

转载请注明出处:http://hi.baidu.com/jadmin/

/**
*
* @(#)ZhuanzMatrix.java
*
* @author    JAdmin
* @version   1.00    2008/08/22
*/

import java.util.Scanner;

public class ZhuanzMatrix
{
public static void main(String[] args)
{
   int row,col;
   Scanner sr = new Scanner(System.in);
   System.out.println("请输入矩阵的行和列参数:");
   System.out.print("row=");
   row = sr.nextInt();
   System.out.print("col=");
   col = sr.nextInt();
   int[][] array = new int[row][col];
   System.out.println("请输入矩阵各元素Matrix[" + row + "]" + "[" + col + "]");
   input(array);
   System.out.println("原矩阵:");
   display(array);
   int[][] newarr = doZhuanz(array);
   System.out.println("转置后:");
   display(newarr);
}

private static void input(int[][] arr)
{
   Scanner sr = new Scanner(System.in);
   for(int i = 0;i < arr.length;i++)
    for(int j = 0;j < arr[0].length;j++)
      arr[i][j] = sr.nextInt();
}

private static void display(int[][] arr)
{
   for(int i = 0;i < arr.length;i++)
   {
    for(int j = 0;j < arr[0].length;j++)
     System.out.print(arr[i][j]+" ");
    System.out.println();
   }
}

private static int[][] doZhuanz(int[][] arr)
{
   int[][] tmparr = new int[arr[0].length][arr.length];
   for(int i = 0;i < tmparr.length;i++)
    for(int j = 0;j < tmparr[0].length;j++)
     tmparr[i][j] = arr[j][i];
   return tmparr;
}
}

posted @ 2007-08-22 18:28 jadmin 阅读(69) | 评论 (0)编辑 收藏

转载请注明出处:http://hi.baidu.com/jadmin/blog/item/88a2853ea2cae8f8838b1318.html

/**
* @(#)DelColOfMatrix.java
*
* @author JAdmin
* @version 1.00 2007/8/22
*
*/

import java.util.Scanner;

public class DelColOfMatrix
{
public static void main(String[] args)
{
    int row, col;
    Scanner sr = new Scanner(System.in);
    System.out.println("请输入矩阵相关参数:");
    System.out.print("row=");
    row = sr.nextInt();
    System.out.print("col=");
    col = sr.nextInt();

    int[][] array = new int[row][col];
    System.out.println("输入矩阵各元素:");
    for (int i = 0; i < array.length; i++)
     for (int j = 0; j < array[0].length; j++)
      array[i][j] = sr.nextInt();
    System.out.println("============The Matrix is============");
    display(array);
    System.out.println("请输入要删除的矩阵列序号");
    System.out.print("delColNum=");
    int delColNum = sr.nextInt();

    int[][] newarr = delCol(array, delColNum);
    System.out
      .println("============The Matrix after Delete is============");
    display(newarr);

}

private static void display(int[][] arr)
{
    for (int i = 0; i < arr.length; i++)
    {
     for (int j = 0; j < arr[0].length; j++)
      System.out.print(arr[i][j] + " ");
     System.out.println();
    }
}

private static int[][] delCol(int[][] arr, int delColNum)
{
    int[][] tmparr = new int[arr.length][(arr[0].length - 1)];
    for (int i = 0; i < arr.length; i++)
    {
     for (int j = delColNum - 1; j < arr[0].length - 1; j++)
      arr[i][j] = arr[i][j + 1];
     for (int k = 0; k < tmparr[0].length; k++)
      tmparr[i][k] = arr[i][k];
    }
    return tmparr;

}

}

posted @ 2007-08-22 09:35 jadmin 阅读(82) | 评论 (0)编辑 收藏
仅列出标题
共50页: First 上一页 29 30 31 32 33 34 35 36 37 下一页 Last