java基础 - 2

JAVA编程语言和JDBC

编写正确且遵守规范的Java程序,可以无需重新编译就在任何启用Java技术的平台上运行。Java编程语言彻底地进行了规定。根据定义,启用Java技术的平台必须支持已知的核心库。java.sql包或javax.sql包或者JDBC就是这样一个库,它们可以视为ODBC的可移植版本,且其本身就是重大的标准。JAVA编程语言和JDBC一起使用,可以给编写数据库应用程序提供正确的可移植性解决方案。注意:虽然可移植的应用程序和标准数据库界面都是重大的成果,但不要忘记,因为历史,竞争,有时是没有意思的原因,各种数据库并没有彻底地进行标准化。这可能意味着,必须根据(甚至同一平台上的)特定数据库的性能或内在的调整来寻找"最低公分母"。无论采用标准的SQLODBCJDBC,或其他解决方案,都存在这个问题。最后需要指明的是JDBC驱动程序就是JAVA类,它实现JDBC驱动程序接口,并可以为特别的数据库转换程序(一般是SQL)请求。无疑,驱动程序在这里起了重要作用。大多数的数据库供应商现在都提供驱动程序,以实现特定系统的JDBC API。这些通常都是免费提供的。第三方驱动程序也可以获得,成本从免费到费用浩大的都有。

JDBC编程的核心包为java.sql包,其结构如下图:

JDBC编程的步骤

第一:加载驱动程序

为了与特定的数据库相连,JDBC必须加载相应的驱动程序。如:

try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

// 加载Oracle的驱动程序

Class.forName("oracle.jdbc.driver.OracleDriver");

// 加载Microsoft SQL Server的驱动程序 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

第二:要将"驱动程序"传递到DriverManager,然后获得"连接"

DriverManager类的getConnection(String url,String user, String password)方法用于建立与某个数据库的连接。每个JDBC驱动程序使用一个专门的JDBC URL作为自我标识的一种方法。

JDBC URL的格式为:jdbc : <子协议名> : <子名称>

子协议(sub-protocol)与JDBC驱动程序有关,可以是odbc,oracle,db2mysqlmicrosoft等等,根据实际的JDBC驱动程序厂商而不同。数据库定位器(database locator)是与驱动程序有关的指示器,用于唯一指定应用程序要和哪个数据库进行交互。根据驱动程序的类型,该定位器可能包括主机名,端口和数据库系统名。

try{

String url="jdbc:odbc:myodbc";

Connection con=DriverManager.getConnection(url);

// 或者

Connection con=

DriverManager.getConnection(url,user,password);

}catch(SQLException e){

e.printStackTrace();

}

// 1.Microsoft SQL ServerURL

url="jdbc:Microsoft:sqlserver://192.168.0.1:1433;databasename=mydb";

127.0.0.1 也可以用字符串 "localhost"代替

// 2.Oracle URL

url="jdbc:oracle:thin:@192.168.0.1:1521:goudan";

第三:创建语句,Statement ,PreparedStatement,CallableStatement,并将它们用于更新数据库或执行查询。

Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的对象:StatementPreparedStatement( 继承Statement )和 CallableStatement(继承PreparedStatement)。它们都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement对象用于执行对数据库已存储过程的调用。

第四:查询返回包含有已请求数据的ResultSet,该ResultSet是按类型检索的。

ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。

第五:DatabaseMetaDataResultSetMetaData接口可以用来提供有关数据库或ResultSet的信息。

实例分析

1:通过ODBC建立连接

? 配置WINDOWSODBC详细步骤参考 <连接步骤.doc>>

? 代码如下:

import java.sql.*;

public class ODBCTest {

public static void main(String[] args) {

Connection con = null;

try {

// 加载ODBC驱动

1Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

// 通过驱动管理器(DriverManager)获得连接

2con = DriverManager.getConnection("jdbc:odbc:myodbc",

"pubuse","123");

// 如果连接不成功,就会出现异常,不会执行下面这个语句

System.out.println("connect success!");

} catch (Exception e) {// 如果出现异常,会打印堆栈里异常的信息

e.printStackTrace();

} finally {// 用完后,关闭连接,释放资源

try {

if (con != null) // 防止出现内存泄露

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

2:通过SQLSERVER 提供的驱动程序获得连接

? 下面通过SQLSERVER提供的三个驱动获得连接。三个jar文件的名字分别为:msbase.jar,mssqlserver.jar,msutil.jar 然后设置classpath环境变量指向这三个路径。假如这三个文件放在d:\mssqldriver 目录下,如下图所示:

? 然后在系统环境变量classpath里面设置这三个jar文件,这样的话就可以在任何的dos命令窗口里面使用。

也可以在一个dos窗口里面设置。这样的话是只在该窗口下有效。

? 部分代码如下:

………

try {

// 加载SQLSERVER的驱动程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

// 通过驱动来获得一个连接

con = DriverManager.getConnection(

"jdbc:microsoft:sqlserver://localhost:1433;"

+ "databasename=pubs", "sa", "");

System.out.println("connect success!");

} catch (Exception e) {

e.printStackTrace();

}

………

3:通过ORACLE提供的驱动程序获得连接

? 下面介绍通过ORACLE提供的驱动程序获得连接。只有一个jar文件:classes12.jar 同上设置环境变量classpath 指向该jar文件。

部分代码如下

………

try {

// 加载ORACLE9i的驱动程序

Class.forName("oracle.jdbc.driver.OracleDriver");

// 获得连接 oracle数据库的端口号:1521 数据服务器的名字叫itjob

// 登陆的用户名为system,密码为:system (默认密码为manager)

con = DriverManager.getConnection(

"jdbc:oracle:thin:@127.0.0.1:1521:itjob",

"system","system");

System.out.println("con ok");

} catch (Exception e) {

e.printStackTrace();

}

………

4:通过数据源获得连接

使用JDBC API的一个主要好处就是独立于数据库的编程,因为大部分JDBC应用程序都可以被轻易地转换到不同的数据库。然而,仍然有两个主要的内容与特定的数据库有关,即JDBC Driver类和JDBC URL

随着JDBC API的升级,数据源技术的引入,可以提高数据库访问的灵活性。本质上,DataSource对象表示一个特殊的数据源。除了将数据库和专门的JDBC驱动程序信息封装到一个单独的,标准化的对象中之外,数据源可以作为Connection工厂,并为设置和获取DataSource对象进行成功操作所需要的特定属性提供方法。DataSource对象可能需要的一些标准属性包括:

? databaseName

? serverName

? portNumber

? username

? password

使用数据源的另一个好处就是和安全有关的敏感信息,如用户名,密码甚至数据库服务器只在一处编码,这可以由系统管理员完成。虽然和DataSource对象的交互可以用图形应用程序完成,但真正看到运行的示例是有指导性的。虽然DataSource对象的概念很简单,但为了在Java应用程序中使用,DataSource对象是使用Java名称和目录接口(JNDI)来引用的。

下面首先介绍下JNDI的相关概念。JNDI是个JAVA API,它包括名称和目录服务器的概念,道理和JDBC与数据库进行通讯的概念差不多。如:硬盘通过与磁道和扇区打交道工作,但用户只关心文件名和目录,文件系统管理名称服务,该服务将给定的文件名和硬盘上特定的位置相关联。另一个简单的示例就是Web,多数用户只关心Web站点的名称,如www.5itjob.com,并不关心底层的IP地址。然而,TCP/IP通讯是通过使用IP地址,而不是人类能看懂的名称进行的。两个表示法之间的转换是通过DNS(域名系统,Domain Name System)完成的。虽然JNDI用自己的方式提供了一个丰富和有用的API,我们的需求却简单得多。简短地说,我们需要知道怎样做四件事:

? 创建名称并将其绑定到一个Java对象

? 查询名称以检索Java对象

? 删除一个名称

? 重新绑定名称到一个新的Java对象

首先要先加载数据源的驱动程序。让环境变量classpath指向下面几个jar文件

2,代码如下:

import java.util.Hashtable;

import javax.naming.*;

import javax.naming.directory.*;

import java.sql.*;

import javax.sql.*;

import com.microsoft.jdbcx.sqlserver.SQLServerDataSource;

public class JNDIServer {

// First we define the relevant parameters for this datasource

private String serverName = "192.168.0.1";

private int portNumber = 1433;

private String login = "student";

private String password = "student";

private String databaseName = "mydb";

private String filePath = "jdbc/mydatasource";

public JNDIServer() {

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

// 创建初始化上下文环境

Context ctx = new InitialContext(env);

// 如果filePath已经绑定过了,那么先解除绑定

ctx.unbind(filePath);

// 创建SQLServerDataSource

SQLServerDataSource ds = new SQLServerDataSource();

// 设置数据源的参数

ds.setServerName(serverName);

ds.setPortNumber(portNumber);

ds.setDatabaseName(databaseName);

ds.setUser(login);

ds.setPassword(password);

ds.setDescription("JDBC DataSource Connection");

// 绑定 JDBC 数据源

ctx.bind(filePath, ds);

ctx.close();

System.out.println("DataSource Created Success!");

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String args[]) {

new JNDIServer();

}

}

运行成功后,会在控制台打印:DataSource Created Success!

同时在运行该类所在的磁盘根目录下生成".bindings"文件,如下图:

数据源创建好之后,下面开始使用数据源。

代码如下:

import java.util.Hashtable;

import javax.naming.*;

import java.sql.*;

import javax.sql.*;

public class UseJNDI {

public static void main(String args[]) {

Connection con = null;

try {

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

Context ctx = new InitialContext(env);

// 获得数据源对象

DataSource ds =

(DataSource) ctx.lookup("jdbc/mydatasource");

// 通过数据源对象获得一个连接

con = ds.getConnection();

// 如果连接不成功,就会出现异常,不会执行下面这个语句

System.out.println("connect success!");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (con != null)// 用完连接后,要关闭释放

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

下面是删除JNDI的引用的代码:

import java.util.Hashtable;

import javax.naming.*;

import java.sql.*;

import javax.sql.*;

public class DeleteJNDI {

public static void main(String[] args) {

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

Context ctx = new InitialContext(env);

ctx.unbind("jdbc/pubs");

ctx.close();

System.out.println("delete succeed!");

} catch (Exception ex) {

System.err.println("ERROR: " + ex.getMessage());

}

}

}

5:通过连接池获得连接

首先请根据我们在上面创建数据库连接的经验,来思考下列问题:

? 为什么需要连接池?

? 什么是PooledConnection?

? 初始化连接池

? 使用连接池

当使用DriverManager或者DataSource方法来获取数据库连接时,每个对新数据库连接的请求都会导致很大的开销。如果频繁地获取新的连接,将会影响性能问题。这在Web服务器端编程的时候尤为明显。请求一个新的Connection对象会带来大量的开销和很多潜在的错误。为了最小化开销,为什么在我们使用完数据库连接后不是重新使用它们,而是删除它们呢?JDBC设计者在创建接口ConnectionPoolDataSource时使用这种流行的设计模式,这允许您创建数据库连接池,其中的连接在关闭后可以重用,而不是删除。

PooledConnection是一个特殊类型的数据库连接,在关闭时不会被删除,不象常规的Connection对象(当常规的连接不再被使用时,垃圾收集器能删除它们)。相反,PooledConnection被缓存以备将来再次使用,从而可能带来大幅度的性能提升。使用数据库连接池几乎和使用DataSource对象一样。首先,不是创建一个实现DataSource接口的类的实例,而是创建了一个实现了ConnectionPoolDataSource接口的类的实例。可以像以前一样使用JNDI来绑定这个新的数据源到一个名称。要实际使用池化的数据源对象,调用ConnectionPooledDataSource(它接下来会建立数据库连接)上的getPooledConnection()得到一个PooledConnection对象。要创建将使用的Connection对象,调用PooledConnection对象(而不是以前的DriverManagerDataSource对象)上的getConnection().这种方法的一个额外的好处是,因为是自动处理,用ConnectionPool管理一定数量的数据库连接方便多了。如果你的客户机许可限制了能够同时连接到数据库的客户机的数目,这种自动化可能非常重要。

初始化连接池。下面的例子我们将使用SQLServer2000数据库和i-net软件的第三方驱动程序来创建PooledDataSource.所有与数据库相关的代码都包含在初始化或绑定过程中。

首先应该在classpath里面再指向名字为Merlia.jarjar文件。

2,代码如下:

import com.inet.tds.PDataSource;

import java.util.Hashtable;

import javax.naming.*;

import com.microsoft.jdbcx.sqlserver.SQLServerDataSource;

public class JNDIofPooledDataSourceTest {

public static void main(String[] args) {

String serverName = "192.168.0.1";

String databaseName = "mydb";

String userName = "student";

String password = "student";

// 通过下面的名字可以获得一个池化的连接

String filePath = "jdbcPool/mydatasource";

int portNumber = 1433;

int poolSize = 10; // We want to create a pool with 10 connections.

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

try {

Context ctx = new InitialContext(env);

// 创建一个池化的数据源对象

PDataSource ds = new PDataSource();

ds.setServerName(serverName);

ds.setPortNumber(portNumber);

ds.setDatabaseName(databaseName);

ds.setUser(userName);

ds.setPassword(password);

ds.setDescription("i-Net PDataSource");

ds.setMaxPoolSize(poolSize);

// 绑定池化的数据源

ctx.bind(filePath, ds);

ctx.close();

System.out.println("PooledDataSource Created Success!");

} catch (Exception ex) {

System.err.println("ERROR: " + ex.getMessage());

}

}

}

一旦初始化了PooledDataSource,就能够在Java应用程序中使用它来创建数据库连接池。请看下面的例子:

import java.util.Hashtable;

import javax.naming.*;

import java.sql.*;

import javax.sql.*;

import java.io.*;

public class UseJNDIOfPooledDataSource {

public static void main(String[] args) {

Connection con = null;

try {

String filePath = "jdbcPool/mydatasource";

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

Context ctx = new InitialContext(env);

// 通过JNDI获得池化的数据源

ConnectionPoolDataSource ds =

(ConnectionPoolDataSource) ctx .lookup(filePath);

// 通过池化的数据源获得池化的连接

PooledConnection pcon = ds.getPooledConnection();

// 通过池化的连接获得连接

con = pcon.getConnection();

// 如果连接不成功,就会出现异常,不会执行下面这个语句

System.out.println("connect success!");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (con != null)// 用完连接后,要关闭释放

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

6:总结数据库连接的各种方式

下面通过综合的例子来说明各种数据库的连接。

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.Hashtable;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.ConnectionPoolDataSource;

import javax.sql.DataSource;

import javax.sql.PooledConnection;

public class DBCon {

// 通过JDBC-ODBC桥获得连接

public static Connection getOdbcCon(String datasourcename, String name,String password)

throws ClassNotFoundException, SQLException {

String url = "jdbc:odbc:";

Connection con = null;

con = DriverManager.getConnection(url + datasourcename, name, password);

return con;

}

// 通过SQLSERVER的三个驱动,连接SQLSERVER2000数据库

public static Connection getSQLServerCon(String name, String password)

throws ClassNotFoundException, SQLException {

String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433";

Connection con = null;

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

con = DriverManager.getConnection(url, name, password);

return con;

}

// 通过ORACLE的驱动,连接ORACLE数据库

public static Connection getOracleCon(String name, String password)

throws ClassNotFoundException, SQLException {

Connection con = null;

Class.forName("oracle.jdbc.driver.OracleDriver");

// 获得连接 oracle数据库的端口号为:1521 数据服务器的名字叫goudan(作者外号)

String url = "jdbc:oracle:thin:@127.0.0.1:1521:goudan";

con = DriverManager.getConnection(url, name, password);

return con;

}

// 通过数据源获得连接

public static Connection getConnectionFromDataSource(String filePath)

throws javax.naming.NamingException, SQLException {

Connection con = null;

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

Context ctx = new InitialContext(env);

DataSource ds = (DataSource) ctx.lookup(filePath);

con = ds.getConnection();

return con;

}

// 通过连接池获得连接

public static Connection getConnectionFromPooledDataSource(String filePath)

throws javax.naming.NamingException, SQLException {

Connection con = null;

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContextFactory");

Context ctx = new InitialContext(env);

ConnectionPoolDataSource ds = (ConnectionPoolDataSource) ctx

.lookup(filePath);

PooledConnection pc = ds.getPooledConnection();

con = pc.getConnection();

return con;

}

}

内容总结

? JDBCJava Database Connectivity)是Sun提供的一套数据库编程接口API,由Java语言编写的类、接口组成;通过这些类和接口JAVA可以方便的访问各种数据库中的数据。

? JDBC连接数据库的四种方式

? JDBC-ODBC桥,简单易用,只适用于WINDOW平台,适用于学习JDBC

? 部分Java驱动程序(native-API partly-Java Driver),少用到。

? 网络驱动程序(net-protocol all-java driver(JDBC Proxy)),应用比较广。

? 纯Java驱动程序(native-protocal all-Java driver,它直接与数据库进行通讯,最好的一种连接。

? JDBC的编程步骤

? 加载驱动程序;

? 建立到数据库的连接对象Connection

? 创建语句,Statement ,PreparedStatement,

CallableStatement,并将它们用于更新数据库或执行查询;

? 查询返回包含有已请求数据的ResultSet

? 通过SqlServer,Oracle的驱动程序连接数据库;

? JDBC数据源,连接池技术的实现原理及其优点

? 数据源技术的引入,可以提高数据库访问的灵活性

? 使用数据源,和安全有关的敏感信息,如用户名,密码甚至数据库服务器地址等信息只在一处编码。

? 使用连接池可以提高连接数据库的效率。

独立实践

1 写一个SQLSERVER连接池的实现,访问pub数据库。

2 写一个连接ORACLE数据库的实现,用scott用户登陆,操作emp

3 从控制台输入注册信息(用户名,密码,确认密码),写到数据库里面。

4 从控制台输入用户名和密码,在数据库中并验证其有效性。(提示:需要编写的类有:User, Validation,DbUtil)。

5 登陆成功后,从控制台输入一个表名,并从控制台打印该表里的数据。

第二十章:高级JDBC

学习目标

? 使用DDL,DML语言对数据库进行基本操作

? 预编译语句

? 使用事务

? 事务的级别控制

? 使用存储过程

? 操作元数据

? 可滚动的和可更新的结果集

? 批处理更新

? 字符大对象CLOB

? 二进制大对象BLOB

? RowSet 新特性

使用DDL,DML语言对数据库进行基本操作。

? 创建表并插入数据及修改数据:

import java.sql.Connection;

import java.sql.Statement;

public class CreateTable {

public static void main(String[] args) {

Connection con = null;

try {

// 通过连接池来获得一个连接

con = DBCon .getConnectionFromPooledDataSource("jdbcPool/mydatasource");

// 创建语句对象

Statement st = con.createStatement();

// 创建表的SQL语句

String sql = "create table student(id int,name char(30),age int)";

// 执行完SQL语句的结果

boolean b = st.execute(sql);

if (b) {

System.out.println("create success");

} else {

System.out.println("create fail");

}

// 插入数据到student

sql = "insert into student values(1,'andy',47)"

+ "insert into student values(2,'jacky',53)"

+ "insert into student values(3,'周润发',51)"

+ "insert into student values(4,'谢贤',60)";

// 执行完SQL语句的结果

b = st.execute(sql);

if (b) {

System.out.println("insert success");

} else {

System.out.println("create fail");

}

// 更新表数据

sql = "update student set name='刘德华' where id=1";

int rows = st.executeUpdate(sql);

// 如果更新成功,rows肯定是大于1的值

if (rows > 0)

System.out.println("update success");

else

System.out.println("update fail");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

查询数据库里的数据

Statement对象的executeQuery()方法一般用于执行一个select语句,它只返回一个结果集,要想把查询结果最后显示给用户,必须对ResultSet对象进行处理。ResultSet对象包括一个由查询语句返回的一个表,这个表中包含所有的查询结果。对ResultSet对象的处理必须逐行进行。ResultSet对象维持一个指向当前行的指针(类似于Iterator的用法)。最初,这个指针指向第一行之前。ResultSetnext()方法使这个指针移向下一行。因此,第一次使用next()方法将指针指向结果集的第一行,这是可以对第一行的数据进行处理。处理完毕后,使用next()方法,将指针移向下一行,继续处理第二行数据。next()方法的返回值是一个boolean值,若为true,则说明指针成功地移向下一行,可以对该行进行处理。若返回值是false,则说明没有下一行,即结果集已经处理完毕。按从左至右的顺序对各列进行处理可以获得较高的执行效率。ResultSet接口的getXXX()方法可以从某列中获得结果,XXX表示JDBC的数据类型。

请看下例:

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.Statement;

public class ResultSetTest {

public static void main(String[] args) {

Connection con = null;

try {

con = DBCon

.getConnectionFromPooledDataSource("jdbcPool/mydatasource");

Statement st = con.createStatement();

String query = "select id,name from student";

// 获得一个结果集

ResultSet rs = st.executeQuery(query);

// 获得结果集的元数据(表及相关的信息)

ResultSetMetaData rsmt = rs.getMetaData();

// 得到结果集有几列

int num = rsmt.getColumnCount();

String[] columns = new String[num];

// 列的序号是从1开始的

for (int i = 0; i < num; i++)

columns[i] = rsmt.getColumnName(i + 1);

// 先输出列名

for (int i = 0; i < num; i++)

System.out.print(columns[i] + " ");

// 输出列名之后换行

System.out.println();

// 取出结果

while (rs.next()) {

// 输出每一行的值

for (int i = 1; i <= num; i++) {

String temp = rs.getString(i);

System.out.print(temp + " ");

}

System.out.println();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

// 用完后要关闭连接,释放资源

if (con != null)

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

输出结果为:(Eclipse环境)

预编译语句(PreparedStatement

Statement对象在每次执行SQL语句时都将该语句传给数据库,在多次执行同一语句时,这样做效率较低。这时可以使用PreparedStatement对象.如果数据库支持预编译,它可以将SQL语句传给数据库作预编译,以后每次执行这个SQL语句时,速度就可以提高很多。如果数据库不支持预编译,则在语句执行时,才将其传给数据库。这对用户来说是透明的。PreparedStatement对象的SQL语句还可以接受参数。在语句中指出需要接受哪些参数,然后进行预编译。在每一次执行时,可以给SQL语句传输不同的参数,这样就大大提高了灵活性。PreparedStatement接口是Statement接口派生的子接口,因此它可以使用Statement接口中的方法。

代码

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.Statement;

public class PrepareStatementTest {

public static void main(String[] args) {

Connection con = null;

try {

con = DBCon

.getConnectionFromPooledDataSource("jdbcPool/mydatasource");

// 创建修改表的PrepareStatement SQL语句

String sql = "update student set name=? where id=?";

// 创建预编译语句对象

PreparedStatement st = con.prepareStatement(sql);

String[] names = new String[] { "梁朝伟", "贝壳汗母", "小罗", "霍元甲" };

for (int i = 0; i < names.length; i++) {

st.setString(1, names[i]);

st.setInt(2, i + 1);

st.executeUpdate();

}

st.close();

// 打印执行完SQL语句的结果

Statement stq = con.createStatement();

// 定义一个查询的SQL语句

String query = "select id,name from student";

// 获得一个结果集

ResultSet rs = stq.executeQuery(query);

// 获得结果集的元数据(表及的信息)

ResultSetMetaData rsmt = rs.getMetaData();

// 得到有几列,保存在num变量里

int num = rsmt.getColumnCount();

String[] columns = new String[num];

// 列的序号是从1开始的

for (int i = 0; i < num; i++)

columns[i] = rsmt.getColumnName(i + 1);

// 先输出列名

for (int i = 0; i < num; i++)

System.out.print(columns[i] + " ");

// 输出列名之后换行

System.out.println();

// 取出结果

while (rs.next()) {

// 输出每一行的值

for (int i = 1; i <= num; i++) {

String temp = rs.getString(i);

System.out.print(temp + " ");

}

System.out.println();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

使用事务

下面介绍如何把一系列语句组织成一个事务?如果事务中所有命令都能正确执行,就可以提交这个事务;否则,如果事务中有一个命令出现错误,回滚这个事务,并返回到提交之前的状态,好像什么也没有发生。把命令组合成事务的主要原因是保证数据库的完整性。对于一个事务而言,要么事务中语句全部得到正确执行,事务就可被提交了,要么它中间出现错误。后一种情况,可以调用rollback()方法,数据库将自动放弃上一次提交事务以来的全部变化。一个数据库连接的缺省模式是autocommit模式,每个SQL命令一执行就会提交给数据库。一旦某个命令已提交,就不能把它回退。可以用Connection接口的getAutocommit()方法,检验数据库的目前自动提交模式设置。用命令con.setAutoCommit(false)方法关闭自动提交模式。用con.commit()命令提交事务。用con.rollback()回滚一个事务。

代码

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import javax.naming.NamingException;

public class UseTran {

public static void main(String[] args) {

Connection con = null;// 方法里临时变量要手动初始化

PreparedStatement updateAge = null;

String updateString = "update student "

+ "set age = ? where name like ?";

String jndiname = "jdbcPool/mydatasource";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

updateAge = con.prepareStatement(updateString);

int[] age = { 45, 39, 25, 96 };

String[] names = { "梁朝伟%", "贝壳汗母%", "小罗%", "霍元甲%" };

int len = age.length;

// 设置事务提交模式为非自动提交

con.setAutoCommit(false);

for (int i = 0; i < len; i++) {

updateAge.setInt(1, age[i]);

updateAge.setString(2, names[i]);

updateAge.executeUpdate();

}

// 上面执行的语句,如果不出现异常则提交 SQL 语句

con.commit();

System.out.println("update success!");

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.err.println("SQLException: " + ex.getMessage());

if (con != null) {

try {

System.err.print("Transaction is being ");

System.err.println("rolled back");

// 如果出现异常则事务回滚

con.rollback();

} catch (SQLException excep) {

System.err.print("SQLException: ");

System.err.println(excep.getMessage());

}

}

} finally {// 不管发生不发生异常,要关闭连接,释放资源

try {

if (con != null) {

con.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

事务的级别控制

SQL术语中,事务是逻辑工作单元(logical unit of work,LUW)构成的一个或多个语句。这在某种含义上意味着,一切都是事务。不过,通常而言,术语事务用来表示或全或无的系列操作;也就是说,要么一切十分成功,要么什么也没有发生。典型的事务是从银行帐户提款,并存放到另一个。只要提款完成,金额就消失了。另一个范例是复式薄记记帐法中的借方和贷方:借方和贷方都必须完成。

在单用户模式,事务非常容易理解-它们只是和保存或忘记应用程序的状态有关。在多用户模式中,事务变得复杂多了。多用户事务的经典说明是银行帐户,其中一个应用程序试图在借记帐户,同时另一个应用程序试图贷记同一个帐户。在前面已经介绍过多线程编程(并发编程)。类似的,事务的根本问题是保持两个事务相互隔离,否则一个应用程序就可能影响另一个,从而导致错误的程序状态。当处理多个访问相同数据的用户时,通常可能出现三种问题:

? 脏读:当应用程序使用了被另一个应用程序修改过的数据,而这个数据处于未提交状态时,就会发生脏读。第二个应用程序随后会请求回滚被其修改的数据。第一个事务使用的数据就会被损坏,或者"变脏"

? 不可重复的读:当一个事务获得了数据,而该数据随后被一个单独的事务所更改时,若第一个事务再次读取更改后的数据,就会发生不可重复的读。这样,第一个事务进行了一个不可重复的读。

? 虚读:当事务通过某种查询获取了数据,另一个事务修改了部分该数据,原来的事务第二次获取该数据时,就会发生虚读。第一个事务现在会有不同的结果集,它可能包含虚读。

为了解决与"多个线程请求相同数据"相关的问题,事务之间用锁相互隔开。多数主流的数据库支持不同类型的锁;因此,JDBC API支持不同类型的事务,它们由Connection对象指派或确定。在JDBC API中可以获得下列事务级别:

? TRANSACTION_NONE 说明不支持事务

? TRANSACTION_READ_UNCOMMITTED说明在提交前一个事务可以看到另一个事务的变化。这样脏读,不可重复的读和虚读都是允许的。

? TRANSACTION_READ_COMMITTED说明读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。

? TRANSACTION_REPEATABLE_READ说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。

? TRANSACTION_SERIALIZABLE是最高的事务级别,它防止脏读,不可重复读和虚读。

为什么不是所有事务都运行在TRANSACTION_SERIALIZABLE模式以保证最高程度的数据完整性呢?问题在于,和处理多线程编程有关的问题相似,事务保护的级别越高,性能损失就越大。假定您的数据库和JDBC驱动程序支持这个特性,则给定一个Connection对象,您可以明确地设置想要的事务级别:con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

您还可以确定当前事务的级别:

int transactionIsolation = con.getTransactionIsolation();

if (transactionIsolation == Connection.TRANSACTION_NONE)

System.out.println("当前事务级别为:TRANSACTION_NONE");

代码:

import java.sql.Connection;

import java.sql.SQLException;

import javax.naming.NamingException;

public class TranTest {

public static void main(String[] args) {

String jndiname = "jdbcPool/mydatasource";

Connection con = null;

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

int transactionIsolation = con.getTransactionIsolation();

if (transactionIsolation == Connection.TRANSACTION_NONE) {

System.out.println("当前事务级别为:TRANSACTION_NONE");

} else if (transactionIsolation == Connection.TRANSACTION_READ_COMMITTED) {

System.out.println("当前事务级别为:TRANSACTION_READ_COMMITTED");

} else if (transactionIsolation == Connection.TRANSACTION_READ_UNCOMMITTED) {

System.out.println("当前事务级别为:TRANSACTION_READ_UNCOMMITTED");

} else if (transactionIsolation == Connection.TRANSACTION_REPEATABLE_READ) {

System.out.println("当前事务级别为:TRANSACTION_REPEATABLE_READ");

} else if (transactionIsolation == Connection.TRANSACTION_SERIALIZABLE) {

System.out.println("当前事务级别为:TRANSACTION_SERIALIZABLE");

}

con.setAutoCommit(false);

con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

transactionIsolation = con.getTransactionIsolation();

if (transactionIsolation == Connection.TRANSACTION_NONE) {

System.out.println("当前事务级别为:TRANSACTION_NONE");

} else if (transactionIsolation == Connection.TRANSACTION_READ_COMMITTED) {

System.out.println("当前事务级别为:TRANSACTION_READ_COMMITTED");

} else if (transactionIsolation == Connection.TRANSACTION_READ_UNCOMMITTED) {

System.out.println("当前事务级别为:TRANSACTION_READ_UNCOMMITTED");

} else if (transactionIsolation == Connection.TRANSACTION_REPEATABLE_READ) {

System.out.println("当前事务级别为:TRANSACTION_REPEATABLE_READ");

} else if (transactionIsolation == Connection.TRANSACTION_SERIALIZABLE) {

System.out.println("当前事务级别为:TRANSACTION_SERIALIZABLE");

}

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.err.println("SQLException : " + ex.getMessage());

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

System.out.println("程序执行结束!");

}

}

使用存储过程

很多数据库都支持在数据库内部执行的函数。这种方法有几个好处,包括更快的性能和改进的安全性。这些函数称为存储过程。存储过程是用来封装SQL语句来完成一个完整的业务功能,类似于面向对象里面方法的概念。虽然它们通常是用SQL编写的,但也可以用数据库支持的任何编程语言编写。随着Java语言日趋流行,几个数据库厂商---OracleOracle数据库)和IBMdb2数据库)都起用了Java语言创建存储过程,还可以在不同数据库之间移动存储过程。

存储过程可以支持三种类型的参数:IN,OUTINOUT,这对于存储过程在数据库内部真正能做什么来说,带来了很大的灵活性。不管存储过程是用什么语言编写的,它都能以一种标准的方式从Java应用程序调用。

首先,您需要创建一个CallableStatement对象。为了标识存储过程和过程需要的参数的类型和数量,还要允许使用三种类型的调用。下面的清单说明了这三种类型(假定我们正在调用一个名为StudentList的存储过程):

? {call StudentList}如果过程不需要参数

? {call StudentList(?,?)}如果过程需要两个参数

? {?=call StudentList(?,?)}如果参数需要两个参数并返回一个

要想使用存储过程,首先应该创建一个存储过程!

代码的实现

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.NamingException;

public class CreateStoredProceduresofSQLServer {

public static void main(String[] args) {

Connection con = null;

Statement stmt = null;

String jndiname = "jdbcPool/mydatasource";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

stmt = con.createStatement();

// 1.创建存储过程show_students

String createProcedure1 = "create procedure show_students " + "as " + "select id, name,age " + "from students " + "order by id";

// 删除数据库中存在的同名过程

stmt.executeUpdate("if exists(select name from sysobjects "

+ "where name='show_students'and type='p') "

+ "drop procedure show_students");

stmt.executeUpdate(createProcedure1);

// 2.创建储存过程onestudent

String createProcedure2 = "create procedure onestudent "

+ "@stu_id int = null, " + "@name varchar(20) output, "

+ "@age int output " + "as " + "if @stu_id = null "

+ "BEGIN "

+ " PRINT 'ERROR: You must specify a stu_id value.' "

+ " RETURN "

+ "END "

+

// Get the sales for the specified cof_name and " +

// assign it to the output parameter. " +

"SELECT @name = name, @age = age " + "FROM coffees "

+ "WHERE id = @stu_id " + "RETURN ";

stmt.executeUpdate("if exists(select name from sysobjects "

+ "where name='onestudent'and type='p') "

+ "drop procedure onestudent");

stmt.executeUpdate(createProcedure2);

// 3.创建函数

String createProcedure3 = "CREATE FUNCTION pubuse.ageofstu "

+

// Input cof_name

"(@stu_name varchar(20)) "

+ "RETURNS int "

+ // return sales

"AS " + "BEGIN " + " DECLARE @age int "

+ " SELECT @age = age " + " FROM student "

+ " WHERE name like @stu_name " + " RETURN @age "

+ "END ";

stmt.executeUpdate("if exists(select name from sysobjects "

+ "where name='ageofstu') "

+ "drop function pubuse.ageofstu");

stmt.executeUpdate(createProcedure3);

stmt.close();

con.close();

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.err.println("SQLException : " + ex.getMessage());

}

System.out.println("程序执行结束!");

}

}

下面是使用存储过程的代码:

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Types;

import javax.naming.NamingException;

public class InvokeStoreProcdureofSQLServer {

public static void main(String[] args) {

Connection con = null;

String jndiname = "jdbcPool/mydatasource";

// 定义调用存储过程和函数的 SQL 语句

String callSQL1 = "{call show_students}";

String callSQL2 = "{call onestudent(?,?,?)}";

String callSQL3 = "{? = call ageofstu(?)}";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

// 调用第 1 个存储过程

CallableStatement cs = con.prepareCall(callSQL1);

ResultSet rs = cs.executeQuery();

System.out.println("第一个存储过程调用结果");

while (rs.next()) {

String id = rs.getString(1);

String name = rs.getString(2);

String age = rs.getString(3);

System.out.println(id + " " + name + " " + age);

}

// 调用第 2 个存储过程

cs = con.prepareCall(callSQL2);

cs.setString(1, "2");

cs.registerOutParameter(2, Types.CHAR);

cs.registerOutParameter(3, Types.INTEGER);

cs.execute();

String name = cs.getString(2);

int age = cs.getInt(3);

System.out.println("第二个存储过程调用结果");

System.out.println("This student's name is " + name

+ " and age is " + age);

// 调用函数

cs = con.prepareCall(callSQL3);

cs.setString(2, "小罗");

cs.registerOutParameter(1, Types.INTEGER);

cs.execute();

age = cs.getInt(1);

System.out.println("函数调用结果");

System.out.println("This student's name is " + age + ".");

cs.close();

con.close();

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.err.println("SQLException : " + ex.getMessage());

}

System.out.println("调用结束!");

}

}

操作元数据

JDBC Meta Data(元数据)----描述数据的数据。它的接口有:

? DatabaseMetaData(数据库元数据)

? ResultSetMetaData(结果集元数据)

DatabaseMetaData(数据库元数据)

在对数据源进行连接以后,得到一个Connection对象,可以从这个对象获得有关数据源的各种信息,包括关于数据库中的各个表,表中的各个列,数据类型和存储过程等各方面的信息。根据这些信息,JDBC程序可以访问一个事先并不了解的数据库。获取这些信息的方法都是在DatabaseMetaData的对象上实现的,而DatabaseMetaData对象是在Connection对象之上获得的。

下面的语句可以在一个连接的基础上创建一个DatabaseMetaData 对象:

DatabaseMetaData dm=con.getMetaData();

数据库的一些常用信息可通过DatabaseMetaData对象的下列方法获得。

? getURL()//返回一个String对象,代表数据库的URL.

? getUserName()//返回此连接使用的数据库的用户名

? isReadOnly()//返回一个boolean值,指示数据库是否只允许读操作。

? getDatabaseProduceName()//返回数据库的产品名称

? getDatabaseProduceVersion()//返回数据库的版本号

? getDriverName()//返回驱动程序的名称。

? getDriverVersion()//返回驱动程序的版本号

代码示例:

import java.sql.Connection;

import java.sql.DatabaseMetaData;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.naming.NamingException;

public class DataBaseMetaDataTest {

public static void main(String[] args) {

Connection con = null;

String jndiname = "jdbcPool/mydatasource";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

// 测试数据库信息

DatabaseMetaData dm = con.getMetaData();

System.out.println("1. 数据库的基本信息");

System.out.println("Database is " + dm.getDatabaseProductName());

System.out.println("Database version is "

+ dm.getDatabaseProductVersion());

System.out.println("JDBC Driver is " + dm.getDriverName());

System.out.println("JDBC driver version is "

+ dm.getDriverVersion());

// 获取数据库中目录(数据库)的信息

System.out.println("2. 数据库中目录(数据库)的信息");

ResultSet catalogs = dm.getCatalogs();

while (catalogs.next()) {

System.out.println(catalogs.getString(1));

}

// 获取数据库中模式的信息

System.out.println("3. 数据库中模式的信息");

ResultSet schemas = dm.getSchemas();

while (schemas.next()) {

System.out.println(schemas.getString(1));

}

// 获取数据库中各个表的情况

System.out.println("4. 数据库中各个表的信息");

ResultSet tables = dm.getTables("pubs", null, null, null);

while (tables.next()) {

for (int i = 0; i < 5; i++) {

System.out.print(tables.getString(i + 1));

System.out.print(" | ");

}

System.out.println();

}

// 获取数据库表中各个列的信息

System.out.println("5. 数据库表中各个列的信息");

ResultSet columns = dm.getColumns(null, null,

"student", null);

while (columns.next()) {

for (int i = 0; i < 18; i++) {

System.out.print(columns.getString(i + 1));

System.out.print(" | ");

}

System.out.println();

}

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.err.println("SQLException : " + ex.getMessage());

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

e.printStackTrace();

}

}

System.out.println("程序结束!!!");

}

}

ResultSetMetaData(结果集元数据)

根据结果集的元数据,可以得到一个查询结果集关于查询表中列的个数,各个列名,类型以及各个列的宽度等。ResultSetMetaData的对象可以由ResultSet对象的getMetaData()方法得到。

ResultSetMetaData对象的常用方法如下:

? ResultSet rs=stmt.executeQuery();

? ResultSetMetaData rsmd=rs.getMetaData();

? rsmd.getColumnCount()//返回ResultSet对象的列数。

? rsmd.getColumnDisplaySize(int column);//返回column指定的列的最大宽度。

? rsmd.getColumnLabel(int column)//返回column指定列的标签。

? rsmd.getColumnName(int column)//返回column指定列的列名。

请看下例:

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.NamingException;

public class ResultSetMetaDataTest {

public static void main(String[] args) {

Statement stmt = null;

ResultSet rs = null;

Connection con = null;

String jndiname = "jdbcPool/mydatasource";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

stmt = con.createStatement();

String querySQL1 = "select * from student";

rs = stmt.executeQuery(querySQL1);

// 提取结果集的元数据:

ResultSetMetaData rsmd = rs.getMetaData();

int colCount = rsmd.getColumnCount();

String[] columnNames = new String[colCount];

String[] columnLabels = new String[colCount];

int[] columnTypes = new int[colCount];

for (int i = 0; i < colCount; i++) {

columnNames[i] = rsmd.getColumnName(i + 1);

columnLabels[i] = rsmd.getColumnLabel(i + 1);

columnTypes[i] = rsmd.getColumnType(i + 1);

}

System.out.println();

System.out.println("提取的数据如下:");

System.out.println();

System.out .println("----------------------");

for (int i = 0; i < colCount; i++) {

System.out.print(columnLabels[i] + "\t");

}

System.out.println();

for (int i = 0; i < colCount; i++) {

System.out.print(columnNames[i] + "\t");

}

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.err.println("SQLException: " + ex.getMessage());

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

}

}

System.out.println("程序结束!!!");

}

}

可滚动的和可更新的结果集

可滚动的结果集表示在结果集中前后滚动显示数据。可更新的结果集表示可以通过结果集来更新数据库里的数据。

可滚动的ResultSet可以使用以下方法:

? absolute()

? afterLast()

? beforeFirst()

? first()

? getRow()

? isAfterLast()

? isBeforeFirst()

? isFirst()

? isLast()

? last()

? moveToCurrentRow()//仅对可更新的ResultSet有效

? previous()

? relative(int rows)//将游标移动相对量的行,或者正方向或者负方向

为了让查询返回可滚动的结果集,你必须用

Statement stmt=con.createStatement(type,concurrency);

得到一个不同的Statement对象。

对于PreparedStatement,调用

PreparedStatement stmt=con.preparedStatement(command,type,concurrency);

例如,如果你只想在一个结果总来回滚动,而不想编辑它的数据,用下列语句:

Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

所有调用方法:

ResultSet rs=stmt.executeQuery(query);

返回的结果集都是可滚动的,一个可滚动的结果集用一个光标指示目前的位置。

ResultSet类型值

? TYPE_FORWARD_ONLY 结果集不可滚动

? TYPE_SCROLL_INSENSITIVE 结果集可滚动,但不反映数据库的变化

? TYPE_SCROLL_SENSITIVE 结果集可滚动,并反映数据库的变化

ResultSet同步值

? CONCUR_READ_ONLY 不能用结果集更新数据库

? CONCUR_UPDATABLE 可以用结果集更新数据库

如果你想编辑ResultSet类型数据,并让这些变化在数据库中自动体现出来,就需要创建一个可更新的结果集。可更新的结果集不一定是可滚动的,但如果想让用户编辑数据,通常这个结果集也是可滚动的。为了得到可更新的结果集,构造语句如下:

Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

接着,调用executeQuery()就可返回可更新的结果集。

注意:不是所有的查询都可返回可更新的结果集。如果某个查询涉及多个表,那么它的返回结果可能是不可更新的。但如果查询只涉及一个表或涉及用主关键字连接的多个表,那么返回结果是可更新的,这可以用ResultSetgetConcurrency()方法验证。

SQL类型相对应,JDBC 2.0为每个数据类型提供了与它相应的updateXxx()方法,如updateDouble(),updateString()等等。

updateXxx()方法只能改变当前光标的记录值,而不能改变数据库中数据。调用updateRow()方法把修改后的数据保存到数据库中。如果移动到另一行之前,没有调用updateRow()方法,本行中所有的更新将被撤消。也可以调用cancelRowUpdates()方法,撤消本行中的所有修改。

例如:

String query="select * from student";

ResultSet rs=stmt.executeQuery(query);

while(rs.next()){

double age=rs.getInt("age");

rs.updateInt("age",age+1);

rs.updateRow();

往数据库中添加一个新记录:

? 首先用moveToInsertRow()方法把光标移动到指定位置(它称为插入行)。

? 接着,调用 updateXxx()方法,在插入位置创建一个新行。

? 最后,调用insertRow()方法,把这个新行发送给数据库。插入完成后,调用

moveToCourrentRow()方法把光标移回调用moveToInsertRow()方法以前的位置。

例:

rs.moveToInsertRow();

rs.updateString("name","李雨春");

rs.updateInt("age",21);

rs.insertRow();

rs.moveToCurrentRow();

调用下面的方法,可以删除位于光标下面的一行:

rs.deleteRow();

deleteRow() 方法会立即把这行从结果集和数据库中删除。

代码的实现

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.NamingException;

public class ResultSetDemo {

public static void main(String[] args) {

Connection con = null;

Statement stmt = null;

ResultSet rs = null;

String querySQL = "select name,age from student";

String jndiname = "jdbcPool/mydatasource";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_UPDATABLE);

rs = stmt.executeQuery(querySQL);

// 显示修改之前的数据

System.out.println("修改之前的数据:");

while (rs.next()) {

for (int i = 1; i <= 2; i++) {

System.out.print(rs.getObject(i));

System.out.print(" ");

}

System.out.println();

}

// 过年了,把记录里年龄都加1,虽然写一个SQL语句就可以实现

// update student set age=age+1

// 但是为了测试rs的用法我们还使用JDBC

rs.beforeFirst();

while (rs.next()) {

int age = rs.getInt("age");

rs.updateInt("age", age + 1);

rs.updateRow();

}

// 显示修改后的数据

rs = stmt.executeQuery(querySQL);

System.out.println("修改之后的数据:");

while (rs.next()) {

for (int i = 1; i <= 2; i++) {

System.out.print(rs.getObject(i));

System.out.print(" ");

}

System.out.println();

}

// 增加一条数据

rs.moveToInsertRow();

rs.updateString("name", "李雨春");

rs.updateInt("age", 21);

rs.insertRow();

rs.moveToCurrentRow();

// 显示增加后的数据

System.out.println("增加之后的数据:");

rs = stmt.executeQuery("select name,age from student");

while (rs.next()) {

for (int i = 1; i <= 2; i++) {

System.out.print(rs.getObject(i));

System.out.print(" ");

}

System.out.println();

}

// 删除最后一行数据

if (rs.last())

rs.deleteRow();

System.out.println("删除之后的数据:");

rs = stmt.executeQuery(querySQL);

while (rs.next()) {

for (int i = 1; i <= 2; i++) {

System.out.print(rs.getObject(i));

System.out.print(" ");

}

System.out.println();

}

stmt.close();

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} catch (SQLException ex) {

System.out.println("\n--- SQLException caught ---\n");

while (ex != null) {

System.out.println("Message: " + ex.getMessage());

System.out.println("SQLState: " + ex.getSQLState());

System.out.println("ErrorCode: " + ex.getErrorCode());

ex = ex.getNextException();

System.out.println();

}

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

}

}

System.out.println();

System.out.println("End.");

}

}

打印结果如图

批处理更新

批处理更新功能可以一次向数据库提交多个更新操作,要求数据库进行处理。一起提交多个更新(而非一个一个单独地提交更新)在某些情况下将大大提高性能。

可以利用Statement,PreparedStatement,CallableStatement对象来提交批处理更新。

代码的实现

import java.sql.BatchUpdateException;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.NamingException;

public class BatchUpdateTest {

public static void main(String[] args) {

Connection con = null;

Statement stmt = null;

String jndiname = "jdbcPool/mydatasource";

try {

con = DBCon.getConnectionFromPooledDataSource(jndiname);

stmt = con.createStatement();

con.setAutoCommit(false);

stmt.addBatch("insert into student values('拉登',56)");

stmt.addBatch("insert into student values('张学友',49)");

stmt.addBatch("insert into student values('刘德华',51)");

stmt.addBatch("insert into student values('猪八戒',128)");

int[] updateCounts = stmt.executeBatch();

con.commit();

for (int i = 0; i < updateCounts.length; i++) {

System.out.println("Line" + (i + 1) + " update counts is : "

+ updateCounts[i]);

}

con.setAutoCommit(true);

ResultSet uprs = stmt.executeQuery("select * from student");

System.out.println("table student after insertion:");

while (uprs.next()) {

String name = uprs.getString("name");

int age = uprs.getInt("age");

System.out.print(name + " " + age);

System.out.println();

}

uprs.close();

stmt.close();

} catch (BatchUpdateException b) {

System.err.println("SQLException: " + b.getMessage());

System.err.println("SQLState: " + b.getSQLState());

System.err.println("Message: " + b.getMessage());

System.err.println("Vendor: " + b.getErrorCode());

System.err.print("Update counts: ");

int[] updateCounts = b.getUpdateCounts();

for (int i = 0; i < updateCounts.length; i++) {

System.err.print(updateCounts[i] + " ");

}

} catch (SQLException ex) {

System.err.println("SQLException: " + ex.getMessage());

System.err.println("SQLState: " + ex.getSQLState());

System.err.println("Message: " + ex.getMessage());

System.err.println("Vendor: " + ex.getErrorCode());

} catch (NamingException ex) {

System.err.println("Name Not Bound : " + ex.getMessage());

} finally {

try {

if (con != null)

con.close();

} catch (Exception e) {

}

}

System.out.println("程序执行结束!");

}

}

打印结果如图

字符大对象CLOB

mssqlserver 2000里面并没有字符大对象这个数据类型,但是可以通过nchar类型来代替字符大对象数据,但是只能存放3k字符以下的。在ORACLE数据库里面存在字符大对象CLOB数据类型。该数据类型用来存放文本类型的数据。

SQL代码:

ORACLE的实现,在运行该例子之前,首先把ORACLE的驱动文件classes12.jar加到classpath里面。然后打开ORACLE数据库,建立一张表。SQL语句如下:

CREATE TABLE MESSAGES(ID VARCHAR2(20),TITLE VARCHAR2(30),AUTHOR VARCHAR(20),MESSAGE CLOB);

JAVA代码:

package com.app;

import java.io.File;

import java.io.FileInputStream;

import java.io.OutputStream;

import java.sql.ResultSet;

import java.sql.Statement;

import java.sql.Connection;

import oracle.sql.CLOB;

public class OracleClob {

public static void main(String[] args) {

String jndiname = "jdbcPool/mydatasource";

Connection con = DBCon.getConnectionFromPooledDataSource(jndiname);

String insertSQL = "Insert INTO messages VALUES('1001','my message', 'xsw', empty_clob())";

try {

con.setAutoCommit(false);

Statement stmt = con.createStatement();

stmt.execute(insertSQL);

String cmd = "SELECT message FROM messages WHERE id='1001'";

ResultSet rset = stmt.executeQuery(cmd);

rset.next();

CLOB clob = (CLOB) rset.getClob(1);

File file = new File("myfile.txt");

FileInputStream fis = new FileInputStream(file);

OutputStream outstream = clob.getAsciiOutputStream();

int size = clob.getBufferSize();

byte[] buffer = new byte[size];

int length = -1;

while ((length = fis.read(buffer)) != -1)

outstream.write(buffer, 0, length);

fis.close();

outstream.close();

con.commit();

con.setAutoCommit(true);

} catch (Exception e) {

e.printStackTrace();

}

}

}

下面看下MSSQLSERVER数据库的实现(首先在查询分析器里面运行下列SQL语句:

CREATE TABLE messages (

id char(30),

title char(40) ,

author char(20) ,

message ntext

)

然后运行下面的代码:

package com.app;

import java.io.File;

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

public class MSSQLClob {

public static void main(String[] args) {

String jndiname = "jdbcPool/mydatasource";

Connection con = DBCon.getConnectionFromPooledDataSource(jndiname);

String insertSQL = "Insert INTO messages VALUES(?,?,?,?)";

PreparedStatement stmt = con.prepareStatement(insertSQL);

File file = new File("myfile.txt");

FileInputStream fis = new FileInputStream(file);

stmt.setString(1, "1001");

stmt.setString(2, "my message");

stmt.setString(3, "xsw");

stmt.setAsciiStream(4, fis, (int) file.length());

stmt.executeUpdate();

fis.close();

}

}

二进制大对象BLOB

该数据类型是用来存放图片文件的。在MSSQLSERVER 2000没有该数据类型,那么可以用binary数据类型代替,但是该数据只能存放小7k的图片。在ORACLE数据库里,有BLOB数据类型,来直接存放图片文件,直接操作该数据类型。对不支持BLOB数据类型的MSSQLSERVER 2000数据库,我们可以用二进制流进行读取图片文件。

ORACLE的实现:

SQL语句:

CREATE TABLE AUTHORS(AUTHOR VARCHAR2(40),PHOTO BLOB)

JAVA代码:

package com.app;

import java.io.File;

import java.io.FileInputStream;

import java.io.OutputStream;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import oracle.sql.BLOB;

public class OracleBlob {

public static void main(String[] args) {

String jndiname = "jdbcPool/mydatasource";

Connection con = DBCon.getConnectionFromPooledDataSource(jndiname);

String insertSQL = "Insert INTO authors VALUES('1001', empty_blob())";

try {

con.setAutoCommit(false);

Statement stmt = con.createStatement();

stmt.execute(insertSQL);

String cmd = "SELECT photo FROM authors WHERE author='1001'";

ResultSet rset = stmt.executeQuery(cmd);

rset.next();

BLOB blob = (BLOB) rset.getBlob(1);

File file = new File("mypic.jpg");

FileInputStream fis = new FileInputStream(file);

OutputStream outstream = blob.getAsciiOutputStream();

int size = blob.getBufferSize();

byte[] buffer = new byte[size];

int length = -1;

while ((length = fis.read(buffer)) != -1)

outstream.write(buffer, 0, length);

fis.close();

outstream.close();

con.commit();

con.setAutoCommit(true);

} catch (Exception e) {

e.printStackTrace();

}

}

}

MSSQLSERVER 2000的实现

SQL语句:

CREATE TABLE authors(

author char(50) ,

photo image NOT NULL

)

代码:

package com.app;

import java.io.File;

import java.io.FileInputStream;

import java.sql.Connection;

import java.sql.PreparedStatement;

public class MSSQLBlob {

public static void main(String[] args) {

String jndiname = "jdbcPool/mydatasource";

Connection con = DBCon.getConnectionFromPooledDataSource(jndiname);

String insertSQL = "Insert INTO authors VALUES(?,?)";

PreparedStatement stmt = con.prepareStatement(insertSQL);

File file = new File("mypic.jpg");

FileInputStream fis = new FileInputStream(file);

stmt.setString(1, "1001");

stmt.setBinaryStream(2, fis, (int) file.length());

stmt.executeUpdate();

fis.close();

}

}

RowSet 新特性

Java 5Java Database Connectivity (JDBC)方面加强了支持,其中加入了新的包javax.sql.rowsetjavax.sql.rowset.serialjavax.sql.rowset.spi。从RowSet接口继承规定了五个新的接口:

? CachedRowSet:可以不用与数据源建立长期的连接,只有当从数据库读取数据或是往数据库写入数据的时候才会与数据库建立连接,它提供了一种轻量级的访问数据库的方式,其数据均存在内存中。

? JdbcRowSet:对ResultSet的对象进行包装,使得可以将ResultSet对象做为一个JavaBeans 组件。

? FilteredRowSet:继承自CachedRowSet,可以根据设置条件得到数据的子集。

? JoinRowSet:继承自CachedRowSet,可以将多个RowSet对象进行SQL Join语句的合并。

? WebRowSet:继承自CachedRowSet,可以将WebRowSet对象输出成XML格式。

CachedRowSet

CachedRowSet可以通过调用populate(ResuletSet rs)来生成数据,一旦获得数据,CachedRowSet就可以断开与数据库的连接,直到往数据库写入数据的时候才需建立连接。

下面的代码演示了如何根据ResultSet建立一个CachedRowSet对象:

package com.itjob;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;

import com.sun.rowset.CachedRowSetImpl;

public class CachedRSTest {

private final static String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";

private final static String URL = "jdbc:odbc:myodbc";

private final static String USER = "student";

private final static String PASSWORD = "student";

public static void main(String[] args) throws InstantiationException,

IllegalAccessException, ClassNotFoundException, SQLException {

Class.forName(DRIVER);

Connection con = DriverManager.getConnection(URL, USER, PASSWORD);

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM student");

CachedRowSet crset = new CachedRowSetImpl();

crset.populate(rs);

rs.close();

stmt.close();

con.close();

System.out.println("name");

while (crset.next()) {

System.out.println(crset.getString("name"));

}

}

}

JdbcRowSet

JdbcRowSet功能与ResultSet类似,与CachedRowSet不同,JdbcRowSet在操作时保持与数据库的连接。可以将与数据库连接的URL,用户名,密码以及执行的SQL语句通过setXXX形式绑定。另外,JdbcRowSet返回的结果默认是可以上下滚动和可更新的,当然这需要数据库厂商提供的JDBC Driver支持。下面的代码演示了如何通过set方法设定数据库连接参数,以及如何操作JdbcRowSet对象。

package com.itjob;

import java.sql.SQLException;

import javax.sql.rowset.JdbcRowSet;

import com.sun.rowset.JdbcRowSetImpl;

public class JdbcRSDemo {

private final static String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";

private final static String URL = "jdbc:odbc:myodbc";

private final static String USER = "student";

private final static String PASSWORD = "student";

public static void main(String[] args) throws SQLException, ClassNotFoundException {

Class.forName(DRIVER);

JdbcRowSet jrs = new JdbcRowSetImpl();

// 设置连接数据库的URL

jrs.setUrl(URL);

// 设置连接数据库的用户名

jrs.setUsername(USER);

// 设置连接数据库的密码

jrs.setPassword(PASSWORD);

// 设置执行数据库的SQL语句

jrs.setCommand("select * from student");

jrs.execute();

System.out.println("name");

while (jrs.next()) {

System.out.println(jrs.getString("name"));

}

jrs.close();

}

}

FilteredRowSet

FilteredRowSet接口中规定了可以设定过滤器,其过滤接口为Predicate接口,必须实现Predicate接口中的evaluate方法。具体的代码如下:

package com.itjob;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;

import javax.sql.rowset.FilteredRowSet;

import com.sun.rowset.CachedRowSetImpl;

import com.sun.rowset.FilteredRowSetImpl;

public class FilteredRSDemo {

private final static String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";

private final static String URL = "jdbc:odbc:myodbc";

private final static String USER = "student";

private final static String PASSWORD = "student";

public static void main(String[] args) throws InstantiationException,

IllegalAccessException, ClassNotFoundException, SQLException {

Class.forName(DRIVER).newInstance();

Connection con = DriverManager.getConnection(URL, USER, PASSWORD);

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM student");

FilteredRowSet frs = new FilteredRowSetImpl();

frs.populate(rs);

con.close();

MyDBFilter filter = new MyDBFilter(1, 4);

frs.setFilter(filter);

System.out.println("name");

while (frs.next()) {

System.out.println(frs.getString("name"));

}

frs.close();

}

}

package com.itjob;

import java.sql.SQLException;

import javax.sql.RowSet;

import javax.sql.rowset.CachedRowSet;

import javax.sql.rowset.Predicate;

class MyDBFilter implements Predicate {

private int low;

private int high;

public MyDBFilter(int low, int high) {

this.low = low;

this.high = high;

}

public boolean evaluate(RowSet rs) {

CachedRowSet crs=(CachedRowSet)rs;

//如果idlowhigh之间返回真

try {

int idValue = crs.getInt("id");

if (low < idValue && idValue < high) {

return true;

}

} catch (SQLException e) {

}

return false;

}

public boolean evaluate(Object arg0, int arg1) throws SQLException {

return false;

}

public boolean evaluate(Object arg0, String arg1) throws SQLException {

return false;

}

}

WebRowSet

WebRowSet继承自CachedRowSet,支持XML格式的查询,更新等操作,下面的代码将WebRowSet对象输出成XML格式到文件。

package com.itjob;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.sql.rowset.WebRowSet;

import com.sun.rowset.WebRowSetImpl;

public class WebRSDemo {

private final static String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";

private final static String URL = "jdbc:odbc:myodbc";

private final static String USER = "student";

private final static String PASSWORD = "student";

public static void main(String[] args) throws InstantiationException,

IllegalAccessException, ClassNotFoundException, SQLException, IOException {

Class.forName(DRIVER).newInstance();

Connection con = DriverManager.getConnection(URL, USER, PASSWORD);

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM student");

// 关闭与数据库的连接

con.close();

WebRowSet wrs = new WebRowSetImpl();

wrs.populate(rs);

FileOutputStream out = new FileOutputStream("data.xml");

wrs.writeXml(out);

wrs.close();

}

}

内容总结

? 对数据库进行SQL语句进行基本操作(包括create, insert, update,delete

? 使用预编译语句可以提高数据库访问效率及加强安全性

? 可以在应用程序级别使用事务

? 通过事务的级别控制,可以满足不同的业务方面的需求

? 使用存储过程优化查询,提高查询效率

? 操作元数据

? 可滚动的和可更新的结果集

? 批处理更新

? 字符大对象CLOB的用法

? 二进制大对象BLOB用法

独立实践

1 连接oracle数据库,建立个可更新的结果集,对scott用户下的emp表进行批处理更新年龄,姓名等字段。

2 连接sql 2000数据库,使用pubs数据库,建立一个带参数的方法,该方法通过输入表名,能动态打印出该表的记录(包括列名)。

3 写一个保存人简历的程序(有图片)。不要求显示输入和输出,全部通过代码来操作,但是要求从数据库可以看到记录。

4 通过事务操作来实现两个账户转账的过程。(要求自己建表)

5 综合所学知识,对scott用户下的emp表进行增、删、改、查操作。

第二十一章:XML基础

学习目标

? XML的概念

? 定义XML文档

? 命名空间(Naming Space

? XML 文档规则

? DTD

? SCHEMA

? 样式表(XSL

XML的概念

XML,称为可扩展标记语言(Extensible Markup Language),用来创建自定义标记的标记语言。它由万维网协会(W3C)创建,用来克服 HTML(即超文本标记语言(Hypertext Markup Language),它是所有网页的基础)的局限。和 HTML 一样,XML 基于 SGML ― 标准通用标记语言(Standard Generalized Markup Language)。XML 是为 Web 设计的。

XML是以数据为中心的,用来标记数据,说明数据是什么的。

应用领域为:

? 信息存储和交换领域,类似于数据管理系统,来存储数据。这种数据处理与硬件,软件没有太大的关系,就是一个文本文件,具有可移植性。处理XML数据的时候,通过JAVA代码写的解析器就可以存取XML数据。

? 在J2EE服务器用的比较多,在服务器端通过XML文件来进行处理数据业务。配置文件几乎全是XML文件。在EJBHibernateJAVA热门技术领域,XML的应用更加重要。

XMLHTML相同点:

? XMLHTML都是基于文本的标记语言。

XMLHTML差别:

? 在功能上最大的区别就是XML是用来存储、传输以及交换数据的,HTML是用来格式化和显示数据的。

? 在内容上的最大的区别是HTML里面的标记(markup)都是定义好的,XML里面的标记都是自定义的。比如:对于那些HTML中的标记中形如"用斜体显示数据")的地方,XML标签则表现为程序中的一个字段名。它为一个数据定义一个标记(label)来表示该数据。(如:andy lau)。注意:由于标识数据可以让你看出其中的意义(如何解释它,应该如何处理它),XML有时也被描述为一种能够指明数据意义(语义)的机制。

HTML是最成功的标记语言。您几乎可以在任何设备(从掌上电脑到大型机)上查看最简单的HTML标记,甚至可以用合适的工具将HTML标记转换成语音和其它格式。既然HTML成功了,为什么W3C(万维网协会)还要创建XML呢?为了回答这个问题,请查看下面这个文档:

张三



西安电子科技大学:电子信息工程

HTML的问题在于它是为人设计的。即使不用浏览器查看上面的HTML文档,您和我也会知道那是某个人的信息。作为高级动物---人来讲:您和我具有理解大多数文档的含义和意图的智慧。但是遗憾的是机器不能做到。尽管这个文档中的标记告诉浏览器如何显示该信息,但标记没有告诉浏览器信息是什么?!您和我都知道它是一个人的信息,但计算机并不知道。要显示HTML,浏览器只需遵守HTML文档中的指令即可。段标记告诉浏览器在新的一行显示,并且通常在前面有一个空行,而两个换行标记则告诉浏览器前进到下一行,并且行之间没有空行。尽管浏览器出色地将文档格式化,但计算机仍不知道这个代表某个人的信息。

如下图在浏览器里的显示:

为了完成对样本HTML文档的讨论,请考虑从该信息中提取出该人是学哪个专业的?请看下面的算法:

从该文档中找到有两个
标记的段落,那么学校就是第二个换行标记的后面的第一个冒号后面的内容,尽管该算法对该文档起作用,但是不具备通用性。如果文档格式一改变,那么该算法就不生效了。

现在让我们来看一个样本XML文档。使用XML,您可以给文档中的标记赋予某种涵义。更重要的是,计算机也容易处理这样的信息。

请看下例:

张三

西安电子科技大学

电子信息工程

现在算法编写又简单又具有通用性:

我们只需要找到标记之间的内容(技术上称为元素),就可以从该文档抽取邮政编码。

定义XML文档

有三个通用术语用来描述XML文档的组成部分:标记,元素和属性。

? 标记是左尖括号(<)和右尖括号(>)之间的文本。有开始标记(例如:)和结束标记(例如:)。

? 元素是开始标记,结束标记以及位于二者之间的所有内容。在上面的样本中,元素包含四个子元素,,,.

? 属性是一个元素的开始标记中的名称-值对。如:

80 danwei 元素的属性。

定义XML基本语法要求:

? XML文档必须包含在一个单一元素中。这个单一元素称为根元素,它包含文档中所有文本和所有其它元素。如:

play majiang

XML文档包含在一个单一元素中。

下面是一个不包含单一根元素的文档:

play pike

play majiang

不管该文档可能包含什么信息,XML解析器都会拒绝它。

? XML元素不能重叠。下面是一些不合乎规则的标记:

刘德华28

如果您在元素中开始了元素,则必须在元素中结束元素。

如:刘德华49

? 不能省去任何结束标记。在下面的XML文档里面标记是不合乎规则的。因为没有任何结束标记。

刘德华

49

? 空元素:如果一个元素根本不包含标记,则称为空元素。如:

是等价的。

? 元素是区分大小写的 在HTML中,是相同的;在XML中,它们是不同的。如果您试图用标记去结束元素,那么将会出错。

我爱深圳市计算机行业协会! ---------错误

我爱深圳市计算机行业协会! ---------正确

属性的规则:

? 属性必须有值

? 属性值必须用引号括起

请看下例:

---错误(属性无值)

--错误(属性值没有用引号括起)

----正确

----正确

属性值可以用单引号括起,也可以用双引号括起,但是要始终保持一致。如果属性值包含单引号或双引号,则您可以使用另一种引号来括起该值。如:

description="zhangsan's JAVA is very well",或者使用实体"代表双引号,使用实体'代表单引号。实体是一个符号(如:",XML解析器会用其它文本代替该符号(如: ")。

XML声明: 大多数XML文档以XML声明作为开始,它向解析器提供了关于文档的基本信息。XML 声明通常在XML 文档的第一行出现。XML 声明不是必选项,但是如果使用XML 声明,必须在文档的第一行,前面不得包含任何其他内容或空白。

? 下所示:

声明最多可以包含三个名称-值对。

? version是使用的XML版本;目前最新版本为1.1

? encoding是该文档所使用的字符集。如没有指定encoding,XML解析器会假定字符在utf-8字符集中,这是一个几乎支持世界上所有语言的字符和象形文字的unicode标准。

? standalone(可以是yesno)定义了是否可以在不读取任何外部实体或外部DTD文档的情况下处理该文档。因为standalone="no"是缺省值,所以您很少会在XML声明中看到standalone

? 注释可以出现在文档的任何位置;它们甚至可以出现在根元素的前面或后面。注释以 结束。注释不能在结束部分以外包含双连字符 --;除此之外,注释可以包含任何内容。最重要的是,注释内的任何标记都忽略;如果您希望除去XML文档的一块较大部分,只需要用注释括住那个部分即可。(要恢复这个注释掉的部分,只需除去注释标记即可。)下面是包含注释的标记:

? 处理指令: XML文件还可以包含处理指令(PI Processing Instruction),这些指令可以将命令或信息传给正在处理XML数据的应用。

通常它用来传递信息给解析器的下游程序。一般写法如下:

命名空间(Naming Space

XML 命名空间提供了一种避免元素命名冲突的方法。

命名冲突

因为XML文档中使用的元素不是固定的,那么两个不同的XML文档使用同一个名字来描述不同类型的元素的情况就可能发生。而这种情况又往往会导致命名冲突。请看下面两个例子

这个 XML 文档在table元素中携带了水果的信息:

Apples Bananas

这个 XML 文档在table元素中携带了桌子的信息(家具,不能吃的哦):

African Coffee Table

80

120

如果上面两个XML文档片断碰巧在一起使用的话,那么将会出现命名冲突的情况。因为这两个片断都包含了

元素,而这两个table元素的定义与所包含的内容又各不相同。

使用前缀解决命名冲突问题

下面的XML文档在table元素中携带了信息:

Apples

Bananas

下面的XML文档携带了家具table的信息:

African Coffee Table

80

120

现在已经没有元素命名冲突的问题了,因为这两个文档对各自的table元素使用了不同的前缀,table元素在两个文档中分别是( )

通过使用前缀,我们创建了两个不同的table元素。

使用命名空间

下面的XML文档在table元素中携带了信息:

Apples

Bananas

下面的XML文档携带了家具table的信息:

African Coffee Table

80

120

在上面两个例子中除了使用前缀外,两个table元素都使用了xmlns属性,使元素和不同的命名空间关联到一起。

命名空间属性

命名空间属性一般放置在元素的开始标记处,其使用语法如下所示:

xmlns:namespace-prefix="namespace"

在上面的例子中,命名空间定义了一个Internet 地址:

xmlns:f="http://www.w3s.com/furniture"

W3C 命名规范声明命名空间本身就是一个统一资源标示符,Uniform Resource Identifier (URI)

当我们在元素的开始标记处使用命名空间时,该元素所有的子元素都将通过一个前缀与同一个命名空间相互关联。

注意:用来标识命名空间的网络地址并不被XML解析器调用,XML解析器不需要从这个网络地址中查找信息,该网络地址的作用仅仅是给命名空间一个唯一的名字,因此这个网络地址也可以是虚拟的,然而又很多公司经常把这个网络地址指向一个真实的Web页面,这个地址包含了关于当前命名空间更详细的信息。

可以访问http://www.w3.org/TR/html4/.

统一资源标识符

通用资源标识符Uniform Resource Identifier (URI)是一个标识网络资源的字符串。最普通的URI应该是统一资源定位符Uniform Resource Locator (URL)URL用于标识网络主机的地址。另一方面,另一个不常用的URI是通用资源名字Universal Resource Name (URN)。在我们的例子中,一般使用的是URLs

既然前面的例子使用的URL地址来标识命名空间,我们可以确信这个命名空间是唯一的。

默认的命名空间

定义一个默认的XML命名空间使得我们在子元素的开始标记中不需要使用前缀。他的语法如下所示:

下面的XML文档在table元素中包含了水果的信息:

Apples Bananas

下面的XML文档包含了家具table的信息:

African Coffee Table

80

120

使用命名空间

文档开始使用XSL的时候,就会发现命名空间使用的是如此频繁。XSL样式单主要用于将XML文档转换成类似于HTML文件的格式。

如果看一下下面的XSL文档,就会发现有很多标记都是HTML标记。那些标记并不是HTML标记,是加了前缀的XSL,这个XSL前缀由命名空间"http://www.w3.org/TR/xsl"所标识:

Title Artist

XML 文档规则

XML 文档规则是用来规定XML文档有那些标记组成,标记的多少,顺序,属性等方面的内容。也就是规定XML的格式及内容。目的是为了解析器解析该XML文档提供方便。XML的文档规则有两种:DTDXML Schema

DTDDocument Type Definition)文档类型定义

DTD定义可以在XML文档中出现的元素,这些元素出现的次序,它们可以如何相互嵌套以及XML文档结构的其它详细信息。

XML Schema

模式可以定义您能在DTD中使用的所有文档结构,还可以定义数据类型和比DTD更复杂的规则。

因此XML 文档可以分为三个类型:

? 格式良好的:满足XML的基本的语法特点,但是不遵守DTD或者XML Schema

? 有效的文档:即满足了XML的基本的语法特点,又遵守DTD或者 XML Schema

? 无效的文档:不满足XML的基本的语法特点。或者该文档不遵守DTD或者XML Schema

首先我们介绍下DTDDocument Type Definition)文档类型定义

XML强大之处在于可以定制自己的标记来替代预先定义的标记集。这里的最大问题在于如何让处理器明白这些自定义的标记,同时我们常说XML要求文档结构完整,这意味着我们必须在提供XML文件时提供它的语法规范。为此,XML需要有一个文档来定义标记的含义,元素相关的属性等,这样解析器就能够检查输入的数据是否正确。

DTD可以包含在XML文档中,也可以独立为一个文件。一个符合DTD验证的XML文档是有效的文档。

请看下例:(student.dtd)

DTD定义了样本文档中使用的所有元素。它定义了三个元素

? 元素包含零个或者多个元素。

? 元素包含一个,一个,一个

,和一个可选的元素。也就是说,,
元素必须出现,而〈phone〉元素可有可无,但是这些元素必须按先后顺序出现。

? 包含文本的元素:(#PCDATA)表明该元素必须包含经过解析的字符数据,经过解析的字符数据实质上就是不是标记的任何文本,即该元素不能包含自己的子元素)

? 其中元素 有个可选的属性xusui.

尽管DTD相当简单,但它清楚地说明了什么样的元素组合是合乎规则的。元素出现在元素之前就是不合乎规则的。另外,请注意,DTD语法不同于普通的XML语法。(XML Schema 文档本身就是XML)。尽管DTD的语法不同,但您仍可以将普通的注释放到DTD中。

下面的XML文档是满足上面DTD的文档:

andy

49

luohu luohukejidasha

goudan

当年减出生年加1">28

shanxi xi an

02988755660

当然也可以把dtd文档写到XML文档内部:

xusui CDATA #IMPLIED>

]>

andy

49

luohu luohukejidasha

goudan

当年减出生年加1">28

shanxi xi an

02988755660

下面分析把DTD文档写在XML文档内部和写在外部的对比:

如果采用外部DTD的话,就需要有两个文档,第一个文档就是关于DTD的文档,第二个文档就是遵守DTD格式的内容文档。实际上,我们可以建立无穷多个遵守该DTD格式的文档。我们在构造关系数据库中的表的时候,需要定义好表的结构(也就是表包含的字段集合),然后就可以往这个表中放入记录,记录的个数从理论上讲可以是无穷多个的。这里关于表的结构就类似于DTD文档,记录类似于遵守DTD格式的内容文档。

外部DTD的好处是:它可以方便高效地被多个XML文件所共享。你只要写一个DTD文件,就可以被多个XML文件所引用。事实上,当许多组织需要统一他们的数据交换格式时,他们就是通过外部DTD来完成的。这样做不仅简化了输入工作,还保证当你需要对DTD做出改动时,只需改动一个公用的DTD文件,而不用一一去改动每个应用了它的XML文件。不过需要注意,如果DTD的改动不是"向后兼容"的,这时原先根据该DTD编写的那些XML文件可能就会出现问题了。所以在改动DTD时,一定要尽量兼容以前的文档,除非解析器变了。(类似于JAVAJDK的发展,JDK的每个版本的发布都会兼容以前的版本,这样在换JDK时,以前的程序就不要改动了。目前的最新JDK的版本是1.6也叫6.0)

由以上的例子可知,建立合法XML文件的要点之一就是要定义好DTD,然后所有的内容就按照DTD格式进行编写。DTD实际上表现了一个层次关系,你也可以把它理解成一棵树的结构。树中的节点实际就是一个个元素(ELEMENT,一个元素包含其他的元素。

对于一个DTD的定义,最关键的在于它内部的元素和属性的定义。按上面例子的理解,一个DTD文档实际上就是元素定义的集合,而元素可能包含属性,也可能不包含属性。属性可以通过以下的语法进行定义:

AttributeName Type Default

AttributeName Type Default

>

ATTLIST是一个XML语言的保留关键字,ElementName表示元素的名称,它相当于程序设计语言中变量的名称。一个元素可以包含多个属性,一个属性由三部分构成:AttributeName,TypeDefaultAttributeName表示该属性的名字,Type表明该属性的类型,Default表明该属性的特点。我们先来看一下XML所定义的属性类型的种类,如下表:

类型 具体的含义说明

CDATA 这个类型表明该属性只能包含字符数据,比如刘德华“hibernate”,”小罗等等

ID 该属性的取值必须是唯一的,就像我们每个人都有的身份证号码是唯一的一样,在一个文档内两个ID属性的值不能一样

IDREFIDREFS 这个属性的值实际上就像C++中的指针一样,它是一个指向文档中其他地方声明的ID值,所以,如果在具体的文档中该属性的取值和它所指向的ID值不匹配的话,就会返回错误。IDREFSIDREF类似,但是可以具有由空格分隔的多个引用

ENTITY,ENTITIES ENTITY属性的值必须对应一个在DTD文档内声明的但还没有分析过的实体。ENTITIES属性和ENTITY类似,不同的是它可以包含多个实体,外部实体,参数实体和外部参数实体。可以把实体理解为程序设计语言中的变量

NMTOKENNMTOKENS NMTOKENCDATA的一个子集,它所使用的字符必须是字母,数字,句点,破折号,下划线或冒号。NMTOKENSNMTOKEN类似,不同之处在于它可以包含多个值,每个值之间用空格进行分隔

NOTATION NOTATION的值必须引用已在DTD文档其他地方声明过的某注解名称

NOTATIONenumerated 该属性的值必须匹配NOTATION名称列表中的某个名称。比如,我们已经存在两个NOTATION,一个为beauty,一个为beast;我们可以定义一个属性类型为NOTATIONbeauty|beast

Enumerated 该属性几乎和C++中的枚举变量一样(JDK1.5里面也有枚举类型),我们事先定义好一些值,该属性的值必须匹配所列出的这些值。比如现在有值为美丽,魅力,温柔,体贴,该属性的类型就可以表现为(美丽|魅力|温柔|体贴),实际内容文档必须从这些值中取一个,值之间用“|”进行分隔

Default属性特点可以有四种形式:#REQUIRED,#IMPLIED,#FIXED value,Defaultvalue.下表对这四种形式进行了详细介绍:

值 含义

#REQUIRED 用来告诉XML解析程序,该元素的所有实例都必须有该属性的值,就像数据表中某一个字段为NOT NULL一样

#IMPLIED 表示如果该元素的实例中没有指定该元素的值的话,就忽略该属性,就像在数据表中某一个字段的值可以为NULL一样

#FIXED value 表示包含该属性的元素实例必须在指定列出的值中,比如 一个属性名称为学员:学员 CDATA #FIXED “刘德华

表示属性值只能去刘德华

Defaultvalue 为属性提供一个默认的值比如一个属性名称为学员:学员 CDATA “刘德华如果在该属性的实例中没有包含这个属性的话,解析器就认为该属性的值就是刘德华,如果在该属性的实例中包含了这个属性并赋值了的话,就采用这个赋值

下面的DTD例子用来说明属性类型IDREF/IDREFS的使用:

如下例:

relID ID #REQUIRED

parentID IDREFS #IMPLIED

name CDATA #REQUIRED

>

请注意:这里的parentID的类型为IDREFS,这个表明该属性的值必须在XML文档中出现过。如果该属性的值没在XML文档中出现过的话,解析器就认为该文档是不合法的。比如,下面的文档就是一个不合法的文档:

李雨春" />

狗蛋" />

张曼玉" />

小罗" />

原因是parentID中出现了值 "p6",而这个值并没有在文档中出现过。

元素的定义语法为:

这里ELEMENTXML语言的关键字,NAME表示元素的名称,CONTENT表示元素的类型。它指定了元素起始标记和结束标记之间允许包含的东西。CONTENT可以以下几种形式出现,如下表:

内容 解释

EMPTY 如果一个元素的CONTENT被声明为EMPTY的话,表示该元素不能包含任何子元素和文本

ANY 表示该元素中可以包含任何在DTD中定义的元素内容

#PCDATA 表明该元素可以包含任何字符数据,但是不能在其中包含任何子元素。

假设我们定义元素学员:

则下面的实例是正确的:

比耳盖茨

而下面的实例就是错误的:

比耳盖茨

因为在其中包含了子元素

一般如果定义元素的CONTENT#PCDATA,最好在其中只加入纯文本字符数据

其他类型 最通常的情况是一个元素本身是由其他元素的集合构成的

在前面的一些例子中,大家一定注意到了"|","+","*"等这些符号,这些符号具体的含义及使用方法见下表:

符号 符号类型 描述 示例 示例说明

() 括号 用来给元素分组 (刘德华|张学友),(小罗|卡罗斯),盖茨 分成三组

| 竖条 表明在列出的对象中选折一个 (爱人|朋友) 表示爱人和朋友必须出现,且只能出现一个

+ 加号 表示该对象最少出现一次,可以出现多次 (student+ 表示student必须出现,可以出现多次

* 星号 表示该对象允许出现任意多次,也可以是零次 (爱好* 爱好可以出现零次到多次

? 问号 表示该对象可以出现,但只能出现一次 (爱人? 爱人可以出现一次或零次

, 逗号 表示对象必须按指定的顺序出现 (name,sex,age) 表示name,sex,age必须顺序出现

有时我们还会在DTD中遇到一些实体的定义,一般分为以下两种情况:

内部实体:

外部实体:

它们在XML文档中的使用是统一的:

computer&texing;

最后,我们在看个例子:〈shenzhen.dtd>

下面是满足上面DTDXML文档:

质料整理\xml\shenzhen.dtd">

&miaoshu;

XML Schema

上面我们讨论了用DTD来验证XML文档,虽然DTD胜任对XML文档结构的验证,但是它有很多局限。为此,微软提出了Schema的方案来改进DTDSchema从字面意义上来说,可以翻译成架构,它的基本意思是为XML文档制定一种模式。Schema相对于DTD的明显好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。这就方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊的工具。Schema简单易懂,懂得XML语法规则的人都可以立刻理解它。Schema的概念提出已久,但W3C的标准最近才出来,相应的应用支持尚未完善,但采用Schema已成为XML发展的一个趋势。

请看下例:

elementFormDefault="qualified" attributeFormDefault="unqualified">

张艺谋

刘德华

xsi:noNamespaceSchemaLocation="D:\java\xml\movie.xsd">

张艺谋

刘德华

从上例可看出这两个XML文当格式完全是一样的。只不过采用的模式文档不一样,一个是DTD 一个是 XML Schema

XML Schema中,元素是通过它的名字和类型来确定的。名称就是该元素的名字,类型就像JAVA中的一个变量,有基本类型(int double char等),有复杂类型(类类型)。在Schema中也是一样,类型(type)可以分为两种形式,一种是简单类型,一种是复合类型。简单类型不能包含元素和属性。复杂类型不仅可以包含属性,而且可以在其中嵌套其他的元素,或者可以和其他元素中的属性相关联。

SchemaDTD的区别:

XMLSGML中继承了DTD,并用它来定义内容的模式,验证和组织元素。同时,它也有很多局限,如下所述:

? DTD不遵守XML语法;

? DTD不可扩展;

? DTD不支持命名空间的应用;

? DTD没有提供强大的数据类型支持,只能表示很简单的数据类型。

Schema完全克服了这些弱点,使得基于Web的应用系统交换XML数据更为容易。下面是它所展现的一些新特性:

? Schema完全基于XML语法,不需要再学习特殊的语法;

? Schema能用处理XML文档的工具处理,而不需要特殊的工具;

? Schema大大扩充了数据类型,支持boolean,number,date and times,URI,integer,decimal number 等等

? Schema支持原型,也就是元素的继承。如:我们定义了一个""数据类型,然后可以根据它产生"狼狗""纯狗"两种数据类型;

? Schema支持属性组。我们一般声明一些公共属性,然后可以应用于所有的元素,属性组允许把元素,属性关系放于外部定义,组合;

? 开放性。原来的DTD只能有一个DTD应用于一个XML文档,现在可以有多个Schema运用于一个XML文档。

Schema的数据类型

基本数据类型

下表列出的是最基本的数据类型,被W3C组织所承认:如下表:

数据类型 相关特性 描述

string length,pattern,maxLength,minLength,enumeration,

whiteSpace 表示字符串

boolean pattern,whiteSpace 布尔型

decimal enumeration,pattern,minInclusive,minExclusive,

maxInclusive,maxExclusive 代表特定精度的数字

float pattern,enumeration,minInclusive,minExclusive,

maxInclusive,maxExclusive 表示单精度32位浮点数

double pattern,enumeration,minInclusive,minExclusive,

maxInclusive,maxExclusive 表示双精度64位浮点数

duration pattern,enumeration,minInclusive,minExclusive,

maxInclusive,maxExclusive 表示持续时间

dateTime pattern,enumeration,minInclusive,minExclusive,

maxInclusive,maxExclusive 代表特定的时间

time pattern,enumeration,minInclusive,minExclusive,

maxInclusive,maxExclusive 代表特定的时间,但是是每天重复的

date pattern,enumeration,minInclusive,minExclusive,

maxInclusive,maxExclusive 代表日期

hexBinary length,pattern,maxLength,minLength,enumeration 代表十六进制数

anyURL length,pattern,maxLength,minLength,enumeration 代表一个URL,用来定位文件

NOTATION length,pattern,maxLength,minLength,enumeration 代表NOTATION类型

扩展数据类型

下面这些类型是微软扩充的数据类型,并没有被W3C组织完全采纳。

数据类型 相关特性 描述

ID length,enumeration,pattern,maxLength,

minLength 用于唯一标识元素

IDREF length,enumeration,pattern,maxLength,

minLength 参考ID类型的元素或属性

ENTITY length,enumeration,pattern,maxLength,

minLengthwhiteSpace 实体类型

NMTOKEN length,enumeration,pattern,maxLength,

minLength NMTOKEN类型

NMTOKENS length,enumeration ,maxLength,

minLengthwhiteSpace NMTOKEN类型集

long enumeration,pattern,fractionDigits,

minInclusive,minExclusive,maxInclusive,

maxExclusive,totalDigits,whiteSpace 表示整型数,大小介于-92233720368547758089223372036854775807之间

int enumeration,pattern,fractionDigits,

minInclusive,minExclusive,maxInclusive,

maxExclusive,totalDigits,whiteSpace 表示整型数,大小介于-21474836482147483647之间

short enumeration,pattern,fractionDigits,

minInclusive,minExclusive,maxInclusive,

maxExclusive,totalDigits,whiteSpace 表示整型数,大小介于-3276832767之间

byte enumeration,pattern,fractionDigits,

minInclusive,minExclusive,maxInclusive,

maxExclusive,totalDigits,whiteSpace 表示整型数,大小介于-128127之间

数据类型的相关特性

前面这些数据类型说明中都有一列相关特性,用于说明该列的类型的一些扩充应用。下面是对它们应用的描述:

enumeration

指定的数据集中选折,主要的目的是为了能限定用户的选值。

fractionDigits

限定最大的小数位,主要用于控制精度。

length

指定数据的长度单元

maxExclusive

指定数据的最大值。其他值必须小于它

maxInclusive

指定最大值,其他值可以小于等于它

maxLength

指定长度的最大值

minExclusive

指定最小值,其他值必须大于它。

minInclusive

指定最小值,其他值可以大于等于它。

minLength

指定长度的最小值

pattern

规范数据的显示规范,使得数据必须匹配它的显示方式。

Schema的元素类型

Schema DTD中的元素类型丰富得多,这可使用户和程序都更容易确定元素的种类,下面的表,只是列出了最常用的元素类型。

元素类型 描述

schema 包含一个已经定义的schema

element 声明一个元素

group 把一组元素声明组合在一起,以便它们能够一起被复合类型应用

attribute 声明一个属性

attributeGroup 把一组属性声明组合在一起,以便他们能够一起被复合类型应用

choice 允许唯一的一个元素从一个组中被选择

simpleType 定义一个简单类型,它决定了元素和属性值的约束和相关信息

simpleContent 应用于complexType,对它的内容进行约束和扩展等

complexType 定义一个复合类型,它决定了一组元素和属性值的约束和相关信息

list 从一个特定数据类型的集合中选择定义一个简单类型元素

union 从一个特定简单数据类型的集合中选择定义一个简单类型元素

unique 定义一个属性或元素值,它必须在一个特定范围内

squence 给一组元素一个特定的序列

restriction 定义一个约束条件

Schema的样例如下:

elementFormDefault="qualified" attributeFormDefault="unqualified">

其中xs命名空间指定的是W3C组织的定义,也就是遵循它的标记集规范。目标命名空间是全局的,指定目标命名元素符合本Schema的定义。elementFormDefault的取值有两个选择:

unqualifiedqualified,前者表示目标命名空间不一定遵循本Schema,后者则必须遵循。attributeFormDefault类似。

elementFormDefault="qualified" attributeFormDefault="unqualified">

element中有些常用的属性:

name 代表该元素的名字,不能和ref同时使用;

type 代表该元素的类型,可以是已有的简单类型,也可以自定义复合类型,或者应用其他命名空间中的类型定义,不能和ref同时使用;

minOccurs 表示该元素出现的最少次数;

maxOccurs 表示该元素出现的最大次数;

ref 表示该元素参考已经定义的元素;

fixed 表示该元素的值是不能改变的,不能与default一起使用;

default 表示该元素的缺省值;

substitutionGroup 表示这个元素的父类,如狼狗也属于狗这一类。

样式表(XSL

XML是一种程序交换原始数据的简单而标准的方法,然而基于XML的数据本身并不包含数据显示的信息。为了使数据便于阅读理解,我们需要将信息更好地显示。类似于MVC模式,XML文档是M的部分,样式表就是V的部分,也就是说,同一个XML文档可以有多个显示效果(样式表)。样式表就是这样一种为XML文档"化妆"的文档,它是一种专门描述结构文档表现方式的文档,即可以描述这些文档如何在屏幕上显示,也可以描述它们的打印效果,甚至声音效果。使用样式表定义XML文档数据的显示方式,将XML数据与其表达形式分离的做法符合业界提倡的数据和表示层分开的思想(MVC)。这样一来,XML格式文档不会重蹈某些HTML文档(以显示数据为主)结构混杂,内容繁乱的覆辙,XML的编写者也可以集中精力于数据本身,而不受显示方式的细枝末节的影响。不仅如此,样式表还带来另一个好处,即定义不同的样式表可以使相同的数据呈现不同的显示外观,从而适合于不同应用,甚至能够在不同的显示设备上显示。这样,XML数据就可以得到最大程度上的重用性,满足不同的应用需求。迄今为止,W3CWWW标准化组织)已经给出了两种样式表语言的推荐标准:一种是级联样式表CSSCascading Style Sheets),另一种是可扩展样式表语言XSLeXtensible Stylesheet Language)。下面,我们就来讲述这两种样式表。

CSS样式表

级联样式表CSS是一种样式描述规则,是一种针对HTML而提出的样式表语言,现在同样可以很好地应用与描述XML文档的显示。利用CSS,我们可以定义HTMLXML文档中元素的显示效果,包括元素的位置,颜色,背景,边框,字体,排版格式等等。

请看下面的一个XML文档:

andy

49

中国 香港 铜锣弯

我们定义显示上面XML文档的CSS样式表(test.css),如下:

person

{

margin-top:.7in;

margin-bottom:.7in;

margin-left:1.5in;

margin-right:1in;

background-color:blue;

display:block

}

name

{

display:block;

font-family:Arial,Helvetica,sans-serif;

font-size:32pt;

width:10em;

color:red

}

age

{

display:block;

font-size=x-large;

color:yellow

}

address

{

display:block;

font-size:20pt;

color:cyan

}

显示效果如下图:

XML中引用一个级联样式表,我们使用如下的处理指令:

样式表路径"?>

我们在示例XML的文档的第二句,引入了样式表。

XML解析器解析XML文档和CSS文件,并执行如下任务:

解析"person.xml",抽取其元素;

使用"test.css"文件,应用样式格式化XML文档中的元素。

XSL样式表

XSL是一种用来转换XML文档的样式表,它包含转换和格式化XML文档的规则。XSL在转换XML文档时分为明显的两个过程:首先转换文档结构,然后将文档格式化输出:如下图:

这两个步骤可以分离开来单独处理,因此在XSL发展过程中逐渐分裂为两种分支:XSLT(结构转换)和XSL-FO(格式化输出)。其中XSL-FO的作用类似于CSSHTML中的作用,由于其发展缓慢而不成熟,W3C至今还未能出台一个得到多方认可的XSL-FO,而且目前主流的浏览器大都不支持XSL-FO,本书不对其做讲解。前面学习XML时,我们已经知道XML是一个完整的树形结构文档。在转换XML文档时可能需要处理其中的一部分(节点)数据,那么如何查找和定位XML文档中的信息呢?XPath就是一种专门用来在XML文档中查找信息的语言,用来描述如何识别,选择,匹配XML文档中的各个构成元件,包括元素,属性,文字内容等。XPath隶属XSLT,因此,我们通常会将XSLT语法和XPath语法混在一起说。用一种比较好理解的解释:如果将XML文档看作一个数据库,XPath就是SQL查询语言;如果将XML文档看成DOS目录结构,XPath就是cd,dir等目录操作命令的集合。XSL包含XSLTXPath的强大功能,从而可以把XML文档转换成任何一种其它格式的文档,例如XML文档,HTML文档,XHTML文档等等,限于目前浏览器的支持能力,在大多数情况下,XSLXML文档转换为一个HTML文档进行显示,本节中我们主要讲述怎样使用XSL样式表将XML文档转换为HTML文档。

XSL的基本结构

为了让大家能够对XSL有一个感性认识,并很快地掌握它的精髓,我们先看一个简单例子。通过剖析这个例子,来掌握XSL的基本结构和一些基本语法。

请看下面的XML文档:

李明

97

69

76

张一强

92

83

62

王亮

74

91

71

赵三金

89

93

67

下面是上面的XML文档所引用的teststudents.xsl:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:fo="http://www.w3.org/1999/XSL/Format">

<span style="font-family:宋体">第一期东北</span><span style="font-family:Times New Roman">JAVA</span><span style="font-family:宋体">班部分学员</span><span style="font-family:Times New Roman">

成绩单

姓名 性别 java oracle mssql

显示结果如下图: 现在我们来分析一下这段XML代码的执行过程:

在作为XML声明和XSL声明之后,样式表利用声明XSL模板,并调用该模板。

根据,系统最先匹配XML源树的根节点。根节点用"/"表示,它的匹配方法在一对括起的源码中声明。按照这段代码,首先生成带有样式信息的HTML文档的开头一段代码。

<span style="font-family:宋体">第一期东北</span><span style="font-family:Times New Roman">JAVA</span><span style="font-family:宋体">班部分学员</span><span style="font-family:Times New Roman">

成绩单

下面,系统看到了的指示,于是,它在XML源树中寻找标记为"students"的节点进行匹配。就像函数调用一样,现在系统跳到了用括起的"函数"中继续生成下面的HTML代码。

现在,系统又接到了新的指示。这条指示要求系统寻找标记为"student"的子节点,对于每一个"student"子树中的内容,系统为其生成表中一行的内容。每一行包含四列,分别把标记为"name","sex","java","oracle","mssql"的节点的内容填进去。对应到本例中的XML数据,生成的HTML代码:

< td >97 < td >69< td >76

< td >92 < td >83< td >62

< td >74 < td >91< td >71

< td >89 < td >93< td >67

处理完中的内容,系统继续生成HTML代码:

姓名 性别 java oracle mssql
李明
张一强
王亮
赵三金

至此,系统已经处理完中的所有内容,可以"函数返回"了。系统返回到括起的源码中,完成HTML最后两行代码的生成:

把上面的HTML代码串起来,就是生成的转换结果文件。

分析上面的例子,我们可以看出一个XSL文件基本上由几部分组成:

因为XSL文档本身是XML文档,因此文档的第一句就是XML声明:

接下来就是XSL声明:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:fo="http://www.w3.org/1999/XSL/Format">

输出模板--

XSL声明中包含模板,模板中定义XML的输出格式。

XSL文档本身是结构完整的XML文档,所以在书写时要注意标签的匹配问题。既是XSL的声明语句,也是根元素,必须位于文件的首部,通常也要利用xmlns属性指明XSL的命名空间。样式表中所有的模板都由标签标明,模板可以说明处理的对象(元素,属性),处理的方式或是转换的结果。此时,我们可以把该标签类似地理解为编程语言中函数的概念。

XSL的基本语法

通过对上面XSL转换XML文档为HTML文档的简单例子的分析,相信大家对XSL的基本语法有了一个初步的认识,下面我们再来详细分析一下XSL的元素语法。

XSL模板:

模板是XSL中最重要的概念之一,XSL文件就是由一个一个的模板组成的,任何一个XSL文件至少包含一个模板。可以把XSL的设计细化成一个个模板,最后再将这些模板组合成一个完整的XSL。这种方法如同程序中模块化设计逐步细化一样,可以使你先从整体上考虑整个XSL的设计,然后将一些表现形式细化成不同的模板,再具体设计这些模块,最后将它们整合在一起。模板中两个主要的元素为:, 这两个元素相结合,就如同编程中的函数调用:前者是调用指令,而后者就是函数体。

定义一个模板的基本语法是:

输出模板-->

属性match则控制模板的匹配模式,确定在什么情况下执行此模板。属性match的取值把模板规则与指定的元素或属性相比较,只有指定的节点才会被处理。其中最上层的模板即根节点必须将match取值设定为"/"

输出根节点的模板-->

如果属性match的取值为"*",那么表示该规则适用于所有的未单独指定处理的元素节点。比如下例中的第二个模板就表示要处理除元素之外的所有节点。

输出模板-->

输出模板-->

此外,XSL中还可以使用路径指示符来指定一些特殊位置的元素与模板相匹配。"//"代表任意深度位置,如用来匹配文档中任何位置的元素;而如果是,则表明是匹配元素的后继节点中所有元素。另外一个路径指示符是"/",表示直接的父子节点关系。将刚才例子中的"//"换为"/",就意味着匹配的是元素子节点中的元素。XSL在输出模板中描述输出格式,这些格式可以是各种字符串,标签符号,节点值或者是一些XSL语法结构,如条件判断,循环处理等。模板定义完毕后,就可以在XSL中调用该模板,调用一个模板的语法为:

用来说明哪一个节点被模板具体处理。你可以将它理解为程序中调用子函数。Select属性用来定义确切的节点名称。总是包含在元素中,像这样:

这段代码说明模板匹配整个文档(根节点),具体执行时处理根节点下所有students元素。对于不同的元素需要调用不同的模板进行处理。为了激活样式表中的模板规则,要在根元素模板规则中使用元素,这样就会层层作用使整个样式表文件生效。直接使用表示不加区分地对当前节点的所有子节点应用模板,而在select属性中书写匹配式则能够限定作用对象:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:fo="http://www.w3.org/1999/XSL/Format">

上述第一个模板与XML文档中的根元素相匹配,并对根节点以下的所有元素应用模板规则。然后,一旦遇到标签,就对元素和元素分别应用模板规则。最后,经过转换显示的结果是学生姓名和java成绩。

节点选择语句

在许多应用场合中,输出模板中需要使用节点的取值,此时可以根据需要使用语句输出节点值,最直接的使用方式是使用空元素,这样可以输出当前节点及其后继节点的取值。而如果仅仅是想输出指定节点的取值,可以利用select属性进行限定(select属性可以是任意合法的路径表达式)。

上述第一个表达式匹配的对象是当前节点的所有子节点中名称为的元素,第二个表达式匹配的对象则是当前节点中所有后继节点中名为的元素。注意:在XSL样式表中必须有一个模板规则与根元素相匹配。例如想在输出文档中显示学生成绩单XML源文档中的name元素的值,可以这样写XSL代码:

其中match="student"定义模板匹配student节点,xsl:value-of语法说明需要输出一个节点的值,而select="name"则定义需要被输出的元素为name。这个过程类似于在数据库里查询一个人的名字。

循环判断语句

XML文档中,如果存在两条以上的数据,必须使用元素指定上层的节点元素,再用设定要输出的内容,才能显示整个XML文档数据。这种循环结构能够遍历整个结果集合,而不必针对每一条结果都单独书写转换规则。它的标准语法格式为:

….

条件判断语句

语句是简单地对条件进行判断,结果为真就执行条件内部的规则,因此可以把if条件与简单的布尔表达式联合使用。

有三种不同的用法,如果要用元素的名称作为匹配条件,语法是:

元素名称" >

下面的例子对"name"元素的内容用红色显示:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:fo="http://www.w3.org/1999/XSL/Format">

<span style="font-family:宋体">第一期东北</span><span style="font-family:Times New Roman">JAVA</span><span style="font-family:宋体">班部分学员</span><span style="font-family:Times New Roman">

成绩单

姓名 性别 java oracle mssql

显示的XML文件为:

如果用元素内容作为匹配条件,语法是:

元素名称[.='元素内容']" >

注意:"."表示当前元素。请看下例,如果名字是叫李明的 显示红颜色。

李明']">

内容总结

? 会写XML文档

? 理解XML命名空间概念

? 掌握DTDSCHEMA的用法

? 会通过使用XSL进行XML的显示

? 知道XML的作用

? 正确使用XML技术

独立实践

? 写一个关于学生课程信息的DTDSHEMA文档

? 根据上面的DTDSCHEMA文档写出XML文档,并定义XSL显示该XML

? 写一个数据库连接的DTDSHEMA文档

? 根据数据库连接的DTDSHEMA文档,写出XML文档,为下一章解析XML,创建数据库连接做准备

? 以下XML 文件不是一個有效的文件,為什麼?

]>

理工图书馆

理工大道一号

文法商图书馆

文管大道一号

总图书馆

如何当个称职的职场新鲜人

如何管理資料库

JAVA 十天速成手冊

修改上面的代码并写出相应的Schema

第二十二章:使用Java解析XML

学习目标

? 解析器的介绍

? 文档对象模型(DOM)解析实例

? SAX解析实例

? DOM4J解析实例

? JDOM解析实例

? JAVA操纵XML 实例讲解

解析器的介绍

XML解析器是读取XML文档并分析其结构的代码。这一部分将介绍XML解析器是如何工作的。将讨论不同类型的XML解析器及何时使用它。

一般而言使用解析器需要以下步骤:

? 创建一个解析器对象

? 使解析器指向您的XML文档

? 处理结果

显然第三步最为复杂。一旦知道了XML文档的内容,比方说,您可能希望生成一个Web页面,创建一个订单或者做一个饼图。这里讨论的常见XML解析工具使这项工作大大简化。

解析器有不同的分类方法:

? 验证和非验证解析器

? 支持一种或多种XML Schema语言的解析器

? 支持Document Object Model (DOM)的解析器

? 支持Simple API for XML (SAX)的解析器

我们已知有三种不同类型的XML文档:

? 结构良好的文档:这类文档符合XML基本规则(属性必须放在引号中,标签必须正确嵌套等)。

? 有效文档:这些结构良好的文档同时还符合文档类型定义(DTD)或XML Schema所定义的规则。

? 无效文档:除以上两种文档外的所有其他文档。

如果您有一个XML文档符合XML的基本规则,那么它就是一个结构良好的文档。如果该文档还满足您的公司所定义的支出帐目文档规则,那么它也是有效的。如果XML解析器发现XML文档不是结构良好的,XML Specification要求解析器报告一个致命错误。

验证解析器:在解析时验证XML文档,而非验证解析器:不验证文档。换句话说,如果一个XML文档是结构良好的,那么非验证解析器并不关心文档是否符合DTD或模式中定义的规则,甚至不关心该文档是否符合DTD或模式中定义的规则,甚至不关心该文档是否有这样的规则。(多数验证解析器都默认关闭验证功能。)

那么为什么要使用非验证解析器呢?有两个很好的理由:速度和效率。XML解析器读取DTD或者模式,建立规则引擎保证XML文档中的每个元素和属性都遵循这些规则,需要做大量的工作。如果您确信一个XML文档是有效的,那么就可以完全跳过验证。根据文档规则复杂程度的不同,这样可以节约相当可观的时间和内存。如果您的代码不够健壮,它从XML文档中得到输入数据,并且该代码要求文档遵循特定的DTD或者模式,那么您可能就不得不验证所有的内容,不论代价多么高,多么浪费时间。

DOMW3C推荐的正式标准。它定义了一个接口,程序能够访问和更新XML文档的结构。如果一个XML解析器声称支持DOM,就意味着它实现了该标准中定义的接口。目前,有三个级别的DOM是正式的推荐标准,被命名为DOM Level 1,DOM Level 2 DOM Level 3。本章中所讨论的DOM功能都是DOM Level 2的一部分。

DOM解析器:当你使用DOM解析器解析一个XML文档时,您得到一棵结构树,它表示XML文档的内容。所有的文本,元素和属性,都在这个树结构中

解析的过程:

解析后的XML文档。 DOM还提供各种不同的功能,可用于分析和操作树的内容和结构。DOM是处理XML数据的传统方法。使用DOM时,数据以树状结构的形式被加载到内存中,所以,DOM解析是一个比较耗费内存的操作。如上图所示,矩形框表示元素节点,椭圆表示文本节点。DOM使用父子关系。例如,在这个例子中,student是具有五个孩子的根元素:三个文本节点(空白),以及两个元素节点nameage。要认识到的一件重要事情是,name age节点实际上具有null值。相反,它们具有文本节点(goudan 28)作为孩子。

DOM以及广义的基于树的处理具有几个优点

首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵DOM树可能是一个缓慢的过程。为了满足该缺点,我们使用SAXSimple API for XMLAPI处理XML文档内容。它的设计目标是占用更少的内存,把更多的工作交给程序员。SAXDOM是互补的,有各自的适用环境。请看下图解析过程:

当使用SAX解析器解析一个XML文档时,解析器在读取文档的过程中会生成一系列的事件。至于如何处理这些事件则取决于您的需求。下面列出了一小部分您在XML文档时可能遇到的事件:

? startDocument事件

? 对于每个元素,在元素开始时有startElement事件,元素结束时有endElement事件

? 如果元素包含内容,对于文本将出现characters事件,对于子元素将出现startElementendElement事件,依此类推

? endDocument事件

如下代码及过程:

goudan

28

分析这个代码片段的SAX处理器,一般情况下将产生以下事件:

startDocument

startElement (person)

characters (white space)

startElement (name)

characters (goudan)

endElement (name)

characters (white space)

startElement (age)

characters (28)

endElement (age)

characters (white space)

endElement (person)

endDocument

这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。

另一方面,由于应用程序没有以任何方式存储数据,使用SAX来更改数据或在数据流中往后移是不可能的。尽管SAXDOM提供了许多有用的功能,对于程序员而言有些任务还是太复杂了。延续开源社群有需要就创建工具的历史传统,Java技术专家Jason Hunter Brett McLaughlin缔造了JDOM,这个Java库极大简化了XML文档的处理。和DOM类似,JDOM也提供一个对象树表示XML文档,但是这些对象工作的方式对Java程序员更直观。要记住,JDOM在背后包含使用普通SAXDOM 解析器的适配器; JDOM对所有主要的(和几个次要的)Java XML解析器都提供了适配器,因此不必担心您的Java XML解析器是否支持JDOMJDOM在幕后使用的解析器不需要您的干涉。

一般来说以下情况应使用DOM解析器:

? 需要详细了解文档的结构

? 需要改变文档的结构(也许您需要对元素排序,增加新的元素等等)

? 需要多次引用解析的信息

进一步推广,在以下情况中应使用SAX解析器:

? 内存少

? 只需要XML文档中少量元素或属性

? 解析的信息只使用一次

JDOM的内存使用比DOM少,但是不如SAX好。此外,如果您希望进行验证,JDOM要求您设置底层的解析器,JDOM本身不进行验证。就是说,如果JDOM能够完成您所需要的所有功能,而且速度满足您的需要,它可以简化您的编码工作。

文档对象模型(DOM)解析实例

DOM主要包含下列内容:

DOM文档是以层次结构组织的节点或信息片段的集合。这个层次结构允许开发人员从树中导航寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。

DOM解析过程(下图):

利用JAXPxml文档的内容解析到一个个的Java对象中,只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。这个工厂模式的具体实现,可以参看下面的类图

DocumentBuilder db = dbf.newDocumentBuilder();

当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要。 然后,我们就可以利用这个解析器来对XML文档进行解析了:

Document doc = db.parse("d:/xml/message.xml");

DocumentBuilderparse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义。

使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,所代表的是一个Node对象的列表:

NodeList nl = doc.getElementsByTagName("message");

我们通过这样一条语句所得到的是XML文档中所有标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象:

Node my_node = nl.item(0);

当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法:

String message = my_node.getFirstChild().getNodeValue();

请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要和W3CDOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。

DOM对象

DOM的基本对象有5个:DocumentNodeNodeListElementAttr。下图表示了基本对象间的关系

Document对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此外,Document还包含了创建其它节点的方法,比如createAttribute()用来创建一个Attr对象。它所包含的主要的方法有: createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。

createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。

getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。

getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。

Node对象是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如ElementAttrTextNode对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点。Node对象所包含的主要的方法有:

appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。

getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。

getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。

getNodeName():根据节点的类型返回节点的名称。

getNodeType():返回节点的类型。

getNodeValue():返回节点的值。

hasChildNodes():判断是不是存在有子节点。

hasAttributes():判断这个节点是否存在有属性。

getOwnerDocument():返回节点所处的Document对象。

insertBefore(org.w3c.dom.Node neworg.w3c.dom.Node ref):在给定的一个子对象前再插入一个子对象。

removeChild(org.w3c.dom.Node):删除给定的子节点对象。

replaceChild(org.w3c.dom.Node neworg.w3c.dom.Nodeold):用一个新的Node对象代替给定的子节点对象。

NodeList对象,代表了一个包含一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素:

getLength():返回列表的长度。

item(int):返回指定位置的Node对象。

Element对象代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。

getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。

getTagName():返回一个代表这个标签名字的字符串。getAttribute(String):返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。

getAttributeNode(String):返回一个代表给定属性名称的Attr对象。Attr对象代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因而在DOMAttr并不是DOM树的一部分,所以Node中的getparentNode()getpreviousSibling()getnextSibling()返回的都将是null。也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。

请看下面例子:(message.xml

sohu

http://www.sohu.com

zhangzhaoyang

2

1

2004

zhangzhaoyang's website

Java

http://java.sun.com

Sun Microsystems

3

1

2001

Sun Microsystem's website.

microsoft

http://www.microsoft.com

bill gates

4

1

2000

bill's website

DOM解析的例子:

下面代码使用DOM解析XML文件

package com.app;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

public class DOMXMLReader {

public static void main(String args[]) {

try {

DocumentBuilderFactory factory = DocumentBuilderFactory

.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse("url.xml");

doc.normalize();

NodeList links = doc.getElementsByTagName("link");

for (int i = 0; i < links.getLength(); i++) {

Element link = (Element) links.item(i);

System.out.print("Content: ");

System.out.println(link.getElementsByTagName("text").item(0)

.getFirstChild().getNodeValue());

System.out.print("URL: ");

System.out.println(link.getElementsByTagName("url").item(0)

.getFirstChild().getNodeValue());

System.out.print("Author: ");

System.out.println(link.getElementsByTagName("author").item(0)

.getFirstChild().getNodeValue());

System.out.print("Date: ");

Element linkdate = (Element) link.getElementsByTagName("date")

.item(0);

String day = linkdate.getElementsByTagName("day").item(0)

.getFirstChild().getNodeValue();

String month = linkdate.getElementsByTagName("month").item(0)

.getFirstChild().getNodeValue();

String year = linkdate.getElementsByTagName("year").item(0)

.getFirstChild().getNodeValue();

System.out.println(day + "-" + month + "-" + year);

System.out.print("Description: ");

System.out.println(link.getElementsByTagName("description")

.item(0).getFirstChild().getNodeValue());

System.out.println();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

下面代码修改XML文件:

package com.app;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Text;

public class DOMXMLWriter {

public static void main(String args[]) {

try {

DocumentBuilderFactory factory = DocumentBuilderFactory

.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse("url.xml");

doc.normalize();

// ---取得变量----

String text = "itjob";

String url = "www.5itjob.com";

String author = "xsw";

String discription = "a good website for it job!";

// -------------

Text textseg;

Element link = doc.createElement("link");

Element linktext = doc.createElement("text");

textseg = doc.createTextNode(text);

linktext.appendChild(textseg);

link.appendChild(linktext);

Element linkurl = doc.createElement("url");

textseg = doc.createTextNode(url);

linkurl.appendChild(textseg);

link.appendChild(linkurl);

Element linkauthor = doc.createElement("author");

textseg = doc.createTextNode(author);

linkauthor.appendChild(textseg);

link.appendChild(linkauthor);

java.util.Calendar rightNow = java.util.Calendar.getInstance();

String day = Integer.toString(rightNow

.get(java.util.Calendar.DAY_OF_MONTH));

String month = Integer.toString(rightNow

.get(java.util.Calendar.MONTH));

String year = Integer.toString(rightNow

.get(java.util.Calendar.YEAR));

Element linkdate = doc.createElement("date");

Element linkdateday = doc.createElement("day");

textseg = doc.createTextNode(day);

linkdateday.appendChild(textseg);

Element linkdatemonth = doc.createElement("month");

textseg = doc.createTextNode(month);

linkdatemonth.appendChild(textseg);

Element linkdateyear = doc.createElement("year");

textseg = doc.createTextNode(year);

linkdateyear.appendChild(textseg);

linkdate.appendChild(linkdateday);

linkdate.appendChild(linkdatemonth);

linkdate.appendChild(linkdateyear);

link.appendChild(linkdate);

Element linkdiscription = doc.createElement("description");

textseg = doc.createTextNode(discription);

linkdiscription.appendChild(textseg);

link.appendChild(linkdiscription);

doc.getDocumentElement().appendChild(link);

TransformerFactory tFactory = TransformerFactory.newInstance();

Transformer transformer = tFactory.newTransformer();

DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(new java.io.File("url.xml"));

transformer.transform(source, result);

System.out.println("write complete!");

} catch (Exception e) {

e.printStackTrace();

}

}

}

SAX解析实例

//以下代码统计url.xml文件中每个标签出现的次数

package com.app;

import java.io.File;

import java.util.Enumeration;

import java.util.Hashtable;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class TagCounter extends DefaultHandler {

// Hashtable用来记录tag出现的次数

private Hashtable tags;

public void startDocument() throws SAXException {

tags = new Hashtable();

}

// 解析完成后的工作

public void endDocument() throws SAXException {

Enumeration e = tags.keys();

while (e.hasMoreElements()) {

String tag = (String) e.nextElement();

int count = ((Integer) tags.get(tag)).intValue();

System.out.println("Tag <" + tag + "> occurs " + count + " times");

}

}

// 对每一个开始元属进行处理

public void startElement(String namespaceURI, String localName,

String rawName, Attributes atts) throws SAXException {

String key = rawName;

Object value = tags.get(key);

if (value == null) {

// 如果是新标签,把它添加在Hastable

tags.put(key, new Integer(1));

} else {

// 如果以前碰到过,得到其计数值,并加1

int count = ((Integer) value).intValue();

count++;

tags.put(key, new Integer(count));

}

}

static public void main(String[] args) {

String filename = null;

filename = "url.xml";

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser saxParser = null;

try {

// 创建解析器SAXParser对象

saxParser = spf.newSAXParser();

saxParser.parse(new File(filename), new TagCounter());

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

//以下程序解析url.xml

package com.app;

import java.io.File;

import java.io.IOException;

import java.util.Stack;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

public class SAXXMLReader extends DefaultHandler {

Stack tags = new Stack();

// 用于保存解析出来的信息

String text = null;

String url = null;

String author = null;

String description = null;

String day = null;

String year = null;

String month = null;

public void endDocument() throws SAXException {

System.out.println("------解析结束--------");

}

public void startDocument() throws SAXException {

System.out.println("------解析开始--------");

}

public void startElement(String p0, String p1, String p2, Attributes p3)

throws SAXException {

tags.push(p2);

}

public void endElement(String p0, String p1, String p2) throws SAXException {

tags.pop();

if (p2.equals("link"))

parser();

}

public void characters(char[] p0, int p1, int p2) throws SAXException {

// 察看栈顶元素,根据元素名称给对应的变量赋值

String tag = (String) tags.peek();

if (tag.equals("text"))

text = new String(p0, p1, p2);

else if (tag.equals("url"))

url = new String(p0, p1, p2);

else if (tag.equals("author"))

author = new String(p0, p1, p2);

else if (tag.equals("day"))

day = new String(p0, p1, p2);

else if (tag.equals("month"))

month = new String(p0, p1, p2);

else if (tag.equals("year"))

year = new String(p0, p1, p2);

else if (tag.equals("description"))

description = new String(p0, p1, p2);

}

private void parser() {

System.out.print("Content: ");

System.out.println(text);

System.out.print("URL: ");

System.out.println(url);

System.out.print("Author: ");

System.out.println(author);

System.out.print("Date: ");

System.out.println(day + "-" + month + "-" + year);

System.out.print("Description: ");

System.out.println(description);

System.out.println();

}

static public void main(String[] args) {

String filename = "url.xml";

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser saxParser = null;

try {

saxParser = spf.newSAXParser();

saxParser.parse(new File(filename), new SAXXMLReader());

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

DOM4J解析实例

D:\\wuhan\\test.xml

A1234A1234aaaaaaaaaa深圳罗湖

   B1234

   深圳南山

   B1234xxxx

   深圳xxxxx

Java 代码

package com.xml;

import java.io.*;

import java.util.*;

import org.dom4j.*;

import org.dom4j.io.*;

public class Dom4j {

public static void main(String arge[]) {

long lasting = System.currentTimeMillis();

try {

File f = new File("D:\\wuhan\\test.xml");

SAXReader reader = new SAXReader();

Document doc = reader.read(f);

Element root = doc.getRootElement();

Element foo;

for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {

foo = (Element) i.next();

System.out.print("车牌号码:" + foo.elementText("NO"));

System.out.println("车主地址:" + foo.elementText("ADDR"));

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

JDOM解析实例

package com.xml;

import java.io.*;

import java.util.*;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.input.SAXBuilder;

public class JDom {

public static void main(String arge[]) {

long lasting = System.currentTimeMillis();

try {

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(new File("D:\\wuhan\\test.xml"));

Element foo = doc.getRootElement();

List allChildren = foo.getChildren();

for(int i = 0;i < allChildren.size();i++) {

System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());

System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());

}

} catch (Exception e) {

e.printStackTrace();

}

}}

JAVA操纵XML 实例讲解

JDBC开发中需要连接到不同的数据库,利用XML文件保存不同类型数据库的连接参数,并使用统一的程序解析XML以取得相应的连接参数。

<>

Oracle

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@localhost:1521:goudan

pubuser1

11111111

mysql

org.git.mm.mysql.Driver

jdbc:mysql://localhost:3306/BookDB

pubuser2

11111111

sqlserver com.microsoft.jdbc.sqlserver.SQLServerDriver

jdbc:Microsoft:sqlserver://127.0.0.1:1433

pubuser3

11111111

<>

package test.xml;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

public class DBTest {

public DBTest(String type) {

// this.type = type ;

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

try {

DocumentBuilder db = dbf.newDocumentBuilder();// 创建解析器

Document doc = db.parse("Db.xml");// 解析地址

NodeList n1 = doc.getElementsByTagName("DB");// 得到含有DB标签的一个列表

for (int i = 0; i < n1.getLength(); i++) {

Element myNode = (Element) n1.item(i);// 通过item方法获得每个对象

if (myNode.getElementsByTagName("type").item(0).getFirstChild()

.getNodeValue().equals(type)) {

String driver = myNode.getElementsByTagName("driver").item(

0).getFirstChild().getNodeValue();

String url = myNode.getElementsByTagName("url").item(0)

.getFirstChild().getNodeValue();

String user = myNode.getElementsByTagName("user").item(0)

.getFirstChild().getNodeValue();

String password = myNode.getElementsByTagName("password")

.item(0).getFirstChild().getNodeValue();

System.out.println(driver + " " + url + " " + user + " "

+ password);

break;

}

}

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] rag) {

DBTest dbt1 = new DBTest("Oracle");

DBTest dbt2 = new DBTest("mysql");

DBTest dbt3 = new DBTest("sqlserver");

}

}

通过JAVA写数据到XML里面

<>

andy

45

13632940025

m

<>

package test.xml;

import java.io.File;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

import org.w3c.dom.Text;

import org.xml.sax.SAXException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.ArrayList;

public class WriteXmlTest {

public static void main(String[] args) {

try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder db = dbf.newDocumentBuilder();

Document dc = db.parse("persons.xml");

fang(dc);

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public static void fang(Document doc) {

Element eleroots = doc.getDocumentElement();

Element eleroot = doc.createElement("person");// 创建gen元素

eleroots.appendChild(eleroot);

Element elename = doc.createElement("name");

Text text1 = doc.createTextNode("andy");

elename.appendChild(text1);

eleroot.appendChild(elename);

Element eleage = doc.createElement("age");

Text text2 = doc.createTextNode("45");

eleage.appendChild(text2);

eleroot.appendChild(eleage);

Element eletel = doc.createElement("tel");

Text text3 = doc.createTextNode("13632940025");

eletel.appendChild(text3);

eleroot.appendChild(eletel);

Element elesex = doc.createElement("sex");

Text text4 = doc.createTextNode("m");

elesex.appendChild(text4);

eleroot.appendChild(elesex);

TransformerFactory tff = TransformerFactory.newInstance();

Transformer tf = null;

try {

tf = tff.newTransformer();

} catch (TransformerConfigurationException e) {

e.printStackTrace();

}

DOMSource ds = new DOMSource(doc);

StreamResult sr = new StreamResult(new File("persons.xml"));

try {

tf.transform(ds, sr);

} catch (TransformerException e) {

e.printStackTrace();

}

}

}

内容总结

? 知道解析器的作用

? 理解DOMSAX解析XML原理

? 了解DOMSAX解析的优缺点

? 使用DOMSAX解析XML文档

? 使用DOM4J解析XML文档

? 使用JDOM 解析XML文档

? 能够使用各种解析方式来处理应用程序

? 能够写出XML方式的连接池技术

独立实践

? 写一个XML文档:包括JDBC连接所需要的驱动,url,用户名,密码等

? 使用SAX或者DOM解析上面的XML建立数据库的连接

? 使用DOM4J解析一个判断用户的登陆的操作,用户信息存在XML文档里

? 使用JDOM解析上一章的一个关于学生课程信息的XML文档,并在控制台显示数据

? 使用任何一种解析方式对学生课程信息的XML文档进行写一行增加课程信息的数据。

第二十三章:HTML基础

学习目标

? HTML文档是由HTML元素组成的文本文件,是预定义的正在使用的HTML标签

? HTML中最重要的标签是定义标题元素,段落和换行的标签

? 掌握格式化元素比如加粗和倾斜文本

? 了解HTML中的特殊实体

? 掌握超链接、锚的用法

? 掌握表格的画法以及如何添加表的标题、表头等

? 掌握无序、有序及自定义列表

? 了解并掌握图像标签、alt属性、src属性,以及如何利用图像创建超链接

? 掌握如何在标签中设置网页背景

知识要点

HTML元素

HTML文档是由HTML元素组成的文本文件。

HTML元素是预定义的正在使用的HTML标签。

________________________________________HTML标签

HTML标签用来组成HTML元素。

HTML标签两端有两个包括字符:“<”“>”,这两个包括字符被称为角括号。

HTML标签通常成对出现,比如。一对标签的前面一个是开始标签,第二个是结束标签,在开始和结束标签之间的文本是元素内容。

HTML标签是大小写无关的,表示的意思是一样的。________________________________________

回忆一下上一页的HTML例子:

Title of page

This is my first homepage.

This text is bold

下面是一个HTML元素:

This text is bold

HTML元素以开始标签起始, 内容是:This text is bold,以结束标签中止。标签的目的是定义一个需要被显示成粗体的HTML元素。

下面也是一个HTML元素:

This is my first homepage.

This text is bold

HTML标签以开始标签起始,终止于结束标签标签的目的是定义一个HTML元素,使其包含HTML文档的主体。________________________________________为什么使用小写标签?

HTML标签是大小写无关的:含义相同。当你上网的时候,你会注意到多数教程在示例中使用大写的HTML标签,我们总是使用小写标签。为什么?

假如你想投入到下一代HTML中,你应该开始使用小写标签。W3C在他们的HTML4建议中提倡使用小写标签,XHTML(下一代HTML)也需要小写标签。________________________________________

标签属性

标签可以拥有属性。属性能够为页面上的HTML元素提供附加信息。

标签定义了HTML页面的主体元素。使用一个附加的bgcolor属性,你可以告诉浏览器:你页面的背景色是红色的,就像这样:

标签

定义了一个HTML表格。使用一个附加的border属性,你可以告诉浏览器:这个表格是没有边框的,代码是:

属性通常由属性名和值成对出现,就像这样:name="value"。属性通常是附加给HTML元素的开始标签的。

引号样式

属性值应该被包含在引号中。双引号是最常用的,但是单引号也可以使用。

在很少情况下,比如说属性值本身包含引号,使用单引号就很必要了。

比如:name='John "ShotGun" Nelson'

注意:中文引号跟英文引号是不一样的。上面所指的引号都是英文状态下的引号。

HTML基本标签

HTML中最重要的标签是定义标题元素,段落和换行的标签。

学习HTML的最好方法是编辑运行示例代码。

请自己尝试一下这个例子

一个非常简单的HTML文档:

The content of the body element is displayed in your browser.

这个例子是一个非常简单的HTML文档,拥有很少的几个HTML标签。它说明了一个主体元素中的文本是如何在浏览器中显示的。

简单的段落:

This is a paragraph.

This is a paragraph.

This is a paragraph.

Paragraph elements are defined by the p tag.

这个例子说明了段落元素中的文本是如何在浏览器中显示的。

标题元素

标题元素由标签

定义。

定义了最大的标题元素,
定义了最小的。

This is a heading

This is a heading

This is a heading

This is a heading

This is a heading

This is a heading

HTML自动在一个标题元素前后各添加一个空行。

段落

段落是用

标签定义的。

This is another paragraph

HTML自动在一个段落前后各添加一个空行。

换行

当需要结束一行,并且不想开始新段落时,使用
标签。
标签不管放在什么位置,都能够强制换行。

This


is a para


graph with line breaks


标签是一个空标签,它没有结束标记。

注释

注释标签用来在HTML源文件中插入注释。注释会被浏览器忽略。你可以使用注释来解释你的代码,这可以在你以后编辑代码的时候帮助你。

注意:你需要在左括号“<”后面跟一个感叹号,右括号不用。

技巧

当你写下HTML文本的时候,你不能确知在另外一个浏览器中,这些文本将被如何显示。有人用着大的显示器,有的人用的小一些。每次用户调整窗口大小的时候,文本都将被重新格式化。不要想在编辑器中写一些空行和空格来协助排版。

HTML将截掉你文本中的多余空格。不管多少个空格,处理起来只当一个。一点附加信息:在HTML里面,一个空行也只被当作一个空格来处理。

使用空段落

来插入空白行是一个坏习惯,请使用
标签来替代。(但是不要用
标签来创建列表,我们后面会专门学习HTML列表的。)

你也许注意到了段落可以不写结束标记

。别依赖它,HTML的下一个版本将不准你漏掉任何一个结束标签。

HTML自动在某些元素前后增加额外的空行,就像在段落和标题元素的前后一样。

我们使用了水平线(


标签)来分隔我们教程的章节。

例如:

多个段落

This paragraph contains a lot of lines in the source code, but the

browser ignores it.

This paragraph contains a lot of spaces in the source code, but the

browser ignores it.

The number of lines in a paragraph depends on the size of your

browser window. If you resize the browser window, the number of lines

in this paragraph will change.

这个例子说明了段落的一些默认行为。

换行

To break


lines


in a


paragraph,


use the br tag.

这个例子说明了在HTML文档中换行的使用。

格式

My Bonnie lies over the ocean. My Bonnie lies over the sea. My Bonnie

lies over the ocean. Oh, bring back my Bonnie to me.

Note that your browser simply ignores your formatting!

这个例子说明了HTML显示格式的一些问题。

标题元素

This is heading 1

This is heading 2

This is heading 3

This is heading 4

This is heading 5

This is heading 6

Use heading tags only for headings. Don't use them just to make

something bold. Use other tags for that.

这个例子说明了在HTML中显示标题元素的标签。

居中的标题元素

This is heading 1

The heading above is aligned to the center of this page. The heading

above is aligned to the center of this page. The heading above is

aligned to the center of this page.

这个例子显示了一个居中的标题元素。

水平线

The hr tag defines a horizontal rule:


This is a paragraph


This is a paragraph


This is a paragraph

这个例子说明了如何插入水平线。

隐藏的注释

This is a regular paragraph

这个例子说明了在HTML文档中如何插入隐藏的注释。

背景色

Look: Colored Background!

这个例子说明了如何给页面设置背景色。

HTML格式

HTML定义了很多元素用来格式化输出,比如加粗和倾斜文本。

例如:

格式化文字

This text is bold


This text is strong


This text is big


This text is emphasized


This text is italic


This text is small


This text contains

subscript


This text contains

superscript

这个例子说明了在HTML里面可以怎样格式化文本。

预格式化文本

This is

preformatted text.

It preserves both spaces

and line breaks.

The pre tag is good for displaying computer code:

for i = 1 to 10

print i

next i

这个例子说明了可以怎样用pre标签来控制换行和空格。

计算机输出标签

Computer code


Keyboard input


Teletype text


Sample text


Computer variable


Note: These tags are often used to display

computer/programming code.

这个例子说明了计算机输出标签在显示上的不同。

地址

Donald Duck


BOX 555


Disneyland


USA

这个例子说明了如何用HTML书写一个地址。

缩写和首字母缩略法

UN


WWW

The title attribute is used to show the spelled-out version when

holding the mouse pointer over the acronym or abbreviation.

This only works for the acronym element in IE 5.

This works for both the abbr and acronym element in Netscape 6.2.

这个例子说明了如何处理缩写和首字母缩略。

文字方向

If your browser supports bi-directional override (bdo), the next line

will be written from the right to the left (rtl):

Here is some Hebrew text

这个例子说明了如何改变文字方向。

块引用

Here comes a long quotation:

This is a long quotation. This is a long quotation. This is a long

quotation. This is a long quotation. This is a long quotation.

Here comes a short quotation:

This is a short quotation

With the block quote element, the browser inserts line breaks and

margins, but the q element does not render as anything special.

这个例子说明了如何处理大段引用和小块引用。

删除和插入文字

a dozen is

twenty

twelve

pieces

Most browsers will overstrike deleted text and underline inserted

text.

Some older browsers will display deleted or inserted text as plain

text.

这个例子说明了如何标记被删除或者插入的文本。

查看HTML源文件

在浏览器菜单中选择查看——源文件,将弹出一个窗口,这个页面的HTML代码就在其中。

HTML实体

有些字符,比如说“<”字符,在HTML中有特殊的含义,因此不能在文本中使用。

想要在HTML中显示一个小于号“<”,需要用到字符实体。

字符实体

HTML中,有些字符拥有特殊含义,比如小于号“<”定义为一个HTML标签的开始。假如我们想要浏览器显示这些字符的话,必须在HTML代码中插入字符实体。

一个字符实体拥有三个部分:一个and符号(&),一个实体名或者一个实体号,最后是一个分号(;

想要在HTML文档中显示一个小于号,我们必须这样写:<或者<

使用名字相对于使用数字的优点是容易记忆,缺点是并非所有的浏览器都支持最新的实体名,但是几乎所有的浏览器都能很好地支持实体号。

注意:实体名是大小写敏感的。

下面这个例子能够让你针对HTML实体实践一下。

This is a character entity: {

不可拆分的空格

HTML中,最常见的字符实体就是不可拆分空格。

通常,HTML会合并你文档中的空格。假如在你的HTML文本中连续写了10个空格,其中9个会被去掉。想要在HTML中插入空格,可以使用实体:

常用的字符实体

显示结果 描述 实体名 实体号

不可拆分的空格

< 小于 < <

> 大于 > >

& and符号 & &

" 引号 " "

' 单引号 '

其它字符实体

显示结果 描述 实体名 实体号

¢ 分 ¢ ¢

£ 英镑 £ £

¥ 人民币元 ¥ ¥

§ 章节 § §

? 版权 © ©

? 注册 ® ®

× 乘号 × ×

÷ 除号 ÷ ÷

HTML链接

HTML使用超级链接来连接到网络上的其他页面。

例如

创建链接

This text is a link to a page on this Web

site.

This text is a link to a

page on the World Wide Web.

这个例子说明了在HTML文档中如何创建链接

图片作为链接

You can also use an image as a link:

这个例子说明了在HTML文档中如何用图片作为链接。

锚标签和href属性

HTML使用锚标签()来创建一个连接到其他文件的链接。锚可以指向网络上的任何资源:HTML页面,图像,声音,影片等等。

创建一个锚的语法:

Text to be displayed

锚可以指向网络上的任何资源:HTML页面,图像,声音,影片等等。

标签被用来创建一个链接指向的锚,href属性用来指定连接到的地址,在锚的起始标签和结束标签中间的部分将被显示为超级链接。

这个锚定义了一个到W3Schools的链接:

Visit W3Schools!

target属性

使用target属性,你可以定义从什么地方打开链接地址。

下面这段代码打开一个新的浏览器窗口来打开链接:

Visit W3Schools!

锚标签和name属性

name属性用来创建一个命名的锚。使用命名锚以后,可以让链接直接跳转到一个页面的某一章节,而不用用户打开那一页,再从上到下慢慢找。

下面是命名锚的语法:

Text to be displayed

你可以为锚随意指定名字,只要你愿意。下面这行代码定义了一个命名锚:Useful Tips Section

你应该注意到了:命名锚的显示方式并没有什么与众不同的。

想要直接链接到“tips”章节的话,在URL地址的后面加一个“#”和这个锚的名字,就像这样:

Jump to the Useful Tips Section

一个链接到本页面中某章节的命名锚是这样写的:Jump to the Useful Tips Section

技巧

尽量在子目录路径后面加一个左斜杠。假如你像下面这样写:href="http://www.w3schools.com/html",将会产生向服务器产生两个HTTP请求,因为服务器会在后面追加一个左斜杠,产生一个新的请求,就像这样:href="http://www.w3schools.com/html/"

命名锚通常用来在大型文档的开头创建章节表。这个页面的每个章节被加上一个命名锚,到这些锚的链接被放在页面的顶端。

如果浏览器无法找到指定的命名锚,它将转到这个页面的顶部,而不显示任何错误提示。

例如:

在新浏览器窗口中打开链接

Last Page

If you set the target attribute of a link to "_blank", the link will

open in a new window.

这个例子说明了怎样用打开新窗口的方式来链接到其他页面,这样,访问者不用离开你的页面。

链接到本页面的某个位置

See also Chapter 4.

Chapter 1

This chapter explains ba bla bla

Chapter 2

This chapter explains ba bla bla

Chapter 3

This chapter explains ba bla bla

Chapter 4

This chapter explains ba bla bla

Chapter 5

This chapter explains ba bla bla

Chapter 6

This chapter explains ba bla bla

Chapter 7

This chapter explains ba bla bla

Chapter 8

This chapter explains ba bla bla

Chapter 9

This chapter explains ba bla bla

Chapter 10

This chapter explains ba bla bla

Chapter 11

This chapter explains ba bla bla

Chapter 12

This chapter explains ba bla bla

Chapter 13

This chapter explains ba bla bla

Chapter 14

This chapter explains ba bla bla

Chapter 15

This chapter explains ba bla bla

Chapter 16

This chapter explains ba bla bla

Chapter 17

This chapter explains ba bla bla

这个例子说明了如何跳转到一个文档的某部分。

跳出框架

Locked in a frame?

Click here!

这个例子说明了假如你的页面在框架中,如何跳出框架。

创建一个邮件链接

This is a mail link:

Send Mail

Note: Spaces between words should be replaced by %20 to

ensure that the browser will display your text properly.

这个例子说明了如何链接到一个邮件信息(只有安装了邮件程序才有效)。

创建一个邮件链接2

This is another mailto link:

href="mailto:[email protected][email protected][email protected]&subject=Summer%20Party&body=You%20are%20invited%20to%20a%20big%20summer%20party!">Send

mail!

Note: Spaces between words should be replaced by %20 to

ensure that the browser will display your text properly.

这个例子显示了一个完成度更高的邮件链接。

HTML表格

使用HTML可以创建表格。

例如:

Each table starts with a table tag. Each table row starts with a tr

tag. Each table data starts with a td tag.

One column:

100

One row and three columns:

100

200

300

Two rows and three columns:

100

200

300

400

500

600

这个例子说明了如何在HTML页面中创建表格。

表格边框

With a normal border:

First

Row

Second

Row

With a thick border:

First

Row

Second

Row

With a very thick border:

First

Row

Second

Row

这个例子显示了不同的表格边框。

表格

表格是用

标签定义的。表格被划分为行(使用标签),每行又被划分为数据单元格(使用标签,因为浏览器对它们的支持不好。希望这个在XHTML的未来版本中得到改变。

________________________________________

例如:

没有边框的表格

This table has no borders:

标签)。td表示表格数据Table Data),即数据单元格的内容。数据单元格可以包含文本,图像,列表,段落,表单,水平线,表格等等。

row 1, cell 1

row 1, cell 2

row 2, cell 1

row 2, cell 2

在浏览器中显示如下:

row 1, cell 1 row 1, cell 2

row 2, cell 1 row 2, cell 2

表格和border属性

如果不指定border属性,表格将不显示边框。有时候这很有用,但是多数时候我们希望显示边框。

想要显示一个有边框的表格,需要使用border属性。

Row 1, cell 1

Row 1, cell 2

表格头

表格头使用

标签指定。

Heading

Another Heading

row 1, cell 1

row 1, cell 2

row 2, cell 1

row 2, cell 2

在浏览器中显示如下:

Heading Another Heading

row 1, cell 1 row 1, cell 2

row 2, cell 1 row 2, cell 2

表格中的空单元格

在多数浏览器中,没有内容的单元格显示得不太好。

row 1, cell 1

row 1, cell 2

row 2, cell 1

在浏览器中显示如下:

row 1, cell 1 row 1, cell 2

row 2, cell 1

注意一下空单元格的边框没有显示出来。为了避免这个,可以在空单元格里加入不可分空格来占位,这样边框能正常显示。

row 1, cell 1

row 1, cell 2

row 2, cell 1

在浏览器中显示如下:

row 1, cell 1 row 1, cell 2

row 2, cell 1

技巧

通常很少使用

100

200

300

400

500

600

And this table has no borders:

100

200

300

400

500

600

这个例子显示了一个没有边框的表格。

表格头

Table headers:

Name

Telephone

Telephone

Bill Gates

555 77 854

555 77 855

Vertical headers:

First Name:

Bill Gates

Telephone:

555 77 854

Telephone:

555 77 855

这个例子说明了如何显示表格头。

空单元格

Some text

Some text

Some text

As you can see, one of the cells has no border. That is because it is

empty. Try to insert a space in the cell. Still it has no border.

The trick is to insert a no-breaking space in the cell.

No-breaking space is a character entity. If you don't know what a

character entity is, read the chapter about it.

The no-breaking space entity starts with an ampersand ("&"),then the

letters "nbsp", and ends with a semicolon (";")

这个例子说明了如何使用“ ”来支撑没有内容的单元格。

有标题的表格

This table has a caption,and a thick border:

My Caption

100

200

300

400

500

600

这个例子说明了如何创建一个有标题的表格。

单元格跨行(列)的表格

Cell that spans two columns:

Name

Telephone

Bill Gates

555 77 854

555 77 855

Cell that spans two rows:

First Name:

Bill Gates

Telephone:

555 77 854

555 77 855

这个例子显示了如何定义跨行或者跨列的单元格。

表格内的其他标签

This is a paragraph

This is another paragraph

This cell contains a table:

A

B

C

D

This cell contains a list

  • apples

  • bananas

  • pineapples

HELLO

这个例子说明了如何在元素中显示其他元素。

cellpadding属性

Without cellpadding:

First

Row

Second

Row

With cellpadding:

First

Row

Second

Row

这个例子说明了如何使用cellpadding属性在表格内容和边框之间留出更多空白。

cellspacing属性

Without cellspacing:

First

Row

Second

Row

With cellspacing:

First

Row

Second

Row

这个例子说明了如何使用cellspacing属性来增加单元格间距。

给表格增加背景色或者背景图像

A background color:

First

Row

Second

Row

A background image:

First

Row

Second

Row

这个例子说明了如何给表格增加背景。

给表格增加背景色或者背景图像

Cell backgrounds:

First

Row

Second

Row

这个例子说明了如何给一个或多个单元格增加背景。

给单元格内容设置对齐方式

Money spent on....

January

February

Clothes

$241.10

$50.20

Make-Up

$30.00

$44.45

Food

$730.40

$650.00

Sum

$1001.50

$744.65

这个例子说明了如何使用“align”属性来设置单元格的对齐方式,让表格好看一些。

frame属性

If you see no frames around the tables in these examples, your

browser is too old, or does not support it.

With frame="border":

First

Row

Second

Row

With frame="box":

First

Row

Second

Row

With frame="void":

First

Row

Second

Row

With frame="above":

First

Row

Second

Row

With frame="below":

First

Row

Second

Row

With frame="hsides":

First

Row

Second

Row

With frame="vsides":

First

Row

Second

Row

With frame="lhs":

First

Row

Second

Row

With frame="rhs":

First

Row

Second

Row

这个例子说明了如何使用“frame”属性来控制表格周围的边框。

HTML列表

HTML支持有序、无序和自定义列表。

例如:

一个无序列表

An Unordered List:

  • Coffee

  • Tea

  • Milk

这个例子显示了一个无序列表。

有序列表

An Ordered List:

  1. Coffee

  2. Tea

  3. Milk

这个例子显示了一个有序列表。

无序列表

无序列表是一个项目的序列。各项目前加有标记(通常是黑色的实心小圆圈)。

无序列表以

    标签开始。每个列表项目以
  • 开始。

    • Coffee

    • Milk

    在浏览器中显示如下:

    ? Coffee

    ? Milk

    无序列表的项目中可以加入段落、换行、图像,链接,其他的列表等等。

    有序列表

    有序列表也是一个项目的序列。各项目前加有数字作标记。

    有序列表以

      标签开始。每个列表项目以
    1. 开始。

      1. Coffee

      2. Milk

      在浏览器中显示如下:

      1. Coffee

      2. Milk

      有序列表的项目中可以加入段落、换行、图像,链接,其他的列表等等。

      自定义列表

      自定义列表不是一个项目的序列,它是一系列条目和它们的解释。

      有序列表以

      标签开始,自定义列表条目以
      开始,自定义列表的定义以
      开始。

      Coffee

      Black hot drink

      Milk

      White cold drink

      在浏览器中显示如下:

      Coffee

      Black hot drink

      Milk

      White cold drink

      自定义列表的定义(标签

      )中可以加入段落、换行、图像,链接,其他的列表等等。

      例如:

      有序列表的不同类型

      Numbered list:

      1. Apples

      2. Bananas

      3. Lemons

      4. Oranges

      Letters list:

      1. Apples

      2. Bananas

      3. Lemons

      4. Oranges

      Lowercase letters list:

      1. Apples

      2. Bananas

      3. Lemons

      4. Oranges

      Roman numbers list:

      1. Apples

      2. Bananas

      3. Lemons

      4. Oranges

      Lowercase Roman numbers list:

      1. Apples

      2. Bananas

      3. Lemons

      4. Oranges

      这个例子显示了有序列表的不同类型。

      无序列表的不同类型

      Disc bullets list:

      • Apples

      • Bananas

      • Lemons

      • Oranges

      Circle bullets list:

      • Apples

      • Bananas

      • Lemons

      • Oranges

      Square bullets list:

      • Apples

      • Bananas

      • Lemons

      • Oranges

      这个例子显示了无序列表的不同类型。

      嵌套列表

      A nested List:

      • Coffee

      • Tea

        • Black tea

        • Green tea

      • Milk

      这个例子说明了可以怎样嵌套列表。

      嵌套列表2

      A nested List:

      • Coffee

      • Tea

        • Black tea

        • Green tea

          • China

          • Africa

      • Milk

      这个例子说明了如何创建一个更复杂化的嵌套列表。

      自定义列表:

      A Definition List:

      Coffee

      Black hot drink

      Milk

      White cold drink

      这个例子说明了如何创建一个自定义列表。

      HTML图像

      使用HTML可以在文档中显示图像。

      例如:

      插入图像

      An image:

      A moving image:

      Note that the syntax of inserting a moving image is no different from

      that of a non-moving image.

      这个例子说明了如何在网页中显示图像。

      插入非本地图像

      An image from W3Schools:

      height="68">

      这个例子说明了如何在网页中显示非本地图像。

      Img标签和src属性

      HTML里面,图像是由标签定义的。

      是空标签,意思是说,它只拥有属性,而没有结束标签。

      想要在页面上显示一个图像,需要使用src属性。“src”表示的意思。“src”属性的值是所要显示图像的URL

      插入图像的语法:

      URL指向图像存储的地址。网站“www.w3schools.com”子目录“images”中的图像“boat.gif”URL如下: “http://www.w3schools.com/images/boat.gif”

      当浏览器在文档中遇到img标签时,就放置一个图像。如果把img标签放在两个段落之间,就会先显示一个段落,然后是这个图像,最后是另外一个段落。

      alt属性

      alt属性用来给图像显示一个交互文本alt属性的值是由用户定义的。

      Big Boat

      “alt”属性在浏览器装载图像失败的时候告诉用户所丢失的信息,此时,浏览器显示这个交互文本来代替图像。给页面上的图像都加上alt属性是一个好习惯,它有助于更好地显示信息,而且,对纯文本浏览器很有用。

      技巧

      如果一个HTML文档包含10个图像,那么为了正确显示这个页面,需要加载11个文件。加载图像是需要时间的,所以请谨慎使用图像。

      例如:

      背景图像

      Look: A background image!

      Both gif and jpg files can be used as HTML backgrounds.

      If the image is smaller than the page, the image will repeat itself.

      这个例子说明了在HTML页面中如何添加背景图像。

      对齐图像

      An image

      in the text

      An image

      in the text

      An image

      in the text

      Note that bottom alignment is the default alignment

      An image

      in the text

      An image before the text

      An image after the text

      这个例子说明了在文字中如何对齐图像。

      浮动图像

      A paragraph with an image. The align attribute of the image is set to

      "left". The image will float to the left of this text.

      A paragraph with an image. The align attribute of the image is set to

      "right". The image will float to the right of this text.

      这个例子说明了如何让图像浮动在段落的旁边。

      调整图像大小

      You can make a picture larger or smaller changing the values in the

      "height" and "width" attributes of the img tag.

      这个例子说明了如何改变图像的大小。

      图像的交互文本

      Last Page

      Text-only browsers will only display the text in the "alt" attribute,

      which is "Last Page".Note that if you hold the mouse pointer over the

      image it will display the text.

      这个例子说明了如何为图像创建交互文本。将鼠标放在图像上,将能够看到这个文本。

      图像链接:

      You can also use an image as a link:

      这个例子说明了如何使用图像作为链接。

      图像地图

      Click on one of the planets to watch it closer:

      usemap="#planetmap">

      Sun

      Mercury

      href="mercury.htm">

      Venus

      Note: We use both an

      id and a

      name attribute in the map tag because some versions of

      Netscape don't understand the id attribute.

      这个例子说明了如何创建带有可点击区域的图像地图。每个可点击区域是一个超级链接。

      将图像转化为图像地图

      Move the mouse over the image, and look at the status bar to see how

      the coordinates change.

      width="146" height="126">

      这个例子说明了如何将图像转化为图像地图。将鼠标在图像上移动,状态栏将显示坐标。

      HTML背景

      好的背景能够让网站变得很美妙。

      例如:

      好的背景和文字颜色

      This is a paragraph. This is a paragraph. This is a paragraph. This

      is a paragraph. This is a paragraph.

      This is another paragraph. This is another paragraph. This is another

      paragraph. This is another paragraph.

      一个背景色和文字颜色让页面文本更易读的例子。

      差的背景和文字颜色

      This is a paragraph. This is a paragraph. This is a paragraph. This

      is a paragraph. This is a paragraph.

      This is another paragraph. This is another paragraph. This is another

      paragraph. This is another paragraph.

      一个背景色和文字颜色让页面文本不便阅读的例子。

      背景

      标签有两个属性可以指定背景。背景可以是颜色,也可以是图像。

      bgcolor

      bgcolor属性将背景设置为颜色,它的值可以是一个十六进制数、RGB值或者一种颜色名称。

      上面三条语句都可以把页面背景设置成黑色。

      background

      background属性将背景设置为图像,它的值是你所要使用图像的URL地址。如果这个图像的大小不及浏览器窗口,它将平铺占满窗口。

      URL地址可以是相对地址(上面第一条语句),也可以是绝对地址(上面第二条语句)。

      ________________________________________注意:如果打算使用背景图像,应该牢记:

      ? 这个图像会使页面加载时间过长吗?小技巧:图像文件的容量尽量不要超过10K

      ? 这个图像跟页面上其他图像协调吗?

      ? 这个图像跟页面上的文字颜色协调吗?

      ? 这个图像平铺了以后看起来还可以吗?

      ? 这个图像吸引了文字的注意力,喧宾夺主了吗?

      ________________________________________

      技巧

      标签的bgcolorbackgroundtext属性在最新的HTML标准(HTML4XHTML)中已被废弃。W3C在他们的推荐中已删除这些属性。在HTML的未来版本中,层叠样式表(CSS)将被用来定义HTML元素的布局和显示属性。

      一般的网站很少使用背景图像。

      最常用的背景颜色是黑色、白色和灰色。

      例如:

      好的背景图像

      Image Background

      Both gif and jpg files can be used as HTML backgrounds.

      If the image is smaller than the page, the image will repeat itself.

      一个背景图像和文字颜色让页面文本易于阅读的例子。

      好的背景图像2

      Image Background

      Both gif and jpg files can be used as HTML backgrounds.

      If the image is smaller than the page, the image will repeat itself.

      另一个背景图像和文字颜色让页面文本易于阅读的例子。

      差的背景图像

      Image Background

      Both gif and jpg files can be used as HTML backgrounds.

      If the image is smaller than the page, the image will repeat itself.

      一个背景图像和文字颜色让页面文本不便阅读的例子。

      内容总结

      ? 掌握HTML中最重要的标签是定义标题元素,段落和换行的标签,格式化元素比如加粗和倾斜文本,了解HTML中的特殊实体

      ? 掌握超链接、锚的用法,表格的画法以及如何添加表的标题、表头等。无序、有序及自定义列表。以及如何在标签中设置网页背景。

      ? 了解并掌握图像标签、alt属性、src属性,以及如何利用图像创建超链接

      独立实践

      ? 写一个自己简历的HTML文档。

      ? 写一个用表格显示本班学生的HTML文档。

      ? 通过点击简历的小头像,可以看到显示完整相片的HTML文档。

      ? 在上面三个HTML文档里用不同的背景图片

      ? 定义一个个人主页的HTML文档

      第二十四章:HTML进阶

      学习目标

      ? 掌握表单的创建方法、提交方式以及表单所包含的文档对象

      ? 掌握框架的创建方法、框架大小的调整以及如何在不同框架之间创建链接

      ? 掌握IFrame的使用,如何利用IFame引入其它页面,以及如何在IFrame和包含IFrame的页面之间通信

      知识要点

      HTML表单

      HTML表单用来选择不同种类的用户输入。

      例如:

      文本框

      First name:


      Last name:

      这个例子说明了在HTML页面中如何创建文本框。在文本框中,用户可以输入文本。

      密码框

      Username:


      Password:

      Note that when you type characters in a password field, the browser

      displays asterisks or bullets instead of the characters.

      这个例子说明了在HTML页面中如何创建密码框。

      表单

      表单是一个能够包含表单元素的区域。

      表单元素是能够让用户在表单中输入信息的元素(比如文本框,密码框,下拉菜单,单选框,复选框等等)。

      表单是用

      元素定义的。

      Input

      最常用的表单标签是标签。Input的类型用type属性指定。最常用的input类型解释如下:

      文本框

      在表单中,文本框用来让用户输入字母、数字等等。

      First name:


      Last name:

      ________________________________________注意,表单本身并不可见。另外,在多数浏览器中,文本框的宽度默认是20个字符。________________________________________

      单选按钮

      当需要用户从有限个选项中选择一个时,使用单选按钮。

      Male


      Female

      在浏览器中显示如下:

      Male

      Female

      ________________________________________注意,各选项中只能选取一个。________________________________________

      复选框

      当需要用户从有限个选项中选择一个或多个时,使用复选框。

      I have a bike


      I have a car

      在浏览器中显示如下:

      I have a bike

      I have a car

      表单的action属性和提交按钮

      当用户点击提交按钮的时候,表单的内容会被提交到其他文件。表单的action属性定义了所要提交到的目的文件,该目的文件收到信息后通常进行相关的处理。

      Username:

      如果在上面这个文本框中输入一些字符,按下提交按钮以后,输入的字符将被提交到页面“action.asp”

      例如:

      复选框

      I have a bike:


      I have a car:

      这个例子说明了在HTML页面中如何创建复选框。用户可以选中,也可以取消选择复选框。

      单选按钮

      Male:


      Female:

      When a user clicks on a radio-button, the button becomes checked, and

      all other buttons with the same name become unchecked

      这个例子说明了在HTML页面中如何创建单选按钮。

      简单的下拉列表

      这个例子说明了在HTML页面如何创建下拉列表。下拉列表是可以选择的列表。

      预选的下拉列表

      这个例子说明了如何创建一个含有预先选定元素的下拉列表。

      文本域

      This example demonstrates a text-area.

      这个例子说明了如何创建文本域(多行文本),用户可以在其中输入文本。在文本域中,字符个数不受限制。

      创建按钮

      这个例子说明了如何创建按钮。按钮上的文字可以自己定义。

      数据周围的标题边框

      Health information:

      Height

      Weight

      If there is no border around the input form, your browser is too old.

      这个例子说明了如何在数据周围画带有标题的边框。

      含有文本框和提交按钮的表单:

      Enter your first name:


      Enter your last name:


      If you click the "Submit" button, you will send your input to a new

      page called action.asp.

      这个例子说明了在HTML页面中加入表单。这个表单包含了两个文本框和一个提交按钮。

      含有复选框的表单

      I have a bike:


      I have a car:


      If you click the "Submit" button, you send your input to a new page

      called action.asp.

      这个表单包含了两个复选框和一个提交按钮。

      含有单选按钮的表单

      Male:


      Female:


      If you click the "Submit" button, you will send your input to a new

      page called action.asp.

      这个表单包含了两个单选按钮和一个提交按钮。

      从表单发送电子邮件

      enctype="text/plain">

      This form sends an e-mail to W3Schools.

      Name:



      Mail:



      Comment:




      这个例子说明了如何从一个表单发送电子邮件。

      HTML框架

      使用框架,可以在一个浏览器窗口中显示不止一个页面。

      例如:

      垂直分栏

      这个例子说明了如何创建一个有三个页面的垂直分栏。

      水平分栏

      这个例子说明了如何创建一个有三个页面的水平分栏。

      如何使用</span><span style="font-family:宋体">标签</span></p> <p><html></p> <p><frameset cols="25%,50%,25%"></p> <p><frame src="frame_a.htm"></p> <p><frame src="frame_b.htm"></p> <p><frame src="frame_c.htm"></p> <p><noframes></p> <p><body></p> <p>Your browser does not handle frames!</p> <p></body></p> <p>

      这个例子说明了如何使用</span><span style="font-family:宋体">标签。</span></p> <p>框架</p> <p>使用框架,可以在一个浏览器窗口中显示不止一个<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档。这样的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档被称为框架页面,它们是相互独立的。</span></p> <p>使用框架的不利因素有:</p> <p>? 网站开发者需要关心更多<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档的情况。 </span></p> <p>? 打印整个页面变得困难。 </p> <p>frameset<span style="font-family:宋体">标签</span></p> <p>? <frameset><span style="font-family:宋体">标签定义了如何将窗口拆分成框架。 </span></p> <p>? 每个<span style="font-family:Times New Roman">frameset</span><span style="font-family:宋体">标签定义了一组行和列。 </span></p> <p>? 行<span style="font-family:Times New Roman">/</span><span style="font-family:宋体">列的值指明了每个行</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">列在屏幕上所占的大小。</span></p> <p>frame<span style="font-family:宋体">标签</span></p> <p><frame><span style="font-family:宋体">标签定义了每个框架中放入什么文件。 </span></p> <p>下面这个例子中,有一个两列的分栏。第一个被设置成窗口宽度的<span style="font-family:Times New Roman">25</span><span style="font-family:宋体">%,第二个被设置成窗口宽度的</span><span style="font-family:Times New Roman">75</span><span style="font-family:宋体">%。页面</span><span style="font-family:Times New Roman">“frame_a.htm”</span><span style="font-family:宋体">被放在第一个分栏中,</span><span style="font-family:Times New Roman">“frame_b.htm”</span><span style="font-family:宋体">被放在第二个分栏中。</span></p> <p><frameset cols="25%,75%"></p> <p><frame src="frame_a.htm"></p> <p><frame src="frame_b.htm"></p> <p></frameset></p> <p>技巧</p> <p>假如一个框架有可见边框,用户可以拖动边框来改变它的大小。如果不想让用户改变大小,可以在<span style="font-family:Times New Roman"><frame></span><span style="font-family:宋体">标签中加入:</span><span style="font-family:Times New Roman">noresize="noresize"</span><span style="font-family:宋体">。</span></p> <p>给不支持框架的浏览器写上<span style="font-family:Times New Roman"><noframes></span><span style="font-family:宋体">标签。</span></p> <p>例如:</p> <p>混合框架</p> <p><html></p> <p><frameset rows="50%,50%"></p> <p><frame src="frame_a.htm"></p> <p><frameset cols="25%,75%"></p> <p><frame src="frame_b.htm"></p> <p><frame src="frame_c.htm"></p> <p></frameset></p> <p></frameset></p> <p></html></p> <p>这个例子说明了怎样把三个页面以行列混合的方式放在框架中。</p> <p>使用了<span style="font-family:Times New Roman">noresize="noresize"</span><span style="font-family:宋体">的框架</span></p> <p><html></p> <p><frameset rows="50%,50%"></p> <p><frame noresize="noresize" src="frame_a.htm"></p> <p><frameset cols="25%,75%"></p> <p><frame noresize="noresize" src="frame_b.htm"></p> <p><frame noresize="noresize" src="frame_c.htm"></p> <p></frameset></p> <p></frameset></p> <p></html></p> <p>这个例子说明了<span style="font-family:Times New Roman">noresize</span><span style="font-family:宋体">属性。这个框架是不可改变大小的,把鼠标移动到框架边界上,你会发现无法调整大小。</span></p> <p>导航框架</p> <p><html></p> <p><frameset cols="120,*"></p> <p><frame src="frame_link.htm"></p> <p><frame src="frame_a.htm" name="showframe"></p> <p></frameset></p> <p></html></p> <p>这个例子说明了如何创建一个导航框架。导航框架包含了一系列链接,它们的目标页面在第二个框架中。文件<span style="font-family:Times New Roman">“frame_links.htm”</span><span style="font-family:宋体">包含了三个链接,链接的代码如下:</span></p> <p><a href ="frame_a.htm" target ="showframe">Frame a</a></p> <p><a href ="frame_b.htm" target ="showframe">Frame b</a></p> <p><a href ="frame_c.htm" target ="showframe">Frame c</a> </p> <p>第二个框架将显示链接到的页面。</p> <p>内联框架:</p> <p><html></p> <p><body></p> <p><iframe src="intro.htm"></iframe></p> <p><p></p> <p>Some older browsers don't support iframes.</p> <p></p></p> <p><p></p> <p>If they don't, the iframe will not be visible.</p> <p></p></p> <p></body></p> <p></html></p> <p>这个例子说明了如何创建一个内联框架(包含在<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">页面里的框架)。</span></p> <p>在框架内跳转到指定章节</p> <p><html></p> <p><frameset cols="30%,70%"></p> <p><frame src="frame_a.htm"></p> <p><frame src="frame_section.htm#C10"></p> <p></frameset></p> <p></html></p> <p>这个例子显示了两个框架页。其中一个的源是一个文件的指定章节,该章节在文件<span style="font-family:Times New Roman">“frame_section.htm”</span><span style="font-family:宋体">中使用代码</span><span style="font-family:Times New Roman"><a name="C10"></span><span style="font-family:宋体">指定。</span></p> <p>使用导航框架跳转到指定章节</p> <p><html></p> <p><frameset cols="200,*"></p> <p><frame src="frame_linksection.htm"></p> <p><frame src="frame_section.htm" name="showframe"></p> <p></frameset></p> <p></html></p> <p>这个例子显示了两个框架页。左边的导航框架包含了一系列以第二个框架为目标的链接(<span style="font-family:Times New Roman">“frame_linksection.htm”</span><span style="font-family:宋体">),第二个框架显示链接文件(</span><span style="font-family:Times New Roman">“frame_section.htm”</span><span style="font-family:宋体">)。导航框架中的一个链接指向目标文件中的指定章节。文件</span><span style="font-family:Times New Roman">“frame_link”</span><span style="font-family:宋体">中的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">代码是像这样的:</span></p> <p><a href ="frame_section" target ="showframe"><span style="font-family:宋体">没有命名锚的链接</span><span style="font-family:Times New Roman"></a></span></p> <p><a href ="frame_section#C10" target ="showframe"><span style="font-family:宋体">有命名锚的链接</span><span style="font-family:Times New Roman"></a></span></p> <p></p> <p>IFrame</p> <p>纵观时下网站,几乎每页都要放<span style="font-family:Times New Roman">Banner</span><span style="font-family:宋体">,栏目图片,版权等一大堆雷同的东西,这都是为了网站风格统一、广告效应的需要。有没有办法,让这些雷同的东西一次下载后就不用再下载,而只下载那些内容有变化区域的网页内容呢?</span></p> <p>答案是:应用<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">标记!</span></p> <p>Iframe<span style="font-family:宋体">标记的使用 </span></p> <p>提起<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">,可能早已被很多人忘记。不过,说起它的兄弟</span><span style="font-family:Times New Roman">Frame</span><span style="font-family:宋体">大家就不会陌生了。</span><span style="font-family:Times New Roman">Frame</span><span style="font-family:宋体">标记即帧标记,我们所说的多帧结构就是在一个浏览器窗口中显示多个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件。现在,我们遇到一种很现实的情况:如有一个教程,是一节一节地上,每页末尾做一个</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">上一节</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">下一节</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">的链接,除了每节教程内容不同之外,页面其它部分内容都是相同的,如果一页一页地做页面,这似乎太让人厌烦了。如果有一种方法让页面其它地方不变,只将教程做成一页一页的内容页,不含其它内容,在点击上下翻页链接时,只改变教程内容部分,其它保持不变。这样,一是省时,另则以后如果教程有个三长两短的变动,也很方便。更重要的是将那些广告</span><span style="font-family:Times New Roman">Banner</span><span style="font-family:宋体">、栏目列表、导航等几乎每页的都有的东西只下载一次后就不再下载了。 </span></p> <p>Iframe<span style="font-family:宋体">标记,又叫浮动帧标记,你可以用它将一个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档嵌入在一个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">中显示。它不同于</span><span style="font-family:Times New Roman">Frame</span><span style="font-family:宋体">标记,最大的区别是这个标记所引用的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件不是与另外的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件相互独立显示,而是可以直接嵌入在一个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件中,与这个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件内容相互融合,成为一个整体;另外,还可以多次在一个页面内显示同一内容,而不必重复写内容,一个形象的比喻即</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">画中画</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">。</span></p> <p>Iframe<span style="font-family:宋体">标记的使用格式</span></p> <p><Iframe src="URL" width="x" height="x" scrolling="[option]" frameborder="x"></iframe></p> <p>src<span style="font-family:宋体">:文件的路径,既可是</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件,也可以是文本、</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">等;</span></p> <p>width<span style="font-family:宋体">、</span><span style="font-family:Times New Roman">height</span><span style="font-family:宋体">:</span><span style="font-family:Times New Roman">"</span><span style="font-family:宋体">画中画</span><span style="font-family:Times New Roman">"</span><span style="font-family:宋体">区域的宽与高;</span></p> <p>scrolling:<span style="font-family:宋体">当</span><span style="font-family:Times New Roman">src</span><span style="font-family:宋体">的指定的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件在指定的区域不显不完时,滚动选项,如果设置为</span><span style="font-family:Times New Roman">NO</span><span style="font-family:宋体">,则不出现滚动条;如为</span><span style="font-family:Times New Roman">Auto</span><span style="font-family:宋体">:则自动出现滚动条;如为</span><span style="font-family:Times New Roman">Yes</span><span style="font-family:宋体">,则显示</span><span style="font-family:Times New Roman">;</span></p> <p>frameborder<span style="font-family:宋体">:区域边框的宽度,为了让</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">画中画</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">与邻近的内容相融合,常设置为</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋体">。</span></p> <p>比如<span style="font-family:Times New Roman">:</span></p> <p><Iframe src="http://netschool.cpcw.com/homepage" width="250" height="200" scrolling="no" frameborder="0"></iframe></p> <p>父窗体与浮动帧之间的相互控制</p> <p>在脚本语言与对象层次中,包含<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">的窗口我们称之为父窗体,而浮动帧则称为子窗体,弄清这两者的关系很重要,因为要在父窗体中访问子窗体或相反都必须清楚对象层次,才能通过程序来访问并控制窗体。</span></p> <p>在父窗体中访问并控制子窗体中的对象</p> <p>在父窗体中,<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">是子窗体,它是</span><span style="font-family:Times New Roman">document</span><span style="font-family:宋体">对象的一个子对象,可以直接在脚本中访问子窗体中的对象。</span></p> <p>现在就有一个问题:我们怎样来控制这个<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">。当我们给这个</span><span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">设置了</span><span style="font-family:Times New Roman">ID </span><span style="font-family:宋体">属性后,就可通过文档对象模型</span><span style="font-family:Times New Roman">DOM</span><span style="font-family:宋体">对</span><span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">所含的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">进行一系列控制。</span></p> <p>比如在<span style="font-family:Times New Roman">example.htm</span><span style="font-family:宋体">里嵌入</span><span style="font-family:Times New Roman">test.htm</span><span style="font-family:宋体">文件,并控制</span><span style="font-family:Times New Roman">test.htm</span><span style="font-family:宋体">里一些标记对象:</span></p> <p><Iframe src="test.htm" id="test" width="250" height="200" scrolling="no" frameborder="0"></iframe></p> <p>test.htm<span style="font-family:宋体">文件代码为</span><span style="font-family:Times New Roman">:</span></p> <p><html></p> <p><body></p> <p><h1 id="myH1"></p> <p>hello,my boy</p> <p></h1></p> <p></body></p> <p></html></p> <p>如我们要改变<span style="font-family:Times New Roman">ID</span><span style="font-family:宋体">号为</span><span style="font-family:Times New Roman">myH1</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">H1</span><span style="font-family:宋体">标记里的文字为</span><span style="font-family:Times New Roman">hello,my dear</span><span style="font-family:宋体">,则可用</span><span style="font-family:Times New Roman">:</span></p> <p>document.myH1.innerText="hello,my dear"(<span style="font-family:宋体">其中,</span><span style="font-family:Times New Roman">document</span><span style="font-family:宋体">可省</span><span style="font-family:Times New Roman">)</span></p> <p>在<span style="font-family:Times New Roman">example.htm</span><span style="font-family:宋体">文件中,</span><span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">标记对象所指的子窗体与一般的</span><span style="font-family:Times New Roman">DHTML</span><span style="font-family:宋体">对象模型一致,对象访问控制方式也是一样的。</span></p> <p>在子窗体中访问并控制父窗体中对象</p> <p>在子窗体中我们可以通过其<span style="font-family:Times New Roman">parent</span><span style="font-family:宋体">(双亲)对象来访问父窗口中的对象。</span></p> <p>如<span style="font-family:Times New Roman">example.htm</span><span style="font-family:宋体">:</span></p> <p><html></p> <p><body οnclick="alert(tt.myH1.innerHTML)"></p> <p><Iframe name="tt" src="frame1.htm" width="250" height="200"</p> <p>scrolling="no" frameborder="0"></iframe></p> <p><h1 id="myH2"></p> <p>hello,my wife</p> <p></h1></p> <p></body></p> <p></html></p> <p>如果要在<span style="font-family:Times New Roman">frame1.htm</span><span style="font-family:宋体">中访问</span><span style="font-family:Times New Roman">ID</span><span style="font-family:宋体">号为</span><span style="font-family:Times New Roman">myH2</span><span style="font-family:宋体">中的标题文字并将之改为</span><span style="font-family:Times New Roman">"hello,my friend"</span><span style="font-family:宋体">,我们就可以这样写:</span></p> <p>parent.myH2.innerText="hello,my friend"</p> <p>这里<span style="font-family:Times New Roman">parent</span><span style="font-family:宋体">对象就代表当前窗体</span><span style="font-family:Times New Roman">(example.htm</span><span style="font-family:宋体">所在窗体</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">,要在子窗体中访问父窗体中的对象,无一例外都通过</span><span style="font-family:Times New Roman">parent</span><span style="font-family:宋体">对象来进行。</span></p> <p>Iframe<span style="font-family:宋体">虽然内嵌在另一个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件中,但它保持相对的独立,是一个</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">独立王国</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">,在单一</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">中的特性同样适用于浮动帧中。</span></p> <p>试想一下,通过<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">标记,我们可将那些不变的内容以</span><span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">来表示,这样,不必重复写相同的内容,这有点象程序设计中的过程或函数,减省了多少繁琐的手工劳动。另外,至关重要的是,它使页面的修改更为可行,因为,不必因为版式的调整而修改每个页面,你只需修改一个父窗体的版式即可了。</span></p> <p>________________________________________<span style="font-family:宋体">有一点要注意,</span><span style="font-family:Times New Roman">Nestscape</span><span style="font-family:宋体">浏览器不支持</span><span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">标记,但在时下</span><span style="font-family:Times New Roman">IE</span><span style="font-family:宋体">的天下,这似乎也无大碍,广泛采用</span><span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">标记,既是为自己着想,又为网友节省了网费,何乐而不为。</span></p> <p>________________________________________</p> <p></p> <p>内容总结</p> <p>? 熟练掌握表单的创建方法、提交方式以及表单所包含的文档对象</p> <p>? 熟练掌握框架的创建方法、框架大小的调整以及如何在不同框架之间创建链接</p> <p>? 掌握<span style="font-family:Times New Roman">IFrame</span><span style="font-family:宋体">的使用,如何利用</span><span style="font-family:Times New Roman">IFame</span><span style="font-family:宋体">引入其它页面,以及如何在</span><span style="font-family:Times New Roman">IFrame</span><span style="font-family:宋体">和包含</span><span style="font-family:Times New Roman">IFrame</span><span style="font-family:宋体">的页面之间通信</span></p> <p></p> <p>独立实践</p> <p>? 写一个用户登录的<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档</span></p> <p>? 把上一章练习里的几个<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档通过框架组织起来</span></p> <p>? 写一个注册用户信息的<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档。要求有普通用户和管理员用户之分</span></p> <p>? 使用<span style="font-family:Times New Roman">Iframe</span><span style="font-family:宋体">来优化上面结个</span><span style="font-family:Times New Roman">HMTL</span><span style="font-family:宋体">文档</span></p> <p>? 思考:如何改变浏览器的滚动条的样式,如何改变<span style="font-family:Times New Roman">IFrame</span><span style="font-family:宋体">的滚动条的样式</span></p> <p>第二十五章:<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">介绍</span></p> <p>学习目标</p> <p>? 了解<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">是什么以及它的特点</span></p> <p>? 了解<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">与</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的区别</span></p> <p>? 了解<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">基于对象编程的特性、编译方式</span></p> <p>? 了解<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的运行环境</span></p> <p>? 会编写简单的<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">程序</span></p> <p></p> <p>JavaScript<span style="font-family:宋体">语言概况</span></p> <p>JavaScript<span style="font-family:宋体">可以使信息和用户之间不仅只是一种显示和浏览的关系,而是实现了一种实时的、动态的、可交式的表达能力。从而基于</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">静态的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">页面将被可提供动态实时信息,并对客户操作进行反应的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面的取代。</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本正是满足这种需求而产生的语言。它深受广泛用户的喜爱的欢迎。它是众多脚本语言中较为优秀的一种,它与</span><span style="font-family:Times New Roman">WWW</span><span style="font-family:宋体">的结合有效地实现了网络计算和网络计算机的蓝图。无疑</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">家族将占领</span><span style="font-family:Times New Roman">Internet</span><span style="font-family:宋体">网络的主导地位。因此,尽快掌握</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本语言编程方法是我国广大用户日益关心的。</span></p> <p>什么是<span style="font-family:Times New Roman">JavaScript</span></p> <p>JavaScript<span style="font-family:宋体">是一种基于对象</span><span style="font-family:Times New Roman">(Object)</span><span style="font-family:宋体">和事件驱动</span><span style="font-family:Times New Roman">(Event Driven)</span><span style="font-family:宋体">并具有安全性能的脚本语言。使用它的目的是与</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">超文本标记语言、</span><span style="font-family:Times New Roman">Java </span><span style="font-family:宋体">脚本语言(</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">小程序)一起实现在一个</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面中链接多个对象,与</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">语言中实现的。它的出现弥补了</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">语言的缺陷,它是</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">与</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">折衷的选择,具有以下几个基本特点:</span></p> <p>是一种脚本编写语言</p> <p>JavaScript<span style="font-family:宋体">是一种脚本语言,它采用小程序段的方式实现编程。像其它脚本语言一样</span><span style="font-family:Times New Roman">,JavaScript</span><span style="font-family:宋体">同样已是一种解释性语言</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">它提供了一个容易的开发过程。 </span></p> <p>它的基本结构形式与<span style="font-family:Times New Roman">C</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">C++</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">VB</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">Delphi</span><span style="font-family:宋体">十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标识结合在一起,从而方便用户的使用操作。 </span></p> <p>基于对象的语言</p> <p>JavaScript<span style="font-family:宋体">是一种基于对象的语言,同时以可以看作一种面向对象的。这意味着它能运用自己已经创建的对象。因此,许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。 </span></p> <p>简单性</p> <p>JavaScript<span style="font-family:宋体">的简单性主要体现在:首先它是一种基于</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">基本语句和控制流之上的简单而紧凑的设计</span><span style="font-family:Times New Roman">, </span><span style="font-family:宋体">从而对于学习</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">是一种非常好的过渡。其次它的变量类型是采用弱类型,并未使用严格的数据类型。 </span></p> <p>安全性</p> <p>JavaScript<span style="font-family:宋体">是一种安全性语言,它不允许访问本地的硬盘,并不能将数据存入到服务器上,不允许对网络文档进行修改和删除,只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。 </span></p> <p>动态性</p> <p>JavaScript<span style="font-family:宋体">是动态的,它可以直接对用户或客户输入做出响应,无须经过</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务程序。它对用户的反映响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页</span><span style="font-family:Times New Roman">(Home Page)</span><span style="font-family:宋体">中执行了某种操作所产生的动作,就称为</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">事件</span><span style="font-family:Times New Roman">”(Event)</span><span style="font-family:宋体">。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。 </span></p> <p>跨平台性</p> <p>JavaScript<span style="font-family:宋体">是依赖于浏览器本身,与操作环境无关,只要能运行浏览器的计算机,并支持</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的浏览器就可正确执行。从而实现了</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">编写一次</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">走遍天下</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">的梦想。 </span></p> <p>实际上<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">最杰出之处在于可以用小程序做大事。无须有高性能的电脑,软件仅需一个字处理软件和一个浏览器,无须</span><span style="font-family:Times New Roman">WEB</span><span style="font-family:宋体">服务器即可在自己的电脑完成所有的事情。</span></p> <p>综合所述<span style="font-family:Times New Roman">JavaScript </span><span style="font-family:宋体">是一种新的描述语言,它可以被嵌入到 </span><span style="font-family:Times New Roman">HTML </span><span style="font-family:宋体">的文件之中。 </span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">语言可以做到回应使用者的需求事件 </span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">如: </span><span style="font-family:Times New Roman">form </span><span style="font-family:宋体">的输入</span><span style="font-family:Times New Roman">) </span><span style="font-family:宋体">,而不用任何的网路来回传输资料,所以当一位使用者输入一项资料时,它不用经过传给伺服端 </span> <span style="font-family:Times New Roman">(server)</span><span style="font-family:宋体">处理,再传回来的过程,而直接可以被客户端 </span><span style="font-family:Times New Roman">(client) </span><span style="font-family:宋体">的应用程式所处理。</span></p> <p>JavaScript<span style="font-family:宋体">和</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的区别</span></p> <p>虽然<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">与</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">有紧密的联系,但却是两个公司开发的不同的两个产品。</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">是</span><span style="font-family:Times New Roman">SUN</span><span style="font-family:宋体">公司推出的新一代面向对象的程序设计语言,特别适合于</span><span style="font-family:Times New Roman">Internet</span><span style="font-family:宋体">应用程序开发;而</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">是</span><span style="font-family:Times New Roman">Netscape</span><span style="font-family:宋体">公司的产品,其目的是为了扩展</span><span style="font-family:Times New Roman">Netscape Navigator</span><span style="font-family:宋体">功能</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">而开发的一种可以嵌入</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面中的基于对象和事件驱动的解释性语言</span><span style="font-family:Times New Roman">, </span><span style="font-family:宋体">它的前身是</span><span style="font-family:Times New Roman">Live Script</span><span style="font-family:宋体">;而</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的前身是</span><span style="font-family:Times New Roman">Oak</span><span style="font-family:宋体">语言。下面对两种语言间的异同作如下比较:</span></p> <p>基于对象和面向对象</p> <p>Java<span style="font-family:宋体">是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象。 </span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(</span><span style="font-family:Times New Roman">Object Based</span><span style="font-family:宋体">)和事件驱动(</span><span style="font-family:Times New Roman">Event Driver</span><span style="font-family:宋体">)的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用。 </span></p> <p>解释和编译</p> <p>两种语言在其浏览器中所执行的方式不一样。<span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的源代码在传递到客户端执行之前,必须经过编译,因而客户端上必须具有相应平台上的仿真器或解释器,它可以通过编译器或解释器实现独立于某个特定的平台编译代码的束缚。</span></p> <p>JavaScript<span style="font-family:宋体">是一种解释性编程语言,其源代码在发往客户端执行之前不需经过编译,而是将文本格式的字符代码发送给客户编由浏览器解释执行。 </span></p> <p>强变量和弱变量</p> <p>两种语言所采取的变量是不一样的。</p> <p>Java<span style="font-family:宋体">采用强类型变量检查,即所有变量在编译之前必须声明。如</span><span style="font-family:Times New Roman">: </span></p> <p>Integer x; </p> <p>String y;</p> <p>x=1234;</p> <p>x=4321;</p> <p>其中<span style="font-family:Times New Roman">X=1234</span><span style="font-family:宋体">说明是一个整数,</span><span style="font-family:Times New Roman">Y=4321</span><span style="font-family:宋体">说明是一个字符串。</span></p> <p>JavaScript<span style="font-family:宋体">中变量声明,采用其弱类型。即变量在使用前不需声明,而解释器在运行时检查其数据类型,如:</span></p> <p>  <span style="font-family:Times New Roman">x=1234;</span></p> <p>  <span style="font-family:Times New Roman">y</span><span style="font-family:宋体">=</span><span style="font-family:Times New Roman">"4321";</span></p> <p>前者说明<span style="font-family:Times New Roman">x</span><span style="font-family:宋体">为其数值型变量,而后者说明</span><span style="font-family:Times New Roman">y</span><span style="font-family:宋体">为字符型变量。</span></p> <p>代码格式</p> <p>Java<span style="font-family:宋体">是一种与</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">无关的格式,必须通过像</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">中引用外部媒体那么进行装载,其代码以字节代码的形式保存在独立的文档中。</span></p> <p>JavaScript<span style="font-family:宋体">的代码是一种文本字符格式,可以直接嵌入</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档中,并且可动态装载。编写</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档就像编辑文本文件一样方便。 </span></p> <p>嵌入方式</p> <p>在<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档中,两种编程语言的标识不同,</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">使用</span><span style="font-family:Times New Roman"><Script>...</Script></span><span style="font-family:宋体">来标识,而</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">使用</span><span style="font-family:Times New Roman"><applet>...</applet></span><span style="font-family:宋体">来标识。 </span></p> <p>静态联编和动态联编</p> <p>Java<span style="font-family:宋体">采用静态联编,即</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的对象引用必须在编译时的进行,以使编译器能够实现强类型检查。</span></p> <p>JavaScript<span style="font-family:宋体">采用动态联编,即</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的对象引用在运行时进行检查,如不经编译则就无法实现对象引用的检查。 </span></p> <p>实例</p> <p>下面我们通过一个例子,编写第一个<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">程序。通过它可说明</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的脚本是怎样被嵌入到</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档中的。</span></p> <p>test1.html<span style="font-family:宋体">文档:</span></p> <p><html></p> <p><head></p> <p><Script Language="JavaScript"></p> <p>  <span style="font-family:Times New Roman">alert("</span><span style="font-family:宋体">这是第一个</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">例子</span><span style="font-family:Times New Roman">!");</span></p> <p>  <span style="font-family:Times New Roman">alert("</span><span style="font-family:宋体">欢迎你进入</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">世界</span><span style="font-family:Times New Roman">!"); </span></p> <p>  alert("<span style="font-family:宋体">今后我们将共同学习</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">知识!</span><span style="font-family:Times New Roman">");</span></p> <p>  <span style="font-family:Times New Roman"></Script></span></p> <p></head><</p> <p></html></p> <p>在浏览器中打开<span style="font-family:Times New Roman">test1.html</span><span style="font-family:宋体">,怎么没有显示啊?</span></p> <p></p> <p>说明:</p> <p>test.html<span style="font-family:宋体">是</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档,其标识格式为标准的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">格式; </span></p> <p>JavaScript<span style="font-family:宋体">代码由 </span><span style="font-family:Times New Roman"><Script Language ="JavaScript">...</Script></span><span style="font-family:宋体">说明。在标识</span><span style="font-family:Times New Roman"><Script Language ="JavaScript">...</Script></span><span style="font-family:宋体">之间就可加入</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本 </span></p> <p>alert()<span style="font-family:宋体">是</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的窗口对象方法,其功能是弹出一个具有</span><span style="font-family:Times New Roman">OK</span><span style="font-family:宋体">对话框并显示()中的字符串 </span></p> <p>通过<span style="font-family:Times New Roman"><!-- ...//--></span><span style="font-family:宋体">标识说明:若不认识</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">代码的浏览器,则所有在其中的标识均被忽略;若认识,则执行其结果。使用注释这是一个好的编程习惯,它使其他人可以读懂你的语言。 </span></p> <p>JavaScript <span style="font-family:宋体">以 </span><span style="font-family:Times New Roman"></Script> </span><span style="font-family:宋体">标签结束。 </span></p> <p>从上面的实例分析中我们可以看出,编写一个<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">程序确实非常容易的。 </span></p> <p></p> <p>内容总结</p> <p>? JavaScript<span style="font-family:宋体">是一种基于对象</span><span style="font-family:Times New Roman">(Object)</span><span style="font-family:宋体">和事件驱动</span><span style="font-family:Times New Roman">(Event Driven)</span><span style="font-family:宋体">并具有安全性能的脚本语言。</span></p> <p>? JavaScript<span style="font-family:宋体">与</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的区别</span></p> <p>Java 面向对象 编译 强变量 applet 静态联编</p> <p>jscript 基于对象 解释 弱变量 直接嵌入 动态联编</p> <p></p> <p>独立实战</p> <p>? 写一个简单的<span style="font-family:Times New Roman">javasript</span><span style="font-family:宋体">程序,弹出警告窗口,显示</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">欢迎来到</span><span style="font-family:Times New Roman">javascript</span><span style="font-family:宋体">世界</span><span style="font-family:Times New Roman">”;</span></p> <p>? 把下列语句加到网页中试试</p> <p><Script Language="JavaScript"></p> <p>document.write("<h1>Hello World!</h1>")</p> <p></Script></p> <p>? 上网搜索如何用<span style="font-family:Times New Roman">javascript</span><span style="font-family:宋体">显示当前的日期和弹出一个对话框</span></p> <p>? 简述<span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">之间的区别</span></p> <p>? 什么是<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">有什么好处?</span></p> <p>第二十六章:<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">基础</span></p> <p>学习目标</p> <p>? 了解并掌握<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中常用的基本数据类型、变量、常量、操作运算符</span></p> <p>? 掌握<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中所有的程序流</span></p> <p>? 了解并掌握<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中的常用函数,包括字符串函数、日期函数等</span></p> <p>? 了解<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的事件机制,并针对事件编写事件处理程序</span></p> <p></p> <p>基本结构</p> <p>JavaScript<span style="font-family:宋体">提供脚本语言的编程与</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">非常相似,并提供了功能强大的类库。对于已经具备</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">语言的人来说,学习</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本语言是一件非常轻松愉快的事。 </span></p> <p>JavaScript<span style="font-family:宋体">代码的加入</span></p> <p><HTML></p> <p><Head></p> <p><Script Language="JavaScript"></p> <p>document. Write("<span style="font-family:宋体">这是</span><span style="font-family:Times New Roman">ITJOB</span><span style="font-family:宋体">学校</span><span style="font-family:Times New Roman">");</span></p> <p>document. close();</p> <p></Script></p> <p></Head></p> <p></HTML></p> <p>说明<span style="font-family:Times New Roman">:</span></p> <p>Document. write()<span style="font-family:宋体">是文档对象的输出函数,其功能是将括号中的字符或变量值输出到窗口;</span><span style="font-family:Times New Roman">document. close()</span><span style="font-family:宋体">是将输出关闭。</span></p> <p>可将<span style="font-family:Times New Roman"><Script>...</Script></span><span style="font-family:宋体">标识放入</span><span style="font-family:Times New Roman"><head>.. </Head></span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman"><Body> ...</Body></span><span style="font-family:宋体">之间。将</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">标识放置</span><span style="font-family:Times New Roman"><Head>... </Head></span><span style="font-family:宋体">在头部之间,使之在主页和其余部分代码之前装载,从而可使代码的功能更强大;可以将</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">标识放置在</span><span style="font-family:Times New Roman"><Body>... </Body></span><span style="font-family:宋体">主体之间以实现某些部分动态地创建文档。</span></p> <p>基本数据类型</p> <p>JavaScript<span style="font-family:宋体">脚本语言同其它语言一样,有它自身的基本数据类型、表达式和算术运算符以及程序的基本框架结构。</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中四种基本的数据类型:数值(整数和实数)、字符串型(用</span><span style="font-family:Times New Roman">“”</span><span style="font-family:宋体">号或</span><span style="font-family:Times New Roman">‘’</span><span style="font-family:宋体">括起来的字符或数值)、布尔型(使</span><span style="font-family:Times New Roman">True</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">False</span><span style="font-family:宋体">表示)和空值。在</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的基本类型中的数据可以是常量,也可以变量。由于</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">采用弱类型的形式,因而一个数据的变量或常量不必首先声明,而是在使用或赋值时确定其数据的类型的。当然也可以先声明该数据的类型,它是通过在赋值时自动说明其数据类型的。</span></p> <p>常量</p> <p>整型常量</p> <p>JavaScript<span style="font-family:宋体">的常量通常又称字面常量,它是不能改变的数据。其整型常量可以使用十六进制、八进制和十进制表示其值。</span></p> <p>实型常量</p> <p>实型常量是由整数部分加小数部分表示,如<span style="font-family:Times New Roman">12.32</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">193.98 </span><span style="font-family:宋体">。可以使用科学或标准方法表示:</span><span style="font-family:Times New Roman">5E7</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">4e5</span><span style="font-family:宋体">等。</span></p> <p>布尔值</p> <p>布尔常量只有两种状态:<span style="font-family:Times New Roman">True</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">False</span><span style="font-family:宋体">。它主要用来说明或代表一种状态或标志,以说明操作流程。它与C++是不一样的</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">C++可以用1或0表示其状态</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">而</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">只能用</span><span style="font-family:Times New Roman">True</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">False</span><span style="font-family:宋体">表示其状态。</span></p> <p>字符型常量</p> <p>使用单引号(<span style="font-family:Times New Roman">‘</span><span style="font-family:宋体">)或双引号(</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">)括起来的一个或几个字符。如 </span><span style="font-family:Times New Roman">"This is a book of JavaScript "</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">"3245"</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">"ewrt234234" </span><span style="font-family:宋体">等。</span></p> <p>空值</p> <p>JavaScript<span style="font-family:宋体">中有一个空值</span><span style="font-family:Times New Roman">null,</span><span style="font-family:宋体">表示什么也没有。如试图引用没有定义的变量</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">则返回一个</span><span style="font-family:Times New Roman">Null</span><span style="font-family:宋体">值。</span></p> <p>特殊字符</p> <p>同C语言一样,<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中同样以有些以反斜杠(/)开头的不可显示的特殊字符。通常称为控制字符。</span></p> <p>变量</p> <p>变量的主要作用是存取数据、提供存放信息的容器。对于变量必须明确变量的命名、变量的类型、变量的声明及其变量的作用域。</p> <p>变量的命名</p> <p>JavaScript<span style="font-family:宋体">中的变量命名同其计算机语言非常相似,这里要注意以下两点:</span></p> <p>? 必须是一个有效的变量,即变量以字母开头,中间可以出现数字如<span style="font-family:Times New Roman">test1</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">text2</span><span style="font-family:宋体">等。除下划线(</span><span style="font-family:Times New Roman">_</span><span style="font-family:宋体">)作为连字符外,变量名称不能有空格、(+)、(-)、(,)或其它符号。</span></p> <p>? 不能使用<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中的关键字作为变量。</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中定义了40多个类键字,这些关键是</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部使用的,不能作为变量的名称。如</span><span style="font-family:Times New Roman">var</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">int</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">double</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">true</span><span style="font-family:宋体">不能作为变量的名称。 </span></p> <p>在对变量命名时,最好把变量的意义与其代表的意思对应起来,以免出现错误。</p> <p>变量的类型</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中,变量可以用命令</span><span style="font-family:Times New Roman">Var</span><span style="font-family:宋体">作声明</span><span style="font-family:Times New Roman">:</span></p> <p>var mytest;</p> <p>该例子定义了一个<span style="font-family:Times New Roman">mytest</span><span style="font-family:宋体">变量。但没有赋予它的值。</span></p> <p>Var mytest=”This is a book”</p> <p>该例子定义了一个<span style="font-family:Times New Roman">mytest</span><span style="font-family:宋体">变量</span><span style="font-family:Times New Roman">, </span><span style="font-family:宋体">并赋值。</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中,变量不声明,而在使用时再根据数据的类型来确定其变量的类型。</span></p> <p>如:</p> <p>x=100 </p> <p>y="125" </p> <p>xy= True </p> <p>cost=19.5<span style="font-family:宋体">等。</span></p> <p>其中<span style="font-family:Times New Roman">x</span><span style="font-family:宋体">整数,</span><span style="font-family:Times New Roman">y</span><span style="font-family:宋体">为字符串,</span><span style="font-family:Times New Roman">xy</span><span style="font-family:宋体">为布尔型,</span><span style="font-family:Times New Roman">cost</span><span style="font-family:宋体">为实型。</span></p> <p>变量的声明及其作用域</p> <p>JavaScript<span style="font-family:宋体">变量可以在使用前声明,并可赋值。通过使用</span><span style="font-family:Times New Roman">var</span><span style="font-family:宋体">关键字对变量声明。对变量声明的最大好处就是能及时发现代码中的错误;因为</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">是采用动态编译的,而动态编译是不易发现代码中的错误,特别是变量命名的方面。</span></p> <p>对于变量还有一个重要性<span style="font-family:Times New Roman">──</span><span style="font-family:宋体">那就是变量的作用域。在</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中同样有全局变量和局部变量。全局变量是定义在所有函数体之外,其作用范围是整个函数;而局部变量是定义在函数体之内,只对其该函数是可见的,而对其它函数则是不可见的。</span></p> <p>表达式和运算符</p> <p>表达式</p> <p>在定义完变量后,就可以对它们进行赋值、改变、计算等一系列操作,这一过程用表达式来完成,表达式是变量、常量、布尔及运算符的集合,表达式可以分为算术表述式、字串表达式、赋值表达式以及布尔表达式等。</p> <p>运算符</p> <p>运算符是完成操作的一系列符号,在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中有算术运算符,如+、</span><span style="font-family:Times New Roman">-</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">*</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">等;</span></p> <p>有比较运算符如<span style="font-family:Times New Roman">!</span><span style="font-family:宋体">=、==等</span><span style="font-family:Times New Roman">; </span><span style="font-family:宋体">有逻辑布尔运算符如!(取反)、</span><span style="font-family:Times New Roman">|</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">||; </span><span style="font-family:宋体">有字串运算如+ 、+=等。</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">主要有双目运算符和单目运算符。其双目运算符由下列组成:</span></p> <p>操作数1 运算符 操作数2</p> <p>即由两个操作数和一个运算符组成。如<span style="font-family:Times New Roman">50</span><span style="font-family:宋体">+</span><span style="font-family:Times New Roman">40</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">"This"+"that"</span><span style="font-family:宋体">等。单目运算符,只需一个操作数,其运算符可在前或后。</span></p> <p>算术运算符</p> <p>JavaScript<span style="font-family:宋体">中的算术运算符有单目运算符和双目运算符。</span></p> <p>双目运算符</p> <p>+<span style="font-family:宋体">(加) 、</span><span style="font-family:Times New Roman">-</span><span style="font-family:宋体">(减)、 </span><span style="font-family:Times New Roman">*</span><span style="font-family:宋体">(乘)、 </span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">(除)、 </span><span style="font-family:Times New Roman">%</span><span style="font-family:宋体">(取模) 、</span><span style="font-family:Times New Roman">|</span><span style="font-family:宋体">(按位或)、</span><span style="font-family:Times New Roman">&(</span><span style="font-family:宋体">按位与</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman"><<</span><span style="font-family:宋体">(左移)、 </span><span style="font-family:Times New Roman">>></span><span style="font-family:宋体">(右移)、 </span><span style="font-family:Times New Roman">>>></span><span style="font-family:宋体">(右移,零填充)。</span></p> <p>单目运算符</p> <p>-<span style="font-family:宋体">(取反)、</span><span style="font-family:Times New Roman">~</span><span style="font-family:宋体">(取补)、</span><span style="font-family:Times New Roman">++</span><span style="font-family:宋体">(递加</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">)、</span><span style="font-family:Times New Roman">--</span><span style="font-family:宋体">(递减</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">)。</span></p> <p>比较运算符</p> <p>比较运算符它的基本操作过程是,首先对它的操作数进行比较,尔后再返回一个<span style="font-family:Times New Roman">true</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">False</span><span style="font-family:宋体">值,有8个比较运算符</span><span style="font-family:Times New Roman">:</span></p> <p><(<span style="font-family:宋体">小于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">>(</span><span style="font-family:宋体">大于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman"><=(</span><span style="font-family:宋体">小于等于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">>=(</span><span style="font-family:宋体">大于等于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">==(</span><span style="font-family:宋体">等于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">!=(</span><span style="font-family:宋体">不等于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">。</span></p> <p>布尔逻辑运算符</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中增加了几个布尔逻辑运算符</span><span style="font-family:Times New Roman">:</span></p> <p>!<span style="font-family:宋体">(取反</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">&=</span><span style="font-family:宋体">(与之后赋值)、 </span><span style="font-family:Times New Roman">&</span><span style="font-family:宋体">(逻辑与)、 </span><span style="font-family:Times New Roman">|=</span><span style="font-family:宋体">(或之后赋值)、 </span><span style="font-family:Times New Roman">|</span><span style="font-family:宋体">(逻辑或)、 </span><span style="font-family:Times New Roman">^=</span><span style="font-family:宋体">(异或之后赋值)、 </span><span style="font-family:Times New Roman">^</span><span style="font-family:宋体">(逻辑异或)、 </span><span style="font-family:Times New Roman">?:</span><span style="font-family:宋体">(三目操作符)、</span><span style="font-family:Times New Roman">||</span><span style="font-family:宋体">(或)、</span><span style="font-family:Times New Roman">==(</span><span style="font-family:宋体">等于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">|=(</span><span style="font-family:宋体">不等于</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">。</span></p> <p>其中三目操作符主要格式如下:</p> <p>操作数?结果1:结果2</p> <p>若操作数的结果为真,则表述式的结果为结果1,否则为结果2。</p> <p></p> <p>实例</p> <p>下面是一个跑马灯效果的<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">文档。</span></p> <p>Test2_1.html</p> <p><html></p> <p><head></p> <p><script Language="JavaScript"></p> <p>var msg="<span style="font-family:宋体">这是一个跑马灯效果的</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">文档</span><span style="font-family:Times New Roman">";</span></p> <p>var interval = 100;</p> <p>var spacelen = 120;</p> <p>var space10=" ";</p> <p>var seq=0;</p> <p>function Scroll() {</p> <p>len = msg.length;</p> <p>window.status = msg.substring(0, seq+1);</p> <p>seq++;</p> <p>if ( seq >= len ) { </p> <p>seq = spacelen; </p> <p>window.setTimeout("Scroll2();", interval );</p> <p>}</p> <p>else</p> <p>window.setTimeout("Scroll();", interval );</p> <p>} </p> <p>function Scroll2() {</p> <p>var out="";</p> <p>for (i=1; i<=spacelen/space10.length; i++) </p> <p>out += space10;</p> <p>out = out + msg;</p> <p>len=out.length;</p> <p>window.status=out.substring(seq, len);</p> <p>seq++;</p> <p>if ( seq >= len ) { seq = 0; };</p> <p>window.setTimeout("Scroll2();", interval );</p> <p>} </p> <p>Scroll();</p> <p></script></p> <p><body></p> <p></body></p> <p></html></p> <p></p> <p>JavaScript<span style="font-family:宋体">程序构成</span></p> <p>JavaScript<span style="font-family:宋体">脚本语言的基本构成是由控制语句、函数、对象、方法、属性等</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">来实现编程的。 </span></p> <p>程序控制流</p> <p>在任何一种语言中,程序控制流是必须的,它能使得整个程序减小混乱,使之顺利按其一定的方式执行。下面是<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">常用的程序控制流结构及语句</span><span style="font-family:Times New Roman">: </span></p> <p>if<span style="font-family:宋体">条件语句</span></p> <p>基本格式</p> <p>if<span style="font-family:宋体">(表述式)</span></p> <p>语句段1;</p> <p>......</p> <p>else</p> <p>语句段2;</p> <p>.....</p> <p>功能:若表达式为<span style="font-family:Times New Roman">true</span><span style="font-family:宋体">,则执行语句段1;否则执行语句段2。</span></p> <p>说明:</p> <p>if -else <span style="font-family:宋体">语句是</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中最基本的控制语句,通过它可以改变语句的执行顺序。 </span></p> <p>表达式中必须使用关系语句,来实现判断,它是作为一个布尔值来估算的。 </p> <p>它将零和非零的数分别转化成<span style="font-family:Times New Roman">false</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">true</span><span style="font-family:宋体">。 </span></p> <p>若<span style="font-family:Times New Roman">if</span><span style="font-family:宋体">后的语句有多行,则必须使用花括号将其括起来。</span></p> <p>另外,<span style="font-family:Times New Roman">if</span><span style="font-family:宋体">语句可以嵌套使用。</span></p> <p>for<span style="font-family:宋体">循环语句</span></p> <p>基本格式</p> <p>for<span style="font-family:宋体">(初始化;条件;增量)</span></p> <p>语句集;</p> <p>功能:实现条件循环,当条件成立时,执行语句集,否则跳出循环体。</p> <p>说明:</p> <p>初始化参数告诉循环的开始位置,必须赋予变量的初值; </p> <p>条件:是用于判别循环停止时的条件。若条件满足,则执行循环体,否则跳出。 </p> <p>增量:主要定义循环控制变量在每次循环时按什么方式变化。 </p> <p>三个主要语句之间,必须使用逗号分隔。 </p> <p>while<span style="font-family:宋体">循环</span></p> <p>基本格式</p> <p>while<span style="font-family:宋体">(条件)</span></p> <p>语句集;</p> <p>该语句与<span style="font-family:Times New Roman">For</span><span style="font-family:宋体">语句一样,当条件为真时,重复循环,否则退出循环。 </span></p> <p>break<span style="font-family:宋体">和</span><span style="font-family:Times New Roman">continue</span><span style="font-family:宋体">语句</span></p> <p>与<span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">语言相同,使用</span><span style="font-family:Times New Roman">break</span><span style="font-family:宋体">语句使得循环从</span><span style="font-family:Times New Roman">For</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">while</span><span style="font-family:宋体">中跳出,</span><span style="font-family:Times New Roman">continue</span><span style="font-family:宋体">使得跳过循环内剩余的语句而进入下一次循环。</span></p> <p>函数</p> <p>函数为程序设计人员提供了一个丰常方便的能力。通常在进行一个复杂的程序设计时,总是根据所要完成的功能,将程序划分为一些相对独立的部分,每部分编写一个函数。从而,使各部分充分独立,任务单一,程序清晰,易懂、易读、易维护。<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">函数可以封装那些在程序中可能要多次用到的模块。并可作为事件驱动的结果而调用的程序。从而实现一个函数把它与事件驱动相关联。这是与其它语言不样的地方。</span></p> <p>JavaScript<span style="font-family:宋体">函数定义</span></p> <p>function <span style="font-family:宋体">函数名 (参数</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">变元)</span><span style="font-family:Times New Roman">{</span></p> <p>函数体<span style="font-family:Times New Roman">;</span></p> <p>return <span style="font-family:宋体">表达式</span><span style="font-family:Times New Roman">;</span></p> <p>}</p> <p>说明:</p> <p> 当调用函数时<span style="font-family:Times New Roman">,</span><span style="font-family:宋体">所用变量均可作为变元传递。</span></p> <p> 函数由关键字<span style="font-family:Times New Roman">Function</span><span style="font-family:宋体">定义。</span></p> <p> 函数名:定义自己函数的名字。</p> <p> 参数表,是传递给函数使用或操作的值,其值可以是常量,变量或其它表达式。</p> <p> 通过指定函数名(实参)来调用一个函数。</p> <p> 必须使用<span style="font-family:Times New Roman">Return</span><span style="font-family:宋体">将值返回。</span></p> <p> 函数名对大小写是敏感的。</p> <p>函数中的形式参数</p> <p>在函数的定义中,我们看到函数名后有参数表,这些参数变量可能是一个或几个。那么怎样才能确定参数变量的个数呢?在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中可通过</span><span style="font-family:Times New Roman">arguments.length</span><span style="font-family:宋体">来检查参数的个数。例:</span></p> <p>Function function_Name(exp1,exp2,exp3,exp4)</p> <p>{</p> <p>Number =function_Name.arguments.length;</p> <p>if (Number>1<span style="font-family:宋体">)</span></p> <p>document.wrile(exp2);</p> <p>if (Number>2)</p> <p>document.write(exp3);</p> <p>if(Number>3)</p> <p>document.write(exp4);</p> <p>...</p> <p>}</p> <p>事件驱动及事件处理</p> <p>基本概念</p> <p>JavaScript<span style="font-family:宋体">是基于对象</span><span style="font-family:Times New Roman">(object-based)</span><span style="font-family:宋体">的语言。这与</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">不同</span><span style="font-family:Times New Roman">,Java</span><span style="font-family:宋体">是面向对象的语言。而基于对象的基本特征,就是采用事件驱动</span><span style="font-family:Times New Roman">(event-driven)</span><span style="font-family:宋体">。它是在图形界面的环境下,使得一切输入变的简单化。通常鼠标或热键的动作我们称之为事件(</span><span style="font-family:Times New Roman">Event</span><span style="font-family:宋体">),而由鼠标或热键引发的一连串程序的动作,称之为事件驱动(</span><span style="font-family:Times New Roman">Event Driver</span><span style="font-family:宋体">)。而对事件进行处理程序或函数,我们称之为事件处理程序(</span><span style="font-family:Times New Roman">Event Handler</span><span style="font-family:宋体">)。</span></p> <p>事件处理程序</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中对象事件的处理通常由函数</span><span style="font-family:Times New Roman">(Function)</span><span style="font-family:宋体">担任。其基本格式与函数全部一样,可以将前面所介绍的所有函数作为事件处理程序。格式如下:</span></p> <p>Function <span style="font-family:宋体">事件处理名(参数表)</span><span style="font-family:Times New Roman">{</span></p> <p>事件处理语句集;</p> <p>……</p> <p>}</p> <p>事件驱动</p> <p>JavaScript<span style="font-family:宋体">事件驱动中的事件是通过鼠标或热键的动作引发的。它主要有以下几个事件:</span></p> <p>单击事件<span style="font-family:Times New Roman">onClick</span></p> <p>当用户单击鼠标按钮时,产生<span style="font-family:Times New Roman">onClick</span><span style="font-family:宋体">事件。同时</span><span style="font-family:Times New Roman">onClick</span><span style="font-family:宋体">指定的事件处理程序或代码将被调用执行。通常在下列基本对象中产生:</span></p> <p>? button<span style="font-family:宋体">(按钮对象)</span></p> <p>? checkbox<span style="font-family:宋体">(复选框)或(检查列表框) </span></p> <p>? radio <span style="font-family:宋体">(单选钮) </span></p> <p>? reset buttons<span style="font-family:宋体">(重要按钮) </span></p> <p>? submit buttons<span style="font-family:宋体">(提交按钮) </span></p> <p>例:可通过下列按钮激活<span style="font-family:Times New Roman">change()</span><span style="font-family:宋体">文件:</span></p> <p><Form> <Input type="button" Value="" onClick="change()"></Form></p> <p>在<span style="font-family:Times New Roman">onClick</span><span style="font-family:宋体">等号后,可以使用自己编写的函数作为事件处理程序,也可以使用</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中内部的函数。还可以直接使用</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的代码等。例: </span></p> <p><Input type="button" value=" " οnclick=alert("<span style="font-family:宋体">这是一个例子</span><span style="font-family:Times New Roman">");</span></p> <p>onChange<span style="font-family:宋体">改变事件</span></p> <p>当利用<span style="font-family:Times New Roman">text</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">textarea</span><span style="font-family:宋体">元素输入字符值改变时发该事件,同时当在</span><span style="font-family:Times New Roman">select</span><span style="font-family:宋体">表格项中一个选项状态改变后也会引发该事件。</span></p> <p>例: </p> <p><Form></p> <p><Input type="text" name="test" value="test"</p> <p>onCharge="check(this.test)"></p> <p></Form></p> <p>选中事件<span style="font-family:Times New Roman">onSelect</span></p> <p>当<span style="font-family:Times New Roman">Text</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">Textarea</span><span style="font-family:宋体">对象中的文字被选中后,引发该事件。</span></p> <p>获得焦点事件<span style="font-family:Times New Roman">onFocus</span></p> <p>当用户单击<span style="font-family:Times New Roman">Text</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">textarea</span><span style="font-family:宋体">以及</span><span style="font-family:Times New Roman">select</span><span style="font-family:宋体">对象时,产生该事件。此时该对象成为前台对象。</span></p> <p>失去焦点<span style="font-family:Times New Roman">onBlur</span></p> <p>当<span style="font-family:Times New Roman">text</span><span style="font-family:宋体">对象或</span><span style="font-family:Times New Roman">textarea</span><span style="font-family:宋体">对象以及</span><span style="font-family:Times New Roman">select</span><span style="font-family:宋体">对象不再拥有焦点、而退到后台时,引发该文件,他与</span><span style="font-family:Times New Roman">onFocas</span><span style="font-family:宋体">事件是一个对应的关系。</span></p> <p>载入文件<span style="font-family:Times New Roman">onLoad</span></p> <p>当文档载入时,产生该事件。<span style="font-family:Times New Roman">onLoad</span><span style="font-family:宋体">一个作用就是在首次载入一个文档时检测</span><span style="font-family:Times New Roman">cookie</span><span style="font-family:宋体">的值,并用一个变量为其赋值,使它可以被源代码使用。</span></p> <p>卸载文件<span style="font-family:Times New Roman">onUnload</span></p> <p>当<span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面退出时引发</span><span style="font-family:Times New Roman">onUnload</span><span style="font-family:宋体">事件,并可更新</span><span style="font-family:Times New Roman">Cookie</span><span style="font-family:宋体">的状态。</span></p> <p></p> <p>实例</p> <p>下例程序是一个自动装载和自动卸载的例子。即当装入<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档时调用</span><span style="font-family:Times New Roman">loadform()</span><span style="font-family:宋体">函数</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">而退出该文档进入另一</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档时则首先调用</span><span style="font-family:Times New Roman">unloadform()</span><span style="font-family:宋体">函数</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">确认后方可进入。 </span></p> <p><HTML></p> <p><HEAD></p> <p><script Language="JavaScript"></p> <p><!--</p> <p>function loadform(){</p> <p>alert("<span style="font-family:宋体">这是一个自动装载例子</span><span style="font-family:Times New Roman">!");</span></p> <p>}</p> <p>function unloadform(){</p> <p>alert("<span style="font-family:宋体">这是一个卸载例子</span><span style="font-family:Times New Roman">!");</span></p> <p>}</p> <p>//--></p> <p></Script></p> <p></HEAD></p> <p><BODY OnLoad="loadform()" OnUnload="unloadform()"></p> <p><a href="test.htm"><span style="font-family:宋体">调用</span><span style="font-family:Times New Roman"></a></span></p> <p></BODY></HTML></p> <p></p> <p>内容总结</p> <p>? JavaScript<span style="font-family:宋体">的程序结构:可将</span><span style="font-family:Times New Roman"><Script>...</Script></span><span style="font-family:宋体">标识放入</span><span style="font-family:Times New Roman"><head>.. </Head></span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman"><Body> ...</Body></span><span style="font-family:宋体">之间。将</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">标识放置</span><span style="font-family:Times New Roman"><Head></span></p> <p>? JavaScript<span style="font-family:宋体">的四种基本数据类型:数值(整数和实数)、字符串型(用</span><span style="font-family:Times New Roman">“”</span><span style="font-family:宋体">号或</span><span style="font-family:Times New Roman">‘’</span><span style="font-family:宋体">括起来的字符或数值)、布尔型(使</span><span style="font-family:Times New Roman">True</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">False</span><span style="font-family:宋体">表示)和空值。</span></p> <p>? 变量的声明及其作用域<span style="font-family:Times New Roman">: </span><span style="font-family:宋体">声明用</span><span style="font-family:Times New Roman">var </span><span style="font-family:宋体">变量名;变量的作用域分全局和局部。全局变量是定义在所有函数体之外,其作用范围是整个函数;而局部变量是定义在函数体之内,只对其该函数是可见的,而对其它函数则是不可见的。</span></p> <p>? 运算符:<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中有算术运算符,如+、</span><span style="font-family:Times New Roman">-</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">*</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">等;有比较运算符如</span><span style="font-family:Times New Roman">!</span><span style="font-family:宋体">=、==等</span><span style="font-family:Times New Roman">; </span><span style="font-family:宋体">有逻辑布尔运算符如!(取反)、</span><span style="font-family:Times New Roman">|</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">||; </span><span style="font-family:宋体">有字串运算如+ 、+=等。</span></p> <p>? JavaScript<span style="font-family:宋体">脚本语言的基本构成是由流程控制语句、函数、对象、方法、属性等组成。</span></p> <p>? 事件驱动及事件处理:事件(<span style="font-family:Times New Roman">Event</span><span style="font-family:宋体">),由鼠标或热键引发的一连串程序的动作,事件驱动(</span><span style="font-family:Times New Roman">Event Driver</span><span style="font-family:宋体">)。对事件进行处理程序或函数,叫事件处理程序(</span><span style="font-family:Times New Roman">Event Handler</span><span style="font-family:宋体">)</span></p> <p>? 常见的事件:<span style="font-family:Times New Roman">onClick onChange onBlur onLoad onUnload</span></p> <p></p> <p>独立实践</p> <p>? 建立<span style="font-family:Times New Roman">javascript</span><span style="font-family:宋体">的两种方式?</span></p> <p>? js<span style="font-family:宋体">的数据类型有哪些 </span><span style="font-family:Times New Roman">''</span><span style="font-family:宋体">与</span><span style="font-family:Times New Roman">""</span><span style="font-family:宋体">有什么区别?</span></p> <p>? js<span style="font-family:宋体">变量命名区分大小写吗 函数名区分大小写吗?</span></p> <p>? 写<span style="font-family:Times New Roman">2</span><span style="font-family:宋体">个</span><span style="font-family:Times New Roman">javascript</span><span style="font-family:宋体">函数</span><span style="font-family:Times New Roman">, loadAlert</span><span style="font-family:宋体">函数在文档加载时提示你的文档已经加载</span><span style="font-family:Times New Roman">, unloadAlert</span><span style="font-family:宋体">在浏览器关闭时提示你的文档已经卸载;</span></p> <p>? 演示跑马灯的例子</p> <p>第二十七章:<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">进阶</span></p> <p>学习目标</p> <p>? 掌握<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中基于对象的常用内部对象属性、方法的使用</span></p> <p>? 掌握自定义对象的创建方法,以及数组的使用方法</p> <p>? 了解并熟悉<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部对象系统</span></p> <p>? 熟悉并利用窗口对象的输入输出操作</p> <p></p> <p>基于对象的<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">语言</span></p> <p>JavaScript<span style="font-family:宋体">语言是基于对象的(</span><span style="font-family:Times New Roman">Object-Based</span><span style="font-family:宋体">),而不是面向对象的(</span><span style="font-family:Times New Roman">object-oriented</span><span style="font-family:宋体">)。之所以说它是一门基于对象的语言,主要是因为它没有提供象抽象、继承、重载等有关面向对象语言的许多功能。而把其它语言所创建的复杂对象统一起来,从而形成一个非常强大的对象系统。</span></p> <p>虽然<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">语言是一门基于对象的,但它还是具有一些面向对象的基本特征。它可以根据需要创建自己的对象,从而进一步扩大</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">的应用范围,增强编写功能强大的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">文本文件。</span></p> <p>对象的基础知识</p> <p>对象的基本结构</p> <p>JavaScript<span style="font-family:宋体">中的对象是由属性</span><span style="font-family:Times New Roman">(properties)</span><span style="font-family:宋体">和方法</span><span style="font-family:Times New Roman">(methods)</span><span style="font-family:宋体">两个基本的元素的构成的。前者是对象在实施其所需要行为的过程中,实现信息的装载单位,从而与变量相关联;后者是指对象能够按照设计者的意图而被执行,从而与特定的函数相关联。</span></p> <p>引用对象的途径</p> <p>一个对象要真正地被使用,可采用以下几种方式获得: </p> <p>? 引用<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部对象</span></p> <p>? 由浏览器环境中提供</p> <p>? 创建新对象</p> <p>这就是说一个对象在被引用之前,这个对象必须存在,否则引用将毫无意义,而出现错误信息。</p> <p>有关对象操作语句 </p> <p>JavaScript<span style="font-family:宋体">不是一个纯面向对象的语言,它设有提供面向对象语言的许多功能,因此</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">设计者之所以把它你</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">基于对象</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">而不是面向对象的语言,在</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中提供了几个用于操作对象的语句和关键词及运算符。 </span></p> <p>For...in<span style="font-family:宋体">语句</span></p> <p>格式如下:</p> <p>For<span style="font-family:宋体">(对象属性名 </span><span style="font-family:Times New Roman">in </span><span style="font-family:宋体">已知对象名)</span></p> <p>说明: </p> <p>该语句的功能是用于对已知对象的所有属性进行操作的控制循环。它将一个已知对象的所有属性反复赋给一个变量;而不是使用计数器来实现的。</p> <p>该语句的优点就是无需知道对象中属性的个数即可进行操作。</p> <p>例:下列函数是显示数组中的内容:</p> <p>Function showData(object) </p> <p>for (var X=0; X<30;X++)</p> <p>document.write(object[i])<span style="font-family:宋体">;</span></p> <p>该函数是通过数组下标顺序值,来访问每个对象的属性,使用这种方式首先必须知道数组的下标值,否则若超出范围,则就会发生错误。而使<span style="font-family:Times New Roman">For...in</span><span style="font-family:宋体">语句,则根本不需要知道对象属性的个数,如下面的例子:</span></p> <p>Function showData(object) </p> <p>for(var prop in object)</p> <p>document.write(object[prop])<span style="font-family:宋体">;</span></p> <p>使用该函数时,在循环体中,<span style="font-family:Times New Roman">For</span><span style="font-family:宋体">自动将的属性取出来,直到最后为此。 </span></p> <p>this<span style="font-family:宋体">关键词</span></p> <p>this<span style="font-family:宋体">是对当前对象的引用,在</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">由于对象的引用是多层次,多方位的,往往一个对象的引用又需要对另一个对象的引用,而另一个对象有可能又要引用另一个对象,这样有可能造成混乱,最后自己不知道现在引用的那一个对象,为此</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">提供了一个用于将对象指定当前对象的语句</span><span style="font-family:Times New Roman">this</span><span style="font-family:宋体">。 </span></p> <p>new<span style="font-family:宋体">运算符</span></p> <p>虽然在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中对象的功能已经是非常强大的了。但更强大的是设计人员可以按照需求来创建自己的对象,以满足某一特定的要求。使用</span><span style="font-family:Times New Roman">New</span><span style="font-family:宋体">运算符可以创建一个新的对象。其创建对象使用如下格式:</span></p> <p>Newobject=new Object(Parameters table);</p> <p>其中<span style="font-family:Times New Roman">Newobject</span><span style="font-family:宋体">创建的新对象:</span><span style="font-family:Times New Roman">object</span><span style="font-family:宋体">是已经存在的对象; </span><span style="font-family:Times New Roman">parameters table</span><span style="font-family:宋体">参数表;</span><span style="font-family:Times New Roman">new</span><span style="font-family:宋体">是</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中的命令语句。</span></p> <p>如创建一个日期新对象</p> <p>newData=new Data()</p> <p>birthday=new Data(December 12.1998)</p> <p>之后就可使<span style="font-family:Times New Roman">NewData</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">birthday</span><span style="font-family:宋体">作为一个新的日期对象了。</span></p> <p>对象属性的引用</p> <p>对象属性的引用可由下列方式之一实现: </p> <p>使用点(<span style="font-family:Times New Roman">.</span><span style="font-family:宋体">)运算符</span></p> <p>university.Name=“<span style="font-family:宋体">云南省</span><span style="font-family:Times New Roman">”</span></p> <p>university.city=“<span style="font-family:宋体">昆明市</span><span style="font-family:Times New Roman">”</span></p> <p>university.Date="1999"</p> <p>其中<span style="font-family:Times New Roman">university</span><span style="font-family:宋体">是一个已经存在的对象,</span><span style="font-family:Times New Roman">Name</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">City</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">Date</span><span style="font-family:宋体">是它的三个属性,并通过操作对其赋值。</span></p> <p>通过对象的下标实现引用</p> <p>university[0]=“<span style="font-family:宋体">云南</span><span style="font-family:Times New Roman">”</span></p> <p>university[1]=“<span style="font-family:宋体">昆明市</span><span style="font-family:Times New Roman">”</span></p> <p>university[2]="1999"</p> <p>通过数组形式的访问属性,可以使用循环操作获取其值。</p> <p>function showunievsity(object)</p> <p>for (var j=0;j<2; j++)</p> <p>document.write(object[j])</p> <p>若采用<span style="font-family:Times New Roman">For...in</span><span style="font-family:宋体">则可以不知其属性的个数后就可以实现:</span></p> <p>Function showmy(object)</p> <p>for (var prop in this)</p> <p>docament.write(this[prop]);</p> <p>通过字符串的形式实现</p> <p>university["Name"]=“<span style="font-family:宋体">云南</span><span style="font-family:Times New Roman">”</span></p> <p>university["City"]=“<span style="font-family:宋体">昆明市</span><span style="font-family:Times New Roman">”</span></p> <p>university["Date"]="1999"</p> <p>对象的方法的引用</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中对象方法的引用是非常简单的。</span></p> <p>ObjectName.methods() </p> <p>实际上<span style="font-family:Times New Roman">methods()=FunctionName</span><span style="font-family:宋体">方法实质上是一个函数。 如引用</span><span style="font-family:Times New Roman">university</span><span style="font-family:宋体">对象中的</span><span style="font-family:Times New Roman">showmy</span><span style="font-family:宋体">()方法,则可使用:</span></p> <p>document.write(university.showmy())</p> <p>或:<span style="font-family:Times New Roman">document.write(university)</span></p> <p>如引用<span style="font-family:Times New Roman">math</span><span style="font-family:宋体">内部对象中</span><span style="font-family:Times New Roman">cos()</span><span style="font-family:宋体">的方法,如下:</span></p> <p>with(math)</p> <p>document.write(cos(35));</p> <p>document.write(cos(80));</p> <p>若不使用<span style="font-family:Times New Roman">with</span><span style="font-family:宋体">则引用时相对要复杂些:</span></p> <p>document.write(Math.cos(35))</p> <p>document.write(math.sin(80))</p> <p>常用对象的属性和方法 </p> <p>JavaScript<span style="font-family:宋体">为我们提供了一些非常有用的常用内部对象和方法。用户不需要用脚本来实现这些功能。这正是基于对象编程的真正目的。 </span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">提供了</span><span style="font-family:Times New Roman">string</span><span style="font-family:宋体">(字符串)、</span><span style="font-family:Times New Roman">math</span><span style="font-family:宋体">(数值计算)和</span><span style="font-family:Times New Roman">Date</span><span style="font-family:宋体">(日期)三种对象和其它一些相关的方法。从而为编程人员快速开发强大的脚本程序提供了非常有利的条件。 </span></p> <p>常用内部对象 </p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中对于对象属性与方法的引用,有两种情况:其一是说该对象是静态对象,即在引用该对象的属性或方法时不需要为它创建实例;而另一种对象则在引用它的对象或方法是必须为它创建一个实例,即该对象是动态对象。 </span></p> <p>对<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部对象的引用,以是紧紧围绕着它的属性与方法进行的。因而明确对象的静动性对于掌握和理解</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部对象是具有非常重要的意义。 </span></p> <p>串对象</p> <p>string<span style="font-family:宋体">对象:内部静态性。</span></p> <p>串对象的属性 </p> <p>该对象只有一个属性,即<span style="font-family:Times New Roman">length</span><span style="font-family:宋体">。它表明了字符串中的字符个数,包括所有符号。例: </span></p> <p>mytest="This is a JavaScript" </p> <p>mystringlength=mytest.length </p> <p>最后<span style="font-family:Times New Roman">mystringlength</span><span style="font-family:宋体">返回</span><span style="font-family:Times New Roman">mytest</span><span style="font-family:宋体">字符串的长度为</span><span style="font-family:Times New Roman">20</span><span style="font-family:宋体">。 </span></p> <p>串对象的方法 </p> <p>string<span style="font-family:宋体">对象的方法共有19个。主要用于有关字符串在</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面中的显示、字体大小、字体颜色、字符的搜索以及字符的大小写转换。 </span></p> <p>其主要方法如下: </p> <p>锚点<span style="font-family:Times New Roman">anchor()</span><span style="font-family:宋体">:该方法创建如用</span><span style="font-family:Times New Roman">Html</span><span style="font-family:宋体">文文件中一样的</span><span style="font-family:Times New Roman">anchor</span><span style="font-family:宋体">标记。使用</span><span style="font-family:Times New Roman">anchor</span><span style="font-family:宋体">如用</span><span style="font-family:Times New Roman">Html</span><span style="font-family:宋体">中</span><span style="font-family:Times New Roman">(A Name="")</span><span style="font-family:宋体">一样。通过下列格式访问</span><span style="font-family:Times New Roman">:</span></p> <p>string.anchor(anchorName)<span style="font-family:宋体">。 </span></p> <p>有关字符显示的控制方法 </p> <p>big()<span style="font-family:宋体">字体显示</span><span style="font-family:Times New Roman">, Italics()</span><span style="font-family:宋体">斜体字显示,</span><span style="font-family:Times New Roman">bold()</span><span style="font-family:宋体">粗体字显示,</span><span style="font-family:Times New Roman">blink()</span><span style="font-family:宋体">字符闪烁显示,</span><span style="font-family:Times New Roman">small</span><span style="font-family:宋体">()字符用小体字显示,</span><span style="font-family:Times New Roman">fixed()</span><span style="font-family:宋体">固定高亮字显示、</span><span style="font-family:Times New Roman">fontsize(size)</span><span style="font-family:宋体">控制字体大小等。 </span></p> <p>字体颜色方法<span style="font-family:Times New Roman">:fontcolor(color) </span></p> <p>字符串大小写转换 </p> <p>toLowerCase()<span style="font-family:宋体">-小写转换,</span><span style="font-family:Times New Roman">toUpperCase()</span><span style="font-family:宋体">大写转换。下列把一个给定的串分别转换成大写和小写格式</span><span style="font-family:Times New Roman">: </span></p> <p>string=stringValue.toUpperCase<span style="font-family:宋体">和</span><span style="font-family:Times New Roman">string=stringValue.toLowerCase</span><span style="font-family:宋体">。 </span></p> <p>字符搜索:<span style="font-family:Times New Roman">indexOf[charactor,fromIndex] </span> </p> <p>从指定<span style="font-family:Times New Roman">formIndtx</span><span style="font-family:宋体">位置开始搜索</span><span style="font-family:Times New Roman">charactor</span><span style="font-family:宋体">第一次出现的位置。 </span></p> <p>返回字符串的一部分字符串:<span style="font-family:Times New Roman">substring(start,end) </span> </p> <p>从<span style="font-family:Times New Roman">start</span><span style="font-family:宋体">开始到</span><span style="font-family:Times New Roman">end</span><span style="font-family:宋体">的字符全部返回。 </span></p> <p>  </p> <p>算术函数的<span style="font-family:Times New Roman">math</span><span style="font-family:宋体">对象 </span></p> <p>功能:提供除加、减、乘、除以外的一引些自述运算。如对数,平方根等。 </p> <p>静动性:静态对象 </p> <p>主要属性 </p> <p>math<span style="font-family:宋体">中提供了6个属性,它们是数学中经常用到的常数E、以10为底的自然对数LN10、以2为底的自然对数</span><span style="font-family:Times New Roman">LN2</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">3.14159</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">PI</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">1/2</span><span style="font-family:宋体">的平方根</span><span style="font-family:Times New Roman">SQRT1-2,2</span><span style="font-family:宋体">的平方根为</span><span style="font-family:Times New Roman">SQRT2</span><span style="font-family:宋体">。 </span></p> <p>主要方法 </p> <p>绝对值:<span style="font-family:Times New Roman">abs() </span></p> <p>正弦余弦值:<span style="font-family:Times New Roman">sin(),cos() </span></p> <p>反正弦反余弦 <span style="font-family:Times New Roman">:asin(), acos() </span></p> <p>正切反正切:<span style="font-family:Times New Roman">tan(),atan() </span></p> <p>四舍五入:<span style="font-family:Times New Roman">round() </span></p> <p>平方根:<span style="font-family:Times New Roman">sqrt() </span></p> <p>基于几方次的值:<span style="font-family:Times New Roman">pow(base,exponent) </span></p> <p>... </p> <p>日期及时间对象 </p> <p>功能:提供一个有关日期和时间的对象。 </p> <p>静动性:动态性,即必须使用<span style="font-family:Times New Roman">New</span><span style="font-family:宋体">运算符创建一个实例。例</span><span style="font-family:Times New Roman">: </span></p> <p>MyDate=New Date() </p> <p>Date<span style="font-family:宋体">对象没有提供直接访问的属性。只具有获取和设置日期和时间的方法。 </span></p> <p>日期起始值<span style="font-family:Times New Roman">:</span><span style="font-family:宋体">1770年1月1日00</span><span style="font-family:Times New Roman">:</span><span style="font-family:宋体">00</span><span style="font-family:Times New Roman">:</span><span style="font-family:宋体">00。 </span></p> <p>获取日期的时间方法 </p> <p>getYear(): <span style="font-family:宋体">返回年数 </span></p> <p>getMonth():<span style="font-family:宋体">返回当月号数 </span></p> <p>getDate(): <span style="font-family:宋体">返回当日号数 </span></p> <p>getDay():<span style="font-family:宋体">返回星期几 </span></p> <p>getHours():<span style="font-family:宋体">返回小时数 </span></p> <p>getMintes(:<span style="font-family:宋体">返回分钟数 </span></p> <p>getSeconds():<span style="font-family:宋体">返回秒数 </span></p> <p>getTime() : <span style="font-family:宋体">返回毫秒数 </span></p> <p>设置日期和时间: </p> <p>setYear();<span style="font-family:宋体">设置年 </span></p> <p>setDate():<span style="font-family:宋体">设置当月号数 </span></p> <p>setMonth():<span style="font-family:宋体">设置当月份数 </span></p> <p>setHours():<span style="font-family:宋体">设置小时数 </span></p> <p>setMintes():<span style="font-family:宋体">设置分钟数 </span></p> <p>setSeconds():<span style="font-family:宋体">设置秒数 </span></p> <p>setTime ():<span style="font-family:宋体">设置毫秒数 </span></p> <p>... </p> <p>JavaScript<span style="font-family:宋体">中的系统函数 </span></p> <p>JavaScript<span style="font-family:宋体">中的系统函数又称内部方法。它提供了与任何对象无关的系统函数,使用这些函数不需创建任何实例</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">可直接用。 </span></p> <p>返回字符串表达式中的值: </p> <p>方法名:<span style="font-family:Times New Roman">eval</span><span style="font-family:宋体">(字符串表达式),例: </span></p> <p>test=eval("8+9+5/2"); </p> <p>返回字符串<span style="font-family:Times New Roman">ASCII</span><span style="font-family:宋体">码: </span></p> <p>方法名:<span style="font-family:Times New Roman">unEscape (string) </span></p> <p>返回字符的编码: </p> <p>方法名:<span style="font-family:Times New Roman">escape(character) </span></p> <p>返回实数: </p> <p>parseFloat(floustring); </p> <p>返回不同进制的数: </p> <p>parseInt(numbestring ,radix) </p> <p>其中<span style="font-family:Times New Roman">radix</span><span style="font-family:宋体">是数的进制,</span><span style="font-family:Times New Roman">numbestring</span><span style="font-family:宋体">字符串数 </span></p> <p></p> <p>创建新对象</p> <p>使用<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">可以创建自己的对象。虽然</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部和浏览器本身的功能已十分强大,但</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">还是提供了创建一个新对象的方法。使其不必像超文本标识语言那样,借助其它多媒体工具,就能完成许多复杂的工作。</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中创建一个新的对象是十分简单的。首先它必须定义一个对象,接着再为该对象创建一个实例。这个实例就是一个新对象,它具有对象定义中的基本特征。 </span></p> <p>对象的定义</p> <p>JavaScript<span style="font-family:宋体">对象的定义,其基本格式如下:</span></p> <p>Function Object<span style="font-family:宋体">(属性表) </span></p> <p>this.prop1=prop1 </p> <p>this.prop2=prop2</p> <p>...</p> <p>this.meth=FunctionName1;</p> <p>this.meth=FunctionName2;</p> <p>...</p> <p>在一个对象的定义中,可以为该对象指明其属性和方法。通过属性和方法构成了一个对象的实例。如下是一个关于<span style="font-family:Times New Roman">University</span><span style="font-family:宋体">对象的定义:</span></p> <p>function university(name,city,creatDate,URL) </p> <p>this.name=name </p> <p>this.city=city</p> <p>this.creatDate=New Date(creatDate)</p> <p>This.URL=URL</p> <p>其基本含义如下: </p> <p>Name<span style="font-family:宋体">-指定一个</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">单位</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">名称。 </span></p> <p>City<span style="font-family:宋体">-</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">单位</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">所在城市。 </span></p> <p>CreatDate<span style="font-family:宋体">-记载</span><span style="font-family:Times New Roman">university</span><span style="font-family:宋体">对象的更新日期。 </span></p> <p>URL<span style="font-family:宋体">-该对象指向一个网址。 </span></p> <p>创建对象实例</p> <p>一旦对象定义完成后,就可以为该对象创建一个实例了: </p> <p>NewObject=New object(); </p> <p>其中<span style="font-family:Times New Roman">Newobjet</span><span style="font-family:宋体">是新的对象,</span><span style="font-family:Times New Roman">Object</span><span style="font-family:宋体">已经定义好的对象。例:</span></p> <p>U1=New university(“<span style="font-family:宋体">云南省</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">昆明市</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">"January 05,199712:00:00","http://www.YN.KM")</span></p> <p>U2=New university(“<span style="font-family:宋体">云南电子科技大学</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">昆明</span><span style="font-family:Times New Roman">”,"January 07,1997 12:00:00","htlp://www.YNKJ.CN")</span></p> <p>对象方法的使用</p> <p>在对象中除了使用属性外,有时还需要使用方法。在对象的定义中,我们看到<span style="font-family:Times New Roman">This.meth=FunctionName</span><span style="font-family:宋体">语句,那就是为定义对象的方法。实质对象的方法就是一个函数</span><span style="font-family:Times New Roman">FunctionName</span><span style="font-family:宋体">,通过它实现自己的意图。</span></p> <p>例在<span style="font-family:Times New Roman">university</span><span style="font-family:宋体">对象中增加一个方法,该方法是显示它自己本身,并返回相应的字串。</span></p> <p><script></p> <p>function university(name,city,createDate,URL) </p> <p>{</p> <p>this.name=name;</p> <p>this.city=city;</p> <p>this.date=new Date(createDate);</p> <p>this.URL=URL;</p> <p>this.show=showuniversity;</p> <p>this.toString=parseToString;</p> <p>}</p> <p>function showuniversity()</p> <p>{</p> <p>for(var prop in this)</p> <p>{</p> <p>document.write(prop + "=" + this[prop] + "<BR>");</p> <p>}</p> <p>}</p> <p>function parseToString()</p> <p>{</p> <p>return "name:"+ this.name + "<br>city:" + this.city + "<br>date:" + this.date;</p> <p>}</p> <p>U2=new university("<span style="font-family:宋体">深圳计算机行业协会</span><span style="font-family:Times New Roman">","</span><span style="font-family:宋体">深圳</span><span style="font-family:Times New Roman">","January 07,1997 12:00:00","htlp://www.5itjob.CN");</span></p> <p>U2.show();</p> <p>document.write(U2);</p> <p></script></p> <p>其中<span style="font-family:Times New Roman">this.show</span><span style="font-family:宋体">就是定义了一个方法</span><span style="font-family:Times New Roman">showuniversity()</span><span style="font-family:宋体">。</span></p> <p>而<span style="font-family:Times New Roman">showuniversity()</span><span style="font-family:宋体">方法是实现</span><span style="font-family:Times New Roman">university</span><span style="font-family:宋体">对象本身的显示。</span></p> <p>察看对象所有属性的方法</p> <p>function showProp(object)</p> <p>{</p> <p>for(var prop in object)</p> <p>{</p> <p>document.write(prop + " = " + object[prop] + "<br>");</p> <p>}</p> <p>}</p> <p>howProp(document);</p> <p>JavaScript<span style="font-family:宋体">中的数组 </span></p> <p>? 使用<span style="font-family:Times New Roman">New</span><span style="font-family:宋体">创建数组 </span></p> <p>? JavaScript<span style="font-family:宋体">中没有提供像其它语言具有明显的数组类型,但可以通过</span><span style="font-family:Times New Roman">function</span><span style="font-family:宋体">定义一个数组,并使用</span><span style="font-family:Times New Roman">New</span><span style="font-family:宋体">对象操作符创建一个具有下标的数组。从而可以实现任何数据类型的存储。</span></p> <p>定义对象的数组</p> <p>function arrayName(size){</p> <p>this.length=size;</p> <p>for(var X=1; X<=size;X++)</p> <p>this[X]=0;</p> <p>reture this;</p> <p>}</p> <p>其中<span style="font-family:Times New Roman">arrayName</span><span style="font-family:宋体">是定义数组的一个名子,</span><span style="font-family:Times New Roman">Size</span><span style="font-family:宋体">是有关数组大小的值</span></p> <p>从中可以看出,<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中的数组是从</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman">size</span><span style="font-family:宋体">,这与其它0到</span><span style="font-family:Times New Roman">size</span><span style="font-family:宋体">的数组表示方法有所不同,当然你可根据需要将数组的下标由1到</span><span style="font-family:Times New Roman">size</span><span style="font-family:宋体">调整到</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman">size</span><span style="font-family:宋体">-1</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">可由下列实现</span><span style="font-family:Times New Roman">:</span></p> <p>function arrayName (size)</p> <p>for (var X=0; X<size;X++)</p> <p>this[X]=0;</p> <p>this.lenght=size;</p> <p>return this;</p> <p>从上面可以看出该方法是只是调整了<span style="font-family:Times New Roman">this.length</span><span style="font-family:宋体">的位置,该位置是用于存储数组的大小的。从而调整后的数组的下标将与其它语言一致。但请读者注意正是由于数组下标顺序由1到</span><span style="font-family:Times New Roman">size</span><span style="font-family:宋体">,使得</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中的对象功能更加强大。</span></p> <p>创建数组实例</p> <p>一个数组定义完成以后,还不能马上使用,必须为该数组创建一个数组实例:</p> <p>Myarray=new arrayName(n);</p> <p>并赋于初值:</p> <p>Myarray[1]=“<span style="font-family:宋体">字串1</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">;</span></p> <p>Myarray[2]=“<span style="font-family:宋体">字串2</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">;</span></p> <p>Myarray[3]=“<span style="font-family:宋体">字串3</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">;</span></p> <p>Myarray[n]=“<span style="font-family:宋体">字串</span><span style="font-family:Times New Roman">n”</span><span style="font-family:宋体">;</span></p> <p>一旦给数组赋于了初值后,数组中就具有真正意义的数据了,以后就可以在程序设计过程中直接引用。</p> <p>创建多维数组 </p> <p>function creatMArray(row,col){ </p> <p>var indx=0;</p> <p>this.length=(row*10)+col</p> <p>for(var x=1;x<=row;x++)</p> <p>for(var y=1;y<=col;y++)</p> <p>indx=(x*10)+y;</p> <p>this[indx]=””;</p> <p>}</p> <p>myMArray=new creatMArray();</p> <p>之后可通过<span style="font-family:Times New Roman">myMArray[11]</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">myMArray[12]</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">myMArray[13]</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">myMArray[21]</span><span style="font-family:宋体">、</span></p> <p>myMArray[22]<span style="font-family:宋体">、</span><span style="font-family:Times New Roman">myMArray[23]</span><span style="font-family:宋体">、</span></p> <p></p> <p>实例</p> <p>颜色变化的例子。</p> <p><html></p> <p><head></p> <p><script></p> <p><!-- </p> <p>function makearray(n) {</p> <p>this.length = n;</p> <p>for(var i = 1; i <= n; i++) </p> <p>this[i] = 0;</p> <p>return this;</p> <p>}</p> <p>hexa = new makearray(16);</p> <p>function init()</p> <p>{</p> <p>for(var i = 0; i < 10; i++) </p> <p>hexa[i] = i; </p> <p>hexa[10]="a"; </p> <p>hexa[11]="b"; </p> <p>hexa[12]="c";</p> <p>hexa[13]="d"; </p> <p>hexa[14]="e"; </p> <p>hexa[15]="f";</p> <p>}</p> <p>function hex(i) {</p> <p>if (i < 0) </p> <p>return "00";</p> <p>else if (i > 255) </p> <p>return "ff"; </p> <p>else return "" + hexa[Math.floor(i/16)] + hexa[i%16];</p> <p>}</p> <p>function setbgColor(r, g, b) { </p> <p>var hr = hex(r); </p> <p>var hg = hex(g); </p> <p>var hb = hex(b); </p> <p>document.bgColor = "#"+hr+hg+hb; </p> <p>}</p> <p>function fade(sr, sg, sb, er, eg, eb, step) { </p> <p>for(var i = 0; i <= step; i++) { </p> <p>setbgColor( Math.floor(sr * ((step-i)/step) + er * (i/step)), </p> <p>Math.floor(sg * ((step-i)/step) + eg * (i/step)), Math.floor(sb * </p> <p>((step-i)/step) + eb * (i/step))); </p> <p>}</p> <p>}</p> <p>function fadein() {</p> <p>fade(255,0,0,0,0,255,100);</p> <p>fade(0,0,255,0,255,0,100);</p> <p>fade(0,255,0, 0,0,0, 100);</p> <p>}</p> <p>init();</p> <p>fadein();</p> <p>// --></p> <p></script></p> <p><body></p> <p></body></p> <p></html></p> <p></p> <p>使用内部对象系统</p> <p>使用浏览器的内部对象系统<span style="font-family:Times New Roman">, </span><span style="font-family:宋体">可实现与</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档进行交互。它的作用是将相关元素组织包装起来,提供给程序设计人员使用,从而减轻编程人的劳动,提高设计</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面的能力。 </span></p> <p>浏览器对象层次及其主要作用</p> <p>除了前面提到过的文档<span style="font-family:Times New Roman">document</span><span style="font-family:宋体">对象外,</span><span style="font-family:Times New Roman">Navigator</span><span style="font-family:宋体">浏览器中还提供了窗口(</span><span style="font-family:Times New Roman">Window</span><span style="font-family:宋体">)对象以及历史(</span><span style="font-family:Times New Roman">History</span><span style="font-family:宋体">)和位置(</span><span style="font-family:Times New Roman">Location</span><span style="font-family:宋体">)对象。 </span></p> <p>? 浏览器对象<span style="font-family:Times New Roman">(navigator)</span></p> <p>提供有关浏览器的信息</p> <p>? 窗口对象<span style="font-family:Times New Roman">(Windows)</span></p> <p>Window<span style="font-family:宋体">对象处于对象层次的最顶端,它提供了处理</span><span style="font-family:Times New Roman">Navigator</span><span style="font-family:宋体">窗口的方法和属性。</span></p> <p>? 位置对象<span style="font-family:Times New Roman">(location)</span></p> <p>Location<span style="font-family:宋体">对象提供了与当前打开的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">一起工作的方法和属性,它是一个静态的对象。</span></p> <p>? 历史对象<span style="font-family:Times New Roman">(history)</span></p> <p>history<span style="font-family:宋体">对象提供了与历史清单有关的信息。</span></p> <p>? 文档对象<span style="font-family:Times New Roman">(document) </span></p> <p>document<span style="font-family:宋体">对象包含了与文档元素</span><span style="font-family:Times New Roman">(elements)</span><span style="font-family:宋体">一起工作的对象,它将这些元素封装起来供编程人员使用。</span></p> <p>编程人员利用这些对象,可以对<span style="font-family:Times New Roman">WWW</span><span style="font-family:宋体">浏览器环境中的事件进行控制并作出处理。在</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中提供了非常丰富的内部方法和属性</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">从而减轻了编程人员的工作</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">提高编程效率。这正是基于对象与面向对象的根本区别所在。在这些对象系统中</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">文档对象属于非常重要的</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">它位于最低层</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">但对于我们实现</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面信息交互起作关键作用。因而它是对象系统的核心部分。</span></p> <p>文档对象功能及其作用</p> <p>在<span style="font-family:Times New Roman">Navigator</span><span style="font-family:宋体">浏览器中,</span><span style="font-family:Times New Roman">document</span><span style="font-family:宋体">文档对象是核心是,同时也是最重要的。见图</span><span style="font-family:Times New Roman">:</span></p> <p>Links Anchor Form Method Prop </p> <p>链接对象 锚对象 窗体对象 方法 对象 </p> <p>从图中可以看出,<span style="font-family:Times New Roman">document</span><span style="font-family:宋体">对象的主要作用就是把这些基本的元素(如</span><span style="font-family:Times New Roman">links,anchor</span><span style="font-family:宋体">等)包装起来,提供给编程人员使用。从另一个角度看,</span><span style="font-family:Times New Roman">document</span><span style="font-family:宋体">对象中又是由属性和方法组成。</span></p> <p>document<span style="font-family:宋体">中三个主要的对象</span></p> <p>在<span style="font-family:Times New Roman">document</span><span style="font-family:宋体">中主要有:</span><span style="font-family:Times New Roman">links,anchor,form</span><span style="font-family:宋体">等三个最重要的对象:</span></p> <p>? anchor<span style="font-family:宋体">锚对象:</span></p> <p>anchor<span style="font-family:宋体">对象指的是</span><span style="font-family:Times New Roman"><a name=...> </a></span><span style="font-family:宋体">标识在</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">源码中存在时产生的对象。它包含着文档中所有的</span><span style="font-family:Times New Roman">anchors</span><span style="font-family:宋体">信息。</span></p> <p>? 链接<span style="font-family:Times New Roman">links</span><span style="font-family:宋体">对象</span></p> <p>link<span style="font-family:宋体">对象指的是用</span><span style="font-family:Times New Roman"><a href=...> </A></span><span style="font-family:宋体">标记的连接一个超文本或超媒体的元素作为一个特定的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">。</span></p> <p>? 窗体(<span style="font-family:Times New Roman">form</span><span style="font-family:宋体">)对象</span></p> <p>窗体对象是文档对象的一个元素,它含有多种格式的对象储存信息,使用它可以在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本中编写程序进行文字输入,并可以用来动态改变文档的行为。通过</span><span style="font-family:Times New Roman">document.forms[]</span><span style="font-family:宋体">数组来使得在同一个页面上可以有多个相同的窗体</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">使用</span><span style="font-family:Times New Roman">forms[]</span><span style="font-family:宋体">数组要比使用窗体名字要方便得多。</span></p> <p>例<span style="font-family:Times New Roman">:</span><span style="font-family:宋体">下面就是一个使用窗体数组和窗体名字的例子。该程序使得两个窗体中的字段内容保持一致。</span></p> <p><Html></p> <p><head></p> <p></head></p> <p><body></p> <p><form></p> <p><input type=text onChange="document.my.elements[0].value=this.value;"></p> <p></form></p> <p><form NAME="my"></p> <p><input type=text</p> <p>onChange="document.forms[0].elements[0].value=this.value;"></p> <p></form></p> <p></body></p> <p></html></p> <p>其中用了<span style="font-family:Times New Roman">OnChnge</span><span style="font-family:宋体">事件</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">当窗体内容改变时激发</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">。第一个使用窗体名字标识</span><span style="font-family:Times New Roman">my,</span><span style="font-family:宋体">第二个使用窗体数组</span><span style="font-family:Times New Roman">Forms[]</span><span style="font-family:宋体">。其效果是一致。</span></p> <p>文档对象中的<span style="font-family:Times New Roman">attribute</span><span style="font-family:宋体">属性</span></p> <p>document<span style="font-family:宋体">对象中的</span><span style="font-family:Times New Roman">attribute</span><span style="font-family:宋体">属性,主要用于在引用</span><span style="font-family:Times New Roman">Href</span><span style="font-family:宋体">标识时,控制着有关颜色的格式和有关文档标题、文档原文件的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">以及文档最后更新的日期。这部分元素的主要含义如下:</span></p> <p>? 链接颜色:<span style="font-family:Times New Roman">alinkcolor</span></p> <p>这个元素主要用于,当选取一个链接时,链接对象本身的颜色就按<span style="font-family:Times New Roman">alinkcolor</span><span style="font-family:宋体">指定改变。</span></p> <p>? 链接颜色:<span style="font-family:Times New Roman">linkcolor</span></p> <p>当用户使用<span style="font-family:Times New Roman"><A Href=...> Text string </A></span><span style="font-family:宋体">链接后,</span><span style="font-family:Times New Roman">Textstring</span><span style="font-family:宋体">的颜色就会按</span><span style="font-family:Times New Roman">Linkcolor</span><span style="font-family:宋体">所指定的颜色更新。</span></p> <p>? 浏览过后的颜色:<span style="font-family:Times New Roman">VlinkColor</span></p> <p>该属性表示的是已被浏览存储为已浏览过的链接颜色。</p> <p>? 背景颜色:<span style="font-family:Times New Roman">bgcolor</span></p> <p>该元素包含文档背景的颜色。</p> <p>? 前景颜色:<span style="font-family:Times New Roman">fgcolor</span></p> <p>该元素包含<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档中文本的前景颜色。</span></p> <p>文档对象的基本元素</p> <p>? 窗体属性:</p> <p>窗体属性是与<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档中</span><span style="font-family:Times New Roman"><Form>...</Form></span><span style="font-family:宋体">相对应的一组对象在</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档所创建的窗体数,由</span><span style="font-family:Times New Roman">length</span><span style="font-family:宋体">指定。通过</span><span style="font-family:Times New Roman">document.forms.length</span><span style="font-family:宋体">反映该文档中所创建的窗体数目。</span></p> <p>? 锚属性:<span style="font-family:Times New Roman">anchors</span></p> <p>该属性中,包含了<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档的所有</span><span style="font-family:Times New Roman"><A> </A></span><span style="font-family:宋体">标记为</span><span style="font-family:Times New Roman">Name=...</span><span style="font-family:宋体">的语句标识。</span></p> <p>所有<span style="font-family:Times New Roman">“</span><span style="font-family:宋体">锚</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">的数目保存在</span><span style="font-family:Times New Roman">document.anchors.length</span><span style="font-family:宋体">中。</span></p> <p>? 链接属性:<span style="font-family:Times New Roman">links</span></p> <p>链接属性是指在文档中<span style="font-family:Times New Roman"><A>...</A></span><span style="font-family:宋体">的由</span><span style="font-family:Times New Roman">Href=...</span><span style="font-family:宋体">指定的数目,其链接数目</span></p> <p>保存在<span style="font-family:Times New Roman">document.links.length</span><span style="font-family:宋体">中。</span></p> <p></p> <p>实例</p> <p>下面我们通过一个例子来说明文档对象的综合应用。</p> <p><html></p> <p><head></p> <p></HEAD></p> <p><BOdy></p> <p><Form Name="mytable"></p> <p>请输入数据:</p> <p><Input Type="text" Name="text1" Value=""></p> <p></Form></p> <p><A name="Link1" href="test31.htm"><span style="font-family:宋体">链接到第一个文本</span><span style="font-family:Times New Roman"></a></span></p> <p><br></p> <p><A name="Link2" href="test32.htm"><span style="font-family:宋体">链接到第二个文本</span><span style="font-family:Times New Roman"></a></span></p> <p><br></p> <p><A name="Link2" href="test33.htm"><span style="font-family:宋体">链接到第三个文本</span><span style="font-family:Times New Roman"></a></span></p> <p><br></p> <p><A href="#Link1"><span style="font-family:宋体">第一锚点</span><span style="font-family:Times New Roman"></a></span></p> <p><A href="#Link2"><span style="font-family:宋体">第二锚点</span><span style="font-family:Times New Roman"></a></span></p> <p><A Href="#Link3"><span style="font-family:宋体">第三锚点</span><span style="font-family:Times New Roman"></a></span></p> <p><BR></p> <p><Script Language="JavaScript"></p> <p>document.write("<span style="font-family:宋体">文档有</span><span style="font-family:Times New Roman">"+document.links.length+"</span><span style="font-family:宋体">个链接</span><span style="font-family:Times New Roman">"+"<br>");</span></p> <p>document.write("<span style="font-family:宋体">文档有</span><span style="font-family:Times New Roman">"+document.anchors.length+"</span><span style="font-family:宋体">个锚点</span><span style="font-family:Times New Roman">"+"<br>");</span></p> <p>document.write("<span style="font-family:宋体">文档有</span><span style="font-family:Times New Roman">"+document.forms.length+"</span><span style="font-family:宋体">个窗体</span><span style="font-family:Times New Roman">");</span></p> <p></script></p> <p></body></p> <p></HTML></p> <p>下列程序随机产生每日一语。</p> <p><HTML></p> <p><HEAD></p> <p><script Language="JavaScript"></p> <p><!--</p> <p>tips = new Array(6);</p> <p>tips[0]="<span style="font-family:宋体">每日一语(</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">";</span></p> <p>tips[1]="<span style="font-family:宋体">每日一语(</span><span style="font-family:Times New Roman">2</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">";</span></p> <p>tips[2]="<span style="font-family:宋体">每日一语(</span><span style="font-family:Times New Roman">3</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">";</span></p> <p>tips[3]="<span style="font-family:宋体">每日一语(</span><span style="font-family:Times New Roman">4</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">";</span></p> <p>tips[4]="<span style="font-family:宋体">每日一语(</span><span style="font-family:Times New Roman">5</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">";</span></p> <p>tips[5]="<span style="font-family:宋体">每日一语(</span><span style="font-family:Times New Roman">6</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">";</span></p> <p>index = Math.floor(Math.random() * tips.length);</p> <p>document.write("<FONT SIZE=8 COLOR=DARKBLUE>" + tips[index]+"</FONT>");</p> <p></Script></p> <p></HEAD></p> <p><BODY></p> <p></BODY></p> <p></HTML></p> <p></p> <p>窗口及输入输出</p> <p>JavaScript<span style="font-family:宋体">是基于对象的脚本编程语言,那么它的输入输出就是通过对象来完成的。其中有关输入可通过窗口(</span><span style="font-family:Times New Roman">Window</span><span style="font-family:宋体">)对象来完成,而输出可通过文档(</span><span style="font-family:Times New Roman">document</span><span style="font-family:宋体">)对象的方法来实现。</span></p> <p>窗口及输入输出</p> <p>请看下面例子:</p> <p><HTML></p> <p><Head></p> <p><script languaga="JavaScript"></p> <p>var test=window.prompt("<span style="font-family:宋体">请输入数据</span><span style="font-family:Times New Roman">:");</span></p> <p>document.write(test+"JavaScript<span style="font-family:宋体">输入输出的例子</span><span style="font-family:Times New Roman">");</span></p> <p></script></p> <p></Head></p> <p></HTML></p> <p>其中<span style="font-family:Times New Roman">window.prompt()</span><span style="font-family:宋体">就是一个窗口对象的方法,其基本作用是,当装入</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面时在屏幕上显示一个具有</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">确定</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">取消</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">的对话框,让你输入数据。</span></p> <p>窗口对象</p> <p>该对象包括许多有用的属性、方法和事件驱动程序,编程人员可以利用这些对象控制浏览器窗口显示的各个方面,如对话框、框架等。在使用应注意以下几点: </p> <p>? 该对象对应于<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文档中的</span><span style="font-family:Times New Roman"><Body></span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><FrameSet></span><span style="font-family:宋体">两种标识;</span></p> <p>? onload<span style="font-family:宋体">和</span><span style="font-family:Times New Roman">onunload</span><span style="font-family:宋体">都是窗口对象属性;</span></p> <p>? 在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本中可直接引用窗口对象。如: </span><span style="font-family:Times New Roman">window.alert("</span><span style="font-family:宋体">窗口对象输入方法</span><span style="font-family:Times New Roman">") </span><span style="font-family:宋体">可直接使用以下格式: </span><span style="font-family:Times New Roman">alert("</span><span style="font-family:宋体">窗口对象输入方法</span><span style="font-family:Times New Roman">")</span></p> <p>窗口对象的事件驱动</p> <p>窗口对象主要有装入<span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">文档事件</span><span style="font-family:Times New Roman">onload</span><span style="font-family:宋体">和卸载时</span><span style="font-family:Times New Roman">onunload</span><span style="font-family:宋体">事件。用于文档载入和停止载入时开始和停止更新文档。</span></p> <p>窗口对象的方法</p> <p>窗口对象的方法主要用来提供信息或输入数据以及创建一个新的窗口。 </p> <p>? 创建一个新窗口<span style="font-family:Times New Roman">open()</span></p> <p>使用<span style="font-family:Times New Roman">window.open</span><span style="font-family:宋体">(参数表)方法可以创建一个新的窗口。其中参数表提供有窗口的主要特性和文档及窗口的命名。</span></p> <p>? 具有<span style="font-family:Times New Roman">OK</span><span style="font-family:宋体">按钮的对话框</span></p> <p>alert()<span style="font-family:宋体">方法能创建一个具有</span><span style="font-family:Times New Roman">OK</span><span style="font-family:宋体">按钮的对话框。</span></p> <p>? 具有<span style="font-family:Times New Roman">OK</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">Cancel</span><span style="font-family:宋体">按钮的对话框</span></p> <p>confirm()<span style="font-family:宋体">方法为编程人员提供一个具有两个按钮的对话框。</span></p> <p>? 具有输入信息的对话框</p> <p>prompt()<span style="font-family:宋体">方法允许用户在对话框中输入信息,并可使用默认值,其基本格式如下</span><span style="font-family:Times New Roman">prompt</span><span style="font-family:宋体">(</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">提示信息</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">,默认值)。 </span></p> <p>窗口对象中的属性</p> <p>窗口对象中的属性主要用来对浏览器中存在的各种窗口和框架的引用,其主要属性有以下几个:</p> <p>? frames <span style="font-family:宋体">确文档中帧的数目 </span></p> <p>frames<span style="font-family:宋体">(帧)作为实现一个窗口的分隔操作,起到非常有用的作用,在使用注意以下几点:</span></p> <p>frames<span style="font-family:宋体">属性是通过</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标识</span><span style="font-family:Times New Roman"><Frames></span><span style="font-family:宋体">的顺序来引用的,它包含了一个窗口中的全部帧数。</span></p> <p>帧本身已是一类窗口,继承了窗口对象所有的全部属性和方法。</p> <p>? parent <span style="font-family:宋体">指明当前窗口或帧的父窗口。</span></p> <p>? defaultstatus:<span style="font-family:宋体">默认状态,它的值显示在窗口的状态栏中。</span></p> <p>? status:<span style="font-family:宋体">包含文档窗口中帧中的当前信息。</span></p> <p>? top:<span style="font-family:宋体">包括的是用以实现所有的下级窗口的窗口。</span></p> <p>? window.<span style="font-family:宋体">指的是当前窗口</span></p> <p>? self:<span style="font-family:宋体">引用当前窗口。</span></p> <p>输出流及文档对象</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">文档对象中,提供了用于显示关闭、消除、打开</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">页面的输出流。</span></p> <p>创建新文档<span style="font-family:Times New Roman">open()</span><span style="font-family:宋体">方法</span></p> <p>使用<span style="font-family:Times New Roman">document.open()</span><span style="font-family:宋体">创建一个新的窗口或在指定的命令窗口内打开文档。由于窗口对象是所加载的父对象</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">因而我们在调用它的属性或方法时</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">不需要加入</span><span style="font-family:Times New Roman">Window</span><span style="font-family:宋体">对象。例用</span><span style="font-family:Times New Roman">Window. open()</span><span style="font-family:宋体">与</span><span style="font-family:Times New Roman">open()</span><span style="font-family:宋体">是一样的。</span></p> <p>打开一个窗口的基本格式: </p> <p>Window .open("URL","<span style="font-family:宋体">窗口名字</span><span style="font-family:Times New Roman">","</span><span style="font-family:宋体">窗口属性</span><span style="font-family:Times New Roman">"]</span></p> <p>window<span style="font-family:宋体">属性参数是由一个字符串列表项它由逗号分隔,它指明了有关新创建窗口的属性。</span></p> <p>参 数 设定值 含 义 </p> <p>toolbar yes/no 建立或不建立标准工具条 </p> <p>location yes/no 建立或不建立位置输入字段 </p> <p>directions yes/no 建立或不建立标准目录按钮 </p> <p>status yes/no 建立或不建立状态条 </p> <p>menubar yes/no 建立或不建立菜单条 </p> <p>scrollbar yes/no 建立或不建立滚动条 </p> <p>revisable yes/no 能否改变窗口大小 </p> <p>width yes/no 确定窗口的宽度 </p> <p>Height yes/no 确定窗口的高度。 </p> <p>在使用<span style="font-family:Times New Roman">Open()</span><span style="font-family:宋体">方法时,需要注意以下点。 </span></p> <p>? 通常浏览器窗中,总有一个文档是打开的。因而不需要为输出建立一个新文档。</p> <p>? 在完成对<span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">文档的写操作后,要使用或调用</span><span style="font-family:Times New Roman">close()</span><span style="font-family:宋体">方法来实现对输出流的关闭。</span></p> <p>? 在使用<span style="font-family:Times New Roman">open()</span><span style="font-family:宋体">来打开一个新流时,可为文档指定一个有效的文档类型,有效文档类型包括</span><span style="font-family:Times New Roman">text/HTML</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">text/gif</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">text/xim</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">text/plugin</span><span style="font-family:宋体">等。</span></p> <p>write()<span style="font-family:宋体">、</span><span style="font-family:Times New Roman">writeln()</span><span style="font-family:宋体">输出显示。</span></p> <p>该方法主要用来实现在<span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面上显示输出信息。在实际使用中,需注意以下几点: </span></p> <p>? writeln()<span style="font-family:宋体">与</span><span style="font-family:Times New Roman">write()</span><span style="font-family:宋体">唯一不同之处在于在未尾加了一个换符。</span></p> <p>? 为了正常显示其输出信息,必须指明<span style="font-family:Times New Roman"><pre> </Pre></span><span style="font-family:宋体">标记,使之告诉编辑器。</span></p> <p>? 输出的文档类型,可以由浏览器中的有效的合法文本类型所确定。</p> <p>关闭文档流<span style="font-family:Times New Roman">close() </span></p> <p>在实现多个文档对象中,必须使用<span style="font-family:Times New Roman">close()</span><span style="font-family:宋体">来关闭一个对象后,才能打开另一个文档对象。</span></p> <p>清除文档内容<span style="font-family:Times New Roman">clear() </span></p> <p>使用该方法可清除已经打开文档的内容。</p> <p>简单的输入、输出例子</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中可以非常方便地实现输入输出信息,并与用户进行交互。</span></p> <p>JavaScript<span style="font-family:宋体">信息的输入</span></p> <p>通过使用<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中所提供的窗口对象方法</span><span style="font-family:Times New Roman">prompt(), </span><span style="font-family:宋体">就能完成信息的输入。该方法提供了最简便的信息输入方式,其基本格式如下: </span></p> <p>Window.prompt("<span style="font-family:宋体">提示信</span><span style="font-family:Times New Roman">", </span><span style="font-family:宋体">预定输入信息</span><span style="font-family:Times New Roman">);</span></p> <p>此方法首先在浏览器窗口中弹出一个对话框<span style="font-family:Times New Roman">, </span><span style="font-family:宋体">让用户自行输入信息。一旦输入完成后,就返回用户所输入信息的值。例</span><span style="font-family:Times New Roman">: test=prompt</span><span style="font-family:宋体">(</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">请输入数据</span><span style="font-family:Times New Roman">:”</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">”this is a JavaScript”</span><span style="font-family:宋体">)</span></p> <p>实际上<span style="font-family:Times New Roman">prompt()</span><span style="font-family:宋体">是窗口对象的一个方法。因为缺省情况下所用的对象就是</span><span style="font-family:Times New Roman">window</span><span style="font-family:宋体">对象</span><span style="font-family:Times New Roman">, </span><span style="font-family:宋体">所以</span><span style="font-family:Times New Roman">windows</span><span style="font-family:宋体">对象可以省略不写。</span></p> <p>输出显示</p> <p>每种语言,都必须提供信息数据的输出显示。<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">也是一样,它提供有几个用于信息输出显示的方法。比较常用的有</span><span style="font-family:Times New Roman">window.alert()</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">document.write</span><span style="font-family:宋体">和及</span><span style="font-family:Times New Roman">document.writln()</span><span style="font-family:宋体">方法。</span></p> <p>document.write()<span style="font-family:宋体">方法和</span><span style="font-family:Times New Roman">document.writeln()</span><span style="font-family:宋体">方法</span></p> <p>document<span style="font-family:宋体">是</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中的一个对象在它中封装许多有用的方法,其中</span><span style="font-family:Times New Roman">write()</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">writeln()</span><span style="font-family:宋体">就是用于将文本信息直接输出到浏览器窗口中的方法。 </span><span style="font-family:Times New Roman">document.write()</span><span style="font-family:宋体">;</span></p> <p>document.writeln()<span style="font-family:宋体">;</span></p> <p>说明: </p> <p>write()<span style="font-family:宋体">和</span><span style="font-family:Times New Roman">writeln()</span><span style="font-family:宋体">方法都是用于向浏览器窗口输出文本字串;</span></p> <p>二者的唯一区别就是<span style="font-family:Times New Roman">writeln()</span><span style="font-family:宋体">方法自动在文本之后加入回车符。</span></p> <p>window.alert()<span style="font-family:宋体">输出</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">为了方便信息输出,</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">提供了具有独立的对话框信息输出</span><span style="font-family:Times New Roman">─alert()</span><span style="font-family:宋体">方法。</span></p> <p>alert()<span style="font-family:宋体">方法是</span><span style="font-family:Times New Roman">window</span><span style="font-family:宋体">对象的一个方法,因此在使用时,不需要写</span><span style="font-family:Times New Roman">window</span><span style="font-family:宋体">窗口对象名,而是直接使用就行了。它主要用途用在输出时产生有关警告提示信息或提示用户,一旦用户按</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">确定</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">钮后,方可继续执行其他脚本程序。例</span><span style="font-family:Times New Roman">:</span></p> <p><HTML></p> <p><HEAD></p> <p><TITLE></TITLE></p> <p></HEAD></p> <p><BODY></p> <p><Script Language="JavaScript"></p> <p>alert("<span style="font-family:宋体">这是一个</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">测试程序</span><span style="font-family:Times New Roman">");</span></p> <p></Script></p> <p></BODY></p> <p></HTML></p> <p>利用输入、输出方法实现交互</p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">中,可以利用</span><span style="font-family:Times New Roman">prompt()</span><span style="font-family:宋体">方法和</span><span style="font-family:Times New Roman">write()</span><span style="font-family:宋体">方法实现与</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面用户进行交互。例下面就是一个有关实现交互的例子。</span></p> <p>Test7_1.htm</p> <p><HTML></p> <p><HEAD></p> <p><TITLE></TITLE></p> <p></HEAD></p> <p><BODY></p> <p><Script Language="JavaScript"></p> <p><!-- Hide From Other Browsers</p> <p>document.write("<H1><span style="font-family:宋体">有关交互的例子</span><span style="font-family:Times New Roman">");</span></p> <p>my=prompt("<span style="font-family:宋体">请输入数据</span><span style="font-family:Times New Roman">:");</span></p> <p>document.write(my+"</H1>");</p> <p>document.close();</p> <p>// Stop Hiding from Other Browsers--></p> <p></Script></p> <p></BODY></p> <p></HTML></p> <p>从上面程序可以看出: </p> <p>可通过<span style="font-family:Times New Roman">write()</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">prompt()</span><span style="font-family:宋体">方法实现交互。</span></p> <p>在<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">脚本语言中可以使用</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标识语言的代码。从而实现混合编程。其中</span><span style="font-family:Times New Roman"><H1></span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><Br></span><span style="font-family:宋体">就是</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标识符。</span></p> <p>Window<span style="font-family:宋体">案例</span></p> <p><html></p> <p><head></p> <p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p> <p><title>test</title></p> <p><script></p> <p>var popUpWin=0;</p> <p>function popUpWindow(URLStr, left, top, width, height)</p> <p>{</p> <p>if(popUpWin)</p> <p>{</p> <p>if(!popUpWin.closed) popUpWin.close();</p> <p>}</p> <p>popUpWin = open(URLStr, 'popUpWin', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbar=no,resizable=no,copyhistory=yes,width='+width+',height='+height+',left='+left+', top='+top+',screenX='+left+',screenY='+top+'');</p> <p>}</p> <p></script></p> <p></head></p> <p><body></p> <p><input type="button" value="delete" onClick="confirm('delete');"></p> <p><input type="button" value="open" onClick="popUpWindow('login.htm',200,200,400,200);"></p> <p></body></html></p> <p></p> <p>内容总结</p> <p>? JavaScript<span style="font-family:宋体">的对象是由属性</span><span style="font-family:Times New Roman">(properties)</span><span style="font-family:宋体">和方法</span><span style="font-family:Times New Roman">(methods)</span><span style="font-family:宋体">两个基本的元素的构成的,引用对象的途径:引用</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">内部对象;由浏览器环境中提供;创建新对象</span></p> <p>? 对象操作语句:<span style="font-family:Times New Roman">For...in</span><span style="font-family:宋体">语句 </span><span style="font-family:Times New Roman">this new </span><span style="font-family:宋体">点(</span><span style="font-family:Times New Roman">.</span><span style="font-family:宋体">)运算符</span></p> <p>? JavaScript<span style="font-family:宋体">常用对象:</span><span style="font-family:Times New Roman">string</span><span style="font-family:宋体">(字符串)、</span><span style="font-family:Times New Roman">math</span><span style="font-family:宋体">(数值计算)和</span><span style="font-family:Times New Roman">Date</span><span style="font-family:宋体">(日期)三种对象</span></p> <p>? 创建新对象首先用<span style="font-family:Times New Roman">function</span><span style="font-family:宋体">定义一个对象,接着用</span><span style="font-family:Times New Roman">new </span><span style="font-family:宋体">为该对象创建一个实例,通过</span><span style="font-family:Times New Roman">.</span><span style="font-family:宋体">运算符访问对象属性和方法。</span></p> <p>? JavaScript<span style="font-family:宋体">中的数组:</span><span style="font-family:Times New Roman">function</span><span style="font-family:宋体">定义一个数组,并使用</span><span style="font-family:Times New Roman">New</span><span style="font-family:宋体">对象操作符创建一个具有下标的数组,通过数组名</span><span style="font-family:Times New Roman">[</span><span style="font-family:宋体">下标</span><span style="font-family:Times New Roman">]</span><span style="font-family:宋体">访问。</span></p> <p>? 浏览器对象层次:文档<span style="font-family:Times New Roman">document</span><span style="font-family:宋体">对象、窗口(</span><span style="font-family:Times New Roman">Window</span><span style="font-family:宋体">)对象、历史(</span><span style="font-family:Times New Roman">History</span><span style="font-family:宋体">)和位置(</span><span style="font-family:Times New Roman">Location</span><span style="font-family:宋体">)对象</span></p> <p>? 重点掌握:<span style="font-family:Times New Roman">document</span><span style="font-family:宋体">对象的层次结构;</span><span style="font-family:Times New Roman">window</span><span style="font-family:宋体">对象的</span><span style="font-family:Times New Roman">alert</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">prompt</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">confirm</span><span style="font-family:宋体">方法 </span></p> <p>独立实战</p> <p>? 创建<span style="font-family:Times New Roman">Date</span><span style="font-family:宋体">对象的一个实例,在一个网页中显示当前的日期(年月日 时分秒)</span></p> <p>? 自定义一个<span style="font-family:Times New Roman">student</span><span style="font-family:宋体">对象,它有</span><span style="font-family:Times New Roman">name,native,age</span><span style="font-family:宋体">三个属性,创建该对象的三个实例,在网页中输出</span></p> <p>? 弹出一个输入的对话框,输入<span style="font-family:Times New Roman">"javaand java World",</span><span style="font-family:宋体">把输入的值保存到</span><span style="font-family:Times New Roman">myvar</span><span style="font-family:宋体">中,在</span><span style="font-family:Times New Roman">myvar</span><span style="font-family:宋体">中统计</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">出现的次数,并取出第三个到第十个字符,输出到文档</span></p> <p>? 网页中制作一个按纽,弹出一个登陆对话框<span style="font-family:Times New Roman">(</span><span style="font-family:宋体">无工具条、无状态栏、无菜单、无滚动条,长</span><span style="font-family:Times New Roman">300</span><span style="font-family:宋体">,宽</span><span style="font-family:Times New Roman">300</span><span style="font-family:宋体">)</span></p> <p>? 随机显示<span style="font-family:Times New Roman">img</span><span style="font-family:宋体">下的一张图片</span></p> <p>? 用户登陆网页有两个输入框,用<span style="font-family:Times New Roman">javascript</span><span style="font-family:宋体">实现验证功能(这两个输入框内容不能为空,否则提示请输入值)</span></p> <p>第二十八章: <span style="font-family:Times New Roman">Servlet</span></p> <p>学习目标</p> <p>? Java Servlet<span style="font-family:宋体">概述</span></p> <p>? Java Servlet API</p> <p>? HTTP<span style="font-family:宋体">协议简介</span></p> <p>? Servlet<span style="font-family:宋体">过滤器</span></p> <p>? Servlet<span style="font-family:宋体">监听器</span></p> <p></p> <p>Java Servlet<span style="font-family:宋体">概述 </span></p> <p>Web<span style="font-family:宋体">刚刚开始用于提供服务,服务供应商们就意识到动态内容的需求。最早朝这个方向发展的技术之一</span><span style="font-family:Times New Roman">Applet</span><span style="font-family:宋体">,专注于利用客户平台提供动态的用户体验。与此同时,开发人员也开始研究使用服务器平台达到同样的目的。最初,通用网关接口(</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">)脚本是产生动态内容的主要技术。尽管</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">脚本技术被广泛使用,它却存在着许多缺陷,包括平台相关和缺少控制性。为了解决这些缺陷,出现了</span><span style="font-family:Times New Roman">Java Servlet</span><span style="font-family:宋体">技术。它以可移植的方式提供了动态的,基于用户的网页内容。</span></p> <p>Java Servlet<span style="font-family:宋体">是用</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">编程语言实现的类。它扩展了通过请求</span><span style="font-family:Times New Roman">——</span><span style="font-family:宋体">响应模式访问的应用程序的服务器端的性能。尽管</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">可以响应任何类型的请求,但通常它们用来扩展</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器端的应用程序。对于这样的应用,</span><span style="font-family:Times New Roman">Java Servlet</span><span style="font-family:宋体">技术定义了专用于</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议的</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">类。类包</span><span style="font-family:Times New Roman">javax.servlet</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">javax.servlet.http</span><span style="font-family:宋体">提供了编写</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的接口和类。所有的</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">必须实现定义了生命周期方法的</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">接口。当实现通用服务时,可以使用或扩展由</span><span style="font-family:Times New Roman">Java Servlet API</span><span style="font-family:宋体">提供的</span><span style="font-family:Times New Roman">GenericServlet</span><span style="font-family:宋体">类。</span><span style="font-family:Times New Roman">HttpServlet</span><span style="font-family:宋体">类提供了像</span><span style="font-family:Times New Roman">doGet</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">doPost</span><span style="font-family:宋体">这样专门用于处理</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">服务的方法。</span></p> <p>Servlet<span style="font-family:宋体">能够做什么?</span></p> <p>Servlet<span style="font-family:宋体">是用</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">代码编写的服务器方软件程序,用于处理客户机和服务器之间的消息传递。</span><span style="font-family:Times New Roman">Java Servlet API</span><span style="font-family:宋体">为请求和响应消息定义了一个标准接口,这样</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">就可以跨平台和跨不同的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用服务器间移植。</span></p> <p>Servlet<span style="font-family:宋体">可以通过动态构造一个发回客户机的响应来响应客户机请求。例如:下面是一个响应</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求的</span><span style="font-family:Times New Roman">Servlet.</span><span style="font-family:宋体">源代码如下:</span></p> <p>package com.servlet;</p> <p>import java.io.IOException;</p> <p>import java.io.PrintWriter;</p> <p>import javax.servlet.ServletException;</p> <p>import javax.servlet.http.HttpServlet;</p> <p>import javax.servlet.http.HttpServletRequest;</p> <p>import javax.servlet.http.HttpServletResponse;</p> <p></p> <p>public class HelloServlet extends HttpServlet {</p> <p>public HelloServlet() {</p> <p>super();</p> <p>}</p> <p>public void destroy() {</p> <p>super.destroy(); // Just puts "destroy" string in log</p> <p>// Put your code here</p> <p>}</p> <p>public void doGet(HttpServletRequest request, HttpServletResponse response)</p> <p>throws ServletException, IOException {</p> <p></p> <p>response.setContentType("text/html");</p> <p>PrintWriter out = response.getWriter();</p> <p>out</p> <p>.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");</p> <p>out.println("<HTML>");</p> <p>out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");</p> <p>out.println(" <BODY>");</p> <p>out.print(" This is ");</p> <p>out.print(this.getClass());</p> <p>out.println(", using the GET method and say you hello");</p> <p>out.println(" </BODY>");</p> <p>out.println("</HTML>");</p> <p>out.flush();</p> <p>out.close();</p> <p>}</p> <p>public void doPost(HttpServletRequest request, HttpServletResponse response)</p> <p>throws ServletException, IOException {</p> <p></p> <p>doGet(request, response);</p> <p>}</p> <p></p> <p>public void doPut(HttpServletRequest request, HttpServletResponse response)</p> <p>throws ServletException, IOException {</p> <p></p> <p>// Put your code here</p> <p>}</p> <p></p> <p>public void init() throws ServletException {</p> <p>// Put your code here</p> <p>}</p> <p></p> <p>}</p> <p>在<span style="font-family:Times New Roman">Web.xml</span><span style="font-family:宋体">配置文件的配置如下:</span></p> <p><?xml version="1.0" encoding="UTF-8"?></p> <p><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"</p> <p>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p> <p>xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee </p> <p>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></p> <p><servlet></p> <p><description></p> <p>This is the description of my J2EE component</p> <p></description></p> <p><display-name></p> <p>This is the display name of my J2EE component</p> <p></display-name></p> <p><servlet-name>HelloServlet</servlet-name></p> <p><servlet-class>com.servlet.HelloServlet</servlet-class></p> <p></servlet></p> <p></p> <p><servlet-mapping></p> <p><servlet-name>HelloServlet</servlet-name></p> <p><url-pattern>/servlet/HelloServlet</url-pattern></p> <p></servlet-mapping></p> <p></web-app></p> <p>在浏览器里输入:</p> <p>http://localhost:818/beike/servlet/HelloServlet</p> <p>运行结果如下图</p> <p></p> <p>由于<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">是用</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">编程语言编写的,它们可以访问整个</span><span style="font-family:Times New Roman">Java API</span><span style="font-family:宋体">集合。这就使它们非常适合实现复杂的商业应用逻辑,特别是访问企业中其它位置的数据。</span><span style="font-family:Times New Roman">Java Database Connection(JDBC) API</span><span style="font-family:宋体">就是一个示例,它允许</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">程序访问关系数据库。一般我们不直接在</span><span style="font-family:Times New Roman">Servelt</span><span style="font-family:宋体">里面写</span><span style="font-family:Times New Roman">JDBC</span><span style="font-family:宋体">编程,而是通过连接池技术或者</span><span style="font-family:Times New Roman">Hibernate</span><span style="font-family:宋体">技术来实现</span><span style="font-family:Times New Roman">JDBC</span><span style="font-family:宋体">的连接,后面会有综合的例子。由于没有与</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">关联的图形,因此它不适合访问</span><span style="font-family:Times New Roman">GUI Java API</span><span style="font-family:宋体">(</span><span style="font-family:Times New Roman">AWT/Swing</span><span style="font-family:宋体">)</span></p> <p>可以多次调用一个<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">来响应来自多个客户机的请求。这是一种多线程的工作方式,该</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">只有一个实例,多个用户通过多线程的访问,来响应给客户的。因此,一个</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">可以同时处理多个请求,并且可以使这些请求同步。</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">可以将请求转发到其它服务器和</span><span style="font-family:Times New Roman">Servlet.</span></p> <p>Servlet<span style="font-family:宋体">如何工作?</span></p> <p>Servlet<span style="font-family:宋体">在</span><span style="font-family:Times New Roman">J2EE</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器(</span><span style="font-family:Times New Roman">Web Container</span><span style="font-family:宋体">)中运行。而应用服务器是一种特殊的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器;它们扩展了</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器的功能,还可以处理</span><span style="font-family:Times New Roman">Enterprise Beans</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用程序的请求。</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器和应用服务器之间有明显的差异。虽然两者都可以在同一台机器上运行,</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器运行的是</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">代码。服务器自己装入,执行和管理</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">。服务器使用</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">字节码解释器来运行</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">程序;这叫做</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">虚拟机(</span><span style="font-family:Times New Roman">JVM</span><span style="font-family:宋体">)。大型的应用服务器会自带虚拟机,比如:</span><span style="font-family:Times New Roman">Weblogic</span><span style="font-family:宋体">。而小型的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器需要使用操作系统里安装好的虚拟机,比如:</span><span style="font-family:Times New Roman">tomcat</span><span style="font-family:宋体">。</span></p> <p>Servlet<span style="font-family:宋体">的生命周期。</span></p> <p></p> <p>Servlet<span style="font-family:宋体">执行的步骤如下:</span></p> <p>1<span style="font-family:宋体">,</span> 客户机将请求发送给服务器。</p> <p>2<span style="font-family:宋体">,</span> 服务器从浏览器的地址栏获得请求的信息。并根据<span style="font-family:Times New Roman">Web.xml</span><span style="font-family:宋体">配置文件找到响应的</span><span style="font-family:Times New Roman">Servet</span><span style="font-family:宋体">执行。如果找不到,会报</span><span style="font-family:Times New Roman">404</span><span style="font-family:宋体">错误。</span></p> <p>3<span style="font-family:宋体">,</span> 如果是第一次请求,那么会实例化该<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">,调用</span><span style="font-family:Times New Roman">init()</span><span style="font-family:宋体">方法进行初始化,该方法在</span><span style="font-family:Times New Roman">Servlet </span><span style="font-family:宋体">的生命周期里只执行一次。然后分配线程进行响应。如果不是第一次访问,那么会直接分配个线程进行客户的响应。</span></p> <p>4<span style="font-family:宋体">,</span> 在<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">响应之前,服务器会产生</span><span style="font-family:Times New Roman">request,response</span><span style="font-family:宋体">对象,并且把客户请求的信息封装到</span><span style="font-family:Times New Roman">request</span><span style="font-family:宋体">对象中,然后把这两个对象传递给</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">service()</span><span style="font-family:宋体">方法执行。</span></p> <p>5<span style="font-family:宋体">,</span> service()<span style="font-family:宋体">根据请求的方式来调用不同的方法执行。比如</span><span style="font-family:Times New Roman">get</span><span style="font-family:宋体">请求,</span><span style="font-family:Times New Roman">service()</span><span style="font-family:宋体">方法会</span><span style="font-family:Times New Roman">request,response</span><span style="font-family:宋体">对象传递给</span><span style="font-family:Times New Roman">doGet()</span><span style="font-family:宋体">方法执行,把执行后的结果保存到</span><span style="font-family:Times New Roman">response</span><span style="font-family:宋体">对象里面。返回给客户。</span></p> <p>6<span style="font-family:宋体">,</span> 服务器关闭后,会调用<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">destroy()</span><span style="font-family:宋体">方法进行销毁。</span></p> <p>下面是<span style="font-family:Times New Roman">Servetl</span><span style="font-family:宋体">执行的线程执行图:</span></p> <p>Servlet<span style="font-family:宋体">与</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">程序的区别:</span></p> <p>CGI<span style="font-family:宋体">(</span><span style="font-family:Times New Roman">Common Gateway Interface</span><span style="font-family:宋体">)公共网关接口程序也是用来创建响应请求的动态</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">内容的。但与</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">相比,</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">还有自己的优势。</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">能够提供一个基于组件的,独立于平台的方法来创建</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用,也没有一般</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">程序的性能限制。</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">具有以下几个特点:</span></p> <p>◆ 可跨平台,跨不同<span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器进行移植。</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">使你能够不用编写指定平台的</span><span style="font-family:Times New Roman">API</span><span style="font-family:宋体">就能进行服务器端编程。</span><span style="font-family:Times New Roman">Java Servlet API</span><span style="font-family:宋体">是标准</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">的延伸。</span></p> <p>◆ 具有持久性(<span style="font-family:Times New Roman">Persistent</span><span style="font-family:宋体">)。一个</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">在装入内存之后,就一直驻留内存,这意味着它能够在请求之间维持系统资源</span><span style="font-family:Times New Roman">—</span><span style="font-family:宋体">如数据库连接。</span></p> <p>◆ 高效的(<span style="font-family:Times New Roman">Efficient</span><span style="font-family:宋体">)。当一个客户对某个</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">发出多个请求时,服务器只创建并装入该</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">一次。每一次重复请求只不过完成商业逻辑处理。</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">过程则对每个请求都装入一个过程,这会大大降低性能。而且,</span><span style="font-family:Times New Roman">JVM</span><span style="font-family:宋体">使用</span><span style="font-family:Times New Roman">lightweight java thread</span><span style="font-family:宋体">来处理对</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的请求,而不是像</span><span style="font-family:Times New Roman">CGI</span><span style="font-family:宋体">那样使用一个</span><span style="font-family:Times New Roman">weighty</span><span style="font-family:宋体">操作系统进程。</span></p> <p>◆ 能够将表示(<span style="font-family:Times New Roman">presentation</span><span style="font-family:宋体">)与商业逻辑(</span><span style="font-family:Times New Roman">business logic</span><span style="font-family:宋体">)分离。这样一来,将一个项目划分为各个独立部分来进行开发和维护变得容易得多了。</span></p> <p>◆ 能够获取给定的<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">的各种调用并且从</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">语言本身的继续开发中获益。</span></p> <p></p> <p>Java Servlet API</p> <p>什么是<span style="font-family:Times New Roman">Java Servlet API? Java Servet API </span><span style="font-family:宋体">是一组类,用于定义</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">客户机和</span><span style="font-family:Times New Roman">Web Servlet</span><span style="font-family:宋体">之间的标准接口。其实,</span><span style="font-family:Times New Roman">API</span><span style="font-family:宋体">将请求封装成对象,这样服务器可以将它们传递到</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">;响应也是这样的封装,因此服务器可以将它们传递回客户机。</span></p> <p>Java Servlet API<span style="font-family:宋体">有两个包。</span><span style="font-family:Times New Roman">Javax.servlet</span><span style="font-family:宋体">包含了支持普通协议无关的</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的类,</span><span style="font-family:Times New Roman">javax.servlet.http</span><span style="font-family:宋体">包括了对</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议的特别支持。本课主要介绍</span><span style="font-family:Times New Roman">HTTP Servlet</span><span style="font-family:宋体">。</span></p> <p>Web<span style="font-family:宋体">上使用的</span><span style="font-family:Times New Roman">HTTP Servlet</span></p> <p>Servlet<span style="font-family:宋体">接口类是</span><span style="font-family:Times New Roman">Java Servlet API</span><span style="font-family:宋体">的重要抽象概念。这个类定义了管理</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">以及它与客户机通信的方法。要编写在</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">上使用的</span><span style="font-family:Times New Roman">HTTP Servlet</span><span style="font-family:宋体">,使用</span><span style="font-family:Times New Roman">HttpServlet</span><span style="font-family:宋体">类:</span></p> <p>◆ HttpServletRequest<span style="font-family:宋体">对象代表发送到</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的客户机请求。这个对象封装了从客户机到服务器的通信。它可以包含关于客户机环境的信息和任何要从</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">发送到客户机的数据。</span></p> <p>◆ HttpServletResponse<span style="font-family:宋体">对象代表从</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">发回客户机的响应。这通常是动态生成的响应,如</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">页面,并且它是用请求和</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">访问的其它来源中的数据创建的。</span></p> <p>处理<span style="font-family:Times New Roman">HTTP Servlet</span><span style="font-family:宋体">的关键方法</span></p> <p>HttpServlet<span style="font-family:宋体">的子类必须至少覆盖一个方法。通常,</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">覆盖</span><span style="font-family:Times New Roman">doGet</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">doPost</span><span style="font-family:宋体">方法。</span><span style="font-family:Times New Roman">GET</span><span style="font-family:宋体">请求是对</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">页面的典型浏览器请求,它是在用户输入</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">或使用链接时发出的。</span><span style="font-family:Times New Roman">POST</span><span style="font-family:宋体">请求是用户提交指定发出的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">表单时生成的。</span><span style="font-family:Times New Roman">HTTP POST</span><span style="font-family:宋体">方法允许客户机一次将无限长度的数据发送到</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器,并且可以在发出信息时使用。</span></p> <p>同一个<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">可以通过让</span><span style="font-family:Times New Roman">doGet</span><span style="font-family:宋体">调用</span><span style="font-family:Times New Roman">doPost</span><span style="font-family:宋体">,或者反向调用来处理</span><span style="font-family:Times New Roman">GET</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">POST</span><span style="font-family:宋体">。</span></p> <p>其它常用方法包括:</p> <p>? Servlet<span style="font-family:宋体">的</span><span style="font-family:Times New Roman">service()</span><span style="font-family:宋体">方法</span></p> <p>? Servlet<span style="font-family:宋体">容器激活了</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">service()</span><span style="font-family:宋体">方法</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">传递</span><span style="font-family:Times New Roman">HttpServletRequest</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">HttpServletResponse</span><span style="font-family:宋体">对象同</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求和响应进行交互,</span><span style="font-family:Times New Roman">service()</span><span style="font-family:宋体">方法从请求对象中得到必要的信息处理请求,然后使用响应对象的方法创建客户响应根据 </span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">传输方法</span><span style="font-family:Times New Roman">,service()</span><span style="font-family:宋体">方法把请求发送给另一个方法</span><span style="font-family:Times New Roman">,GET</span><span style="font-family:宋体">请求发送给</span><span style="font-family:Times New Roman">doGet()</span><span style="font-family:宋体">方法</span><span style="font-family:Times New Roman">,POST</span><span style="font-family:宋体">请求发送给</span><span style="font-family:Times New Roman">doPost()</span><span style="font-family:宋体">方法方法之间可以相互调用</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">如</span><span style="font-family:Times New Roman">doPost()</span><span style="font-family:宋体">可以调用</span><span style="font-family:Times New Roman">doGet()</span><span style="font-family:宋体">方法</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">大多数人直接调用</span><span style="font-family:Times New Roman">doGet</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">doPost</span></p> <p>? doPut<span style="font-family:宋体">方法,用于</span><span style="font-family:Times New Roman">HTTP PUT</span><span style="font-family:宋体">请求</span></p> <p>? doDelete<span style="font-family:宋体">方法,用于</span><span style="font-family:Times New Roman">HTTP DELETE</span><span style="font-family:宋体">请求</span></p> <p>? init <span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">destroy</span><span style="font-family:宋体">,用于管理为</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的使用期限而保留的资源。</span></p> <p>? getServletInfo,Servlet<span style="font-family:宋体">用来提供自身信息的方法。</span></p> <p>其它相关接口的说明:</p> <p>javax.servlet.ServletConfig<span style="font-family:宋体">接口:当</span><span style="font-family:Times New Roman">Servet</span><span style="font-family:宋体">第一次被装载时,为了向它传递服务设置信息,容器开发者必须实现该接口。</span></p> <p>javax.servlet.ServletContext<span style="font-family:宋体">接口:提供给</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">一些访问它们所运行环境的方法,并允许记录一些重要的事件,由</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的编写者来决定记录什么样的数据。</span></p> <p>下图是<span style="font-family:Times New Roman">servlet UML</span><span style="font-family:宋体">图</span></p> <p></p> <p></p> <p>HTTP<span style="font-family:宋体">协议简介</span></p> <p>大部分<span style="font-family:Times New Roman">J2EE Web</span><span style="font-family:宋体">客户端使用</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议和</span><span style="font-family:Times New Roman">J2EE</span><span style="font-family:宋体">服务器通讯。</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议定义了客户端可以发送给服务器的请求和服务器可以作为回答的响应。每个请求包含一个</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">是一个字符串,标识了</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">组件或者像</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">页面和图象文件这样的静态资源。</span></p> <p>J2EE<span style="font-family:宋体">服务器将</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求转化为一个</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求(</span><span style="font-family:Times New Roman">Request</span><span style="font-family:宋体">)对象,并把这个对象传递给</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">标识的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">组件。</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">组件填充一个</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">响应(</span><span style="font-family:Times New Roman">Response</span><span style="font-family:宋体">)对象,服务器把这个对象转化为</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">响应,并发送给客户端。</span></p> <p>HTTP<span style="font-family:宋体">协议基本概念及其特点</span></p> <p>HTTP<span style="font-family:宋体">(</span><span style="font-family:Times New Roman">HyperText Transfer Protocol</span><span style="font-family:宋体">)是超文本传输协议的简称,是</span><span style="font-family:Times New Roman">WWW</span><span style="font-family:宋体">上用于发布信息的主要协议。也可以理解为:在</span><span style="font-family:Times New Roman">TCP/IP</span><span style="font-family:宋体">之上的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">RPC(Remote Process Call</span><span style="font-family:宋体">远程过程调用</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">。关于</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议更详细的信息,请登陆</span><span style="font-family:Times New Roman">www.w3.org</span><span style="font-family:宋体">访问。</span></p> <p>HTTP<span style="font-family:宋体">定义了一个客户机</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">服务器结构的简单事务处理,这里的客户机</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">服务器也就是浏览器</span><span style="font-family:Times New Roman">/Web </span><span style="font-family:宋体">服务器。简单事务处理由以下几步组成:</span></p> <p>客户与服务器建立连接</p> <p>客户向服务器提交请求</p> <p>如果请求被接受,那么服务器回送一个应答,应答中至少包括状态编码和该文件的内容。</p> <p>客户或服务器断开连接。</p> <p>HTTP<span style="font-family:宋体">的基本特点是:</span></p> <p>简单。服务器迅速作出浏览器的应答。</p> <p>无状态。一个请求到另一个请求不保留任何有关连接的信息。</p> <p>灵活。允许传送任意类型的数据对象。</p> <p>无连接。<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">是一个无连接协议。</span></p> <p>HTTP<span style="font-family:宋体">的缺点是每次连接</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">只完成一次请求。若服务器的一个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件中有许多图象,每传一个图象都要单独建立一次连接。</span></p> <p>一个<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求包含请求方法(</span><span style="font-family:Times New Roman">Request Method</span><span style="font-family:宋体">),请求</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">,头字段(</span><span style="font-family:Times New Roman">Header Field</span><span style="font-family:宋体">)和请求体。</span><span style="font-family:Times New Roman">HTTP1.1</span><span style="font-family:宋体">定义了下面的请求方法:</span></p> <p>GET<span style="font-family:宋体">:获取由请求</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">标识的资源。</span></p> <p>HEAD<span style="font-family:宋体">:返回由</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">标识的头信息。</span></p> <p>POST<span style="font-family:宋体">:想</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">服务器发送无限制长度的数据。</span></p> <p>PUT<span style="font-family:宋体">:存储一个资源到请求的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">。</span></p> <p>DELETE<span style="font-family:宋体">:删除由</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">标识的资源。</span></p> <p>OPTIONS<span style="font-family:宋体">:返回服务器支持的</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">方法。</span></p> <p>TRACE<span style="font-family:宋体">:返回</span><span style="font-family:Times New Roman">TRACE</span><span style="font-family:宋体">请求附带的头字段。</span></p> <p>一个<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">响应包括响应码,头字段和响应体。</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议要求响应码和所有的头字段都在任何响应体之前返回。</span></p> <p>下面是一些常用的状态码:</p> <p>404<span style="font-family:宋体">:指示请求的资源不可用。</span></p> <p>401<span style="font-family:宋体">:指示请求需要</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">验证。</span></p> <p>500<span style="font-family:宋体">:指示在</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">服务器内部发生错误,不能执行请求。</span></p> <p>503<span style="font-family:宋体">:指示</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">服务器暂时性超载,不能处理当前请求。</span></p> <p>HTTP<span style="font-family:宋体">请求报头</span><span style="font-family:Times New Roman">--Resquest</span></p> <p>HttpServletRequest<span style="font-family:宋体">对象封装了来自客户端的全部信息</span><span style="font-family:Times New Roman">. Servlet</span><span style="font-family:宋体">容器得到一个请求的时候</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">建立了一个该类型的对象</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">并传递给</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">获取参数方法</span><span style="font-family:Times New Roman">.</span></p> <p>public String getParameter(String name)</p> <p>public Enumeration getParameterNames()</p> <p>public String[] getParameterValues(String name)</p> <p>获取内容信息</p> <p>getCharacterEncoding()<span style="font-family:宋体">方法返回请求的名称和字符编码风格</span></p> <p>用法<span style="font-family:Times New Roman">:request.getCharacterEncoding()</span></p> <p>public int getContentLength()<span style="font-family:宋体">方法可返回以字节记数的内容长度</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">如果长度未知</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">则返回</span><span style="font-family:Times New Roman">-1 </span></p> <p>用法<span style="font-family:Times New Roman">:request.getContentLength()</span></p> <p>getContentType()<span style="font-family:宋体">方法返回请求内容的</span><span style="font-family:Times New Roman">MIME</span><span style="font-family:宋体">类型</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">未知返回</span><span style="font-family:Times New Roman">null </span></p> <p>用法<span style="font-family:Times New Roman">:request.getContentType()</span></p> <p>获取连接信息</p> <p>getProtocol()<span style="font-family:宋体">方法获取传输协议及版本</span></p> <p>用法<span style="font-family:Times New Roman">:request.getProtocol() (HTTP/1.1)</span></p> <p>getRemoteAddr()<span style="font-family:宋体">方法返回因特网协议</span><span style="font-family:Times New Roman">(IP)</span><span style="font-family:宋体">地址</span></p> <p>用法<span style="font-family:Times New Roman">:request.getRemoteAddr() (122.40.18.09)</span></p> <p>getRemoteHost()<span style="font-family:宋体">方法返回主机名</span></p> <p>用法<span style="font-family:Times New Roman">:request.getRemoteHost() (122.40.18.09)</span></p> <p>getScheme()<span style="font-family:宋体">方法返回模式名</span></p> <p>用法<span style="font-family:Times New Roman">:request.getScheme() (http)</span></p> <p>getServerName()<span style="font-family:宋体">方法返回服务器名</span></p> <p>用法<span style="font-family:Times New Roman">:request.getServerName() (localhost)</span></p> <p>getServerPort()<span style="font-family:宋体">方法返回服务器端口号</span></p> <p>用法<span style="font-family:Times New Roman">:request.getServerPort() (80)</span></p> <p>获取<span style="font-family:Times New Roman">Cookie</span><span style="font-family:宋体">:</span></p> <p>以下代码显示了全部可用的<span style="font-family:Times New Roman">Cookie</span></p> <p>Cookie[] cookies=request.getCookies();</p> <p>int cookiesLen=cookies.length()</p> <p>if(cookiesLen>0){</p> <p>for(int i=0 ; i<cookiesLen; i++)</p> <p>{</p> <p>String sName=cookies[i].getName();</p> <p>String sValue=cookies[i]=getValue();</p> <p>}</p> <p>}</p> <p>获取用户请求信息</p> <p>req.getAuthtype()<span style="font-family:宋体">方法返回认证模式</span></p> <p>req.getMethod()<span style="font-family:宋体">方法返回</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">方法</span></p> <p>req.getPathInfo()<span style="font-family:宋体">方法返回路径信息</span></p> <p>req.getPathTranslated()<span style="font-family:宋体">方法返回真实传输路径</span></p> <p>req.getQueryString()<span style="font-family:宋体">方法返回请求索引串</span></p> <p>req.getRequestURI()<span style="font-family:宋体">方法返回请求</span><span style="font-family:Times New Roman">URI</span></p> <p>req.getServletPath()<span style="font-family:宋体">方法返回</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">路径</span></p> <p>req.getAttributeNames()<span style="font-family:宋体">方法返回请求属性集</span></p> <p>req.getAttribute(String name)<span style="font-family:宋体">方法返回属性</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">的信息 </span></p> <p>HTTP<span style="font-family:宋体">响应报头</span><span style="font-family:Times New Roman">--Response</span></p> <p>HttpServletResponse<span style="font-family:宋体">对象封装了同客户的全部通信</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">并提供了多种方法</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">能够访问和操作</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">报头</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">属性等</span></p> <p>常见的方法</p> <p>setHeader()<span style="font-family:宋体">方法</span></p> <p>addCookie()</p> <p>sendError()</p> <p>setContentType()</p> <p>会话管理</p> <p>由于<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">是无状态协议</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">服务器无法识别来自相同客户端请求的顺序</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">因此需要采取专门的方法识别该类用户</span></p> <p>1.<span style="font-family:宋体">隐藏的表单字段:</span><span style="font-family:Times New Roman"><input name=“id” type=“hidden” value=“005”></span></p> <p>2.<span style="font-family:宋体">改写</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">:向地址栏内</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">后追加信息</span></p> <p>http://localhost/servlets/srvlt?sql==1009&id=005</p> <p>以上两个信息可以用<span style="font-family:Times New Roman">request.getParameter(“id”)</span><span style="font-family:宋体">取出</span></p> <p>3. 持久<span style="font-family:Times New Roman">Cookie</span><span style="font-family:宋体">:</span><span style="font-family:Times New Roman">Cookie</span><span style="font-family:宋体">类</span></p> <p>? 建立<span style="font-family:Times New Roman">Cookie</span></p> <p>Date dtLogin=new Date();</p> <p>? Cookie coLt=new Cookie(“loginTime”,dtLogin.toString()); </p> <p>? response.addCookie(coLt);// <span style="font-family:宋体">发送给客户端的响应中包含该</span><span style="font-family:Times New Roman">Cookie</span></p> <p>? 访问<span style="font-family:Times New Roman">Cookie,</span><span style="font-family:宋体">得到用户登录的最后时间</span></p> <p>?? for(int i=0; i<reqCookies.length; i++){</p> <p>? sName=reqCookies[i].getName();</p> <p>? if(sName!=null && sName.equalsIgnoreCase(“loginTime”)) </p> <p>? sValue=reqCookies[i].getValue();</p> <p>? }</p> <p>3.<span style="font-family:宋体">会话跟踪</span><span style="font-family:Times New Roman">API</span><span style="font-family:宋体">:</span><span style="font-family:Times New Roman">HttpSession</span><span style="font-family:宋体">接口</span></p> <p>HttpSession session=request.getSession();</p> <p>使用<span style="font-family:Times New Roman">HttpSession</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">setAttribute()</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">getAttribute()</span><span style="font-family:宋体">方法把一个属性同会话联系起来</span></p> <p>发送请求:能够向另一个<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">发送请求</span></p> <p>ServletContext sc=this.getServletContext();</p> <p>RequestDispatcher rd=sc.getRequestDispatcher(‘/srvltCom’); If(rd!=null){</p> <p>try{</p> <p>rd.forward(req,res); <span style="font-family:宋体">或 </span><span style="font-family:Times New Roman">rd.include(req,res);</span></p> <p>}</p> <p>Catch(Exception e){} }</p> <p></p> <p>Servlet<span style="font-family:宋体">过滤器</span></p> <p>Servlet<span style="font-family:宋体">过滤器是</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的一种特殊用法,主要用来完成一些通用的操作。比如编码的过滤,判断用户的登陆状态等等。</span></p> <p>Servlet<span style="font-family:宋体">过滤器的适用场合:</span></p> <p>A<span style="font-family:宋体">.认证过滤</span></p> <p>B<span style="font-family:宋体">.登录和审核过滤</span></p> <p>C<span style="font-family:宋体">.图像转换过滤 </span></p> <p>D<span style="font-family:宋体">.数据压缩过滤 </span></p> <p>E<span style="font-family:宋体">.加密过滤 </span></p> <p>F<span style="font-family:宋体">.令牌过滤 </span></p> <p>G<span style="font-family:宋体">.资源访问触发事件过滤 </span></p> <p>H<span style="font-family:宋体">.</span><span style="font-family:Times New Roman">XSL/T</span><span style="font-family:宋体">过滤 </span></p> <p>I<span style="font-family:宋体">.多用途</span><span style="font-family:Times New Roman">INTERNET</span><span style="font-family:宋体">邮件扩展</span><span style="font-family:Times New Roman">(Mime)</span><span style="font-family:宋体">类型过滤</span></p> <p>Servlet<span style="font-family:宋体">过滤器接口的构成:</span></p> <p>所有的<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">过滤器类都必须实现</span><span style="font-family:Times New Roman">javax.servlet.Filter</span><span style="font-family:宋体">接口。这个接口含有</span><span style="font-family:Times New Roman">3</span><span style="font-family:宋体">个过滤器类必须实现的方法:</span></p> <p>A.init(FilterConfig)<span style="font-family:宋体">:</span></p> <p>这是<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">过滤器的初始化方法,读取</span><span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">文件中</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">过滤器的初始化参数</span></p> <p>B.doFilter(ServletRequest,ServletResponse,FilterChain)<span style="font-family:宋体">:完成实际的过滤操作,当请求访问过滤器关联的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">时,</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">容器将先调用过滤器的</span><span style="font-family:Times New Roman">doFilter</span><span style="font-family:宋体">方法。</span><span style="font-family:Times New Roman">FilterChain</span><span style="font-family:宋体">参数用于访问后续过滤器</span></p> <p>C.destroy()<span style="font-family:宋体">:</span></p> <p>Servlet<span style="font-family:宋体">容器在销毁过滤器实例前调用该方法,这个方法中可以释放</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">过滤器占用的资源</span></p> <p>Servlet<span style="font-family:宋体">过滤器的创建步骤:</span></p> <p>A<span style="font-family:宋体">.实现</span><span style="font-family:Times New Roman">javax.servlet.Filter</span><span style="font-family:宋体">接口的</span><span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">类</span></p> <p>B<span style="font-family:宋体">.实现</span><span style="font-family:Times New Roman">init</span><span style="font-family:宋体">方法,读取过滤器的初始化函数</span></p> <p>C<span style="font-family:宋体">.实现</span><span style="font-family:Times New Roman">doFilter</span><span style="font-family:宋体">方法,完成对请求或过滤的响应</span></p> <p>D<span style="font-family:宋体">.调用</span><span style="font-family:Times New Roman">FilterChain</span><span style="font-family:宋体">接口对象的</span><span style="font-family:Times New Roman">doFilter</span><span style="font-family:宋体">方法,向后续的过滤器传递请求或响应</span></p> <p>E<span style="font-family:宋体">.销毁过滤器</span></p> <p>F.<span style="font-family:宋体">在</span><span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">中配置</span><span style="font-family:Times New Roman">Filter</span></p> <p>Servlet<span style="font-family:宋体">过滤器的执行流程图如下:</span></p> <p></p> <p>请看下例进行编码的过滤器:<span style="font-family:Times New Roman">CodeFilter.java</span></p> <p>package com.filter;</p> <p>import java.io.IOException;</p> <p></p> <p>import javax.servlet.Filter;</p> <p>import javax.servlet.FilterChain;</p> <p>import javax.servlet.FilterConfig;</p> <p>import javax.servlet.ServletException;</p> <p>import javax.servlet.ServletRequest;</p> <p>import javax.servlet.ServletResponse;</p> <p></p> <p>public class CodeFilter implements Filter {</p> <p></p> <p>FilterConfig config = null;</p> <p></p> <p>public void destroy() {</p> <p>// TODO Auto-generated method stub</p> <p>config = null;</p> <p>}</p> <p></p> <p>public void doFilter(ServletRequest arg0, ServletResponse arg1,</p> <p>FilterChain arg2) throws IOException, ServletException {</p> <p>// <span style="font-family:宋体">设置请求和响应的字符编码格式为</span><span style="font-family:Times New Roman">gb2312</span></p> <p>arg0.setCharacterEncoding("gb2312");</p> <p>arg1.setCharacterEncoding("gb2312");</p> <p>System.out.println("already code filter.....");</p> <p>arg2.doFilter(arg0, arg1);</p> <p></p> <p>}</p> <p></p> <p>public void init(FilterConfig arg0) throws ServletException {</p> <p>// TODO Auto-generated method stub</p> <p>config = arg0;</p> <p>}</p> <p>}</p> <p>在<span style="font-family:Times New Roman">Web.xml</span><span style="font-family:宋体">配置文件中的主要信息为:</span></p> <p><filter></p> <p><filter-name>code</filter-name></p> <p><filter-class>com.filter.CodeFilter</filter-class></p> <p></filter></p> <p><filter-mapping></p> <p><filter-name>code</filter-name></p> <p><url-pattern>/*</url-pattern></p> <p></filter-mapping></p> <p>可以看到上面的配置信息和<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的配置格式完全一样。由以上信息可知,当浏览器输入访问该</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用程序的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">组件(</span><span style="font-family:Times New Roman">Servlet,Jsp</span><span style="font-family:宋体">),都会先执行该过滤器,进行字符编码。</span></p> <p>下面请看判断用户是否登陆的过滤器:</p> <p>CheckLoginFilter.java</p> <p>package com.filter;</p> <p>import java.io.IOException;</p> <p>import javax.servlet.Filter;</p> <p>import javax.servlet.FilterChain;</p> <p>import javax.servlet.FilterConfig;</p> <p>import javax.servlet.ServletException;</p> <p>import javax.servlet.ServletRequest;</p> <p>import javax.servlet.ServletResponse;</p> <p>import javax.servlet.http.HttpServletRequest;</p> <p>import javax.servlet.http.HttpServletResponse;</p> <p>import javax.servlet.http.HttpSession;</p> <p>public class CheckLoginFilter implements Filter {</p> <p></p> <p>FilterConfig config = null;</p> <p></p> <p>public void destroy() {</p> <p>// TODO Auto-generated method stub</p> <p>config = null;</p> <p>}</p> <p>public void doFilter(ServletRequest arg0, ServletResponse arg1,</p> <p>FilterChain arg2) throws IOException, ServletException {</p> <p>// TODO Auto-generated method stub</p> <p>HttpServletRequest request = (HttpServletRequest) arg0;</p> <p>HttpSession session = request.getSession(true);</p> <p>String res = (String) session.getAttribute("islogin");</p> <p>HttpServletResponse response = (HttpServletResponse) arg1;</p> <p>if (res == null || !res.equals("true")) {</p> <p>response.sendRedirect("../error.html");</p> <p>}</p> <p>arg2.doFilter(request, response);</p> <p>}</p> <p></p> <p>public void init(FilterConfig arg0) throws ServletException {</p> <p>// TODO Auto-generated method stub</p> <p>this.config = arg0;</p> <p>}</p> <p>}</p> <p>在<span style="font-family:Times New Roman">Web.xml</span><span style="font-family:宋体">文件中的主要配置为:</span></p> <p><filter></p> <p><filter-name>LoginFilter</filter-name></p> <p><filter-class>com.filter.CheckLoginFilter</filter-class></p> <p></filter></p> <p><filter-mapping></p> <p><filter-name>LoginFilter</filter-name></p> <p><url-pattern>/success/*</url-pattern></p> <p></filter-mapping></p> <p>下面以一个<span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">做为测试</span></p> <p>该<span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">配置文件信息为:</span></p> <p><servlet-mapping></p> <p><servlet-name>CodingServlet</servlet-name></p> <p><url-pattern>/success/code</url-pattern></p> <p></servlet-mapping></p> <p>由以上配置的信息可知:当地址栏直接输入</p> <p>http://localhost:818/WebDemo/success/code<span style="font-family:宋体">时,由于格式既符合</span><span style="font-family:Times New Roman">/* </span><span style="font-family:宋体">又符合</span><span style="font-family:Times New Roman">/success/*</span><span style="font-family:宋体">,所以两个过滤器都会执行。</span></p> <p>执行的结果会转发到<span style="font-family:Times New Roman">error.html</span><span style="font-family:宋体">,</span></p> <p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p> <p><html></p> <p><head></p> <p><title>error.html</title></p> <p></p> <p><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"></p> <p><meta http-equiv="description" content="this is my page"></p> <p><meta http-equiv="content-type" content="text/html; charset=UTF-8"></p> <p></p> <p><!--<link rel="stylesheet" type="text/css" href="./styles.css">--></p> <p></p> <p></head></p> <p></p> <p><body></p> <p>sorry ni mei login</p> <p><br></p> <p>qing</p> <p><a href=http://localhost:818/web122/test.html>login</a></p> <p></body></p> <p></html></p> <p>在浏览器运行的结果为下图:</p> <p></p> <p>得到上面的结果后,也会从<span style="font-family:Times New Roman">tomcat</span><span style="font-family:宋体">的控制台打印如下图的信息:</span></p> <p>其中第一条信息为<span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">监听器执行后打印的结果,下面马上会介绍监听器。</span></p> <p></p> <p></p> <p>Servlet<span style="font-family:宋体">监听器</span></p> <p>Servlet<span style="font-family:宋体">监听器主要有以下几种:</span></p> <p>ServletRequestListener ,ServletRequestAttributeListener<span style="font-family:宋体">,</span></p> <p>HttpSessionActivationListener ,HttpSessionBindingListener ,</p> <p>HttpSessionAttributeListener,HttpSessionListener,</p> <p>ServletContextListener<span style="font-family:宋体">等等。</span></p> <p>这些监听器主要用来监听<span style="font-family:Times New Roman">session,request,application</span><span style="font-family:宋体">这三个对象里存取数据的变化。当然也有些常用的用途。</span></p> <p>下面的例子是用来记数的,记录当前时刻,有多少人在访问我们的网站:</p> <p>监听器类的定义如下:<span style="font-family:Times New Roman">SessListener.java</span></p> <p>package com.listener;</p> <p></p> <p>import javax.servlet.ServletContext;</p> <p>import javax.servlet.http.HttpSession;</p> <p>import javax.servlet.http.HttpSessionActivationListener;</p> <p>import javax.servlet.http.HttpSessionAttributeListener;</p> <p>import javax.servlet.http.HttpSessionBindingEvent;</p> <p>import javax.servlet.http.HttpSessionBindingListener;</p> <p>import javax.servlet.http.HttpSessionEvent;</p> <p>import javax.servlet.http.HttpSessionListener;</p> <p></p> <p>public class SessListener implements HttpSessionBindingListener,</p> <p>HttpSessionActivationListener, HttpSessionListener,</p> <p>HttpSessionAttributeListener {</p> <p></p> <p>private int count;</p> <p></p> <p>public void valueBound(HttpSessionBindingEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p></p> <p>}</p> <p></p> <p>public void valueUnbound(HttpSessionBindingEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p>public void sessionDidActivate(HttpSessionEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p>public void sessionWillPassivate(HttpSessionEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p></p> <p>public void sessionCreated(HttpSessionEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>System.out.println("sessionCreated");</p> <p>count++;</p> <p>HttpSession session = arg0.getSession();</p> <p>session.setMaxInactiveInterval(120);</p> <p>ServletContext application = session.getServletContext();</p> <p>application.setAttribute("num", count);</p> <p>}</p> <p></p> <p>public void sessionDestroyed(HttpSessionEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>System.out.println("sessionDestroyed");</p> <p>count--;</p> <p>if (count <= 0)</p> <p>count = 1;</p> <p>HttpSession session = arg0.getSession();</p> <p>ServletContext application = session.getServletContext();</p> <p>application.setAttribute("num", count);</p> <p>}</p> <p>public void attributeAdded(HttpSessionBindingEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p></p> <p>public void attributeRemoved(HttpSessionBindingEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p>public void attributeReplaced(HttpSessionBindingEvent arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p>}</p> <p>该监听器在<span style="font-family:Times New Roman">Web.xml</span><span style="font-family:宋体">的配置文件中的信息为:</span></p> <p><listener></p> <p><listener-class>com.listener.SessListener</listener-class></p> <p></listener></p> <p>当用户访问时就会进行人数的统计。关于本章的例子请参考工程<span style="font-family:Times New Roman">WebDemo</span><span style="font-family:宋体">。 </span></p> <p>内容总结</p> <p>? Java Servlet<span style="font-family:宋体">是用</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">编程语言实现的类。它扩展了通过请求</span><span style="font-family:Times New Roman">——</span><span style="font-family:宋体">响应模式访问的应用程序的服务器端的性能。类包</span><span style="font-family:Times New Roman">javax.servlet</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">javax.servlet.http</span><span style="font-family:宋体">提供了编写</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的接口和类。所有的</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">必须实现定义了生命周期方法的</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">接口。</span></p> <p>? Servlet<span style="font-family:宋体">的生命周期:</span></p> <p></p> <p>? HTTP<span style="font-family:宋体">协议:超文本传输协议</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">的基本特点是简单、无状态、灵活、无连接</span></p> <p>? HTTP<span style="font-family:宋体">请求报头</span><span style="font-family:Times New Roman">Resquest</span><span style="font-family:宋体">:</span><span style="font-family:Times New Roman">HttpServletRequest</span><span style="font-family:宋体">对象封装了来自客户端的全部请求信息,包含客户机环境的信息和任何要从</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">发送到服务器的数据,它有各种获取请求信息的方法</span></p> <p>? HTTP<span style="font-family:宋体">响应报头</span><span style="font-family:Times New Roman">Response</span><span style="font-family:宋体">:</span><span style="font-family:Times New Roman">HttpServletResponse</span><span style="font-family:宋体">对象封装了</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">发回客户机的响应,通常是动态生成的响应,如</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">页面,并且它是用请求和</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">访问的其它来源中的数据创建的。它提供了多种方法</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">能够访问和操作</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">报头</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">属性等</span></p> <p>? 会话管理:通过隐藏的表单字段、改写<span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">和持久</span><span style="font-family:Times New Roman">Cookie</span><span style="font-family:宋体">三种手段 </span></p> <p>独立实践</p> <p>? 在下列范例中,点击<span style="font-family:Times New Roman">“Submit request!”</span><span style="font-family:宋体">超链接时将以何种</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求形式调用</span><span style="font-family:Times New Roman">HelloServlet?</span></p> <p><a href=” http://localhost:8080/servlets/HelloServlet” >submit request!</a></p> <p>A. GET</p> <p>B. POST</p> <p>C. HEAD</p> <p>D. DELETE</p> <p>? 以下是<span style="font-family:Times New Roman">HelloServlet</span><span style="font-family:宋体">的完整内容:</span></p> <p>import javax.servlet.*;</p> <p>import javax.servlet.http.*;</p> <p>import java.io.*</p> <p></p> <p>public class HelloServlet extends HttpServlet {</p> <p>PrintWriter out = null;</p> <p></p> <p>public void service(HttpServletRequest request,</p> <p>HttpServletResponse response)</p> <p>throws ServletException, IOException {</p> <p>response.setContentType("text/html");</p> <p>out = response.getWriter();</p> <p></p> <p>}</p> <p>public void doGet(HttpServletRequest request,</p> <p>HttpServletResponse response)</p> <p>throws ServletException, IOException {</p> <p>out.println("doGet() is called");</p> <p>}</p> <p>public void doPost(HttpServletRequest request,</p> <p>HttpServletResponse response)</p> <p>throws ServletException, IOException {</p> <p>out.println("doPost() is called");</p> <p>}</p> <p>}</p> <p>如果以下面的方式调用<span style="font-family:Times New Roman">HelloServlet</span><span style="font-family:宋体">,浏览器将会显示下列哪个信息</span><span style="font-family:Times New Roman">?</span></p> <p>http://localhost:8080/servlet/HelloServlet </p> <p>? 下面哪个方法可以取得<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求所传递的参数</span><span style="font-family:Times New Roman">?</span></p> <p>A. ServletRequest<span style="font-family:宋体">接口的</span><span style="font-family:Times New Roman">getAttribute()</span><span style="font-family:宋体">方法</span></p> <p>B. ServletRequest<span style="font-family:宋体">接口的</span><span style="font-family:Times New Roman">getParameter()</span><span style="font-family:宋体">方法</span></p> <p>C. HttpServletRequest<span style="font-family:宋体">接口的</span><span style="font-family:Times New Roman">getAttribute()</span><span style="font-family:宋体">方法</span></p> <p>D. HttpServletRequest<span style="font-family:宋体">接口的</span><span style="font-family:Times New Roman">getParameter()</span><span style="font-family:宋体">方法</span></p> <p>? 查看下列程序代码片段:</p> <p>1. response.setContextType("image/gif");</p> <p>2</p> <p>3. out.close()</p> <p>如果你希望在<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">回应中传送一张</span><span style="font-family:Times New Roman">GIF</span><span style="font-family:宋体">图片,应该在第</span><span style="font-family:Times New Roman">2</span><span style="font-family:宋体">行加入什么程序代码</span><span style="font-family:Times New Roman">?</span></p> <p>? 下列哪个接口所提供的方法可回传一个<span style="font-family:Times New Roman">RequestDispatcher</span><span style="font-family:宋体">对象(选择两个正确答案)</span><span style="font-family:Times New Roman">?</span></p> <p>A. HttpServletRequest</p> <p>B. ServletConfig</p> <p>C. GenericServlet</p> <p>D. ServletContext</p> <p>E. ServletRequest</p> <p>第二十九章: <span style="font-family:Times New Roman">Jsp </span><span style="font-family:宋体">技术</span></p> <p>学习目标</p> <p>? JSP<span style="font-family:宋体">介绍</span></p> <p>? JSP<span style="font-family:宋体">语法</span></p> <p>? JSP<span style="font-family:宋体">内置对象</span></p> <p>? 自定义标签</p> <p>? 标准标签的使用</p> <p></p> <p>JSP<span style="font-family:宋体">介绍</span></p> <p>JSP(Java Server Page)<span style="font-family:宋体">是</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的简化设计。注重的是显示方面,而</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">主要是负责控制,在</span><span style="font-family:Times New Roman">MVC</span><span style="font-family:宋体">模式里面,</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">处于视图层,</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">处于控制器层。</span></p> <p></p> <p>JSP<span style="font-family:宋体">语法</span></p> <p>JSP<span style="font-family:宋体">是由模板元素(</span><span style="font-family:Times New Roman">html/xml</span><span style="font-family:宋体">等),指令元素,</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">脚本,动作元素组成的。 </span></p> <p>JSP<span style="font-family:宋体">的执行原理如下图:</span></p> <p></p> <p>JSP<span style="font-family:宋体">的执行过程如下图:</span></p> <p></p> <p>请看下例:</p> <p>JSP<span style="font-family:宋体">源文件 </span><span style="font-family:Times New Roman">test.jsp</span></p> <p><%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%></p> <p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p> <p><html></p> <p><head></p> <p><title>My JSP 'test.jsp' starting page</title></p> <p></head></p> <p><body></p> <p><%</p> <p>for (int i = 0; i < 5; i++) {</p> <p>out.println("hello<br>");</p> <p>}</p> <p>%></p> <p></body></p> <p></html></p> <p>经编译后的<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">源文件</span></p> <p>package org.apache.jsp;</p> <p>import javax.servlet.*;</p> <p>import javax.servlet.http.*;</p> <p>import javax.servlet.jsp.*;</p> <p>import java.util.*;</p> <p>public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase</p> <p>implements org.apache.jasper.runtime.JspSourceDependent {</p> <p>private static java.util.Vector _jspx_dependants;</p> <p>public java.util.List getDependants() {</p> <p>return _jspx_dependants;</p> <p>}</p> <p>public void _jspService(HttpServletRequest request,</p> <p>HttpServletResponse response) throws java.io.IOException,</p> <p>ServletException {</p> <p>JspFactory _jspxFactory = null;</p> <p>PageContext pageContext = null;</p> <p>HttpSession session = null;</p> <p>ServletContext application = null;</p> <p>ServletConfig config = null;</p> <p>JspWriter out = null;</p> <p>Object page = this;</p> <p>JspWriter _jspx_out = null;</p> <p>try {</p> <p>_jspxFactory = JspFactory.getDefaultFactory();</p> <p>response.setContentType("text/html;charset=ISO-8859-1");</p> <p>pageContext = _jspxFactory.getPageContext(this, request, response,</p> <p>null, true, 8192, true);</p> <p>application = pageContext.getServletContext();</p> <p>config = pageContext.getServletConfig();</p> <p>session = pageContext.getSession();</p> <p>out = pageContext.getOut();</p> <p>_jspx_out = out;</p> <p>out.write("\r\n\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n<html>\r\n <head>\r\n <title>My JSP 'test.jsp' starting page</title>\r\n </head>\r\n \r\n <body>\r\n ");</p> <p>for (int i = 0; i < 5; i++) {</p> <p>out.println("hello<br>");</p> <p>}</p> <p>out.write("\r\n </body>\r\n</html>\r\n");</p> <p>} catch (Throwable t) {</p> <p>if (!(t instanceof SkipPageException)) {</p> <p>out = _jspx_out;</p> <p>if (out != null && out.getBufferSize() != 0)</p> <p>out.clearBuffer();</p> <p>if (pageContext != null)</p> <p>pageContext.handlePageException(t);</p> <p>}</p> <p>} finally {</p> <p>if (_jspxFactory != null)</p> <p>_jspxFactory.releasePageContext(pageContext);</p> <p>}</p> <p>}</p> <p>}</p> <p>执行完该<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">生成的结果如下:</span></p> <p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p> <p><html></p> <p><head></p> <p><title>My JSP 'test.jsp' starting page</title></p> <p></head></p> <p><body></p> <p>hello<br></p> <p>hello<br></p> <p>hello<br></p> <p>hello<br></p> <p>hello<br></p> <p></body></p> <p></html></p> <p>页面显示的结果如下图:</p> <p>模板元素</p> <p>模板元素主要是指<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">模板,它是</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">引擎里面不执行的部分。这些</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标记数据直接会传送到客户端的浏览器。关于</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">请找些相关资料,花三个小时就可以搞定了,在此就不多做介绍了。</span></p> <p>指令元素</p> <p>1<span style="font-family:宋体">,</span> 页面指令 (<span style="font-family:Times New Roman">page</span><span style="font-family:宋体">指令)</span></p> <p>2<span style="font-family:宋体">,</span> 包含指令 (<span style="font-family:Times New Roman">include</span><span style="font-family:宋体">指令)</span></p> <p>3<span style="font-family:宋体">,</span> 标签库指令 (<span style="font-family:Times New Roman">taglib</span><span style="font-family:宋体">指令)</span></p> <p>这三个包含在<span style="font-family:Times New Roman">“<%@ %>”</span><span style="font-family:宋体">卷标里 </span></p> <p>页面指令</p> <p>“<%@ page %>”<span style="font-family:宋体">指令作用于整个</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页面,同样包括静态的包含文件。但是</span><span style="font-family:Times New Roman">“<%@ page %>”</span><span style="font-family:宋体">指令不能作用于动态的包含文件,比如 </span><span style="font-family:Times New Roman">“<jsp:include>”</span><span style="font-family:宋体">。</span></p> <p>可以在一个页面中用上多个<span style="font-family:Times New Roman">“<%@ page %>”</span><span style="font-family:宋体">指令,但是其中的属性只能用一次,不过也有例外,那就是</span><span style="font-family:Times New Roman">import</span><span style="font-family:宋体">属性。因为</span><span style="font-family:Times New Roman">import</span><span style="font-family:宋体">属性和</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">中的</span><span style="font-family:Times New Roman">import</span><span style="font-family:宋体">语句类似</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">参照</span><span style="font-family:Times New Roman">Java Language</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">import</span><span style="font-family:宋体">语句引入得是</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">语言中的类</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">,所以此属性就能多用几次。</span></p> <p>无论把<span style="font-family:Times New Roman">“<%@ page %>”</span><span style="font-family:宋体">指令放在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">的文件的哪个地方,它的作用范围都是整个</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页面。不过,为了</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">程序的可读性,以及好的编程习惯,最好还是把它放在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件的顶部。</span></p> <p>如:</p> <p><%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%></p> <p>所有属性用法如下:</p> <p><%@ page [ language="java" ] </p> <p>[ extends="package.class"] </p> <p>[import="{package.class | package.*},..." ] </p> <p>[ session="true | false" ] </p> <p>[ buffer="none | 8kb | sizekb" ] </p> <p>[ autoFlush="true | false" ] </p> <p>[ isThreadSafe="true | false" ] </p> <p>[ info="text" ] </p> <p>[ errorPage="relativeURL" ] </p> <p>[ contentType="mimeType [;charset=characterSet]"|"text/html; charset=ISO-8859-1" ] </p> <p>[ isErrorPage="true | false"] </p> <p>%></p> <p>对主要常用属性的解释:</p> <p>1<span style="font-family:宋体">.</span><span style="font-family:Times New Roman">language="java" </span></p> <p>声明脚本语言的种类,目前只能用<span style="font-family:Times New Roman">"java" </span><span style="font-family:宋体">。</span></p> <p>2.import="{package.class | package.* },..." </p> <p>需要导入的<span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">包的列表,这些包作用于程序段,表达式,以及声明。下面的包在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">编译时已经导入了,所以就不需要再指明了: </span></p> <p>java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.* </p> <p>3<span style="font-family:宋体">.</span><span style="font-family:Times New Roman">errorPage="relativeURL" </span></p> <p>设置处理异常事件的<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件。 </span></p> <p></p> <p></p> <p>4<span style="font-family:宋体">.</span><span style="font-family:Times New Roman">isErrorPage="true | false" </span></p> <p>设置此页是否为出错页,如果被设置为<span style="font-family:Times New Roman">true,</span><span style="font-family:宋体">你就能使用</span><span style="font-family:Times New Roman">exception</span><span style="font-family:宋体">对象</span></p> <p>exception<span style="font-family:宋体">对象示例,</span><span style="font-family:Times New Roman">ErrorPage.jsp</span><span style="font-family:宋体">文件代码</span></p> <p><%@ page isErrorPage="true" %></p> <p></p> <p><%= exception.getMessage() %><br></p> <p><%= exception.toString()%><br></p> <p>请看下例</p> <p><%@ page language="java" import="java.util.Date" session="true"</p> <p>buffer="12kb" autoFlush="true" info="page test" errorPage="error.jsp"</p> <p>isErrorPage="false" contentType="text/html; charset=gb2312"%></p> <p><%@ page errorPage="error.jsp"%></p> <p><%@ page isELIgnored="false"%></p> <p><html></p> <p><body></p> <p><h1></p> <p>使用<span style="font-family:Times New Roman">page</span><span style="font-family:宋体">指令的测试页面</span></p> <p></h1></p> <p><%=new Date().toLocaleString()%></p> <p>使用表达式语言: <span style="font-family:Times New Roman">\${2>3}:${2>3}</span></p> <p></body></p> <p></html></p> <p>显示结果如下:</p> <p></p> <p>包含指令</p> <p>是页面里包含有其他的页面。格式如:<span style="font-family:Times New Roman"><%@ include file=”head.jsp” %></span></p> <p>如下例:</p> <p>head.jsp</p> <p><table height=20 width=100% bgcolor=99ccff></p> <p><tr></p> <p><td align=center></p> <p>------head------</p> <p></td></p> <p></tr></p> <p></table></p> <p></p> <p>body.jsp</p> <p><html></p> <p><body bgcolor=eeffdd></p> <p>this is body</p> <p><br></p> <p><table height=20 width=100 bgcolor=ff2233></p> <p><tr></p> <p><td align=center></p> <p>********body********</p> <p></td></p> <p></tr></p> <p></p> <p></table></p> <p></body></p> <p></html></p> <p></p> <p>footer.jsp</p> <p><%@ page contentType="text/html; charset=gb2312"%></p> <p><br></p> <p>------footer------</p> <p><br></p> <p><table height=50 width=100 bgcolor=518000></p> <p><tr></p> <p><td align=center></p> <p><hr></p> <p><%=new java.util.Date()%></p> <p></td></p> <p></tr></p> <p></table></p> <p></p> <p>include.jsp</p> <p><%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%></p> <p><%@ include file="head.jsp"%></p> <p><%@ include file="body.html"%></p> <p><%@ include file="footer.jsp"%></p> <p></p> <p>浏览器的运行结果为:</p> <p></p> <p>标签库指令</p> <p>格式</p> <p><%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %></p> <p>如下例:<span style="font-family:Times New Roman">testtag.jsp</span></p> <p><%@ page language="java" import="java.util.*" pageEncoding="gbk"%></p> <p><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%></p> <p><html></p> <p><body></p> <p><c:if test="true"></p> <p>hello</p> <p></c:if></p> <p></body></p> <p></html></p> <p>在浏览器里的运行结果为:</p> <p></p> <p>脚本元素</p> <p>声明</p> <p>声明的格式为:<span style="font-family:Times New Roman"><%! %></span></p> <p>声明是声明实例变量,在转换成<span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">源文件的时候是以属性的形式生成。</span></p> <p>表达式</p> <p>表达式是或者运算值</p> <p>表达式的格式为:<span style="font-family:Times New Roman"><%= %></span></p> <p>scriptlet<span style="font-family:宋体">脚本</span></p> <p>scriptlet<span style="font-family:宋体">是</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">脚本</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">里面可以直接写</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">代码。</span></p> <p>scriptlet<span style="font-family:宋体">的格式为:</span><span style="font-family:Times New Roman"><% %></span></p> <p>如下例:<span style="font-family:Times New Roman">jiaoben.jsp</span></p> <p><%@ page language="java" import="java.util.*" pageEncoding="gbk"%></p> <p><html></p> <p><head></p> <p></p> <p><title>My JSP 'jiaoben.jsp' starting page</title></p> <p></head></p> <p><%! int age = 28; %></p> <p><body></p> <p><%</p> <p>String mess = "test scriptlet";</p> <p>out.print(mess + "<br>");</p> <p>if(age > 18){</p> <p>%></p> <p>成人拉! <br></p> <p><%}%></p> <p>该人的年龄为:</p> <p><%=age %></p> <p></body></p> <p></html></p> <p>转换成<span style="font-family:Times New Roman">Servlet </span><span style="font-family:宋体">的代码如下:</span></p> <p>package org.apache.jsp;</p> <p></p> <p>import javax.servlet.*;</p> <p>import javax.servlet.http.*;</p> <p>import javax.servlet.jsp.*;</p> <p>import java.util.*;</p> <p></p> <p>public final class jiaoben_jsp extends org.apache.jasper.runtime.HttpJspBase</p> <p>implements org.apache.jasper.runtime.JspSourceDependent {</p> <p></p> <p>int age = 28;</p> <p></p> <p>private static java.util.Vector _jspx_dependants;</p> <p></p> <p>public java.util.List getDependants() {</p> <p>return _jspx_dependants;</p> <p>}</p> <p></p> <p>public void _jspService(HttpServletRequest request, HttpServletResponse response)</p> <p>throws java.io.IOException, ServletException {</p> <p></p> <p>JspFactory _jspxFactory = null;</p> <p>PageContext pageContext = null;</p> <p>HttpSession session = null;</p> <p>ServletContext application = null;</p> <p>ServletConfig config = null;</p> <p>JspWriter out = null;</p> <p>Object page = this;</p> <p>JspWriter _jspx_out = null;</p> <p></p> <p></p> <p>try {</p> <p>_jspxFactory = JspFactory.getDefaultFactory();</p> <p>response.setContentType("text/html;charset=gbk");</p> <p>pageContext = _jspxFactory.getPageContext(this, request, response,</p> <p>null, true, 8192, true);</p> <p>application = pageContext.getServletContext();</p> <p>config = pageContext.getServletConfig();</p> <p>session = pageContext.getSession();</p> <p>out = pageContext.getOut();</p> <p>_jspx_out = out;</p> <p></p> <p>out.write("\r\n\r\n<html>\r\n <head>\r\n \r\n <title>My JSP 'jiaoben.jsp' starting page</title>\r\n\r\n </head>\r\n ");</p> <p>out.write("\r\n <body>\r\n ");</p> <p></p> <p>String mess = "test scriptlet";</p> <p>out.print(mess + "<br>");</p> <p>if(age > 18){</p> <p></p> <p>out.write("<span style="font-family:宋体">鎴愪汉鎷夛紒</span><span style="font-family:Times New Roman"><br>\r\n ");</span></p> <p>}</p> <p>out.write("\r\n <span style="font-family:宋体">璇ヤ汉鐨勫勾榫勪负锛</span><span style="font-family:Times New Roman">?);</span></p> <p>out.print(age );</p> <p>out.write("\r\n </body>\r\n</html>\r\n");</p> <p>} catch (Throwable t) {</p> <p>if (!(t instanceof SkipPageException)){</p> <p>out = _jspx_out;</p> <p>if (out != null && out.getBufferSize() != 0)</p> <p>out.clearBuffer();</p> <p>if (pageContext != null) pageContext.handlePageException(t);</p> <p>}</p> <p>} finally {</p> <p>if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);</p> <p>}</p> <p>}</p> <p>}</p> <p>注意:在 <span style="font-family:Times New Roman"><% %></span><span style="font-family:宋体">声明的</span><span style="font-family:Times New Roman">String mess = "test scriptlet"; </span><span style="font-family:宋体">是生成在方法里的。在</span><span style="font-family:Times New Roman"><%! %></span><span style="font-family:宋体">声明的</span><span style="font-family:Times New Roman">int age = 28; </span><span style="font-family:宋体">是生成在属性里的。</span></p> <p>执行完后生成的<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">代码如下:</span></p> <p><html></p> <p><head></p> <p><title>My JSP 'jiaoben.jsp' starting page</title></p> <p></head></p> <p><body></p> <p>test scriptlet<br></p> <p>成人拉! <br></p> <p>该人的年龄为:<span style="font-family:Times New Roman">28</span></p> <p></body></p> <p></html></p> <p>在浏览器里的运行结果如下图:</p> <p></p> <p>注意: 在标准的开发里面,是不允许在页面里面直接写<span style="font-family:Times New Roman">java</span><span style="font-family:宋体">代码的。在页面里面只能以标签的形式出现。本章后面会介绍通过自定义标签来取代直接写</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">代码的操作。但是在要求不高的小型项目里面,在页面里面直接使用</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">代码会提高开发效率。</span></p> <p>动作元素</p> <p>常使用的动作元素为: </p> <p><jsp:forward>,<jsp:param>,<jsp:include>,jsp:useBean>,</p> <p><jsp:getProperty>,<jsp:setProperty><span style="font-family:宋体">等等</span></p> <p><jsp:forward><span style="font-family:宋体">动作</span></p> <p>向另一个文件传递一个包含用户请求的<span style="font-family:Times New Roman">request</span><span style="font-family:宋体">对象 </span><span style="font-family:Times New Roman"><jsp:forward></span><span style="font-family:宋体">标签以后的代码,将不能执行。注意</span><span style="font-family:Times New Roman">jsp:forward</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">response.sendRedirect</span><span style="font-family:宋体">的区别在于</span><span style="font-family:Times New Roman">forward</span><span style="font-family:宋体">在同一个</span><span style="font-family:Times New Roman">request</span><span style="font-family:宋体">作用范围内,而重定向是另一个请求。</span></p> <p>下面的例子传递一个参数到<span style="font-family:Times New Roman">forwardTo.jsp</span></p> <p>jspone.jsp</p> <p><jsp:forward page="forwardTo.jsp"></p> <p><jsp:param name="userName" value="riso" /></p> <p></jsp:forward></p> <p>forwardTo.jsp</p> <p><%</p> <p>String useName=request.getParameter("userName");</p> <p>out.println(useName + "<span style="font-family:宋体">谢谢光临!</span><span style="font-family:Times New Roman">");</span> </p> <p>%></p> <p>输出:</p> <p>riso<span style="font-family:宋体">谢谢光临! </span></p> <p><jsp:include></p> <p>包含一个静态或动态文件</p> <p><jsp:include><span style="font-family:宋体">与</span><span style="font-family:Times New Roman"><%@ include file="</span><span style="font-family:宋体">路径</span><span style="font-family:Times New Roman">"%></span><span style="font-family:宋体">区别是前者是动态的,页面的内容可以改变,而后者是静态的,一经载入页面,将不能修改。</span></p> <p>请看下例:</p> <p>static.html</p> <p><html></p> <p><body></p> <p><form method=post action="jsp_include.jsp"></p> <p><table></p> <p><tr></p> <p><td></p> <p>please input your name:</p> <p></td></p> <p></tr></p> <p><tr></p> <p><td></p> <p><input type=text name=name></p> <p></td></p> <p></tr></p> <p><tr></p> <p><td></p> <p>input you password:</p> <p></td></p> <p><td></p> <p><input type=text name=password></p> <p></td></p> <p></tr></p> <p><tr></p> <p><td></p> <p><input type=submit value=login></p> <p></td></p> <p></tr></p> <p></table></p> <p></body></p> <p></html></p> <p>two.jsp</p> <p><%@ page contentType="text/html; charset=gb2312" language="java"%></p> <p>举例说明<span style="font-family:Times New Roman">include</span><span style="font-family:宋体">的工作原理:</span></p> <p><br> this is a1=<%=request.getParameter("a1")%><br></p> <p>this is a2= <%=request.getParameter("a2")%> <br></p> <p><% out.println("hello from two.jsp");%></p> <p></p> <p>jsp_include.jsp</p> <p><%@ page contentType="text/html; charset=gb2312" language="java"%></p> <p><html></p> <p><body></p> <p><%@ include file="static.html"%></p> <p><%//<span style="font-family:宋体">只是把文件包含进来</span><span style="font-family:Times New Roman">%></span></p> <p><a href="two.jsp">goto two--></a><br></p> <p>this examples show include works</p> <p><jsp:include page="two.jsp" flush="true"></p> <p><jsp:param name="a1" value="<%=request.getParameter("name")%>" /></p> <p><jsp:param name="a2" value="<%=request.getParameter("password")%>" /></p> <p></jsp:include></p> <p></body></p> <p></html></p> <p>从浏览器里输入:</p> <p>http://localhost:818/JspDemo/jsp_include.jsp</p> <p>看到结果为:</p> <p></p> <p>下面介绍<span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">的使用操作:</span></p> <p>PersonBean.java</p> <p>package com.bean;</p> <p></p> <p>public class PersonBean {</p> <p>private String name;</p> <p></p> <p>private String password;</p> <p></p> <p>public void setName(String name) {</p> <p>this.name = name;</p> <p>}</p> <p></p> <p>public void setPass(String pass) {</p> <p>this.password = pass;</p> <p>}</p> <p></p> <p>public String getName() {</p> <p>return this.name;</p> <p>}</p> <p></p> <p>public String getPass() {</p> <p>return this.password;</p> <p>}</p> <p>}</p> <p>login.jsp</p> <p><%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%></p> <p><%@ page import="com.bean.*" errorPage="error.jsp"%></p> <p><%</p> <p>String path = request.getContextPath();</p> <p>String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";</p> <p>%></p> <p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p> <p><html></p> <p><head></p> <p><base href="<%=basePath%>"></p> <p><title>My JSP 'login.jsp' starting page</title></p> <p><meta http-equiv="pragma" content="no-cache"></p> <p><meta http-equiv="cache-control" content="no-cache"></p> <p><meta http-equiv="expires" content="0"></p> <p><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"></p> <p><meta http-equiv="description" content="This is my page"></p> <p><!--</p> <p><link rel="stylesheet" type="text/css" href="styles.css"></p> <p>--></p> <p></head></p> <p><body></p> <p><form action="bean.jsp"></p> <p>name:</p> <p><input type="text" name="name"></p> <p><br></p> <p>pass:</p> <p><input type="password" name="password"></p> <p><br></p> <p><input type="submit" value="login"></p> <p></form></p> <p></body></p> <p></html></p> <p>从浏览器里输入:<span style="font-family:Times New Roman">http://localhost:818/JspDemo/login.jsp</span></p> <p>结果为:</p> <p></p> <p>当点击<span style="font-family:Times New Roman">login</span><span style="font-family:宋体">按钮,会跳到</span><span style="font-family:Times New Roman">bean.jsp</span></p> <p>bean.jsp</p> <p><jsp:useBean id="myPerson" scope="request" class="com.bean.PersonBean"></p> <p><jsp:setProperty name="myPerson" property="name" /></p> <p><jsp:setProperty name="myPerson" property="pass" param="password" /></p> <p></jsp:useBean></p> <p>name:</p> <p><jsp:getProperty name="myPerson" property="name" /></p> <p>pass:</p> <p><jsp:getProperty name="myPerson" property="pass" /></p> <p>运行的结果为:</p> <p></p> <p>注意:</p> <p>JavaBean<span style="font-family:宋体">的属性存取是通过</span><span style="font-family:Times New Roman">setXXX(),getXXX()</span><span style="font-family:宋体">方法来执行,而不是根据属性的名字来存取的。 </span></p> <p>JavaBean<span style="font-family:宋体">的</span><span style="font-family:Times New Roman">scope="page | request | session | application" </span></p> <p>page<span style="font-family:宋体">在包含</span><span style="font-family:Times New Roman">“<jsp:useBean>”</span><span style="font-family:宋体">元素的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件以及该文件中所有静态包含文件中使用这个</span><span style="font-family:Times New Roman">Bean,</span><span style="font-family:宋体">直到页面执行完毕向客户端发回响应或转到另一个文件为止。 </span></p> <p>request <span style="font-family:宋体">在任何执行相同请求的</span><span style="font-family:Times New Roman">Jsp</span><span style="font-family:宋体">文件中使用这个</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">,直到页面执行完毕向客户端发回响应或转到另一个文件为止。能够使用</span><span style="font-family:Times New Roman">Request</span><span style="font-family:宋体">对象访问这个</span><span style="font-family:Times New Roman">Bean,</span><span style="font-family:宋体">比如</span><span style="font-family:Times New Roman">request.getAttribute(beanInstanceName)</span><span style="font-family:宋体">。 </span></p> <p>session - <span style="font-family:宋体">从创建</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">开始,就能在任何使用相同</span><span style="font-family:Times New Roman">session</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">jsp</span><span style="font-family:宋体">文件中使用这个</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">。这个</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">存在于整个</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">生存周期内,任何在分享此</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Jsp</span><span style="font-family:宋体">文件都能使用同一</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">。注意在创建这个</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Jsp</span><span style="font-family:宋体">文件中</span><span style="font-family:Times New Roman">“<% @ page %>”</span><span style="font-family:宋体">指令中必须指定</span><span style="font-family:Times New Roman">“session="true"”</span><span style="font-family:宋体">。 </span></p> <p>application - <span style="font-family:宋体">从创建</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">开始,就能在任何使用相同</span><span style="font-family:Times New Roman">application</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Jsp</span><span style="font-family:宋体">文件中使用</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">。这个</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">存在于整个</span><span style="font-family:Times New Roman">application</span><span style="font-family:宋体">生存周期内,任何在分享此</span><span style="font-family:Times New Roman">application</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Jsp</span><span style="font-family:宋体">文件都能使用同一</span><span style="font-family:Times New Roman">Bean. </span></p> <p>JSP<span style="font-family:宋体">内置对象</span></p> <p>JSP <span style="font-family:宋体">有以下九种内置对象,包括:</span></p> <p>request<span style="font-family:宋体">,请求对象</span></p> <p>response<span style="font-family:宋体">,响应对象</span></p> <p>pageContext<span style="font-family:宋体">,页面上下文对象</span></p> <p>session<span style="font-family:宋体">,会话对象</span></p> <p>application<span style="font-family:宋体">,应用程序对象</span></p> <p>out<span style="font-family:宋体">,输出对象</span></p> <p>config<span style="font-family:宋体">,配置对象</span></p> <p>page<span style="font-family:宋体">,页面对象</span></p> <p>exception<span style="font-family:宋体">,例外对象</span></p> <p>下表对九个内置对象的解释</p> <p>对象名 类型 作用域</p> <p>request javax.servlet.ServletRequest <span style="font-family:宋体">的子类</span> request</p> <p>response javax.servlet.ServletResponse <span style="font-family:宋体">的子类</span> page</p> <p>pageContext javax.servlet.jsp.PageContext page</p> <p>session javax.servlet.http.HttpSession session</p> <p>application javax.servlet.ServletContext application</p> <p>out javax.servlet.jsp.JspWriter page</p> <p>config java.servlet.ServletConfig page</p> <p>page java.lang.Object page</p> <p>exception java.lang.Throwable page</p> <p>request <span style="font-family:宋体">对象代表的是来自客户端的请求,例如我们在</span><span style="font-family:Times New Roman">FORM</span><span style="font-family:宋体">表单中填写的信息等,是最常用的对象。关于它的方法使用较多的是</span><span style="font-family:Times New Roman">getParameter</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">getParameterNames</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">getParameterValues</span><span style="font-family:宋体">,通过调用这几个方法来获取请求对象中所包含的参数的值</span><span style="font-family:Times New Roman">;</span></p> <p>response <span style="font-family:宋体">对象代表的是对客户端的响应,也就是说可以通</span><span style="font-family:Times New Roman">“response”</span><span style="font-family:宋体">对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用</span><span style="font-family:Times New Roman">“out” </span><span style="font-family:宋体">对象即可。 </span></p> <p>pageContext <span style="font-family:宋体">对象直译时可以称作</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">页面上下文</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">对象,代表的是当前页面运行的一些属性,常用的方法包括</span><span style="font-family:Times New Roman">findAttribute</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">getAttribute</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">getAttributesScope</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">getAttributeNamesInScope</span><span style="font-family:宋体">,一般情况下</span><span style="font-family:Times New Roman">“pageContext” </span><span style="font-family:宋体">对象用到得也不是很多,只有在项目所面临的情况比较复杂的情况下,才会利用到页面属性来辅助处理。</span></p> <p>session <span style="font-family:宋体">对象代表服务器与客户端所建立的会话,是在服务器端保存客户的信息。主要是跟踪用户的状态,比如是否登陆等。</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">对象记载某一特定的客户信息,不同的客户用不同的</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">对象来记载。</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">对象有效期:默认为</span><span style="font-family:Times New Roman">20</span><span style="font-family:宋体">分钟,可设定。常用的方法包括</span><span style="font-family:Times New Roman">getId</span><span style="font-family:宋体">、 </span><span style="font-family:Times New Roman">getValue</span><span style="font-family:宋体">、 </span><span style="font-family:Times New Roman">getValueNames</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">putValue</span><span style="font-family:宋体">等。 </span></p> <p>application” <span style="font-family:宋体">对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有</span><span style="font-family:Times New Roman">setAttribute</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">getAttribute</span><span style="font-family:宋体">等。与</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">的区别是:</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">对象记载某一特定的客户信息,不同的客户用不同的</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">对象来记载而</span><span style="font-family:Times New Roman">Application</span><span style="font-family:宋体">对象记载所有访问该应用程序的客户信息 。</span></p> <p>out <span style="font-family:宋体">对象代表了向客户端发送数据的对象,与</span><span style="font-family:Times New Roman">“response” </span><span style="font-family:宋体">对象不同,通过</span><span style="font-family:Times New Roman">“out” </span><span style="font-family:宋体">对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过</span><span style="font-family:Times New Roman">“out” </span><span style="font-family:宋体">对象直接向客户端写一个由程序动态生成</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件。常用的方法除了</span><span style="font-family:Times New Roman">pirnt</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">println</span><span style="font-family:宋体">之外,还包括</span><span style="font-family:Times New Roman">clear</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">clearBuffer</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">flush</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">getBufferSize</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">getRemaining</span><span style="font-family:宋体">,这是因为</span><span style="font-family:Times New Roman">“out” </span><span style="font-family:宋体">对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。</span></p> <p>config <span style="font-family:宋体">对象提供一些配置信息,常用的方法有</span><span style="font-family:Times New Roman">getInitParameter</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">getInitParameterNames</span><span style="font-family:宋体">,以获得</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">初始化时的参数。</span></p> <p>page <span style="font-family:宋体">对象代表了正在运行的由</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件产生的类对象,不建议一般读者使用。</span></p> <p>exception <span style="font-family:宋体">对象则代表了</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件运行时所产生的例外对象,此对象不能在一般</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件中直接使用,而只能在使用了</span><span style="font-family:Times New Roman">“<%@ page isErrorPage="true "%>”</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件中使用。</span></p> <p>out<span style="font-family:宋体">对象的使用操作如下代码:</span></p> <p><%@ page language="java" import="java.util.*" pageEncoding="gbk"%></p> <p><%</p> <p>response.setContentType("text/html");</p> <p>out.println("<span style="font-family:宋体">学习使用</span><span style="font-family:Times New Roman">out</span><span style="font-family:宋体">对象:</span><span style="font-family:Times New Roman"><br><hr>");</span></p> <p>out.println("<br>out.println(boolean):");</p> <p>out.println(true);</p> <p>out.println("<br>out.println(char):");</p> <p>out.println('a');</p> <p>out.println("<br>out.println(char[]):");</p> <p>out.println(new char[]{'a','b'});</p> <p>out.println("<br>out.println(double):");</p> <p>out.println(2.3d);</p> <p>out.println("<br>out.println(float):");</p> <p>out.println(43.2f);</p> <p>out.println("<br>out.println(int):");</p> <p>out.println(34);</p> <p>out.println("<br>out.println(long):");</p> <p>out.println(2342342343242354L);</p> <p>out.println("<br>out.println(object):");</p> <p>out.println(new java.util.Date());</p> <p>out.println("<br>out.println(string):");</p> <p>out.println("string");</p> <p>out.println("<br>out.newLine():");</p> <p>out.newLine();</p> <p>out.println("<br>out.getBufferSize():");</p> <p>out.println(out.getBufferSize());</p> <p>out.println("<br>out.getRemaining():");</p> <p>out.println(out.getRemaining());</p> <p>out.println("<br>out.isAutoFlush():");</p> <p>out.println(out.isAutoFlush());</p> <p>out.flush();</p> <p>%></p> <p>运行的结果如下:</p> <p></p> <p>config<span style="font-family:宋体">对象的测试</span></p> <p>代码如下:</p> <p><%@ page contentType="text/html; charset=gb2312" language="java"</p> <p>import="java.sql.*" errorPage=""%></p> <p><html></p> <p><head></p> <p><title>Untitled Document</title></p> <p><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></p> <p></head></p> <p></p> <p><body></p> <p><% int count=0;</p> <p>try</p> <p>{</p> <p>count=Integer.parseInt(config.getInitParameter("counter"));</p> <p>}</p> <p>catch(Exception e)</p> <p>{</p> <p>out.println("org:"+e);</p> <p>}</p> <p>out.println("<span style="font-family:宋体">此页面设置的初始值为</span><span style="font-family:Times New Roman">"+count+"</span><span style="font-family:宋体">次</span><span style="font-family:Times New Roman">");</span></p> <p>%></p> <p></body></p> <p></html></p> <p>在<span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">中的配置信息为:</span></p> <p><?xml version="1.0" encoding="UTF-8"?></p> <p><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"</p> <p>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p> <p>xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee </p> <p>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></p> <p><servlet></p> <p><description></p> <p>This is the description of my J2EE component</p> <p></description></p> <p><display-name></p> <p>This is the display name of my J2EE component</p> <p></display-name></p> <p><servlet-name>SessionServet</servlet-name></p> <p><servlet-class>com.servlet.SessionServet</servlet-class></p> <p></servlet></p> <p></p> <p><servlet></p> <p><servlet-name>config_counter</servlet-name></p> <p><jsp-file>/config.jsp</jsp-file></p> <p><init-param></p> <p><param-name>counter</param-name></p> <p><param-value>1000</param-value></p> <p></init-param></p> <p></servlet></p> <p><servlet-mapping></p> <p><servlet-name>config_counter</servlet-name></p> <p><url-pattern>/config_counter</url-pattern></p> <p></servlet-mapping></p> <p><servlet-mapping></p> <p><servlet-name>SessionServet</servlet-name></p> <p><url-pattern>/servlet</url-pattern></p> <p></servlet-mapping></p> <p></p> <p></web-app></p> <p>在浏览器里的运行结果为:</p> <p></p> <p>session,application.request<span style="font-family:宋体">对象已经在</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">里介绍过了。用法完全一样,这里就不多说了。</span></p> <p>剩余的内置对象由于不是太常用,在这里也不介绍了。</p> <p>Session<span style="font-family:宋体">和</span><span style="font-family:Times New Roman">Application</span><span style="font-family:宋体">对象</span></p> <p>Session<span style="font-family:宋体">对象记载某一特定的客户信息,不同的客户用不同的</span><span style="font-family:Times New Roman">Session</span><span style="font-family:宋体">对象来记载</span></p> <p>Application<span style="font-family:宋体">对象记载所有访问该应用程序的客户信息</span></p> <p>application<span style="font-family:宋体">对象示例</span></p> <p><%@ page contentType="text/html;charset=gb2312"%></p> <p><html></p> <p><head></p> <p><title>application</title></p> <p><head></p> <p><body></p> <p><% out.println("Java Servlet API Version "+application.getMajorVersion()</p> <p>+"."+application.getMinorVersion()+"<br>");</p> <p>out.println("peixun2.13.jsp's MIME type is:"+application.getMimeType("peixun2.13.jsp")</p> <p>+"<br>");</p> <p>out.println("URL of 'peixun2.13.jsp' is: "+application.getResource(“/peixun2.13.jsp")+"<br>");</p> <p>out.println("getServerInfo()="+application.getServerInfo()+"<br>");</p> <p>out.println(application.getRealPath(" "));</p> <p>application.log("Add a Record to log_file"); %></p> <p></body></p> <p></html></p> <p>运行结果</p> <p></p> <p>JSP<span style="font-family:宋体">的汉字问题的原理</span></p> <p>客户端和服务器用<span style="font-family:Times New Roman">gb2312</span></p> <p>HTTP<span style="font-family:宋体">传输编码用</span><span style="font-family:Times New Roman">ISO8859_1</span></p> <p>服务器需要指示客户端文档的编码方式</p> <p><%@ page contentType="text/html;charset=gb2312"%></p> <p></p> <p>在服务器端接收到客户端数据时需要转换为<span style="font-family:Times New Roman">gb2312</span><span style="font-family:宋体">后进行处理,方法</span></p> <p>String name=new String(name.getBytes("ISO8859_1"), "gb2312");</p> <p></p> <p>自定义标签</p> <p>在目前中大型项目开发里面,对<span style="font-family:Times New Roman">MVC</span><span style="font-family:宋体">模式的要求是比较高的。在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页面只能出现标签和</span><span style="font-family:Times New Roman">html/xml</span><span style="font-family:宋体">模板,而不能出现</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">代码。那么标签的运行原理是通过页面里的标签,而通过</span><span style="font-family:Times New Roman">xml</span><span style="font-family:宋体">文件的配置,去调用后台的</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">对象执行,然后把结果返回给页面。</span></p> <p>请看下例:</p> <p>首先定义标签执行类<span style="font-family:Times New Roman">HelloWorldTag.java</span></p> <p>package com.mytag;</p> <p></p> <p>import java.sql.Connection;</p> <p>import java.sql.ResultSet;</p> <p>import java.sql.ResultSetMetaData;</p> <p>import java.sql.Statement;</p> <p></p> <p>import javax.servlet.jsp.JspException;</p> <p>import javax.servlet.jsp.JspWriter;</p> <p>import javax.servlet.jsp.PageContext;</p> <p>import javax.servlet.jsp.tagext.Tag;</p> <p></p> <p>import com.jdbc.JDBCCon;</p> <p></p> <p>public class HelloWorldTag implements Tag {</p> <p></p> <p>PageContext pageContext = null;</p> <p></p> <p>String mess = null;</p> <p></p> <p>public void setMess(String me) {</p> <p>this.mess = me;</p> <p>}</p> <p></p> <p>public int doEndTag() throws JspException {</p> <p>// TODO Auto-generated method stub</p> <p></p> <p>return this.EVAL_PAGE;</p> <p>}</p> <p></p> <p>public int doStartTag() throws JspException {</p> <p>// TODO Auto-generated method stub</p> <p></p> <p>Connection con = JDBCCon.getCon();</p> <p>JspWriter out = pageContext.getOut();</p> <p>String sql = "select * from " + mess;</p> <p>try {</p> <p>Statement st = con.createStatement();</p> <p>ResultSet rs = st.executeQuery(sql);</p> <p>ResultSetMetaData rsmd = rs.getMetaData();</p> <p>int lie = rsmd.getColumnCount();</p> <p>while (rs.next()) {</p> <p>for (int i = 1; i <= lie; i++) {</p> <p>out.print(rs.getString(i) + ",");</p> <p>}</p> <p>out.println("<br>");</p> <p>}</p> <p>out.println("hello " + mess);</p> <p>} catch (Exception e) {</p> <p>e.printStackTrace();</p> <p>} finally {</p> <p>try {</p> <p>if (con != null) {</p> <p>con.close();</p> <p>}</p> <p>} catch (Exception e) {</p> <p>e.printStackTrace();</p> <p>}</p> <p>}</p> <p>return this.SKIP_BODY;</p> <p>}</p> <p></p> <p>public Tag getParent() {</p> <p>// TODO Auto-generated method stub</p> <p>return null;</p> <p>}</p> <p></p> <p>public void release() {</p> <p>// TODO Auto-generated method stub</p> <p>}</p> <p></p> <p>public void setPageContext(PageContext arg0) {</p> <p>// TODO Auto-generated method stub</p> <p>this.pageContext = arg0;</p> <p>}</p> <p></p> <p>public void setParent(Tag arg0) {</p> <p>// TODO Auto-generated method stub</p> <p></p> <p>}</p> <p></p> <p>}</p> <p>其次定义标签库的描述文件</p> <p><?xml version="1.0" encoding="UTF-8"?></p> <p><taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"</p> <p>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p> <p>xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd "></p> <p><tlib-version>0.0</tlib-version></p> <p><short-name>NMTOKEN</short-name></p> <p><uri>www.kening.com</uri></p> <p><tag></p> <p><name>shuchu</name></p> <p><tag-class>com.mytag.HelloWorldTag</tag-class></p> <p><body-content>empty</body-content></p> <p><attribute></p> <p><name>mess</name></p> <p><required>true</required></p> <p></attribute></p> <p></tag></p> <p><tag></p> <p><name>xuanzhe</name></p> <p><tag-class>com.mytag.BodyTagTest</tag-class></p> <p><body-content>JSP</body-content></p> <p><attribute></p> <p><name>isOut</name></p> <p><required>true</required></p> <p><rtexprvalue>true</rtexprvalue></p> <p></attribute></p> <p></tag></p> <p><tag></p> <p><name>number</name></p> <p><tag-class>com.mytag.CountTag</tag-class></p> <p><body-content>JSP</body-content></p> <p><attribute></p> <p><name>count</name></p> <p><required>true</required></p> <p><rtexprvalue>true</rtexprvalue></p> <p></attribute></p> <p></tag></p> <p><tag></p> <p><name>diedai</name></p> <p><tag-class>com.mytag.IteTag</tag-class></p> <p><body-content>JSP</body-content></p> <p><attribute></p> <p><name>name</name></p> <p><required>true</required></p> <p></attribute></p> <p><attribute></p> <p><name>data</name></p> <p><required>true</required></p> <p><rtexprvalue>true</rtexprvalue></p> <p></attribute></p> <p></tag></p> <p></taglib></p> <p>在页面里的使用如下:<span style="font-family:Times New Roman">HelloTag.jsp</span></p> <p><%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%></p> <p><%@ taglib uri="www.kening.com" prefix="hello"%></p> <p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p> <p><html></p> <p><head></p> <p><title>My JSP 'HelloTag.jsp' starting page</title></p> <p></head></p> <p></p> <p><body></p> <p><hello:shuchu mess="kebiao" /></p> <p></body></p> <p></html></p> <p>运行结果如下:</p> <p></p> <p>关于标签体,叠代标签的定义请参考<span style="font-family:Times New Roman">JspDemo</span><span style="font-family:宋体">事例。</span></p> <p>标准标签的使用</p> <p>如下<span style="font-family:Times New Roman">biaozhuntag.jsp</span><span style="font-family:宋体">:</span></p> <p><%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%></p> <p><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%></p> <p><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%></p> <p><%</p> <p>String path = request.getContextPath();</p> <p>String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";</p> <p>%></p> <p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p> <p><html></p> <p><head></p> <p><base href="<%=basePath%>"></p> <p><title>My JSP 'biaozhuntag.jsp' starting page</title></p> <p><meta http-equiv="pragma" content="no-cache"></p> <p><meta http-equiv="cache-control" content="no-cache"></p> <p><meta http-equiv="expires" content="0"></p> <p><!--<link rel="stylesheet" type="text/css" href="styles.css">--></p> <p></head></p> <p><body></p> <p><c:catch var="myexception"></p> <p><% int k = 5/0; %></p> <p></c:catch></p> <p><c:out value="${myexception}"></c:out></p> <p><c:if test="false"></p> <p>hello</p> <p></c:if></p> <p><c:forEach var="i" begin="1" end="10" step="3"></p> <p><c:out value="${i}"></c:out></p> <p><br></p> <p></c:forEach></p> <p><c:url var="myurl" value="login.jsp" scope="session"></p> <p></c:url></p> <p><c:out value="${myurl}" /></p> <p><br></p> <p><c:if test="${param.name == 'andy'}"></p> <p><c:redirect url="${myurl}"></c:redirect></p> <p></c:if></p> <p><c:out value="${param.name}" /></p> <p><c:forTokens var="token"</p> <p>items="blue,red,green|yellow|pink,black|white" delims="|"></p> <p><c:out value="${token}" /></p> <p></c:forTokens></p> <p><sql:setDataSource var="ds1"</p> <p>driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"</p> <p>url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=pubs"</p> <p>user="sa" password="signal" /></p> <p><sql:setDataSource var="ds2" dataSource="jdbc/tag" /></p> <p><sql:query var="query1" dataSource="${ds2}"></p> <p>SELECT * FROM student</p> <p></sql:query></p> <p><table border="1"></p> <p><c:forEach var="row" items="${query1.rows}"></p> <p><tr></p> <p><td></p> <p>id:</p> <p><c:out value="${row.id}" /></p> <p></td></p> <p><td></p> <p>name:</p> <p><c:out value="${row.name}" /></p> <p></td></p> <p></tr></p> <p></c:forEach></p> <p></table></p> <p></body></p> <p></html></p> <p>运行结果如下图:</p> <p></p> <p>关于该例子的源代码请参看附录里:<span style="font-family:Times New Roman">JspDemo</span><span style="font-family:宋体">工程</span></p> <p></p> <p>内容总结</p> <p>? JSP<span style="font-family:宋体">是由模板元素(</span><span style="font-family:Times New Roman">html/xml</span><span style="font-family:宋体">等),指令元素,</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">脚本,动作元素组成的。 </span></p> <p>? 指令元素分为:页面指令<span style="font-family:Times New Roman">(page</span><span style="font-family:宋体">指令</span><span style="font-family:Times New Roman">) </span><span style="font-family:宋体">包含指令</span><span style="font-family:Times New Roman">(include</span><span style="font-family:宋体">指令</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">标签库指令</span><span style="font-family:Times New Roman">(taglib</span><span style="font-family:宋体">指令</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">这三个包含在</span><span style="font-family:Times New Roman">“<%@ %>”</span><span style="font-family:宋体">卷标里 </span></p> <p>? 脚本元素<span style="font-family:Times New Roman">:</span><span style="font-family:宋体">声明的格式为</span><span style="font-family:Times New Roman"><%!</span><span style="font-family:宋体">变量名</span><span style="font-family:Times New Roman">=</span><span style="font-family:宋体">值</span><span style="font-family:Times New Roman">%></span><span style="font-family:宋体">转换成</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">源文件的时候是以属性的形式生成;</span><span style="font-family:Times New Roman"><% java</span><span style="font-family:宋体">代码</span><span style="font-family:Times New Roman">%></span><span style="font-family:宋体">嵌入</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">代码,转换成</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">源文件的时候是以方法的形式生成;</span></p> <p>? 动作元素 </p> <p><jsp:forward>,<jsp:param>,<jsp:include>,jsp:useBean>,<jsp:getProperty>,<jsp:setProperty><span style="font-family:宋体">等等</span></p> <p>注意<span style="font-family:Times New Roman">jsp:forward</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">response.sendRedirect</span><span style="font-family:宋体">的区别在于</span><span style="font-family:Times New Roman">forward</span><span style="font-family:宋体">在同一个</span><span style="font-family:Times New Roman">request</span><span style="font-family:宋体">作用范围内,而重定向是另一个请求。</span></p> <p>? javabean:<span style="font-family:宋体">只有</span><span style="font-family:Times New Roman">get/set</span><span style="font-family:宋体">方法的</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">对象</span></p> <p><jsp:useBean id="myPerson" scope="request" </p> <p>class="bean.PersonBean"></p> <p><jsp:setProperty name="myPerson" property="name" /></p> <p><jsp:setProperty name="myPerson" property="pass" /></p> <p></jsp:useBean></p> <p>? JSP <span style="font-family:宋体">有以下九种内置对象,包括:</span></p> <p>request<span style="font-family:宋体">请求对象</span> response<span style="font-family:宋体">响应对象</span></p> <p>pageContext<span style="font-family:宋体">页面上下文对象 </span><span style="font-family:Times New Roman">session</span><span style="font-family:宋体">会话对象</span></p> <p>application<span style="font-family:宋体">应用程序对象 </span><span style="font-family:Times New Roman">out</span><span style="font-family:宋体">输出对象</span></p> <p>config<span style="font-family:宋体">配置对象 </span>page<span style="font-family:宋体">页面对象</span></p> <p>exception<span style="font-family:宋体">例外对象</span></p> <p>? 自定义标签 </p> <p>独立实战</p> <p>? jsp<span style="font-family:宋体">的组成部分是什么</span></p> <p>? jsp<span style="font-family:宋体">的内置对象有哪些,它们的作用分别是什么</span></p> <p>? 说不同</p> <p><%@ include file><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><jsp:include></span></p> <p><%! int age = 28; %><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><% int age=28;%></span></p> <p><jsp:forward file><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><% response.sendRedirect %></span></p> <p>page<span style="font-family:宋体">、</span><span style="font-family:Times New Roman">request</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">session</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">application</span></p> <p><!-- --> <span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><%-- --%></span></p> <p>? 用<span style="font-family:Times New Roman"><jsp:include></span><span style="font-family:宋体">实现一个三栏页面布局,用</span><span style="font-family:Times New Roman"><%@ include</span><span style="font-family:宋体">包含公共文件</span><span style="font-family:Times New Roman">command.jsp</span></p> <p>? 自定义一个标签<span style="font-family:Times New Roman">titleTag,</span><span style="font-family:宋体">输出一个标题条</span></p> <p>? 用<span style="font-family:Times New Roman">jsp+jdbc</span><span style="font-family:宋体">实现用户登录注册和注销功能</span></p> <p>第三十章:<span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">入门</span></p> <p>学习目标</p> <p>? 应用框架介绍 </p> <p>? 理解<span style="font-family:Times New Roman">HTTP, CGI, servlet, </span><span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">JSP </span></p> <p>? 使用 <span style="font-family:Times New Roman">Model 2 </span><span style="font-family:宋体">架构 </span></p> <p>? 构建简单的应用</p> <p></p> <p>Struts<span style="font-family:宋体">简介</span></p> <p>Struts<span style="font-family:宋体">是</span><span style="font-family:Times New Roman">Apache</span><span style="font-family:宋体">软件基金下</span><span style="font-family:Times New Roman">Jakarta</span><span style="font-family:宋体">项目的一部分,</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">框架的主要架构设计和开发者是</span><span style="font-family:Times New Roman">Craig R.McClanahan</span><span style="font-family:宋体">。</span><span style="font-family:Times New Roman">Craig </span><span style="font-family:宋体">也是</span><span style="font-family:Times New Roman">Tomcat</span><span style="font-family:宋体">的主要架构师,以及</span><span style="font-family:Times New Roman">Java Web Services Developer Pack</span><span style="font-family:宋体">的主要架构师和实现者。他现在是</span><span style="font-family:Times New Roman">Sun</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">JavaServer Faces (JSR-127) </span><span style="font-family:宋体">以及</span><span style="font-family:Times New Roman">J2EE</span><span style="font-family:宋体">平台的</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">层架构的规范领导。 </span></p> <p>Struts <span style="font-family:宋体">在</span><span style="font-family:Times New Roman">Apache </span><span style="font-family:宋体">软件许可 </span><span style="font-family:Times New Roman">[ASF, License]</span><span style="font-family:宋体">下对公众是免费的。 使用此软件没有任何获得和再现成本。不象其他一些开源许可,</span><span style="font-family:Times New Roman">Apache </span><span style="font-family:宋体">软件许可对商业用途是友好的。你可以在你的商业项目中使用</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">,并自由分发</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">库。你也可以将</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">组件集成到你的框架中,就像他们是你自己编写的一样。</span></p> <p>框架之所以叫<span style="font-family:Times New Roman">“Struts”</span><span style="font-family:宋体">,是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。 这也是一个解释</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">在开发</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用程序中所扮演的角色的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样,软件工程师使用</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">为业务应用的每一层提供支持。</span></p> <p>什么是应用框架</p> <p>框架(<span style="font-family:Times New Roman">framework</span><span style="font-family:宋体">)是可重用的,半完成的应用程序,可以用来产生专门的定制程序</span><span style="font-family:Times New Roman">[Johnson]</span><span style="font-family:宋体">。</span></p> <p>Framework<span style="font-family:宋体">概念并不是很新了,伴随着软件开发的发展,在多层的软件开发项目中,可重用、易扩展的,而且是经过良好测试的软件组件,越来越为人们所青睐。这意味着人们可以将充裕的时间用来分析、构建业务逻辑的应用上,而非繁杂的代码工程。于是人们将相同类型问题的解决途径进行抽象,抽取成一个应用框架。这也就是我们所说的</span><span style="font-family:Times New Roman">Framework</span><span style="font-family:宋体">。</span></p> <p>Framework<span style="font-family:宋体">的体系提供了一套明确机制,从而让开发人员很容易的扩展和控制整个</span><span style="font-family:Times New Roman">Framework</span><span style="font-family:宋体">开发上的结构。</span> 通常,<span style="font-family:Times New Roman">Framework</span><span style="font-family:宋体">的结构中都有一个</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">命令和控制</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">组件(</span><span style="font-family:Times New Roman">"command and control" component</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">——Framework Factory and Manager</span><span style="font-family:宋体">。</span></p> <p></p> <p>图<span style="font-family:Times New Roman">1 Framework</span><span style="font-family:宋体">体系</span></p> <p>通过基于请求响应(<span style="font-family:Times New Roman">Request-Response</span><span style="font-family:宋体">)模式的应用</span><span style="font-family:Times New Roman">Framework</span><span style="font-family:宋体">,基本上有如下几个表现逻辑结构组成。</span></p> <p>? 控制器(<span style="font-family:Times New Roman">Controller</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">——</span><span style="font-family:宋体">控制整个</span><span style="font-family:Times New Roman">Framework</span><span style="font-family:宋体">中各个组件的协调工作。</span></p> <p>? 业务逻辑层(<span style="font-family:Times New Roman">Business Logic</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">——</span><span style="font-family:宋体">对</span><span style="font-family:Times New Roman">Framwork</span><span style="font-family:宋体">本身来说,这里仅仅只是概念和几个提够服务的基础组件,真正的实现与客户的业务逻辑接轨,还需要开发人员在</span><span style="font-family:Times New Roman">Framework</span><span style="font-family:宋体">上再次扩展。</span></p> <p>? 数据逻辑层(<span style="font-family:Times New Roman">Data Logic</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">——</span><span style="font-family:宋体">绝大应用系统都需要涉及到数据交互,这一层次主要包括了数据逻辑和数据访问接口。对于数据逻辑来说,如果你了解数据建模(</span><span style="font-family:Times New Roman">Data Modeling</span><span style="font-family:宋体">)可能就很容易理解。</span></p> <p>框架向开发人员提供一系列具有以下特征的骨架组件: </p> <p>? 已经知道他们在其他程序上工作的很好; </p> <p>? 它们随时可以在下一个项目中使用; </p> <p>? 他们可以被组织的其他团队使用;</p> <p>WEB<span style="font-family:宋体">框架所要解决的问题</span></p> <p>涉及的概念和技术</p> <p>超文本传输协议 <span style="font-family:Times New Roman">(HTTP) </span><span style="font-family:宋体">:很多服务器应用程序使用</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">之外的其他协议。他们在计算机之间维护一个持久性的的连接。应用服务器可以清楚的知道是谁连接上来,而且何时中断连接。因为他们知道每一个连接的状态,以及每一个使用它的人。这称之为状态协议。 </span></p> <p>相反, <span style="font-family:Times New Roman">HTTP </span><span style="font-family:宋体">是一个无状态协议。</span><span style="font-family:Times New Roman">HTTP server </span><span style="font-family:宋体">可以接受来自于各种客户的各种请求,并提供各种响应,即使是这个响应仅仅是说</span><span style="font-family:Times New Roman">No</span><span style="font-family:宋体">。没有大量的协商和连接持久性,无状态协议可以处理大量的请求。</span></p> <p>HTTP<span style="font-family:宋体">请求的第一行包含方法,其后是请求的来源地址和</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">版本。</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求头跟在首行后面,可以没有也可以有多个。</span><span style="font-family:Times New Roman">HTTP </span><span style="font-family:宋体">头向服务器提供额外的信息。可以包括浏览器的种类和版本,可接受的文档类型,浏览器的 </span> <span style="font-family:Times New Roman">cookies</span><span style="font-family:宋体">等等。</span><span style="font-family:Times New Roman">7</span><span style="font-family:宋体">种请求方法中, </span><span style="font-family:Times New Roman">GET </span><span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">POST </span><span style="font-family:宋体">是用得最多的。 </span></p> <p>一旦服务器接收到请求,他就要产生一个<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">响应。响应的第一行称为状态行,包含了</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">协议的版本,数字型状态,以及状态的简短描述。状态行后,服务器将返回一个</span><span style="font-family:Times New Roman">HTTP </span><span style="font-family:宋体">响应头,类似于</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求头。</span> </p> <p>Cookies <span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">URL </span><span style="font-family:宋体">重写是两个在请求间跟踪用户状态的方式。</span><span style="font-family:Times New Roman">cookie </span><span style="font-family:宋体">是一种特殊的信息包,存储于用户的计算机中。</span><span style="font-family:Times New Roman">URL </span><span style="font-family:宋体">重写是在页面地址中存储一个特殊的标记,</span><span style="font-family:Times New Roman">Java </span><span style="font-family:宋体">服务器可以用它来跟踪用户。</span></p> <p>标准的<span style="font-family:Times New Roman">HTTP web </span><span style="font-family:宋体">服务器并不传输动态内容。它主要是使用请求来定位文件资源,并在响应中返回此资源。通常这里的文件使用</span><span style="font-family:Times New Roman">Hypertext Markup Language (HTML) [W3C, HTML] </span><span style="font-family:宋体">格式化,以使浏览器可以显示它们。</span></p> <p>静态内容直接来自于文本或数据文件,比如<span style="font-family:Times New Roman">HTML </span><span style="font-family:宋体">或者 </span><span style="font-family:Times New Roman">JPEG </span><span style="font-family:宋体">文件。这些文件可以随时改变,但通过浏览器请求时,却不能自动改变。</span></p> <p>动态内容是临时产生的,典型地,它是针对浏览器的个别请求的响应。</p> <p></p> <p>建立简单的<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用</span></p> <p>首先你该做的</p> <p>下载并安装<span style="font-family:Times New Roman">JDK </span><span style="font-family:宋体">下载并安装 </span><span style="font-family:Times New Roman">Tomcat </span><span style="font-family:宋体">校验</span><span style="font-family:Times New Roman">Tomcat</span><span style="font-family:宋体">是否工作正常。 </span></p> <p>用户注册程序</p> <p>需求描述:用户将看到一个注册屏幕,包含<span style="font-family:Times New Roman">3</span><span style="font-family:宋体">个字段:用户名,密码和密码确认。成功的注册要求两次密码相符。如果注册成功,控制将转向一个页面,显示注册成功</span><span style="font-family:Times New Roman">successful!.</span><span style="font-family:宋体">。如果两次输入密码不同,控制流将转向一个显示失败的页面。</span></p> <p>问题: 如何创建<span style="font-family:Times New Roman">HTML </span><span style="font-family:宋体">表单; 从</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">表单获取输入; 处理输入(业务逻辑);根据动态输入改变控制流;</span></p> <p>解决:为完成这个程序,你需要建立 一个<span style="font-family:Times New Roman">ActionForm </span> <span style="font-family:宋体">一个</span><span style="font-family:Times New Roman">Action struts-config.xml</span><span style="font-family:宋体">文件 和三个页面 </span></p> <p>步骤<span style="font-family:Times New Roman">1 </span><span style="font-family:宋体">创建</span><span style="font-family:Times New Roman">ActionForm</span></p> <p>ActionForm<span style="font-family:宋体">是个</span><span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">,扩展</span><span style="font-family:Times New Roman">org.apache.struts.ActionForm</span><span style="font-family:宋体">类。这个对象捕获通过请求传送的输入。当浏览器提交一个表单,它在请求中为每个表单中的字段创建一个参数。</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">针对每个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">表单中的字段具有一个对应的属性。</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">匹配请求中的参数和</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">中的属性。当匹配好后,</span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">为属性调用</span><span style="font-family:Times New Roman">setter</span><span style="font-family:宋体">方法,并将请求中的值传入。在我们的练习中,表单中的</span><span style="font-family:Times New Roman">username</span><span style="font-family:宋体">字段需要一个</span><span style="font-family:Times New Roman">setUsername(String)</span><span style="font-family:宋体">方法。</span><span style="font-family:Times New Roman">Password1</span><span style="font-family:宋体">字段需要</span><span style="font-family:Times New Roman">setPassword1(String) </span><span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">setPassword2(String)</span><span style="font-family:宋体">方法。 </span></p> <p>RegisterForm <span style="font-family:宋体">的源代码显示在清单</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">中。 </span></p> <p>package app;</p> <p>import org.apache.struts.action.*;</p> <p>public class Registerform extends ActionForm {</p> <p>protected String userName;</p> <p>protected String password1;</p> <p>protected String password2;</p> <p>public String getPassword1() {</p> <p>return password1;</p> <p>}</p> <p>public void setPassword1(String password1) {</p> <p>this.password1 = password1;</p> <p>}</p> <p>public String getPassword2() {</p> <p>return password2;</p> <p>}</p> <p>public void setPassword2(String password2) {</p> <p>this.password2 = password2;</p> <p>}</p> <p>public String getUserName() {</p> <p>return userName;</p> <p>}</p> <p>public void setUserName(String userName) {</p> <p>this.userName = userName;</p> <p>}</p> <p>}</p> <p>存储在 </p> <p><BaseDirectory>/webapps/register/WEB-INF/classes/app<span style="font-family:宋体">下</span></p> <p>步骤<span style="font-family:Times New Roman">2 </span><span style="font-family:宋体">创建 </span><span style="font-family:Times New Roman">RegisterAction</span></p> <p>Action<span style="font-family:宋体">一个</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">类,扩展了</span><span style="font-family:Times New Roman">org.apache.struts.Action</span><span style="font-family:宋体">。</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">组装</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">,然后将其传递给</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">。</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">通常负责输入校验,存取业务信息,以及决定向</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">返回哪个</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">。</span></p> <p>package app;</p> <p>import org.apache.struts.action.*;</p> <p>import javax.servlet.http.*;</p> <p>import java.io.*;</p> <p>public class RegisterAction extends Action {</p> <p>public ActionForward execute(ActionMapping mapping, ActionForm form,</p> <p>HttpServletRequest req, HttpServletResponse res) {</p> <p>// <span style="font-family:宋体">转换</span><span style="font-family:Times New Roman">form</span><span style="font-family:宋体">到 </span><span style="font-family:Times New Roman">RegisterForm</span></p> <p>RegisterForm rf = (RegisterForm) form;</p> <p>String username = rf.getUsername();</p> <p>String password1 = rf.getPassword1();</p> <p>String password2 = rf.getPassword2();</p> <p>// <span style="font-family:宋体">业务逻辑</span></p> <p>if (password1.equals(password2)) {</p> <p>try {</p> <p>// <span style="font-family:宋体">调用服务把用户加到数据库中去</span></p> <p>//UserService.getInstance().AddUser(username, password1);</p> <p>return mapping.findForward("success");</p> <p>} catch (Exception e) {</p> <p>return mapping.findForward("failure");</p> <p>}</p> <p>}</p> <p>// Return ActionForward for failure</p> <p>return mapping.findForward("failure");</p> <p>}</p> <p>}</p> <p>步骤<span style="font-family:Times New Roman">3 </span><span style="font-family:宋体">创建</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">配置文件 </span><span style="font-family:Times New Roman">(struts-config.xml) </span></p> <p>struts-config.xml <span style="font-family:宋体">文件包含了</span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">需要用来处理对应用请求的详细信息。为了练习,我们创建一个空壳的</span><span style="font-family:Times New Roman">struts-config.xml </span><span style="font-family:宋体">文件。</span></p> <p>文件存储在<span style="font-family:Times New Roman"><BaseDirectory>/webapps/register/WEB-INF/</span><span style="font-family:宋体">目录下,需要改变的是:</span></p> <p>首先,添加<span style="font-family:Times New Roman">/register </span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman"><action></span><span style="font-family:宋体">元素的 </span><span style="font-family:Times New Roman">path </span><span style="font-family:宋体">属性。</span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">使用</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">容器转发给它的</span><span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">来选择正确的</span><span style="font-family:Times New Roman">Action </span><span style="font-family:宋体">类。</span><span style="font-family:Times New Roman">URI </span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">ActionMapping </span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">path </span><span style="font-family:宋体">属性匹配。这里,请求给出的路径必须在去除前缀和后缀后和</span><span style="font-family:Times New Roman">/register </span><span style="font-family:宋体">匹配。前缀或后缀通常是</span><span style="font-family:Times New Roman">/do/ </span><span style="font-family:宋体">或者 </span><span style="font-family:Times New Roman">.do</span><span style="font-family:宋体">。 我们的练习中,将后缀设置为</span><span style="font-family:Times New Roman">.do</span><span style="font-family:宋体">。当</span><span style="font-family:Times New Roman">URI </span><span style="font-family:宋体">具有一个</span><span style="font-family:Times New Roman">.do </span><span style="font-family:宋体">扩展名,容器就知道将请求转发给</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">。</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">会自动去除 扩展名,所以我们在配置时不必加上它们。 </span></p> <p>下一步添加:<span style="font-family:Times New Roman">registerForm </span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman"><action> </span><span style="font-family:宋体">元素的 </span><span style="font-family:Times New Roman">name </span><span style="font-family:宋体">属性。</span><span style="font-family:Times New Roman"><action> </span><span style="font-family:宋体">元素使用</span><span style="font-family:Times New Roman">name </span><span style="font-family:宋体">属性来识别哪个</span><span style="font-family:Times New Roman">ActionForm </span><span style="font-family:宋体">将被创建,并将提交的表单组装给他。 </span></p> <p>然后,添加 <span style="font-family:Times New Roman">app.RegisterAction </span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman"><action> </span><span style="font-family:宋体">元素的 </span><span style="font-family:Times New Roman">type </span><span style="font-family:宋体">属性。</span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">使用这个属性来识别将用来处理请求的</span><span style="font-family:Times New Roman">Action </span><span style="font-family:宋体">类。 </span></p> <p>接下来,在<span style="font-family:Times New Roman"><forward> </span><span style="font-family:宋体">元素下,添加 </span><span style="font-family:Times New Roman">success </span><span style="font-family:宋体">到 </span><span style="font-family:Times New Roman">name </span><span style="font-family:宋体">属性,并且 </span><span style="font-family:Times New Roman">/success.html </span><span style="font-family:宋体">到 </span><span style="font-family:Times New Roman">path </span><span style="font-family:宋体">属性。最后,再在另一个</span><span style="font-family:Times New Roman"><forward></span><span style="font-family:宋体">下添加 </span><span style="font-family:Times New Roman">failure </span><span style="font-family:宋体">到 </span><span style="font-family:Times New Roman">name </span><span style="font-family:宋体">属性, </span><span style="font-family:Times New Roman">/failure.html </span><span style="font-family:宋体">到 </span><span style="font-family:Times New Roman">path </span><span style="font-family:宋体">属性。 这些元素将创建</span><span style="font-family:Times New Roman">ActionForward </span><span style="font-family:宋体">对象,我们将用它来选择程序的控制流。</span><span style="font-family:Times New Roman"><forward> </span><span style="font-family:宋体">元素定义了在</span><span style="font-family:Times New Roman">RegisterAction</span><span style="font-family:宋体">中使用的逻辑名称之间的关联。</span></p> <p>Struts-config.xml <span style="font-family:宋体">源代码:</span></p> <p><?xml version="1.0" encoding="ISO-8859-1" ?></p> <p><!DOCTYPE struts-config PUBLIC </p> <p>"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN" </p> <p>"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"></p> <p><struts-config></p> <p><form-beans></p> <p><form-bean name="registerForm" type="app.RegisterForm" /></p> <p></form-beans></p> <p><action-mappings></p> <p><action path="/register" type="app.RegisterAction"</p> <p>name="registerForm"></p> <p><forward name="success" path="/success.html" /></p> <p><forward name="failure" path="/failure.html" /></p> <p></action></p> <p></action-mappings></p> <p></struts-config></p> <p>Struts<span style="font-family:宋体">框架将</span><span style="font-family:Times New Roman">struts-config.xml </span><span style="font-family:宋体">文件视为部署描述符使用。它使我们可以创建和改变</span><span style="font-family:Times New Roman">ActionMapping </span><span style="font-family:宋体">和路径的关联而不用重新编译</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">类。我们也可以改变页面之间的连接,而不改变</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">模板。</span></p> <p>步骤<span style="font-family:Times New Roman">4 </span><span style="font-family:宋体">创建</span><span style="font-family:Times New Roman">success.html, failure.html, </span><span style="font-family:宋体">以及</span><span style="font-family:Times New Roman">register.jsp </span><span style="font-family:宋体">页面存放在</span><span style="font-family:Times New Roman"><Base Directory>/webapps/register</span><span style="font-family:宋体">目录下。</span></p> <p>success.html </p> <p><HTML></p> <p><HEAD></p> <p><TITLE><span style="font-family:宋体">成功</span><span style="font-family:Times New Roman"></TITLE></span></p> <p></HEAD></p> <p><BODY></p> <p>恭喜你,注册成功了</p> <p><P></p> <p><A href="register.jsp"><span style="font-family:宋体">继续注册吗?</span><span style="font-family:Times New Roman"></A></span></p> <p></P></p> <p></BODY></p> <p></HTML></p> <p>failure.html</p> <p><HTML></p> <p><HEAD></p> <p><TITLE><span style="font-family:宋体">对不起</span><span style="font-family:Times New Roman"></TITLE></span></p> <p></HEAD></p> <p><BODY></p> <p>注册失败<span style="font-family:Times New Roman">!</span></p> <p><P></p> <p><A href="register.jsp"><span style="font-family:宋体">还要试一试吗</span><span style="font-family:Times New Roman">?</A></span></p> <p></P></p> <p></BODY></p> <p></HTML></p> <p>Register.jsp</p> <p><%@ taglib uri="/WEB-INF/struts-form.tld" prefix="form"%></p> <p><form:form action="register.do"> </p> <p>用户名<span style="font-family:Times New Roman">:<form:text property="username" /></span></p> <p><br> </p> <p>输入密码<span style="font-family:Times New Roman">:<form:password property="password1" /></span></p> <p><br> </p> <p>再输一次<span style="font-family:Times New Roman">:<form:password property="password2" /></span></p> <p><br></p> <p><form:submit value="Register" /></p> <p></form:form></p> <p>整个程序的流程图如下</p> <p></p> <p>现在,试一下运行如何。 如果<span style="font-family:Times New Roman">Tomcat</span><span style="font-family:宋体">没有运行,启动它。 </span></p> <p>在浏览器中输入以下地址: </p> <p>http://localhost:8080/register/register.jsp </p> <p>回顾一下,我们做了什么 </p> <p>建立<span style="font-family:Times New Roman">Register</span><span style="font-family:宋体">应用我们实际上完成了以下内容: </span></p> <p>? RegisterForm ActionForm</p> <p>? RegisterAction Action </p> <p>? 3<span style="font-family:宋体">个页面 </span></p> <p>它是如何工作的</p> <p>当你浏览器地址<span style="font-family:Times New Roman">http://localhost:8080/register/register.jsp</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">Tomcat</span><span style="font-family:宋体">按通常情况加工这个页面。输入</span><span style="font-family:Times New Roman">username</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">password</span><span style="font-family:宋体">,点击</span><span style="font-family:Times New Roman">Register </span><span style="font-family:宋体">提交页面。浏览器在请求中</span><span style="font-family:Times New Roman">post</span><span style="font-family:宋体">表单的内容。容器检查请求将送到哪一个注册的路径去。然后请求被转发到</span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">,并由</span><span style="font-family:Times New Roman">RegisterAction</span><span style="font-family:宋体">来处理。在返回成功或失败之前,</span><span style="font-family:Times New Roman">RegisterAction </span><span style="font-family:宋体">校验输入的有效性。最后</span><span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">将控制根据返回的</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">转发到响应页面,如图下图</span></p> <p></p> <p>内容总结</p> <p>? 框架的概念 </p> <p>? 理解<span style="font-family:Times New Roman">HTTP, CGI, servlet, </span><span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">JSP </span></p> <p>? 使用 <span style="font-family:Times New Roman">Model 2 </span><span style="font-family:宋体">架构 </span></p> <p>? 构建简单的应用</p> <p>? 理解<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">的执行过程</span></p> <p>? 建立简单的<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用</span></p> <p>独立实践</p> <p>? 使用<span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">完成用户注册程序</span></p> <p>? 使用<span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">完成登录(要求显示详细的错误信息)</span></p> <p>? 登录成功后在成功页面显示你的姓名等信息</p> <p>? 简述<span style="font-family:Times New Roman">MODEL 1 </span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">MODEL 2</span><span style="font-family:宋体">的区别</span></p> <p>? 简述<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">的工作流程</span></p> <p>第三十一章:<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">基础</span></p> <p>学习目标</p> <p>? Struts<span style="font-family:宋体">如何实现</span><span style="font-family:Times New Roman">Model 2, MVC</span></p> <p>? Struts<span style="font-family:宋体">控制流程</span></p> <p>? Struts<span style="font-family:宋体">组件介绍</span></p> <p>? Struts ActionServlet<span style="font-family:宋体">控制器对象</span></p> <p>? Struts Action Classes</p> <p>? Struts Action Mapping</p> <p></p> <p>MVC</p> <p>MVC<span style="font-family:宋体">是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用</span><span style="font-family:Times New Roman">MVC</span><span style="font-family:宋体">应用程序被分成三个核心部件:</span></p> <p>模型、视图、控制器。</p> <p>它们各自处理自己的任务。</p> <p></p> <p>模型(<span style="font-family:Times New Roman">model</span><span style="font-family:宋体">)</span></p> <p>模型表示企业数据和业务规则。</p> <p>在<span style="font-family:Times New Roman">MVC</span><span style="font-family:宋体">的三个部件中,模型拥有最多的处理任务。</span></p> <p>模型与数据格式无关,一个模型能为多个视图提供数据。多个视图重用</p> <p>视图(<span style="font-family:Times New Roman">view</span><span style="font-family:宋体">)</span></p> <p>视图是用户看到和交互的界面。</p> <p>视图由<span style="font-family:Times New Roman">Jsp HTML Flash XHTML ML/XSL</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">WML</span><span style="font-family:宋体">等标识语言。</span></p> <p>视图中没有处理,不管这些数据如何存在,对视图来说,只是一种输出数据并允许用户操纵的方式。</p> <p>控制器(<span style="font-family:Times New Roman">Controller</span><span style="font-family:宋体">)</span></p> <p>控制器接受输入并调用模型和视图去完成用户的需求。</p> <p>控制器不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。</p> <p>控制器一般由<span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">承担</span></p> <p></p> <p>MVC<span style="font-family:宋体">的处理过程</span><span style="font-family:Times New Roman">:</span><span style="font-family:宋体">首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。 </span></p> <p>struts<span style="font-family:宋体">框架的优势</span></p> <p>? 良好的架构和设计</p> <p>? 可重用,模块化,扩展性好</p> <p>? Open source</p> <p>Struts<span style="font-family:宋体">如何实现</span><span style="font-family:Times New Roman">Model 2, MVC</span></p> <p>下表列出了<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">的核心类,即对应的经典的</span><span style="font-family:Times New Roman">MVC</span><span style="font-family:宋体">组件职责。 </span></p> <p>类 描述</p> <p>ActionForward 用户指向或者视图选择</p> <p>ActionForm 状态改变的数据</p> <p>ActionMapping 状态改变事件</p> <p>ActionServlet 控制器,接受用户请求和状态改变,以及发出视图选择控制器的一部分,于模型交互,执行状态改变或状态查询,以及告诉<span style="font-family:Times New Roman">Action ActionServlet </span><span style="font-family:宋体">下一个选择的视图</span></p> <p>除了这些核心类,<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">使用一些配置文件和视图助手(</span><span style="font-family:Times New Roman">view helpers</span><span style="font-family:宋体">)来沟通控制器和模型。</span></p> <p>下表列出了<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">配置文件和描述了他们在架构中的角色。 </span></p> <p>文件 目的</p> <p>ApplicationResources.properties 存储本地化信息和标签,以使应用可以国际化</p> <p>struts-config.xml 存储控制器对象的缺省配置,包括模型支持的用户指向,状态改变,状态查询 </p> <p>为将<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">配置数据暴露给视图,框架以</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">标签的形式提供了大量的助手类,如表:</span></p> <p>标记库描述符 目的</p> <p>struts-html.tld 扩展<span style="font-family:Times New Roman">HTML Form</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">标记</span></p> <p>struts-bean.tld 扩展处理<span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">标记</span></p> <p>Struts <span style="font-family:宋体">控制流 </span></p> <p>下图以<span style="font-family:Times New Roman">UML</span><span style="font-family:宋体">时序图的方式展示了</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">请求</span><span style="font-family:Times New Roman">-</span><span style="font-family:宋体">响应流程</span></p> <p></p> <p>我们来按这个请求<span style="font-family:Times New Roman">-</span><span style="font-family:宋体">响应流程走一边</span></p> <p>? 客户请求匹配<span style="font-family:Times New Roman">Action URI</span><span style="font-family:宋体">样式的路径 </span></p> <p>? 容器将请求传递给<span style="font-family:Times New Roman">ActionServlet.</span></p> <p>? 如果这个是模块化应用,<span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">选择响应的模块。</span></p> <p>? ActionServlet<span style="font-family:宋体">查询路径的映射。</span></p> <p>? 如果映射标明了一个<span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">看是否已经有一个实例,或者创建一个新的实例。如果已经有一个</span><span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">重设它</span><span style="font-family:Times New Roman">(reset)</span><span style="font-family:宋体">,并根据</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求重新组装它。</span></p> <p>? 如果<span style="font-family:Times New Roman">mapping</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">validate</span><span style="font-family:宋体">属性设置为</span><span style="font-family:Times New Roman">true,</span><span style="font-family:宋体">它将调用</span><span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">validate</span><span style="font-family:宋体">方法,如果验证失败,</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">将控制转发到</span><span style="font-family:Times New Roman">input</span><span style="font-family:宋体">属性标明的路径,控制流终止。</span></p> <p>? 如果<span style="font-family:Times New Roman">mapping</span><span style="font-family:宋体">标明一个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">类型,如果它已经存在或已经实例化,它将被重用。 </span></p> <p>? 接着<span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">perform</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">execute</span><span style="font-family:宋体">方法被</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">调用,并传递一个实例化的</span><span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">或者</span><span style="font-family:Times New Roman">null</span><span style="font-family:宋体">。</span></p> <p>? Action<span style="font-family:宋体">可以组装</span><span style="font-family:Times New Roman">form bean,</span><span style="font-family:宋体">调用业务对象,以及其他需要做的事情。 </span></p> <p>? Action<span style="font-family:宋体">返回一个</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">给</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">。</span></p> <p>? 如果<span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">指向另一个</span><span style="font-family:Times New Roman">Action URI</span><span style="font-family:宋体">,重新开始;否则,显示页面或者其他资源,流程结束。通常,结果是一个</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页面,或者</span><span style="font-family:Times New Roman">Jasper,</span><span style="font-family:宋体">或其它类似技术 </span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">非</span><span style="font-family:Times New Roman">Struts)</span></p> <p>? 如果<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">使用</span><span style="font-family:Times New Roman">Struts HTML</span><span style="font-family:宋体">标记</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">并且在请求中看到正确的</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">,他们会从</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">中组装</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">控件。否则,</span><span style="font-family:Times New Roman"><html:form></span><span style="font-family:宋体">标记将创建一个。从</span><span style="font-family:Times New Roman">Struts1.1</span><span style="font-family:宋体">开始</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">如果</span><span style="font-family:Times New Roman">form</span><span style="font-family:宋体">标记自行创建一个</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">,它将调用</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Reset</span><span style="font-family:宋体">方法。如果你只是想创建一个空白的表单,你可以使用标准的</span><span style="font-family:Times New Roman">ForwardAction</span><span style="font-family:宋体">来通过</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">传递控制,然后离开页面。</span></p> <p></p> <p>Struts framework<span style="font-family:宋体">的工作原理和组件</span></p> <p>对于<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">如何控制、处理客户请求,让我们通过对</span><span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">的四个核心组件介绍来具体说明。这几个组件就是:</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">ActionClasses</span><span style="font-family:宋体">、</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">(此处包括</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">)、</span><span style="font-family:Times New Roman">ActionFromBean</span><span style="font-family:宋体">。</span></p> <p>Struts ActionServlet<span style="font-family:宋体">控制器对象</span></p> <p>ActionServlet<span style="font-family:宋体">继承自</span><span style="font-family:Times New Roman">javax.servlet.http.HttpServlet</span><span style="font-family:宋体">类,其在</span><span style="font-family:Times New Roman">Struts framework</span><span style="font-family:宋体">中扮演的角色是中心控制器。它提供一个中心位置来处理全部的终端请求。控制器</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">主要负责将</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。</span></p> <p>按照<span style="font-family:Times New Roman">Servelt</span><span style="font-family:宋体">的标准,所有得</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">必须在</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">配置文件(</span><span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">)声明。同样,</span><span style="font-family:Times New Roman">ActoinServlet</span><span style="font-family:宋体">必须在</span><span style="font-family:Times New Roman">Web Application</span><span style="font-family:宋体">配置文件(</span><span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">)中描述,有关配置信息如下。</span></p> <p><servlet></p> <p><servlet-name>action</servlet-name></p> <p><servlet-class></p> <p>org.apache.struts.action.ActionServlet</p> <p></servlet-class></p> <p></servlet></p> <p>全部的请求<span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">以</span><span style="font-family:Times New Roman">*.do</span><span style="font-family:宋体">的模式存在并映射到这个</span><span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">,其配置如下:</span></p> <p><servlet-mapping></p> <p><servlet-name>action</servlet-name></p> <p><url-pattern>*.do</url-pattern></p> <p></servlet-mapping></p> <p>一个该模式的请求<span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">符合如下格式:</span></p> <p>http://www.my_site_name.com/mycontext/actionName.do</p> <p>中心控制器为所有的表示层请求提供了一个集中的访问点。这个控制器提供的抽象概念减轻了开发者建立公共应用系统服务的困难,如管理视图、会话及表单数据。它也提供一个通用机制如错误及异常处理,导航,国际化,数据验证,数据转换等。</p> <p>当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器<span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">,一旦它获得了请求,它就会把提交的请求都委托给</span><span style="font-family:Times New Roman">RequestProcessor</span><span style="font-family:宋体">对象。</span></p> <p>RequestProcessor<span style="font-family:宋体">使用</span><span style="font-family:Times New Roman">struts-config.xml</span><span style="font-family:宋体">文件检查请求</span><span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">找到动作</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">标示符。接着将请求信息传交给一些辅助类(</span><span style="font-family:Times New Roman">help classes</span><span style="font-family:宋体">)处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。</span></p> <p>在<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">中,这个辅助类就是</span><span style="font-family:Times New Roman">org.apache.struts.action.Action</span><span style="font-family:宋体">。通常开发者需要自己继承</span><span style="font-family:Times New Roman">Aciton</span><span style="font-family:宋体">类,从而实现自己的</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">实例。</span></p> <p>Struts Action Classes</p> <p>如果<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">配置是一个应用系统的大脑,</span><span style="font-family:Times New Roman">Action </span><span style="font-family:宋体">类则是其强健的四肢。它们是</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用中真正干活的组件,开发人员一般都在这里耗费大量的时间处理这个类。</span></p> <p>Struts Action<span style="font-family:宋体">的核心职责是:</span></p> <p>访问业务</p> <p>为表现层准备数据对象</p> <p>处理在其中出现的错误</p> <p>搞定<span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">对象</span></p> <p>Action<span style="font-family:宋体">最为常用的是</span><span style="font-family:Times New Roman">execute</span><span style="font-family:宋体">()方法。(注意,以前的</span><span style="font-family:Times New Roman">perform</span><span style="font-family:宋体">方法在</span><span style="font-family:Times New Roman">struts1.1</span><span style="font-family:宋体">中已经不再支持),还有一个</span><span style="font-family:Times New Roman">execute</span><span style="font-family:宋体">()方法,请参考</span><span style="font-family:Times New Roman">apidoc</span></p> <p>public ActionForward execute(ActionMapping mapping,</p> <p>ActionForm form,</p> <p>HttpServletRequest request,</p> <p>HttpServletResponse response)</p> <p>throws Exception </p> <p>当<span style="font-family:Times New Roman">Controller</span><span style="font-family:宋体">收到客户的请求的时候,在将请求转移到一个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">实例时,如果这个实例不存在,控制器会首先创建,然后会调用这个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">实例的</span><span style="font-family:Times New Roman">execute</span><span style="font-family:宋体">()方法。</span><span style="font-family:Times New Roman">Struts Framework</span><span style="font-family:宋体">为应用系统中的每一个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的</span><span style="font-family:Times New Roman">Action </span><span style="font-family:宋体">类运行在一个多线程的环境中。</span></p> <p>Action<span style="font-family:宋体">做些什么</span><span style="font-family:Times New Roman">?</span></p> <p>取表单数据</p> <p>MyActionForm myform = (MyActionForm) form;</p> <p>调用业务逻辑</p> <p>EmployeeService service = new EmployeeService();</p> <p>service.insertEmployee( employeeDTO );</p> <p>检测错误</p> <p>ActionErrors errors = new ActionErrors(); </p> <p>try { </p> <p>// * <span style="font-family:宋体">调用业务对象 </span><span style="font-family:Times New Roman">*</span></p> <p>} </p> <p>catch (ModelException e) { </p> <p>errors.add(ActionErrors.GLOBAL_ERROR, </p> <p>new ActionError("error.detail",e.getMessage())); </p> <p>} </p> <p>if (!errors.empty()) { </p> <p>saveErrors(Request, errors); </p> <p>return (mapping.findForward("error")); </p> <p>} </p> <p>// * <span style="font-family:宋体">正常继续 </span><span style="font-family:Times New Roman">*</span></p> <p>处理异常</p> <p><action path="/employeeAction"</p> <p>type="app.EmployeeDispatchAction" name="employeeForm"</p> <p>scope="request" validate="true"</p> <p>input="/employeeForm.jsp"></p> <p><exception key="exception.database.error"</p> <p>type="app.DatabaseException" path="/error.jsp" /></p> <p><forward name="insertSuccess" path="/employeeForm.jsp" /></p> <p><forward name="updateSuccess" path="/confirmation.jsp" /></p> <p></action></p> <p>Action<span style="font-family:宋体">的分类</span></p> <p>标准<span style="font-family:Times New Roman">Action</span></p> <p>ForwardAction <span style="font-family:宋体">发出一个</span><span style="font-family:Times New Roman">RequestDispatcher </span><span style="font-family:宋体">转发 </span></p> <p>IncludeAction <span style="font-family:宋体">发出一个</span><span style="font-family:Times New Roman">RequestDispatcher </span><span style="font-family:宋体">包含</span></p> <p>DispatchAction </p> <p>LookupDispatchAction </p> <p>SwitchAction</p> <p>ForwardAction</p> <p>创建一个请求分派器,并根据<span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">提供的上下文相关的</span><span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">转发控制</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">上下文相关路径在</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">parameter</span><span style="font-family:宋体">属性中给出</span><span style="font-family:Times New Roman">:</span></p> <p><action path="/saveSubscription"</p> <p>type="org.apache.struts.actions.ForwardAction"</p> <p>name="subscriptionForm" scope="request" input="/subscription.jsp"</p> <p>name="/path/to/application/resource" /></p> <p>IncludeAction</p> <p>通过包含转发,你发出一个<span style="font-family:Times New Roman">include</span><span style="font-family:宋体">指令。当其</span><span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">完成时,控制要返回。相反</span><span style="font-family:Times New Roman">,Forward</span><span style="font-family:宋体">一旦一个响应开始就不能发出一个转发,控制也不返回到发出的</span><span style="font-family:Times New Roman">servlet</span></p> <p>Forward<span style="font-family:宋体">与</span><span style="font-family:Times New Roman">Include</span><span style="font-family:宋体">的区别</span></p> <p>Action 响应 控制</p> <p>Forward 一旦响应开始就不能发出 控制不返回</p> <p>Include 在响应时也可以发出 控制要回</p> <p>DispatchAction</p> <p>Struts<span style="font-family:宋体">开发人员的一个常用策略时使用同一个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">类来处理几个相关的任务。一个很好的例子是对一个数据记录执行基本的</span><span style="font-family:Times New Roman">CRUD (</span><span style="font-family:宋体">创建读取修改和删除</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">操作,它们非常相似,可以放在一个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">类中处理。通过扩展</span><span style="font-family:Times New Roman">DispatchAction(org.apache.struts.actions.DispatchAction),</span><span style="font-family:宋体">开发人员可以将多个方法在一个单一的</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">内成</span></p> <p>DispatchAction<span style="font-family:宋体">可以通过隐藏字段的关键字自动选择正确的方法;他使用反射机制而不是大部分开发人员所使用的逻辑方法。</span></p> <p>public ActionForward create(ActionMapping mapping,</p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>public ActionForward read(ActionMapping mapping, </p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>public ActionForward update(ActionMapping mapping, </p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>public ActionForward delete(ActionMapping mapping, </p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>在<span style="font-family:Times New Roman">Struts-config.xml</span><span style="font-family:宋体">中配置如下</span></p> <p><action-mappings ></p> <p><action</p> <p>attribute="employeeForm"</p> <p>input="/employee.jsp"</p> <p>name="employeeForm"</p> <p>parameter="method"</p> <p>path="/employee"</p> <p>scope="request"</p> <p>type="app.EmployeeDispatchAction" /></p> <p></action-mappings> </p> <p>为选择 <span style="font-family:Times New Roman">delete </span><span style="font-family:宋体">方法</span><span style="font-family:Times New Roman">, </span><span style="font-family:宋体">你可以调用</span></p> <p>http://localhost/struts2/employee?method=delete</p> <p>实践中<span style="font-family:Times New Roman">method</span><span style="font-family:宋体">字段的值通常是按钮或者表单中隐藏属性的名来设置,</span></p> <p>如<span style="font-family:Times New Roman"><html:form action= /employee?method=create></span><span style="font-family:宋体">或</span></p> <p>在<span style="font-family:Times New Roman">form</span><span style="font-family:宋体">中加入一个</span><span style="font-family:Times New Roman">Hidden</span><span style="font-family:宋体">字段</span></p> <p><html:hidden name=”method” value=”create”/></p> <p>LookupDispatchAction</p> <p>选择<span style="font-family:Times New Roman">dispatch</span><span style="font-family:宋体">方法的一个方便的方式是将它们连接到按钮,这对于本地化应用来说是个问题,因为按钮的标签可能根据用户的场所来改变,如英文版本显示</span><span style="font-family:Times New Roman">Delete</span><span style="font-family:宋体">按纽而对中文用户要显示</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">删除</span><span style="font-family:Times New Roman">”</span></p> <p>LookupDispatchAction(org.apache.struts.actions.LookupDispatchAction)<span style="font-family:宋体">通过将标签映射到资源文件的消息关键字来解决这个问题,但消息关键字不是相应</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">方法的名称,开发人员就提供一个</span><span style="font-family:Times New Roman">hash</span><span style="font-family:宋体">表来映射消息关键字和</span><span style="font-family:Times New Roman">dispatch</span><span style="font-family:宋体">方法名(通过</span><span style="font-family:Times New Roman">getKeyMethodap</span><span style="font-family:宋体">方法实现)</span></p> <p>protected Map getKeyMethodap(ActionMapping mapping, ActionForm form,</p> <p>HttpServletRequest Request) {</p> <p>Map map = new HashMap();</p> <p>map.put("button.add", "cerate");//<span style="font-family:宋体">把</span><span style="font-family:Times New Roman">button.add</span><span style="font-family:宋体">映射到</span><span style="font-family:Times New Roman">create</span><span style="font-family:宋体">方法</span></p> <p>map.put("button.view", "read");</p> <p>map.put("button.update", "update");</p> <p>map.put("button.delete", "delete");</p> <p>return map;</p> <p>}</p> <p>public ActionForward create(ActionMapping mapping,</p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>public ActionForward read(ActionMapping mapping, </p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>public ActionForward update(ActionMapping mapping, </p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>public ActionForward delete(ActionMapping mapping, </p> <p>ActionForm form,</p> <p>HttpServletRequest Request, HttpServletResponse Response)</p> <p>throws IOException, ServletException;</p> <p>在<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">中按钮要这样来创建</span><span style="font-family:Times New Roman">:</span></p> <p><html:form action="/dataRecord"></p> <p><html:submit property="method"></p> <p><bean:message key="button.add"></p> <p></html:submit></p> <p><html:submit property="method"></p> <p><bean:message key="button.view"></p> <p></html:submit></p> <p><html:submit property="method"></p> <p><bean:message key="button.update"></p> <p></html:submit></p> <p><html:submit property="method"></p> <p><bean:message key="button.delete"></p> <p></html:submit></p> <p></html:form></p> <p>对应的资源文件</p> <p>中文<span style="font-family:Times New Roman">ApplicationResources_zh_CN.properties</span></p> <p>button.add=<span style="font-family:宋体">增加</span></p> <p>button.view=<span style="font-family:宋体">查看</span></p> <p>button.update=<span style="font-family:宋体">更新</span></p> <p>button.delete=<span style="font-family:宋体">删除</span></p> <p>英文<span style="font-family:Times New Roman">ApplicationResources_zh.properties</span></p> <p>button.add=Add</p> <p>button.view=View</p> <p>button.update=Update</p> <p>button.delete=Delete</p> <p>SwitchAction</p> <p>所有的 <span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用至少具有一个模块</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">某些应用可能有多个模块,每个模块使用其自己的一套配置文件和表现页面,并且可以象应用中仅有一个模块的情况一样独立进行开发。当我们想从一个模块跳转到另一个模块时可以使用</span><span style="font-family:Times New Roman">SwitchAction(org.apache.struts.actions.SwitchAction)</span><span style="font-family:宋体">,它是一个标准</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">,可以从一个模块切换到另一个模块,然后转发控制到此模块中的路径。</span></p> <p>SwitchAction<span style="font-family:宋体">需要两个请求参数被传递: </span></p> <p>page:<span style="font-family:宋体">一个模块相对的</span><span style="font-family:Times New Roman">URI(</span><span style="font-family:宋体">以</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">开始</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">切换后控制应该转发去的地方</span></p> <p>prefix:<span style="font-family:宋体">控制应该切换到的应用模块的模块前缀</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">以</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">开始</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">缺省使用</span><span style="font-family:Times New Roman">0</span><span style="font-family:宋体">长度的字符串</span></p> <p>Struts Action Mapping</p> <p>上面讲到了一个客户请求是如何被控制器转发和处理的,但是,控制器如何知道什么样的信息转发到什么样的<span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">类呢?这就需要一些与动作和请求信息相对应的映射配置说明。在</span><span style="font-family:Times New Roman">struts </span><span style="font-family:宋体">中,这些配置映射信息是存储在特定的</span><span style="font-family:Times New Roman">XML</span><span style="font-family:宋体">文件(比如</span><span style="font-family:Times New Roman">struts-config.xml</span><span style="font-family:宋体">)。这些配置信息在系统启动的时候被读入内存,供</span><span style="font-family:Times New Roman">struts framework</span><span style="font-family:宋体">在运行期间使用。在内存中,每一个</span><span style="font-family:Times New Roman"><action></span><span style="font-family:宋体">元素都与</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">类的一个实例对应。</span></p> <p>下面显示了一个登陆的配置映射。</p> <p><action-mappings></p> <p><action path="/logonAction" type="com.test.LogonAction"</p> <p>name="LogonForm" scope="request" input="logoncheck.jsp"</p> <p>validate="false"></p> <p><forward name="welcome" path="/welcome.jsp" /></p> <p><forward name="failure" path="/logon_failure.jsp " /></p> <p></action></p> <p></action-mappings></p> <p>上面的配置表示:当可以通过<span style="font-family:Times New Roman">/logonAction.do</span><span style="font-family:宋体">提交请求信息的时候,控制器将信息委托</span><span style="font-family:Times New Roman">com.test.LogonAction</span><span style="font-family:宋体">处理。调用</span><span style="font-family:Times New Roman">LogonAction</span><span style="font-family:宋体">实例的</span><span style="font-family:Times New Roman">execute()</span><span style="font-family:宋体">方法。同时将</span><span style="font-family:Times New Roman">Mapping</span><span style="font-family:宋体">实例和所对应的</span><span style="font-family:Times New Roman">LogonForm Bean</span><span style="font-family:宋体">信息传入。其中</span><span style="font-family:Times New Roman">name=LogonForm</span><span style="font-family:宋体">,使用的</span><span style="font-family:Times New Roman">form-bean</span><span style="font-family:宋体">元素所声明的</span><span style="font-family:Times New Roman">ActionForm Bean</span><span style="font-family:宋体">。</span></p> <p>form-bean<span style="font-family:宋体">的声明如下</span></p> <p><form-beans></p> <p><form-bean name="LoginForm" type="com.test.LoginForm" /></p> <p></form-beans></p> <p>使用<span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">导航</span></p> <p>元素<span style="font-family:Times New Roman"><forward></span><span style="font-family:宋体">则表示了当</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">实例的</span><span style="font-family:Times New Roman">execute()</span><span style="font-family:宋体">方法运行完毕或,控制器根据</span><span style="font-family:Times New Roman">Mapping</span><span style="font-family:宋体">可将响应信息转到适当的地方。如上面现实,如果客户登陆成功,则调用</span><span style="font-family:Times New Roman">welcome forward</span><span style="font-family:宋体">,将成功信息返回到</span><span style="font-family:Times New Roman">/welcome.jsp</span><span style="font-family:宋体">页面。在你的</span><span style="font-family:Times New Roman">execute()</span><span style="font-family:宋体">方法的结尾可以使用下面的实例代码而返回</span><span style="font-family:Times New Roman">welcome forward</span><span style="font-family:宋体">。当然你的</span><span style="font-family:Times New Roman">welcome forward</span><span style="font-family:宋体">必须在</span><span style="font-family:Times New Roman">action</span><span style="font-family:宋体">元素属性中定义,正如上面所声明的那样。</span></p> <p>return (mapping.findForward("welcome"));</p> <p>ActionForward<span style="font-family:宋体">对象是配置对象。这些配置对象拥有独一无二的标识以允许它们按照有意义的名称如</span><span style="font-family:Times New Roman">“success”</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">“failure”</span><span style="font-family:宋体">等来检索。</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">对象封装了向前进的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">路径且被请求处理器用于识别目标视图。</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">对象建立自</span><span style="font-family:Times New Roman"><forward></span><span style="font-family:宋体">元素位于</span><span style="font-family:Times New Roman">struts-config.xml</span><span style="font-family:宋体">。下面是一个</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">中</span><span style="font-family:Times New Roman"><forward></span><span style="font-family:宋体">元素例子,属于</span><span style="font-family:Times New Roman"><action></span><span style="font-family:宋体">元素范围。</span></p> <p><action path="/editCustomerProfile"</p> <p>type="packageName.EditCustomerProfileAction" name="customerProfileForm"</p> <p>scope="request"></p> <p><forward name="success" path="/MainMenu.jsp" /></p> <p><forward name="failure" path="/CustomerService.jsp" /></p> <p></action></p> <p>基于执行请求处理器的<span style="font-family:Times New Roman">execute(…)</span><span style="font-family:宋体">方法的结果,当传递一个值匹配指定于</span><span style="font-family:Times New Roman"><forward></span><span style="font-family:宋体">元素中</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性的值的时候,下一个视图可以在</span><span style="font-family:Times New Roman">execute(…)</span><span style="font-family:宋体">方法中被开发者用方便的方法</span><span style="font-family:Times New Roman">org.apache.struts.action.ActionMapping.findForward(…)</span><span style="font-family:宋体">选择。</span><span style="font-family:Times New Roman">ActionMapping.findForward(…)</span><span style="font-family:宋体">方法既从它的本地范围又从全局范围提供一个</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">对象,该对象返回至</span><span style="font-family:Times New Roman">RequestProcessor</span><span style="font-family:宋体">以</span><span style="font-family:Times New Roman">RequestDispatcher.forward(…)</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">response.sendRedirect(…)</span><span style="font-family:宋体">调用下一个视图。当</span><span style="font-family:Times New Roman"><forward></span><span style="font-family:宋体">元素有</span><span style="font-family:Times New Roman">redirect=“false”</span><span style="font-family:宋体">属性或</span><span style="font-family:Times New Roman">redirect</span><span style="font-family:宋体">属性不存在的时候,</span><span style="font-family:Times New Roman">RequestDispatcher.forward(…)</span><span style="font-family:宋体">被执行;当</span><span style="font-family:Times New Roman">redirect=“true”</span><span style="font-family:宋体">是,将调用</span><span style="font-family:Times New Roman">sendRedirect(…)</span><span style="font-family:宋体">方法。下例举例说明了</span><span style="font-family:Times New Roman">redirect</span><span style="font-family:宋体">属性的用法:</span></p> <p><forward name="success" path="/Catalog.jsp" redirect="true"/></p> <p>如果<span style="font-family:Times New Roman">redirect=true, URL</span><span style="font-family:宋体">建立如</span><span style="font-family:Times New Roman">/contextPath/path</span><span style="font-family:宋体">因为</span><span style="font-family:Times New Roman">HttpServletResponse.sendRedirect(…)</span><span style="font-family:宋体">中解释</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">采用</span><span style="font-family:Times New Roman">”/”</span><span style="font-family:宋体">开头相对于</span><span style="font-family:Times New Roman">servlet</span><span style="font-family:宋体">容器根目录。</span></p> <p>如果<span style="font-family:Times New Roman">redirect=false, URI</span><span style="font-family:宋体">建立如</span><span style="font-family:Times New Roman">/path</span><span style="font-family:宋体">因为</span></p> <p>ServletContext.getRequestDisptacher(…)<span style="font-family:宋体">采用虚拟目录相关</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">。</span></p> <p>global-forwards</p> <p>在配置文件中描述了整个应用系统可以使用的<span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">,而不是仅仅是一个特定的</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">。</span></p> <p><global-forwards></p> <p><forward name="logout" path="/logout.do" /></p> <p><forward name="error" path="/error.jsp" /></p> <p></global-forwards></p> <p>使用时:</p> <p>Return mapping.findForward(“logout”)<span style="font-family:宋体">或着</span></p> <p>Jsp<span style="font-family:宋体">中</span><span style="font-family:Times New Roman"><html:link forward=”error”/></span></p> <p>Struts ActionForm Bean<span style="font-family:宋体">捕获表单数据</span></p> <p>使用<span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用的人通常会花费大量的时间通过</span><span style="font-family:Times New Roman">HTMLform</span><span style="font-family:宋体">提交数据</span><span style="font-family:Times New Roman">,HTML</span></p> <p>form<span style="font-family:宋体">给</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">开发人员提出了两个挑战:一是在数据被提交时获取数据,以及用户要修改的数据预装入一个表单,以供用户修改。</span></p> <p>怎么才能把<span style="font-family:Times New Roman">javabean</span><span style="font-family:宋体">中的数据和</span><span style="font-family:Times New Roman">HTML form</span><span style="font-family:宋体">上的数据连接起来呢?</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">通过标签来组装控件,每个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标签对应一个标准的</span><span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">标记元素(</span><span style="font-family:Times New Roman">taglib</span><span style="font-family:宋体">)</span><span style="font-family:Times New Roman">, </span><span style="font-family:宋体">每个标签都有一个属性项对应提供</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性名称,</span><span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">属性的返回值对应</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">控件的</span><span style="font-family:Times New Roman">value</span><span style="font-family:宋体">属性。</span></p> <p>如:<span style="font-family:Times New Roman"><input name="address"/></span><span style="font-family:宋体">由</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">标签来代替: </span></p> <p><html:input property="address"/></p> <p>ActionForm<span style="font-family:宋体">的作用:</span></p> <p>通过<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">的标记库在</span><span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">Html</span><span style="font-family:宋体">表单元素间传值</span></p> <p>ActionForm <span style="font-family:宋体">的要求</span></p> <p>创建一个<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">并不困难,但是你的类必须符合一些要求: </span></p> <p>? ActionForm<span style="font-family:宋体">必须扩展自</span><span style="font-family:Times New Roman">org.apache.struts.ActionForm</span><span style="font-family:宋体">。基类</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">是不能实例化的。</span></p> <p>? ActionForm <span style="font-family:宋体">必须为每个应该从请求中收集的</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">控件定义一个公共属性。</span></p> <p>? 如果你要求<span style="font-family:Times New Roman">ActionForm </span><span style="font-family:宋体">在传递属性到</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">之前校验它们,你就必须实现</span><span style="font-family:Times New Roman">validate</span><span style="font-family:宋体">方法;</span></p> <p>? 如果想在组装前初始化属性,必须实现<span style="font-family:Times New Roman">reset,</span><span style="font-family:宋体">它在</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">组装前被调用;</span></p> <p>下面是一个简单的<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">类:</span></p> <p>import org.apache.struts.action.*;</p> <p></p> <p>public class MyForm extends ActionForm {</p> <p>protected String name;</p> <p></p> <p>protected String address;</p> <p></p> <p>public String getName() {</p> <p>return this.name;</p> <p>};</p> <p></p> <p>public String getAddress() {</p> <p>return this.address;</p> <p>};</p> <p></p> <p>public void setName(String name) {</p> <p>this.name = name;</p> <p>};</p> <p></p> <p>public void setAddress(String address) {</p> <p>this.address = address;</p> <p>};</p> <p>};</p> <p>ActionForm<span style="font-family:宋体">的处理流程</span></p> <p>对于每一个客户请求,<span style="font-family:Times New Roman">Struts framework</span><span style="font-family:宋体">在处理</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的时候,一般需要经历如下几个步骤:</span></p> <p>? 检查<span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">的映射,确定</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">中已经配置了对</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的映射</span></p> <p>? 根据<span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性,查找</span><span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">的配置信息</span></p> <p>? 检查<span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">formbean</span><span style="font-family:宋体">的使用范围,确定在此范围下,是否已经有此</span><span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">的实例。</span></p> <p>? 假如当前范围下,已经存在了此<span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">的实例,而是对当前请求来说,是同一种类型的话,那么就重用。</span></p> <p>? 否则,就重新构建一个<span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">的实例</span></p> <p>? form bean<span style="font-family:宋体">的</span><span style="font-family:Times New Roman">reset()</span><span style="font-family:宋体">方法备调用</span></p> <p>? 调用对应的<span style="font-family:Times New Roman">setter</span><span style="font-family:宋体">方法,对状态属性赋值</span></p> <p>? 如果<span style="font-family:Times New Roman">validatede</span><span style="font-family:宋体">的属性北设置为</span><span style="font-family:Times New Roman">true</span><span style="font-family:宋体">,那么就调用</span><span style="font-family:Times New Roman">form bean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">validate()</span><span style="font-family:宋体">方法。</span></p> <p>? 如果<span style="font-family:Times New Roman">validate</span><span style="font-family:宋体">()方法没有返回任何错误,控制器将</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">作为参数,传给</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">实例的</span><span style="font-family:Times New Roman">execute</span><span style="font-family:宋体">()方法并执行。</span></p> <p>注意:直接从<span style="font-family:Times New Roman">ActionFrom</span><span style="font-family:宋体">类继承的</span><span style="font-family:Times New Roman">reset()</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">validate()</span><span style="font-family:宋体">方法,并不能实现什么处理功能,所以有必要自己重新覆盖。</span></p> <p>使用动态<span style="font-family:Times New Roman">ActionForm</span></p> <p>配置动态<span style="font-family:Times New Roman">ActionForm</span></p> <p><form-beans></p> <p><form-bean name="employeeForm"</p> <p>type="org.apache.struts.action.DynaActionForm"></p> <p><form-property name="name" type="java.lang.String" initial=”cjy”/></p> <p><form-property name="password1" type="java.lang.String" /></p> <p><form-property name="password2" type="java.lang.String" /></p> <p></form-bean></p> <p></form-beans></p> <p>动态表单通过子元素来设置动态<span style="font-family:Times New Roman">ActionFrom</span><span style="font-family:宋体">的属性</span></p> <p>name:<span style="font-family:宋体">指定属性名</span></p> <p>type<span style="font-family:宋体">指定属性类型,它可以使用以下</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">类型</span></p> <p>java.lang.BigDecimal</p> <p>java.lang.BigInteger</p> <p>java.lang.Boolean</p> <p>java.lang.Byte</p> <p>java.lang.Character</p> <p>java.lang.Double</p> <p>java.lang.Float</p> <p>java.lang.Integer</p> <p>...</p> <p>动态<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">reset(</span><span style="font-family:宋体">)的方法</span></p> <p>DynaActionForm<span style="font-family:宋体">基类提供了</span><span style="font-family:Times New Roman">initialize()</span><span style="font-family:宋体">方法,它把表单所有的属性初始化,初始值有</span><span style="font-family:Times New Roman">initial</span><span style="font-family:宋体">属性指定,如果没有设置,初始值由</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">类型默认</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">如对象类型为</span><span style="font-family:Times New Roman">null boolean</span><span style="font-family:宋体">为</span><span style="font-family:Times New Roman">false </span><span style="font-family:宋体">整形为为</span><span style="font-family:Times New Roman">0</span></p> <p>访问动态<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的属性</span></p> <p>动态<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">把所有的属性保存在一个</span><span style="font-family:Times New Roman">map</span><span style="font-family:宋体">中</span></p> <p>public Object get(String name)</p> <p>public void set(String name,Object value)</p> <p>用<span style="font-family:Times New Roman">get</span><span style="font-family:宋体">取出指定名称的属性值,用</span><span style="font-family:Times New Roman">set</span><span style="font-family:宋体">给指定属性赋值,如</span></p> <p>String email=(String)form.get("email");</p> <p>form.set("email","cjy@21.com");</p> <p>动态<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的表单验证</span></p> <p>DynaActionForm<span style="font-family:宋体">基类的</span><span style="font-family:Times New Roman">validate()</span><span style="font-family:宋体">方法没有提供任何默认的行为,必须扩展</span><span style="font-family:Times New Roman">DynaActionForm</span><span style="font-family:宋体">类,覆盖</span><span style="font-family:Times New Roman">validate()</span><span style="font-family:宋体">方法编程来实现,还可以用</span><span style="font-family:Times New Roman">Validator</span><span style="font-family:宋体">验证框架来实现配置验证</span></p> <p></p> <p>ActionForm<span style="font-family:宋体">的继承层次</span></p> <p></p> <p>Struts<span style="font-family:宋体">的其他组件</span></p> <p>StrutsFramework<span style="font-family:宋体">本身提供了很多可扩展的组件或</span><span style="font-family:Times New Roman">subframework</span><span style="font-family:宋体">,方便的开发人员在其构架上构建</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">层的应用系统。比如</span><span style="font-family:Times New Roman">upload,collections,logging</span><span style="font-family:宋体">等等。让我们来看看两个比较重要的组件:</span><span style="font-family:Times New Roman">validationg framework</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">struts taglib</span><span style="font-family:宋体">。有关其他组件请参考</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">用户手册</span></p> <p>http://jakarta.apache.org/struts/userGuide</p> <p>Validation Framework for Struts</p> <p>在<span style="font-family:Times New Roman">struts1.1</span><span style="font-family:宋体">中,新增了</span><span style="font-family:Times New Roman">validation framework</span><span style="font-family:宋体">。增加了对</span><span style="font-family:Times New Roman">form</span><span style="font-family:宋体">数据提交的验证。将原本需要在</span><span style="font-family:Times New Roman">ActionFrom Bean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">validate</span><span style="font-family:宋体">()进行的验证通过配置文件的描述进行验证。</span></p> <p>有关其详细信息,请参考</p> <p>http://home.earthlink.net/~dwinterfeldt <span style="font-family:宋体">。</span></p> <p>个人建议对于小型应用系统可以采用这种配置方式,但是对于应用系统中有大量<span style="font-family:Times New Roman">web</span><span style="font-family:宋体">层表单应用的系统,并且业务需求变动比较大的,使用</span><span style="font-family:Times New Roman">validation framework</span><span style="font-family:宋体">可能会加重开发难度、系统维护难度。可以借鉴</span><span style="font-family:Times New Roman">validation framework</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">Javascript Validator Tag</span><span style="font-family:宋体">。</span></p> <p>Struts TagLib</p> <p>struts<span style="font-family:宋体">提供了一组可扩展的自定义标签库(</span><span style="font-family:Times New Roman">TagLib</span><span style="font-family:宋体">),可以简化创建用户界面的过程。目前包括:</span><span style="font-family:Times New Roman">Bean Tags</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">HTML Tags</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">Logic Tags</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">Nested Tags</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">Template Tags</span><span style="font-family:宋体"> 这几个</span><span style="font-family:Times New Roman">Taglib</span><span style="font-family:宋体">。有关</span><span style="font-family:Times New Roman">Struts Taglib</span><span style="font-family:宋体">的结构和使用,可以参考后面有关章节。</span></p> <p>BeanUtils </p> <p>这个组件的全称是<span style="font-family:Times New Roman">Bean Introspection Utilites</span><span style="font-family:宋体">。是属于</span><span style="font-family:Times New Roman">Jakarta Commons</span><span style="font-family:宋体">项目组的。主要是帮助构建</span><span style="font-family:Times New Roman">javabean</span><span style="font-family:宋体">的属性操作的(</span><span style="font-family:Times New Roman">getter,setter</span><span style="font-family:宋体">),已经提供一种动态定义和访问</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性。有关详细信息,请参考</span></p> <p>http://jakarta.apache.org/commons/beanutils.html</p> <p>Collections</p> <p>这个组件主要是提供了一些集合或列表对象,在原有的<span style="font-family:Times New Roman">java collections framework</span><span style="font-family:宋体">的基础上进行了扩展。详细资料请参考:</span></p> <p>http://jakarta.apache.org/commons/collections.html</p> <p>Digester</p> <p>这个组件翻译成中文的意思是<span style="font-family:Times New Roman">“</span><span style="font-family:宋体">汇编</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">。其主要功能是根据</span><span style="font-family:Times New Roman">xml</span><span style="font-family:宋体">配置文件,初始化系统的一些</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">类对象。</span><span style="font-family:Times New Roman">Digester</span><span style="font-family:宋体">帮助你指定</span><span style="font-family:Times New Roman">XML</span><span style="font-family:宋体">与</span><span style="font-family:Times New Roman">java</span><span style="font-family:宋体">对象之间映射模型,而且允许客户话定制映射规则(</span><span style="font-family:Times New Roman">rules</span><span style="font-family:宋体">)。详细资料请参考 </span></p> <p>http://jakarta.apache.org/commons/digester.html</p> <p></p> <p>内容总结</p> <p>? 掌握<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">如何实现</span><span style="font-family:Times New Roman">Model 2, MVC</span></p> <p>? 熟练应用<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">控制流程</span></p> <p>? 掌握<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">组件介绍</span></p> <p>? 灵活运用<span style="font-family:Times New Roman">Struts ActionServlet</span><span style="font-family:宋体">控制器对象</span></p> <p>? 掌握<span style="font-family:Times New Roman">Struts Action Classes</span></p> <p>? 掌握<span style="font-family:Times New Roman">Struts Action Mapping</span></p> <p>? 能够对<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">组件熟练使用</span></p> <p>? 能够在程序中使用<span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">框架</span></p> <p>独立实践</p> <p>? 按照<span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">的流程,做一个雇员注册的功能</span></p> <p>? 完成一个雇员登录的功能,如果登录错误,要求显示详细的错误的信息</p> <p>? 使用表单验证和框架验证完成对注册信息的验证</p> <p>? 使用<span style="font-family:Times New Roman">DispachAction</span></p> <p>? 使用<span style="font-family:Times New Roman">BeanUtils</span><span style="font-family:宋体">工具,做一个显示雇员表的数据的功能。</span></p> <p>第三十二章:配置<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">组件</span></p> <p>学习目标</p> <p>? Web<span style="font-family:宋体">应用部署描述符 </span></p> <p>? Struts<span style="font-family:宋体">配置文件 </span></p> <p>? 应用资源文件 </p> <p>? Ant<span style="font-family:宋体">的构建文件 </span></p> <p></p> <p>三个 <span style="font-family:Times New Roman">XML</span><span style="font-family:宋体">文件和一个属性文件 </span></p> <p>? web.xml<span style="font-family:宋体">:</span><span style="font-family:Times New Roman">JSP </span><span style="font-family:宋体">容器使用这个文件来载入和配这是</span><span style="font-family:Times New Roman">Java Servlet </span><span style="font-family:宋体">要求的</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">应用部署描述符。</span><span style="font-family:Times New Roman">Servlet</span><span style="font-family:宋体">的应用。 </span></p> <p>? struts-config.xml<span style="font-family:宋体">:</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">框架的部署描述符。它用来载入和配置</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">框架使用的各种组件。 </span></p> <p>? Build.xml<span style="font-family:宋体">:</span><span style="font-family:Times New Roman">Jakarta Ant</span><span style="font-family:宋体">构建工具使用它来编译和部署你的应用。使用</span><span style="font-family:Times New Roman">Ant</span><span style="font-family:宋体">不是必需的,但它在</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">人员中很流行。 </span></p> <p>? Application.properties<span style="font-family:宋体">:该文件为你的</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用提供资源。像</span><span style="font-family:Times New Roman">build.xml</span><span style="font-family:宋体">文件一样, 它不是严格要求的,但是大</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用都要用到。 </span></p> <p>Web<span style="font-family:宋体">应用部署描述符 </span><span style="font-family:Times New Roman">web.xml</span></p> <p>Struts<span style="font-family:宋体">框架的核心是</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">把它当作是一个控制器。将它看成是一个黑盒。他们总是在</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">应用部署描述符 </span><span style="font-family:Times New Roman">(web.xml) </span><span style="font-family:宋体">中配置它,然后让它自己工作。</span></p> <p>Struts<span style="font-family:宋体">框架有两个组件需要从应用部署描述符中配置:</span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">和标签库(可选)</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">例如注册应用的</span><span style="font-family:Times New Roman">web.xml</span></p> <p><!--<span style="font-family:宋体">前两行将文件标识为一个</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">应用部署描述符 </span><span style="font-family:Times New Roman">--> </span></p> <p><?xml version="1.0" encoding="ISO-8859-1"?></p> <p><!DOCTYPE web-app </p> <p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" </p> <p>"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"></p> <p><web-app></p> <p><!--<span style="font-family:宋体">配置 </span><span style="font-family:Times New Roman">ActionServlet—</span><span style="font-family:宋体">这一段告诉容器装入</span><span style="font-family:Times New Roman">action</span><span style="font-family:宋体">名称下的</span><span style="font-family:Times New Roman">ActionServlet --></span></p> <p><servlet></p> <p><servlet-name>action</servlet-name></p> <p><servlet-class></p> <p>org.apache.struts.action.ActionServlet</p> <p></servlet-class></p> <p><init-param></p> <p><param-name>application</param-name></p> <p><param-value>application</param-value></p> <p></init-param></p> <p><init-param></p> <p><param-name>config</param-name></p> <p><param-value>/WEB-INF/conf/struts-config.xml</param-value></p> <p></init-param></p> <p><init-param></p> <p><param-name>debug</param-name></p> <p><param-value>2</param-value></p> <p></init-param></p> <p><init-param></p> <p><param-name>detail</param-name></p> <p><param-value>2</param-value></p> <p></init-param></p> <p><load-on-startup>2</load-on-startup></p> <p></servlet></p> <p><!-- <span style="font-family:宋体">标识</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">请求</span><span style="font-family:Times New Roman">—</span><span style="font-family:宋体">这一段告诉容器将匹配</span><span style="font-family:Times New Roman">*.do </span><span style="font-family:宋体">格式的文件请求转发到</span><span style="font-family:Times New Roman">action servlet --></span></p> <p><servlet-mapping></p> <p><servlet-name>action</servlet-name></p> <p><url-pattern>*.do</url-pattern></p> <p></servlet-mapping></p> <p><!-- <span style="font-family:宋体">创建</span><span style="font-family:Times New Roman">welcome</span><span style="font-family:宋体">文件 </span><span style="font-family:Times New Roman">--></span></p> <p><welcome-file-list></p> <p><welcome-file>index.jsp</welcome-file></p> <p></welcome-file-list></p> <p><!-- <span style="font-family:宋体">配置标签库</span><span style="font-family:Times New Roman">—</span><span style="font-family:宋体">这里我们配置应用中使用的标签库。 </span><span style="font-family:Times New Roman">3</span><span style="font-family:宋体">个核心的</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">标签库</span><span style="font-family:Times New Roman">—bean, html, </span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">logic --></span></p> <p><taglib></p> <p><taglib-uri>/tags/struts-bean</taglib-uri></p> <p><taglib-location>/WEB-INF/lib/struts-bean.tld</taglib-location></p> <p></taglib></p> <p><taglib></p> <p><taglib-uri>/tags/struts-html</taglib-uri></p> <p><taglib-location>/WEB-INF/lib/struts-html.tld</taglib-location></p> <p></taglib></p> <p><taglib></p> <p><taglib-uri>/tags/struts-logic</taglib-uri></p> <p><taglib-location>/WEB-INF/lib/struts-logic.tld</taglib-location></p> <p></taglib></p> <p></web-app></p> <p>ActionServlet<span style="font-family:宋体">的参数的配置</span></p> <p>Struts<span style="font-family:宋体">配置 </span></p> <p>Struts<span style="font-family:宋体">配置文件 </span><span style="font-family:Times New Roman">(struts-config.xml)</span><span style="font-family:宋体">用来装入多个关键的框架组件。这些对象一起构成了</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">配置。 </span></p> <p><struts-config></p> <p>下面配置针对常规<span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">DynaActionForm</span><span style="font-family:宋体">的 </span><span style="font-family:Times New Roman"><form-bean> </span><span style="font-family:宋体">元素配置</span></p> <p><form-bean name="menuForm" type="com.itjob.struts.MenuForm" /></p> <p><form-bean name="logonForm"</p> <p>type="org.apache.struts.action.DynaActionForm"></p> <p><form-property name="username" type="java.lang.String" /></p> <p><form-property name="password" type="java.lang.String" /></p> <p></form-bean> </p> <p>下面配置全局转发配置这些<span style="font-family:Times New Roman">forward</span><span style="font-family:宋体">对应用中的每个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">都有效。你也可以部署一个局部 </span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman"><action> </span><span style="font-family:宋体">元素中。局部转发仅针对该</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">有效。</span></p> <p><global-forwards></p> <p><forward name="logoff" path="/logoff.do" /></p> <p><forward name="logon" path="/logon.do" /></p> <p><forward name="welcome" path="/welcome.do" /></p> <p></global-forwards> </p> <p>下面配置<span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">,它描述应用要采取的操作、命令。 </span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">被用作一个</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">的逻辑标识符,或者路径。当</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">浏览器请求一个</span><span style="font-family:Times New Roman">Action</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">首先查找相应的</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">。</span><span style="font-family:Times New Roman">ActionMapping </span><span style="font-family:宋体">则告诉 </span><span style="font-family:Times New Roman">ActionServlet </span><span style="font-family:宋体">哪个 </span><span style="font-family:Times New Roman">Action </span><span style="font-family:宋体">对象要用于这个</span><span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">。</span></p> <p><action-mappings> <span style="font-family:宋体">元素描述了我们的应用要用来处理请求的</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">对象</span><span style="font-family:Times New Roman">(org.apache.struts.action.ActionMapping)</span><span style="font-family:宋体">的集合。请求要到达应用然后到达</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">,它必须匹配上下文和我们在容器中注册的</span><span style="font-family:Times New Roman">url-pattern </span><span style="font-family:宋体">格式。</span></p> <p>如果<span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">是针对</span><span style="font-family:Times New Roman">http://localhost/myApp/myAction.do </span><span style="font-family:宋体">我们只需要引用 </span><span style="font-family:Times New Roman">/myAction</span><span style="font-family:宋体">作为 </span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">的路径</span></p> <p><action path="/logonSubmit" type="app.LogonAction" name="logonForm"</p> <p>scope="request" validate="true" input="/pagess/Logon.jsp" /></p> <p><action path="/logon" type="app.ContinueAction"></p> <p><forward name="continue" path="/pagess/Logon.jsp" /></p> <p></action></p> <p><action path="/welcome" type="app.ContinueAction"></p> <p><forward name="continue" path="/pagess/Welcome.jsp" /></p> <p></action></p> <p>请求处理器是<span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">处理循环的核心。大多数情况下,你可以编写和装入一个请求处理器,来代替创建你自己的</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">子类。</span></p> <p><contrller nocache="true" null="true"</p> <p>processorClass="com.myCompany.struts.RequestProcessor" /> </p> <p>每个模块都应该有其自己的缺省消息资源束。</p> <p><message-resources parameter="resources.application" /></p> <p><message-resources parameter="resources.image" /> </p> <p>plug-in<span style="font-family:宋体">在</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用中,将验证任务委托给第三方的插件</span></p> <p><plug-in className="org.apache.struts.validator.ValidatorPlugIn"></p> <p><set-property property="pathname"</p> <p>value="/WEB-INF/validator-rules.xml" /></p> <p><set-property property="pathname" value="/WEB-INF/validation.xml" /></p> <p></plug-in></p> <p>data-sources<span style="font-family:宋体">为了帮助开发人员使用连接, </span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">提供了一个数据源管理组件。你可以使用这个组实例化和配置一些实现数据源的对象,并且可以从</span><span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">的属性进行整体配置。 </span></p> <p>下面是一个数据源配置,使用<span style="font-family:Times New Roman">MySQL</span><span style="font-family:宋体">数据库的</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">缺省配置</span><span style="font-family:Times New Roman">: </span></p> <p><data-sources></p> <p><data-source></p> <p><set-property property="maxCount" value="4" /></p> <p><set-property property="minCount" value="2" /></p> <p><set-property property="description"</p> <p>value="Artimus:MySQL Data Source Config" /></p> <p><set-property property="driverClass"</p> <p>value="org.gjt.mm.mysql.Driver" /></p> <p><set-property property="url"</p> <p>value="jdbc:mysql://localhost:3306/artimus" /></p> <p><set-property property="autoCommit" value="true" /></p> <p><set-property property="user" value="root" /></p> <p><set-property property="password" value="" /></p> <p></data-source></p> <p></data-sources></p> <p>应用资源文件 </p> <p>Struts<span style="font-family:宋体">框架提供了好用和灵活的消息系统</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">在</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">代码中,要给定一个消息的关键字;消息文本在运行时丛属性文件中检索。框架文档将消息属性文件引用为 </span><span style="font-family:Times New Roman">application resources </span><span style="font-family:宋体">或者 </span><span style="font-family:Times New Roman">message resource bundle</span><span style="font-family:宋体">。</span></p> <p>如果你想要本地化你的应用,你可以为你想要支持的场所创建一个额外的应用资源文件。这实际上是创建一个资源束 <span style="font-family:Times New Roman"> (java.util.ResourceBundle)</span><span style="font-family:宋体">。框架会为每个用户维护一个标准的</span><span style="font-family:Times New Roman">Locale</span><span style="font-family:宋体">对象</span><span style="font-family:Times New Roman">(java.util.Locale)</span><span style="font-family:宋体">。针对用户场所的合适的消息会自动从资源束中进行选取。</span></p> <p>两个概念:</p> <p>? Locale<span style="font-family:宋体">(场所) 对象是一个特定的语言和地区的识别符。 </span></p> <p>? ResourceBundle <span style="font-family:宋体">对象包含场所特定的对象。当需要一个场所特定的对象时,可以从资源束中取得,它返回匹配用户场所的对象。 </span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">框架为消息文本使用基于字符串的资源束。</span></p> <p>属性文件自身是一个平面的文本文件,每一行是一个关键字<span style="font-family:Times New Roman">-</span><span style="font-family:宋体">值对。你可以使用任何文本编辑器进行编辑,包括</span><span style="font-family:Times New Roman">Windows Notepad</span><span style="font-family:宋体">。 </span></p> <p>应用资源文件的缺省名称是通过在<span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">向</span><span style="font-family:Times New Roman">Struts ActionServlet</span><span style="font-family:宋体">传递一个初始化参数决定的。在应用中使用</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">应用资源束之前必须首先进行配置。应用资源文件位于应用的</span><span style="font-family:Times New Roman">CLASSPATH</span><span style="font-family:宋体">之中,这样</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">可以找到它。最好是放在你的应用的</span><span style="font-family:Times New Roman">class </span><span style="font-family:宋体">文件夹中。这可能是在</span><span style="font-family:Times New Roman">WEB-INF/classes</span><span style="font-family:宋体">文件夹中,或者,如果你以二进制部署你的应用时在</span><span style="font-family:Times New Roman">WEB-INF/lib</span><span style="font-family:宋体">下的一个</span><span style="font-family:Times New Roman">JAR</span><span style="font-family:宋体">文件中。 </span></p> <p>param-value <span style="font-family:宋体">应该使你的文件按包命名格式的全限定名称。这意味着如果如果你将资源文件直接放在</span><span style="font-family:Times New Roman">classes</span><span style="font-family:宋体">下,你可以直接使用文件名,如前面的代码片断所示。 </span></p> <p><init-param></p> <p><param-name></p> <p>Application</param-name> <param-value>resources.application</param-value></p> <p></init-param> </p> <p>物理文件的系统路径应该是: </p> <p>WEB-INF/classes/resources/application.properties </p> <p>为了本地化你的应用,为每个支持的场所添加资源文件,并修改基本名称: </p> <p>WEB-INF/classes/resources/ </p> <p>application.properties </p> <p>application_es.properties </p> <p>application_fr_CA.properties </p> <p>Ant<span style="font-family:宋体">构建文件</span></p> <p>构建文件<span style="font-family:Times New Roman">build.xml</span><span style="font-family:宋体">设置为使用源代码存储在</span><span style="font-family:Times New Roman">WEB-INF</span><span style="font-family:宋体">子目录下的项目树。这使得整个应用,包括源代码和编译文件,都集中在一个目录系统之中。这就能使你得应用的工作目录可以位于你的开发服务器中。如果容器可以很好的重装类文件,你就可以重新构建应用来测试最新的改变,而不用重启容器。 </span></p> <p><!--project <span style="font-family:宋体">构建文件总体名称,并且标识一个基础目录和缺省目标</span><span style="font-family:Times New Roman">--></span></p> <p><project name="logon basedir=" ." deafult="dist"></p> <p><property name="project.title" value="Logon" /></p> <p><property name="project.version" value="1.2" /></p> <p><property name="dist.name" value="logon" /></p> <p><!--<span style="font-family:宋体">构建应用是要使用的</span><span style="font-family:Times New Roman">classpath </span><span style="font-family:宋体">通常是</span><span style="font-family:Times New Roman">WEB-INF/lib</span><span style="font-family:宋体">文件夹中的</span><span style="font-family:Times New Roman">JAR</span><span style="font-family:宋体">的清单</span><span style="font-family:Times New Roman">--></span></p> <p><path id="project.class.path"></p> <p><pathelement path="lib/struts.jar" /></p> <p><pathelement path="./classes/" /></p> <p><pathelement path="${classpath}" /></p> <p></path></p> <p><!-- <span style="font-family:宋体">帮助</span><span style="font-family:Times New Roman">Ant</span><span style="font-family:宋体">通过比较类文件和源文件的时间戳来最小化编译工作 </span><span style="font-family:Times New Roman">--></span></p> <p><target name="prepare"></p> <p><tstamp /></p> <p></target></p> <p><!-- <span style="font-family:宋体">从源代码树中拷贝一些属性文件到</span><span style="font-family:Times New Roman">classes</span><span style="font-family:宋体">树。可以保持原始的属性文件和文件源代码中的保持一致 </span><span style="font-family:Times New Roman">--></span></p> <p><target name="resources"></p> <p><copy todir="classes" includeEmptyDirs="no"></p> <p><fileset dir="src/resources"></p> <p><patternset></p> <p><include name="**/*.properties" /></p> <p></patternset></p> <p></fileset></p> <p></copy></p> <p></target></p> <p><!--<span style="font-family:宋体">首先调用</span><span style="font-family:Times New Roman">prepare </span><span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">resources </span><span style="font-family:宋体">目标,然后开始构建源文件</span><span style="font-family:Times New Roman">--></span></p> <p><target name="compile" depends="prepare,resources"></p> <p><javac srcdir="src" destdir="classes"></p> <p><classpath refid="project.class.path" /></p> <p></javac></p> <p></target></p> <p><!--clean<span style="font-family:宋体">目标通过删除和恢复类文件夹来确保所有的东西都重新构建</span><span style="font-family:Times New Roman">--></span></p> <p><target name="clean" description="Prepare for clean build"></p> <p><delete dir="classes" /></p> <p><mkdir dir="classes" /></p> <p></target></p> <p><!-- javadoc <span style="font-family:宋体">目标为应用构建</span><span style="font-family:Times New Roman">JavaDoc</span><span style="font-family:宋体">。通常,要标明</span><span style="font-family:Times New Roman">classpath</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">JAR</span><span style="font-family:宋体">路径。注意,是冒号分隔的列表</span><span style="font-family:Times New Roman">--></span></p> <p><target name="javadoc" description="Generate JavaDoc API docs"></p> <p><delete dir="./doc/api" /></p> <p><mkdir dir="./doc/api" /></p> <p><javadoc sourcepath="./src/java" destdir="./doc/api"</p> <p>classpath="lib/struts.jar:" packagenames="app.*" author="true"</p> <p>private="true" version="true" windowtitle=" API Documentation"</p> <p>doctitle="<h1>${project.title} Documentation (Version ${project.version})</h1>"</p> <p>bottom="Copyright © 2002" /></p> <p></target></p> <p><!-- dist<span style="font-family:宋体">目标为应用创建一个</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">归档</span><span style="font-family:Times New Roman">(WAR)</span><span style="font-family:宋体">文件。这个文件可以用来在你的生产服务器上部署你的应用。</span><span style="font-family:Times New Roman">--></span></p> <p><target name="dist" description="createe binary distribution"></p> <p><delete dir="./dist" /></p> <p><mkdir dir="./dist" /></p> <p><war warfile="./dist/${dist.name}.war"</p> <p>webxml="../WEB-INF/web.xml" manifest="../META-INF/MANIFEST.MF"</p> <p>basedir="../"</p> <p>excludes="WEB-INF/dist,WEB-INF/web.xml,META-INF/MANIFEST.MF" /></p> <p></target></p> <p><!-- project <span style="font-family:宋体">目标将全部构建所有东西,并准备一个二进制的分发包</span><span style="font-family:Times New Roman">--></span></p> <p><target name="project" depends="clean,prepare,compile,javadoc,dist" /></p> <p></project></p> <p>配置<span style="font-family:Times New Roman">Tiles</span><span style="font-family:宋体">框架 </span></p> <p>Tiles<span style="font-family:宋体">是一个</span><span style="font-family:Times New Roman">Struts </span><span style="font-family:宋体">框架的可选组件,是一个强大的页面组装工具</span></p> <p>步骤<span style="font-family:Times New Roman">1</span><span style="font-family:宋体">:</span></p> <p>从<span style="font-family:Times New Roman">Struts lib </span><span style="font-family:宋体">文件夹拷贝</span><span style="font-family:Times New Roman">struts-tiles.tld </span><span style="font-family:宋体">和 </span><span style="font-family:Times New Roman">tiles-config.dtd </span><span style="font-family:宋体">文件 </span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">如果没有</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">到</span><span style="font-family:Times New Roman">/WEB-INF </span><span style="font-family:宋体">文件夹</span><span style="font-family:Times New Roman">. </span></p> <p>插入下面的语句快到<span style="font-family:Times New Roman">(</span><span style="font-family:宋体">如果没有</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">到 </span><span style="font-family:Times New Roman">/WEB-INF/web.xml </span><span style="font-family:宋体">文件中,并且紧跟其他</span><span style="font-family:Times New Roman"><taglib> </span><span style="font-family:宋体">元素:</span></p> <p><taglib></p> <p><taglib-uri>/tags/tiles</taglib-uri></p> <p><taglib-location>/WEB-INF/tiles.tld</taglib-location></p> <p></taglib> </p> <p>步骤<span style="font-family:Times New Roman">2 </span><span style="font-family:宋体">创建一个</span><span style="font-family:Times New Roman">tiles-defs.xml </span><span style="font-family:宋体">在 </span><span style="font-family:Times New Roman">/WEB-INF</span><span style="font-family:宋体">文件夹</span></p> <p><!DOCTYPE tiles-definitions PUBLIC </p> <p>"-//Apache Software Foundation//DTD Tiles Conig//EN" </p> <p>"http://jakarta.apache.org/struts/dtds/tiles-config.dtd"></p> <p><tiles-definitions></p> <p><!-- skeleton definition </p> <p><definition name="${name}" path="${path}"> </p> <p><put name="${name}" value="${value}"/> </p> <p></definition> </p> <p>end blank definition --></p> <p></tiles-definitions> </p> <p>步骤<span style="font-family:Times New Roman">3 </span><span style="font-family:宋体">插入这个 </span><span style="font-family:Times New Roman"><plug-in> </span><span style="font-family:宋体">元素到</span><span style="font-family:Times New Roman">struts-config.xml</span><span style="font-family:宋体">,位置在关闭的</span><span style="font-family:Times New Roman"></struts-config> </span><span style="font-family:宋体">元素之前:</span></p> <p><plug-in className="org.apache.struts.tiles.TilesPlugin"></p> <p><set-property property="definitions-config"</p> <p>value="/WEB-INF/tiles-defs.xml" /></p> <p></plug-in></p> <p></p> <p>内容总结</p> <p>? Web<span style="font-family:宋体">应用部署描述符 </span></p> <p>? 应用资源文件 </p> <p>? 掌握<span style="font-family:Times New Roman">Ant</span><span style="font-family:宋体">的构建文件 </span></p> <p>? 能够用<span style="font-family:Times New Roman">ant</span><span style="font-family:宋体">工具对</span><span style="font-family:Times New Roman">Web</span><span style="font-family:宋体">应用部署</span></p> <p>? 熟练使用<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">配置文件 </span></p> <p>独立实践</p> <p>? 按照上一章完成的一个雇员登录的功能,如果登录错误,要求用国际化显示详细的错误的信息</p> <p>? 假设在地址栏中输入一个不存在的页面,要求能显示已经自定义好的<span style="font-family:Times New Roman">404</span><span style="font-family:宋体">错误页面</span></p> <p>? 如果在地址栏中输入:<span style="font-family:Times New Roman">http://127.0.0.1:8080/login,</span><span style="font-family:宋体">不输入具体页面,要求显示一个自定义的欢迎页面出来</span></p> <p>? 用<span style="font-family:Times New Roman">ant </span><span style="font-family:宋体">工具部署雇员管理系统</span></p> <p>? 用<span style="font-family:Times New Roman">Tiles</span><span style="font-family:宋体">框架来优化雇员管理系统</span></p> <p>第三十三章:<span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">标记库</span></p> <p>学习目标</p> <p>? Bean<span style="font-family:宋体">标记</span></p> <p>? 逻辑标记</p> <p>? HTML<span style="font-family:宋体">标记</span></p> <p>? 模板标记</p> <p></p> <p>Struts<span style="font-family:宋体">标记库</span><span style="font-family:Times New Roman">taglib</span><span style="font-family:宋体">介绍 </span></p> <p>Struts<span style="font-family:宋体">提供了用来封装逻辑的各种定制</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">标记,因此页面设计者可以将主要精力花在页面的可视特征上,而不必主要考虑</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">语法或其它</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">语法</span></p> <p>? Struts-bean.tld<span style="font-family:宋体">:使访问和定义</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">更容易,为了实现国际化,应使用不同的属性文件</span></p> <p>? struts-html.tld<span style="font-family:宋体">:提供显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">对象(如表单、按钮和复选框等)的简便方法</span></p> <p>? struts-logic.tld<span style="font-family:宋体">:支持逻辑构造,以便可以有条件地显示文本或者作为处理循环的结果来显示文本</span></p> <p>? struts-template.tld<span style="font-family:宋体">:支持使用在运行时可以修改的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">模板</span></p> <p>taglib<span style="font-family:宋体">的使用:要在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件顶部的<</span><span style="font-family:Times New Roman">taglib</span><span style="font-family:宋体">>伪指令如下所示:</span></p> <p><%@ taglib uri=“struts-html.tld” prefix=“html”%></p> <p><%@ taglib uri=“struts-bean.tld”prefix=“bean”%></p> <p><%@ taglib uri=“struts-logic.tld”prefix=“logic”%></p> <p>每个<<span style="font-family:Times New Roman">taglib</span><span style="font-family:宋体">>伪指令都具有与基于 </span><span style="font-family:Times New Roman">web.xml</span><span style="font-family:宋体">的<</span><span style="font-family:Times New Roman">taglib</span><span style="font-family:宋体">>标记中的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">相匹配的</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">,在</span><span style="font-family:Times New Roman">jsp</span><span style="font-family:宋体">中通过以下两种形式使用标记</span></p> <p>? 没有嵌套内容的标记可以采用以下格式:</p> <p><prefix:tagName attributesAndValues/></p> <p>? 嵌套内容是在一对标记之间嵌套的:</p> <p><prefix:tagName attributesAndValues /></p> <p></prefix:tagName></p> <p>Bean<span style="font-family:宋体">标记</span></p> <p>这个标记库中包含用于定义新<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">、访问</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">及其属性的标记。</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">框架提供了多种自定义标记用来在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页中处理</span><span style="font-family:Times New Roman">JavaBean</span><span style="font-family:宋体">。这些标记被封装在一个普通的标记库中,在文件</span><span style="font-family:Times New Roman">struts-bean.tld</span><span style="font-family:宋体">中定义了它的标记库描述器。</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">标记库将标记定义在四个子类别中:</span></p> <p>? 创建和复制<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的标记</span></p> <p>? 脚本变量定义标记</p> <p>? bean<span style="font-family:宋体">翻译标记</span></p> <p>? 消息国际化标记</p> <p>创建和复制<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的标记</span></p> <p><bean:define><span style="font-family:宋体">标记用来:</span></p> <p>? 定义新字符串常数</p> <p>? 将现有的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">复制到新定义的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">对象</span></p> <p>? 复制现有<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性来创建新的</span><span style="font-family:Times New Roman">bean</span></p> <p><bean:define><span style="font-family:宋体">标记属性表:</span></p> <p>属性 描述</p> <p>Id 新定义的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">脚本变量名称,必须设置</span></p> <p>Type 定义引入脚本变量的类</p> <p>Value 为<span style="font-family:Times New Roman">id</span><span style="font-family:宋体">属性定义的脚本变量分配一个新的对象</span></p> <p>Name 目标<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称。若</span><span style="font-family:Times New Roman">value</span><span style="font-family:宋体">属性没有设置,这个属性就必须设置</span></p> <p>Property Name 属性定义的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性名称,用来定义新的</span><span style="font-family:Times New Roman">bean</span></p> <p>Scope 源<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的作用域。若没有设置,搜索范围是从页作用域到应用程序作用域</span></p> <p>toScope 目标<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的作用域。若没有设置,默认值是页作用域</span></p> <p>例如:定义一个<span style="font-family:Times New Roman">bean:</span></p> <p><bean:define id=”test” value=”this is a test”/></p> <p>源<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">在页作用域中被拷贝大于请求作用域中的另一个</span><span style="font-family:Times New Roman">bean:</span></p> <p><bean:define id=”targetBean” name=”sourceBean” scope=”page” toScope=”request”/></p> <p>定义脚本变量的标记</p> <p>从多种资源中定义和生成脚本变量,这些资源包括<span style="font-family:Times New Roman">cookie,</span><span style="font-family:宋体">请求参数,</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">标头等等。属性如下:</span></p> <p>属性 描述</p> <p>Id 脚本变量和要定义的页作用域属性的名称</p> <p>Name cookie/<span style="font-family:宋体">标头</span><span style="font-family:Times New Roman">/</span><span style="font-family:宋体">参数的名称</span></p> <p>multiple 如果这个属性设置了任意一个数值,所有匹配的<span style="font-family:Times New Roman">cookie</span><span style="font-family:宋体">都会被积累并存储到一个</span><span style="font-family:Times New Roman">Cookie[](</span><span style="font-family:宋体">一个数组</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">类型的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">里。若无设置,指定</span><span style="font-family:Times New Roman">cookie</span><span style="font-family:宋体">的第一个值将作为</span><span style="font-family:Times New Roman">Cookie</span><span style="font-family:宋体">类型的值</span></p> <p>Value 如果没有匹配的<span style="font-family:Times New Roman">cookie</span><span style="font-family:宋体">或数值,就返回这个属性指定的默认值</span></p> <p>例如:<span style="font-family:Times New Roman"><bean:cookie id=”myCookie” name=”userName”/> </span><span style="font-family:宋体">脚本变量名称是</span><span style="font-family:Times New Roman">myCookie</span><span style="font-family:宋体">,用来创建这个属性的</span><span style="font-family:Times New Roman">cookie</span><span style="font-family:宋体">的名称是</span><span style="font-family:Times New Roman">userName</span><span style="font-family:宋体">。</span></p> <p><bean:header id=”myHeader” name=”Accept-Language”/> 脚本变量名称是<span style="font-family:Times New Roman">myHeader,</span><span style="font-family:宋体">请求标头的名称是</span><span style="font-family:Times New Roman">Accept-Language.</span></p> <p><bean:parameter id=”myParameter” name=”myParameter”> <span style="font-family:宋体"> 脚本变量名称是</span><span style="font-family:Times New Roman">myPatameter,</span><span style="font-family:宋体">它保存的请求参数的名称也是</span><span style="font-family:Times New Roman">myParameter.</span></p> <p><bean:include><span style="font-family:宋体">标记将对一个资源的响应进行检索,并引入一个脚本变量和字符串类型的页作用域属性。这个资源可以是一个页,一个</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">或一个外部</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">。与</span><span style="font-family:Times New Roman"><jsp:include></span><span style="font-family:宋体">的不同是资源的响应被存储到一个页作用域的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">中,而不是写入到输出流。属性如下:</span></p> <p>属性 描述</p> <p>Id 脚本变量和要定义的页作用域属性的名称</p> <p>Page 一个内部资源</p> <p>forward 一个<span style="font-family:Times New Roman">ActionForward</span></p> <p>Href 要包含的资源的完整<span style="font-family:Times New Roman">URL</span></p> <p>例如:<span style="font-family:Times New Roman"><bean:include id=”myInclude” page=”MyJsp?x=1”/></span><span style="font-family:宋体">脚本变量的名称是</span><span style="font-family:Times New Roman">myInclude</span><span style="font-family:宋体">,要检索的响应来自资源</span><span style="font-family:Times New Roman">MyJsp?x=1</span><span style="font-family:宋体">。</span></p> <p><bean:resource><span style="font-family:宋体">标记将检索</span><span style="font-family:Times New Roman">web</span><span style="font-family:宋体">应用中的资源,并引入一个脚本变量和</span><span style="font-family:Times New Roman">InputStream</span><span style="font-family:宋体">或字符串类型的页作用域属性。如果在检索资源时发生问题,就会产生一个请求时间异常。属性如下:</span></p> <p>属性 描述</p> <p>Id 脚本变量和要定义的页作用域属性的名称</p> <p>Name 资源的相对路径</p> <p>Input 如果这个属性不存在,资源的类型就是字符串</p> <p>例如:<span style="font-family:Times New Roman"><bean:resource id=”myResource” name=”/WEB-INF/images/myResource.xml”/> </span><span style="font-family:宋体">脚本变量的名称是</span><span style="font-family:Times New Roman">myResource</span><span style="font-family:宋体">,要检索的资源的名称是</span><span style="font-family:Times New Roman">myResource.xml</span><span style="font-family:宋体">。</span></p> <p>显示<span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">属性</span></p> <p>标记库中定义了<span style="font-family:Times New Roman"><bean:write></span><span style="font-family:宋体">标记,用来将</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性输送到封装的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页写入器。这个标记与</span><span style="font-family:Times New Roman"><jsp:getProperty></span><span style="font-family:宋体">类似,属性如下:</span></p> <p>属性 描述</p> <p>Name 要进行属性显示的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称</span></p> <p>property 要显示的属性的名称。如果这个属性类有<span style="font-family:Times New Roman">java.beans.PropertyEditor,getAsText()</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">toString </span><span style="font-family:宋体">方法会被调用</span></p> <p>Scope Bean<span style="font-family:宋体">的作用域,若没有设置,搜索范围是从页到应用程序作用域</span></p> <p>Filter 如果设置<span style="font-family:Times New Roman">true,</span><span style="font-family:宋体">属性中的所有特殊</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">字符都将被转化为相应的实体引用</span></p> <p>Ignore 如果设置<span style="font-family:Times New Roman">false</span><span style="font-family:宋体">,当发现属性时会产生一个请求时间异常,否则返回</span><span style="font-family:Times New Roman">null</span></p> <p>例如:<span style="font-family:Times New Roman"><bean:write name=”myBean” property=”myProperty” scope=”request” filter=”true”/> myBean</span><span style="font-family:宋体">的属性</span><span style="font-family:Times New Roman">myProperty</span><span style="font-family:宋体">将会被显示,作用域为请求,如果发现任何</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">特殊字符都将被转化为相应的实体引用。</span></p> <p>消息标记和国际化</p> <p>strtus<span style="font-family:宋体">框架支持国际化和本地化</span><span style="font-family:Times New Roman">,</span><span style="font-family:宋体">通过使用</span><span style="font-family:Times New Roman"><bean:message></span><span style="font-family:宋体">标记,以及使用</span><span style="font-family:Times New Roman">java.util</span><span style="font-family:宋体">数据包中定义的</span><span style="font-family:Times New Roman">Locale</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">ResourceBundle</span><span style="font-family:宋体">类来实现</span><span style="font-family:Times New Roman">Java2</span><span style="font-family:宋体">平台对这些任务的支持。</span><span style="font-family:Times New Roman">Java.text.MessageFormat</span><span style="font-family:宋体">类定义的技术可以支持消息的格式</span></p> <p>用<span style="font-family:Times New Roman">strtus</span><span style="font-family:宋体">实现国际化和本地化</span></p> <p>定义资源文件的名称,这个文件会包含用默认语言编写的在程序中会出现的所有消息。这些消息以<span style="font-family:Times New Roman">“</span><span style="font-family:宋体">关键字</span><span style="font-family:Times New Roman">-</span><span style="font-family:宋体">值</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">的形式存储,如下:</span></p> <p>error.validation.location = The entered location is invalid</p> <p>这个文件需要存储在类的路径下,而且它的路径要作为初始化参数传送给<span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">作为参数进行传递时,路径的格式要符合完整</span><span style="font-family:Times New Roman">Java</span><span style="font-family:宋体">类的标准命名规范。比如,如果资源文件存储在</span><span style="font-family:Times New Roman">WEB-INF\classes</span><span style="font-family:宋体">目录中,文件名是</span><span style="font-family:Times New Roman">ApplicationResources.properties</span><span style="font-family:宋体">,那么需要传递的参数值是</span><span style="font-family:Times New Roman">ApplicationResources</span><span style="font-family:宋体">。如果文件在</span><span style="font-family:Times New Roman">WEB-INF\classes\com\test</span><span style="font-family:宋体">中,那么参数值就应该是</span><span style="font-family:Times New Roman">com.test. ApplicationResources.</span></p> <p>例如:资源文件中定义了一个消息:</p> <p>info.myKey = The numbers entered are {0},{1},{2},{3}</p> <p>我们可使用下面的消息标记:</p> <p><bean:message key=”info.myKey” arg0=”5” arg1=”6” arg2=”7” arg3=”8”/></p> <p>这个信息标记输出到<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页会显示为:</span></p> <p>The numbers entered are 5,6,7,8</p> <p>逻辑标记</p> <p>逻辑库的标记能够用来处理外观逻辑而不需要使用<span style="font-family:Times New Roman">scriptlet</span><span style="font-family:宋体">。</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">逻辑标签库包含的标记能够有条件地产生输出文本,在对象集合中循环从而重复地产生输出文本,以及应用程序流程控制。它也提供了一组在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页中处理流程控制的标记。这些标记封装在文件名为</span><span style="font-family:Times New Roman">struts-logic.tld</span><span style="font-family:宋体">的标记包中。</span></p> <p>逻辑标记库定义的标记能够执行下列三个功能:条件逻辑 重复 转发<span style="font-family:Times New Roman">/</span><span style="font-family:宋体">重定向响应</span></p> <p>条件逻辑<span style="font-family:Times New Roman">:struts</span><span style="font-family:宋体">有三类条件逻辑。</span></p> <p>第一类可以比较下列实体与一个常数的大小: cookie?<span style="font-family:宋体">请求参数</span><span style="font-family:Times New Roman">?bean</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的参数</span><span style="font-family:Times New Roman">?</span> 请求标头</p> <p>以下列出了这一类标记:</p> <p>标记 功能</p> <p><equal> 如果常数与被定义的实体相等,返回<span style="font-family:Times New Roman">true</span></p> <p><notEqual> 如果常数与被定义的实体不相等,返回<span style="font-family:Times New Roman">true</span></p> <p><greaterEqual> 如果常数大于等于被定义的实体,返回<span style="font-family:Times New Roman">true</span></p> <p><lessEqual> 如果常数小于等于被定义的实体,返回<span style="font-family:Times New Roman">true</span></p> <p><lessThan> 如果常数小于被定义的实体,返回<span style="font-family:Times New Roman">true</span></p> <p><greaterThan> 如果常数大于被定义的实体,返回<span style="font-family:Times New Roman">true</span></p> <p>这一类的所有标记有相同的属性</p> <p>属性 描述</p> <p>Value 要进行比较的常数值</p> <p>Cookie 要进行比较的<span style="font-family:Times New Roman">HTTP cookie</span><span style="font-family:宋体">的名称</span></p> <p>Header 要进行比较的<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求标头的名称</span></p> <p>parameter 要进行比较的<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求参数的名称</span></p> <p>Name 如果要进行比较的是<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性,则这个属性代表</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称</span></p> <p>property 要进行比较的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称</span></p> <p>Scope Bean<span style="font-family:宋体">的作用域,如果没有指定作用域,则它的搜索范围是从页到应用程序</span></p> <p>例如:</p> <p><logic:equal parameter=”name” value=”SomeName”></p> <p>The entered name is SomeName</p> <p></logic:equal></p> <p>判断名为<span style="font-family:Times New Roman">”name”</span><span style="font-family:宋体">的请求参数的值是否是</span><span style="font-family:Times New Roman">”SomeName”</span><span style="font-family:宋体">。</span></p> <p><logic:greaterThan name=”bean” property=”prop” scope=”page” value=”7”></p> <p>The value of bean.Prop is greater than 7</p> <p></logic:greaterThan></p> <p>判断在页的作用域中是否有一个名为<span style="font-family:Times New Roman">”bean”</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,它有一个</span><span style="font-family:Times New Roman">prop</span><span style="font-family:宋体">属性,这个属性的值是否大于</span><span style="font-family:Times New Roman">7</span><span style="font-family:宋体">。如果这个属性能够转化为数值,就进行数值比较,否则就进行字符串比较。</span></p> <p>第二类条件标记定义了两个标记:</p> <p>? <logic:present></p> <p>? <logic:notPresent></p> <p>它们的功能是在计算标记体之前判断特定的项目是否存在。标记的属性和属性值决定了要进行检查的项目。</p> <p>属性 描述</p> <p>Cookie 由这个属性指定的<span style="font-family:Times New Roman">cookie</span><span style="font-family:宋体">将被检查是否存在</span></p> <p>Header 由这个属性指定的请求标头将被检查是否存在</p> <p>parameter 由这个属性指定的请求参数将被检查是否存在</p> <p>Name 如果没有设置<span style="font-family:Times New Roman">property</span><span style="font-family:宋体">属性,那么有这个属性指定的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">将被检查是否存在。如果设置了,那么</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性都将被检查是否存在</span></p> <p>property 检查有<span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性指定的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">中是否存在指定的属性</span></p> <p>Scope 如果指定了<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称,这就是</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的作用域。如果没有指定作用域,搜索的范围从页到应用程序作用域</span></p> <p>Role 检查当前已经确认的用户是否属于特殊的角色</p> <p>User 检查当前已经确认的用户是否有特定的名称</p> <p>例如:<span style="font-family:Times New Roman"><logic:notPresent name=”bean” property=”prop” scope=”page”></span></p> <p>The bean property bean.prop is present</p> <p></logic:notPresent></p> <p>标记判断在页作用域中是否存在一个名为<span style="font-family:Times New Roman">”bean”</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,这个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">有一个</span><span style="font-family:Times New Roman">prop</span><span style="font-family:宋体">属性。</span></p> <p>第三类条件标记比较复杂,这些标记根据模板匹配的结果检查标记体的内容。换句话说,这些标记判断一个指定项目的值是否是一个特定常数的子字符串:</p> <p>? <logic:match></p> <p>? <logic:notMatch></p> <p>这些标记允许<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">引擎在发现了匹配或是没有发现时计算标记主体。属性如下:</span></p> <p>属性 描述</p> <p>Cookie 要进行比较的<span style="font-family:Times New Roman">HTTP cookie</span><span style="font-family:宋体">的名称</span></p> <p>Header 要进行比较的的<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">标头 的名称</span></p> <p>parameter 要进行比较的的<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">请求参数的名称</span></p> <p>Name 若要对<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性进行比较,这个属性是用户指定</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称</span></p> <p>location 如果设置了这个属性的值,将会在这个指定的位置<span style="font-family:Times New Roman">(</span><span style="font-family:宋体">索引值</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">进行匹配</span></p> <p>scope 如果对<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">进行比较,这个属性指定了</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的作用域。如果没有设置这个参数,搜索范围是从页到应用程序作用域</span></p> <p>property 要进行比较的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性名称</span></p> <p>value 要进行比较的常数值</p> <p>例如:<span style="font-family:Times New Roman"><logic:match parameter=”name” value=”xyz” location=”1”></span></p> <p>The parameter name is a sub-string of the string xyz from index 1</p> <p></logic:match></p> <p>标记检查名为<span style="font-family:Times New Roman">”name”</span><span style="font-family:宋体">的请求参数是否是</span><span style="font-family:Times New Roman">”xyz”</span><span style="font-family:宋体">的子字符串,但是子字符串必须从</span><span style="font-family:Times New Roman">”xyz”</span><span style="font-family:宋体">的索引位置</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">开始(也就是说子字符串必须是</span><span style="font-family:Times New Roman">”y”</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">”yz”</span><span style="font-family:宋体">)。</span></p> <p>重复标记</p> <p>在逻辑标记库中定义了<span style="font-family:Times New Roman"><logic:iterate></span><span style="font-family:宋体">标记,它能够根据特定集合中元素的数目对标记体的内容进行重复的检查。集合的类型可以是</span><span style="font-family:Times New Roman">java.util.Iterator,java.util.Collection,java.util.Map</span><span style="font-family:宋体">或是一个数组。</span></p> <p>有三种方法可以定义这个集合:</p> <p>? 使用运行时间表达式来返回一个属性集合的集合</p> <p>? 将集合定义为<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,并且使用</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性指定存储属性的名称。</span></p> <p>? 使用<span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性定义一个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,并且使用</span><span style="font-family:Times New Roman">property</span><span style="font-family:宋体">属性定义一个返回集合的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性。</span></p> <p>当前元素的集合会被定义为一个页作用域的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">。属性如下,所有这些属性都能使用运行时表达式。</span></p> <p>属性 描述</p> <p>collection 如果没有设置<span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性,它就指定了要进行重复的集合</span></p> <p>Id 页作用域<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">和脚本变量的名称,它保存着集合中当前元素的句柄</span></p> <p>indexed 页作用域<span style="font-family:Times New Roman">JSP bean</span><span style="font-family:宋体">的名称,它包含着每次重复完成后集合的当前索引</span></p> <p>Length 重复的最大次数</p> <p>Name 作为集合的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称,或是一个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">名称,它由</span><span style="font-family:Times New Roman">property</span><span style="font-family:宋体">属性定义的属性,是个集合</span></p> <p>Offset 重复开始位置的索引</p> <p>property 作为集合的<span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">属性的名称</span></p> <p>Scope 如果指定了<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">名称,这个属性设置</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的作用域。若没有设置,搜索范围从页到应用程序作用域</span></p> <p>Type 为当前定义的页作用域<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的类型</span></p> <p>例如:<span style="font-family:Times New Roman"><logic:iterate id=”currentInt”</span></p> <p>collection=”<% =myList %>”</p> <p>type=”java.lang.Integer”</p> <p>offset=”1”</p> <p>length=”2”></p> <p><% =currentint %></p> <p></logic:iterate></p> <p>代码将从列表中的第一个元素开始重复两个元素并且能够让当前元素作为页作用域和<span style="font-family:Times New Roman">java.lang.Integer</span><span style="font-family:宋体">类型的脚本变量来使用。也就是说,如果</span><span style="font-family:Times New Roman">myList</span><span style="font-family:宋体">包含元素</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">2</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">3</span><span style="font-family:宋体">,</span><span style="font-family:Times New Roman">4</span><span style="font-family:宋体">等,代码将会打印</span><span style="font-family:Times New Roman">1</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">2</span><span style="font-family:宋体">。</span></p> <p>转发和重定向标记</p> <p>转发标记</p> <p><logic:forward><span style="font-family:宋体">标记能够将响应转发给重定向到特定的全局</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">上。</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">的类型决定了是使用</span><span style="font-family:Times New Roman">PageContext</span><span style="font-family:宋体">转发响应,还是使用</span><span style="font-family:Times New Roman">sendRedirect</span><span style="font-family:宋体">将响应进行重定向。此标记只有一个</span><span style="font-family:Times New Roman">”name”</span><span style="font-family:宋体">属性,用来指定全局</span><span style="font-family:Times New Roman">ActionForward</span><span style="font-family:宋体">的名称,例如:</span></p> <p><logic:forward name=”myGlobalForward”/></p> <p>重定向标记</p> <p><logic:redirect><span style="font-family:宋体">标记是一个能够执行</span><span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">重定向的强大工具。根据指定的不同属性,它能够通过不同的方式实现重定向。它还允许开发人员指定重定向</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">的查询参数。属性如下:</span></p> <p>属性 描述</p> <p>Forward 映射了资源相对路径的<span style="font-family:Times New Roman">ActionForward</span></p> <p>Href 资源的完整<span style="font-family:Times New Roman">URL</span></p> <p>Page 资源的相对路径</p> <p>Name Map<span style="font-family:宋体">类型的页名称,请求,会话或程序属性的名称,其中包含要附加大哦重定向</span><span style="font-family:Times New Roman">URL</span><span style="font-family:宋体">(如果没有设置 </span><span style="font-family:Times New Roman">property</span><span style="font-family:宋体">属性)上的</span><span style="font-family:Times New Roman">“</span><span style="font-family:宋体">名称</span><span style="font-family:Times New Roman">-</span><span style="font-family:宋体">值</span><span style="font-family:Times New Roman">”</span><span style="font-family:宋体">参数。或是具有</span><span style="font-family:Times New Roman">Map</span><span style="font-family:宋体">类型属性的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">名称,其中包含相同的信息(没有设置</span><span style="font-family:Times New Roman">property</span><span style="font-family:宋体">属性)</span></p> <p>Property Map<span style="font-family:宋体">类型的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称。</span><span style="font-family:Times New Roman">Bean</span><span style="font-family:宋体">的名称由</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性指定。</span></p> <p>Scope 如果指定了<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称,这个属性指定搜索</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的范围。如果没有设置,搜索范围从页到应用程序作用域</span></p> <p>ParamID 定义特定查询参数的名称</p> <p>ParamName 字符串类型的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称,其中包含查询参数的值</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">如果没有设置</span><span style="font-family:Times New Roman">paramProperty</span><span style="font-family:宋体">属性</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">;或是一个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称,它的属性</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">在</span><span style="font-family:Times New Roman">paramProperty</span><span style="font-family:宋体">属性中指定</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">包含了查询参数值</span></p> <p>paramProperty 字符串<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称,其中包含着查询参数的值</span></p> <p>ParamScope ParamName<span style="font-family:宋体">定义的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的搜索范围</span><span style="font-family:Times New Roman">. </span><span style="font-family:宋体">使用这个标记时至少要指定</span><span style="font-family:Times New Roman">forward,href</span><span style="font-family:宋体">或</span><span style="font-family:Times New Roman">page</span><span style="font-family:宋体">中的一个属性,以便标明将响应重定向到哪个资源</span></p> <p>HTML<span style="font-family:宋体">标记</span></p> <p>Struts HTML<span style="font-family:宋体">标记可以大致地分为以下几个功能:</span></p> <p>? 显示表单元素和输入控件</p> <p>? 显示错误信息</p> <p>? 显示其他<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">元素</span></p> <p>显示表单元素和输入控件</p> <p>struts<span style="font-family:宋体">将</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">表单与为表单操作而定义的</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">紧密联系在一起。表单输入字段的名称与</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">里定义的属性名称是对应的。当第一次显示表单时,表单的输入字段是从</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">中移植过来的,当表单被提交时,请求参数将移植到</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">实例。</span></p> <p>所有可以在<span style="font-family:Times New Roman"><form></span><span style="font-family:宋体">标记中使用的用来显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">输入控件的内嵌标记都使用下列属性来定义</span><span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">事件处理器。</span></p> <p>属性 描述</p> <p>Onblur 字段失去了焦点</p> <p>Onchange 字段失去了焦点并且数值被更改了</p> <p>Onclick 字段被鼠标点击</p> <p>Ondblclick 字段被鼠标双击</p> <p>Onfocus 字段接收到输入焦点</p> <p>Onkeydown 字段拥有焦点并且有键按下</p> <p>onkeypress 字段拥有焦点并且有键按下并释放</p> <p>Onkeyup 字段拥有焦点并且有键被释放</p> <p>onmousedown 鼠标指针指向字段并且点击</p> <p>onmousemove 鼠标指针指向字段并且在字段内移动</p> <p>onmouseout 鼠标指针指向控件,但是指针在元素外围移动</p> <p>onmouseover 鼠标指针没有指向字段,但是指针在元素内部移动</p> <p>Onmouseup 鼠标指针指向字段,并且释放了鼠标按键</p> <p><form><span style="font-family:宋体">元素中能够被定义的其他一般属性有:</span></p> <p>属性 描述</p> <p>Accesskey 定义访问输入字段的快捷键</p> <p>Style 定义输入字段的样式</p> <p>styleClass 定义输入字段的样式表类</p> <p>Tabindex 输入字段的<span style="font-family:Times New Roman">tab</span><span style="font-family:宋体">顺序</span></p> <p>表单标记</p> <p><html:form><span style="font-family:宋体">标记用来显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标记,可以指定</span><span style="font-family:Times New Roman">AcitonForm bean</span><span style="font-family:宋体">的名称和它的类名。如果没有设置这些属性,就需要有配置文件来指定</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">以表明当前输入的是哪个</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页,以及从映射中检索的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">名和类。如果在</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">指定的作用域中没有找到指定的名称,就会创建并存储一个新的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,否则将使用找到的</span><span style="font-family:Times New Roman">bean<form></span><span style="font-family:宋体">标记能够包含与各种</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">输入字段相对应的子标记。</span></p> <p><html:form><span style="font-family:宋体">标记属性如下:</span></p> <p>属性 描述</p> <p>Action 与表单相关的操作。在配置中,这个操作也用来标识与表单相关的<span style="font-family:Times New Roman">ActionForm bean</span></p> <p>Enctype 表单<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">方法的编码类型</span></p> <p>Focus 表单中需要初始化焦点的字段</p> <p>Method 表单使用的<span style="font-family:Times New Roman">HTTP</span><span style="font-family:宋体">方法</span></p> <p>Name 与表单相关的<span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">的名称。如果没有设置这个属性,</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称将会从配置信息中获得</span></p> <p>Onreset 表单复位时的<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">事件句柄</span></p> <p>Onsubmit 表单提交时的<span style="font-family:Times New Roman">JavaScript</span><span style="font-family:宋体">事件句柄</span></p> <p>Scope 搜索<span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">的范围。如果没有设置,将从配置文件中获取</span></p> <p>Style 使用的格式</p> <p>styleClass 这个元素的格式表类</p> <p>Type ActionForm bean<span style="font-family:宋体">的完整名称。如果没有设置,将从配置文件获得</span></p> <p>例如:</p> <p><html:form action=”validateEmploee.do” method=”post”></p> <p></html:form></p> <p>与表单相关的操作路径是<span style="font-family:Times New Roman">validateEmployee,</span><span style="font-family:宋体">而表单数据是通过</span><span style="font-family:Times New Roman">POST</span><span style="font-family:宋体">传递的。对于这个表单来说,</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">的其他信息,如</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">名称类型,作用域,都是从表单指定操作的</span><span style="font-family:Times New Roman">ActionMapping</span><span style="font-family:宋体">中检索得到的:</span></p> <p><form-beans></p> <p><form-bean name=”empForm” type=”com.example.EmployeeForm” /></p> <p></form-beans></p> <p><action-mappings></p> <p><action path=”/validateEmployee”</p> <p>type=”com.example.ValidateExampleAction” name=”empForm” scope=”request”</p> <p>input=”/employeeInput.jsp”></p> <p><forward name=”success” path=”/employeeOutput.jsp”></p> <p></action></p> <p></action-mapping></p> <p>如果配置文件中包含上述信息,并且请求<span style="font-family:Times New Roman">URI</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">*.do</span><span style="font-family:宋体">被映射到</span><span style="font-family:Times New Roman">ActionServlet</span><span style="font-family:宋体">,与表单相关的</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">的名称,类型和作用域分别是</span><span style="font-family:Times New Roman">empForm,com.example.EmployeeForm</span><span style="font-family:宋体">和</span><span style="font-family:Times New Roman">request.</span><span style="font-family:宋体">这些属性也可以使用</span><span style="font-family:Times New Roman"><html:form></span><span style="font-family:宋体">标记属性进行显示的定义。</span></p> <p>以下标记必须嵌套在<span style="font-family:Times New Roman"><html:form></span><span style="font-family:宋体">标记里</span></p> <p>按钮和取消标记</p> <p><html:button><span style="font-family:宋体">标记显示一个按钮控件;</span><span style="font-family:Times New Roman"><html:cancel></span><span style="font-family:宋体">标记显示一个取消按钮。属性如下:</span></p> <p>属性 描述</p> <p>Property 定义在表单被提交时返回到服务器的请求参数的名称</p> <p>Value 按钮上的标记</p> <p>复位和提交标记</p> <p><html:reset><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><html:submit></span><span style="font-family:宋体">标记分别能够显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">复位按钮和提交按钮。</span></p> <p>文本和文本区标记</p> <p><html:text><span style="font-family:宋体">和</span><span style="font-family:Times New Roman"><html:textarea></span><span style="font-family:宋体">标记分别</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文本框和文本区,属性如下:</span></p> <p>属性 描述</p> <p>Property 定义当表单被提交时送回到服务器的请求参数的名称,或用来确定文本元素当前值的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性名称</span></p> <p>Name 属性被查询的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的名称,它决定了文本框和文本区的值。如果没有设置,将使用与这个内嵌表单相关的</span><span style="font-family:Times New Roman">ActionForm</span><span style="font-family:宋体">的名称</span></p> <p><html:text><span style="font-family:宋体">标记还有以下属性:</span></p> <p>属性 描述</p> <p>Maxlength 能够输入的最大字符数</p> <p>Size 文本框的大小(字符数)</p> <p><html:textarea><span style="font-family:宋体">标记特有的属性如下:</span></p> <p>属性 描述</p> <p>Rows 文本区的行数</p> <p>Cols 文本区的列数</p> <p>检查框和复选框标记</p> <p><html:checkbox><span style="font-family:宋体">标记能够显示检查框控件。</span><span style="font-family:Times New Roman"><html:multibox></span><span style="font-family:宋体">标记能够显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">复选框控件,请求对象在传递检查框名称时使用的</span><span style="font-family:Times New Roman">getParameterValues()</span><span style="font-family:宋体">调用将返回一个字符串数组。属性如下:</span></p> <p>属性 描述</p> <p>Name Bean<span style="font-family:宋体">的名称,其属性会被用来确定检查是否以选中的状态显示。如果没有设置,将使用与这个内嵌表单相关的</span><span style="font-family:Times New Roman">ActionFrom bean</span><span style="font-family:宋体">的名称</span></p> <p>Property 检查框的名称,也是决定检查框是否以选中的状态显示的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性名称。在复选框的情况下,这个属性必须是一个数组</span></p> <p>Value 当检查框被选中时返回到服务器的请求参数的值</p> <p>例如:<span style="font-family:Times New Roman"><html:checkbox property=”married” value=”Y”/></span></p> <p>一个名为<span style="font-family:Times New Roman">married</span><span style="font-family:宋体">的检查框,在表单提交时会返回一个</span><span style="font-family:Times New Roman">”Y”.</span></p> <p>文件标记</p> <p><html:file><span style="font-family:宋体">标记可以显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件控件。属性如下:</span></p> <p>属性 描述</p> <p>Name Bean<span style="font-family:宋体">的名称,它的属性将确定文件控件中显示的内容。如果没设置,将使用与内嵌表单相关的</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">的名称</span></p> <p>property 这个属性定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定文件控件中显示内容的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性名称</span></p> <p>Accept 服务器能够处理的内容类型集。它也将对客户浏览器对话框中的可选文件类型进行过滤</p> <p>Value 按钮上的标记,这个按钮能够在本地文件系统中浏览文件</p> <p>单选钮标记</p> <p><html:radio><span style="font-family:宋体">标记用来显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">单选钮控件,属性如下:</span></p> <p>属性 描述</p> <p>Name Bean<span style="font-family:宋体">的名称,其属性会被用来确定单选钮是否以选中的状态显示。如果没有设置,将使用与这个内嵌表单相关的</span><span style="font-family:Times New Roman">ActionFrom bean</span><span style="font-family:宋体">的名称</span></p> <p>property 当表单被提交时送回到服务器的请求参数的名称,以及用来确定单选钮是否以被选中状态进行显示的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称</span></p> <p>Value 当单选钮被选中时返回到服务器的值</p> <p>隐藏标记</p> <p><html:hidden><span style="font-family:宋体">标记能够显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">隐藏输入元素,属性如下:</span></p> <p>属性 描述</p> <p>Name Bean<span style="font-family:宋体">的名称,其属性会被用来确定隐藏元素的当前值。如果没有设置,将使用与这个内嵌表单相关的</span><span style="font-family:Times New Roman">ActionFrom bean</span><span style="font-family:宋体">的名称</span></p> <p>property 定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定隐藏元素当前值的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称</span></p> <p>Value 用来初始化隐藏输入元素的值</p> <p>密码标记</p> <p><html:password><span style="font-family:宋体">标记能够显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">密码控件,属性如下:</span></p> <p>属性 描述</p> <p>maxlength 能够输入的最大字符数</p> <p>Name Bean<span style="font-family:宋体">的名称,它的属性将用来确定密码元素的当前值。如果没有设置,将使用与这个内嵌表单相关的</span><span style="font-family:Times New Roman">ActionFrom bean</span><span style="font-family:宋体">的名称</span></p> <p>property 定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定密码元素当前值的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称</span></p> <p>redisplay 在显示这个字段时,如果相应的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性已经被设置了数据,这个属性决定了是否显示密码的内容</span></p> <p>Size 字段的大小</p> <p>选择标记</p> <p><html:select><span style="font-family:宋体">标记能够显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">选择控件,属性如下:</span></p> <p>属性 描述</p> <p>multiple 表明这个选择控件是否允许进行多选</p> <p>Name Bean<span style="font-family:宋体">的名称,它的属性确定了哪个。如果没有设置,将使用与这个内嵌表单相关的</span><span style="font-family:Times New Roman">ActionFrom bean</span><span style="font-family:宋体">的名称</span></p> <p>property 定义了当表单被提交时送回到服务器的请求参数的名称,以及用来确定哪个选项需要被选中的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性的名称</span></p> <p>Size 能够同时显示的选项数目</p> <p>Value 用来表明需要被选中的选项</p> <p>选项标记<span style="font-family:Times New Roman">(</span><span style="font-family:宋体">这个元素需要嵌套在</span><span style="font-family:Times New Roman"><html:select></span><span style="font-family:宋体">标记里</span><span style="font-family:Times New Roman">)</span></p> <p><html:option><span style="font-family:宋体">标记用来显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">选项元素集合,属性如下:</span></p> <p>属性 描述</p> <p>collection Bean<span style="font-family:宋体">集合的名称,这个集合存储在某个作用域的属性中。选项的数目与集合中元素的数目相同。</span><span style="font-family:Times New Roman">Property</span><span style="font-family:宋体">属性能够定义选项值所使用的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">属性,而</span><span style="font-family:Times New Roman">labelProperty</span><span style="font-family:宋体">属性定义选项标记所使用的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性</span></p> <p>labelName 用来指定存储于某个作用域的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,这个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">是一个字符串的集合,能够定义</span><span style="font-family:Times New Roman"><html:option></span><span style="font-family:宋体">元素的标记</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">如果标志与值不相同</span><span style="font-family:Times New Roman">)</span></p> <p>labelProperty 与<span style="font-family:Times New Roman">collection</span><span style="font-family:宋体">属性共同使用时,用来定义了存储于某个作用域的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,这个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">将返回一个字符串集合,能够用来写入</span><span style="font-family:Times New Roman"><html:option></span><span style="font-family:宋体">元素的</span><span style="font-family:Times New Roman">value</span><span style="font-family:宋体">属性</span></p> <p>Name 如果这是唯一被指定的属性,它就定义了存储于某个作用域的<span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,这个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">将返回一个字符串集合,能够用来写入</span><span style="font-family:Times New Roman"><html:option></span><span style="font-family:宋体">元素的</span><span style="font-family:Times New Roman">value</span><span style="font-family:宋体">属性</span></p> <p>property 这个属性在与<span style="font-family:Times New Roman">collection</span><span style="font-family:宋体">属性共同使用时,定义了每个要显示选项值的独立</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性。如果不是与</span><span style="font-family:Times New Roman">collection</span><span style="font-family:宋体">属性共同使用,这个属性定义了由</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性指定的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的属性名称</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">如果有</span><span style="font-family:Times New Roman">name</span><span style="font-family:宋体">属性</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">,或是定义了一个</span><span style="font-family:Times New Roman">ActionForm bean</span><span style="font-family:宋体">,这个</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">将返回一个集合来写入选项的值</span></p> <p>我们看一下这个标记的一些例子:</p> <p><html:option collection=”optionCollection” property=”optionValue” labelProperty=”optionLabel”/></p> <p>标记假设在某个作用域中有一个名为<span style="font-family:Times New Roman">optionCollection</span><span style="font-family:宋体">的集合,它包含了一些具有</span><span style="font-family:Times New Roman">optionValue</span><span style="font-family:宋体">属性的独立的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,每个属性将作为一个选项的值。每个选项的标志由</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">的</span><span style="font-family:Times New Roman">optionLabel</span><span style="font-family:宋体">属性属性进行定义。</span></p> <p><html:option name=”optionValues” labelName=”optionLabels”/></p> <p>标记中<span style="font-family:Times New Roman">optionValues</span><span style="font-family:宋体">代表一个存储在某个作用域中的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,它是一个字符串集合,能够用来写入选项的值,而</span><span style="font-family:Times New Roman">optionLabels</span><span style="font-family:宋体">代表一个存储在某个作用域中的</span><span style="font-family:Times New Roman">bean</span><span style="font-family:宋体">,它也是一个字符串集合,能够用来写入选项的标志。</span></p> <p>显示错误信息的标记</p> <p><html:errors><span style="font-family:宋体">标记能够与</span><span style="font-family:Times New Roman">ActionErrors</span><span style="font-family:宋体">结合在一起来显示错误信息。这个标记首先要从当前区域的资源文件中读取消息关键字</span><span style="font-family:Times New Roman">errors.header</span><span style="font-family:宋体">,然后显示消息的文本。接下去它会在</span><span style="font-family:Times New Roman">ActionErrors</span><span style="font-family:宋体">对象</span><span style="font-family:Times New Roman">(</span><span style="font-family:宋体">通常作为请求参数而存储在</span><span style="font-family:Times New Roman">Action.ERROR_KEY</span><span style="font-family:宋体">关键字下</span><span style="font-family:Times New Roman">)</span><span style="font-family:宋体">中循环,读取单个</span><span style="font-family:Times New Roman">ActionError</span><span style="font-family:宋体">对象的消息关键字,从当前区域的资源文件中读取并格式化相应的消息,并且显示它们。然后它读取与</span><span style="font-family:Times New Roman">errors.footer</span><span style="font-family:宋体">关键字相对应的消息并且显示出来。</span></p> <p>通过定义<span style="font-family:Times New Roman">property</span><span style="font-family:宋体">属性能够过滤要显示的消息,这个属性的值应该与</span><span style="font-family:Times New Roman">ActionErrors</span><span style="font-family:宋体">对象中存储</span><span style="font-family:Times New Roman">ActionError</span><span style="font-family:宋体">对象的关键字对应。属性如下:</span></p> <p>属性 描述</p> <p>Bundle 表示应用程序作用域属性的名称,它包含着消息资源,其默认值<span style="font-family:Times New Roman">Acion.MESSAGE_KEY</span></p> <p>Locale 表示会话作用域属性的名称,它存储着用户当前登录的区域信息。其默认值是<span style="font-family:Times New Roman">Action.ERROR_KEY</span></p> <p>Name 表示请求属性的名称,它存储着<span style="font-family:Times New Roman">ActionErrors</span><span style="font-family:宋体">对象。其默认值是</span><span style="font-family:Times New Roman">Action.ERROR_KEY</span></p> <p>property 这个属性指定了<span style="font-family:Times New Roman">ActionErrors</span><span style="font-family:宋体">对象中存储每个独立</span><span style="font-family:Times New Roman">ActionError</span><span style="font-family:宋体">对象的关键字,它可以过滤消息</span></p> <p>例子:</p> <p><html:errors/></p> <p>显示集合中所有的错误。</p> <p><html:errors property=”missing.name”/></p> <p>显示存储在<span style="font-family:Times New Roman">missing.name</span><span style="font-family:宋体">关键字的错误。</span></p> <p>其他<span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">标记</span></p> <p>struts HTML<span style="font-family:宋体">标记还定义了下列标记来显示其他</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">元素:</span></p> <p>? <html:html> : <span style="font-family:宋体">显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">元素</span></p> <p>? <html:img> : <span style="font-family:宋体">显示图象标记</span></p> <p>? <html:link> : <span style="font-family:宋体">显示</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">链接或锚点</span></p> <p>? <html:rewrite> : <span style="font-family:宋体">创建没有锚点标记的</span><span style="font-family:Times New Roman">URI</span></p> <p>这些标记的详细内容请参照<span style="font-family:Times New Roman">struts</span><span style="font-family:宋体">文档。</span></p> <p>模板标记</p> <p>动态模板是模块化<span style="font-family:Times New Roman">WEB</span><span style="font-family:宋体">页布局设计的强大手段。</span><span style="font-family:Times New Roman">Struts</span><span style="font-family:宋体">模板标记库定义了自定义标记来实现动态模板。</span></p> <p>插入标记</p> <p><template:insert><span style="font-family:宋体">标记能够在应用程序的</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页中插入动态模板。这个标记只有一个</span><span style="font-family:Times New Roman">template</span><span style="font-family:宋体">属性,用来定义模板</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页。要插入到模板的页是有多个</span><span style="font-family:Times New Roman"><template:put></span><span style="font-family:宋体">标记来指定的,而这些标记被定义为</span><span style="font-family:Times New Roman"><template:insert></span><span style="font-family:宋体">标记的主体内容。</span></p> <p>放置标记</p> <p><template:put><span style="font-family:宋体">标记是</span><span style="font-family:Times New Roman"><template:insert></span><span style="font-family:宋体">标记内部使用的,用来指定插入到模板的资源。属性如下:</span></p> <p>属性 描述</p> <p>content 定义要插入的内容,比如一个<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">文件或一个</span><span style="font-family:Times New Roman">HTML</span><span style="font-family:宋体">文件</span></p> <p>direct 如果这个设置为<span style="font-family:Times New Roman">true</span><span style="font-family:宋体">,由</span><span style="font-family:Times New Roman">content</span><span style="font-family:宋体">属性指定的内容将直接显示在</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">上而不是作为包含文件</span></p> <p>Name 要插入的内容的名称</p> <p>Role 如果设置了这个属性,只有在当前合法用户具有特定角色时才能进行内容的插入</p> <p>获得标记</p> <p>在模板<span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页中使用</span><span style="font-family:Times New Roman"><template:get></span><span style="font-family:宋体">标记能够检索由</span><span style="font-family:Times New Roman"><template:put></span><span style="font-family:宋体">标记插入到</span><span style="font-family:Times New Roman">JSP</span><span style="font-family:宋体">页的资源。属性如下:</span></p> <p>属性 描述</p> <p>Name 由<span style="font-family:Times New Roman"><template:put></span><span style="font-family:宋体">�</span></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1275141057314570240"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Java基础)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950065014828232704.htm" title="【Java基础面试题】Java特点,八种基本数据类型" target="_blank">【Java基础面试题】Java特点,八种基本数据类型</a> <span class="text-muted"></span> <div>Java的特点1.面向对象2.跨平台3.简单易学4.内存管理JVM、JDK、JRE的关系JVM:Java虚拟机,它负责把字节码文件进行编译并运行,是Java具有跨平台性的关键所在。它还有内存管理,垃圾回收等功能。JDK:JDK是Java开发工具包,它包含了JVM,编译器,调试器等开发工具,还包含一系列类库。它提供了Java程序编译,调试,运行所需要的工具和环境。JRE:是java运行时的最小环境,</div> </li> <li><a href="/article/1950053795572543488.htm" title="JavaWeb(苍穹外卖)--学习笔记14" target="_blank">JavaWeb(苍穹外卖)--学习笔记14</a> <span class="text-muted">哈哈哈哈哈0627</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>前言终于开始学习做项目了,本篇文章是学习B站黑马程序员苍穹外卖的学习笔记。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,这篇文章是把我觉得JavaWeb的学习中比较重要的内容写一个总结(其实因为学到下单支付太难了我复习复习前面的)Controller层(这里只讲讲几个需要注意的注解)管理服务端的动态资源:SpringFramewo</div> </li> <li><a href="/article/1949818877881937920.htm" title="Educoder–Java 第1关:Object类 第2关:JAVA基础类型包装类-练习 第3关:String&StringBuilder&StringBuffer类-练习 第4关:Random类" target="_blank">Educoder–Java 第1关:Object类 第2关:JAVA基础类型包装类-练习 第3关:String&StringBuilder&StringBuffer类-练习 第4关:Random类</a> <span class="text-muted"></span> <div>文章目录第1关:Object类编程要求答案第2关:JAVA基础类型包装类-练习任务描述编程要求测试说明答案第3关:String&StringBuilder&StringBuffer类-练习任务描述测试说明答案第4关:Random类测试说明答案第1关:Object类编程要求请仔细阅读右侧代码,根据方法内的提示,在Begin-End区域内进行代码补充,具体任务如下:Demo类和Person类已经写好,</div> </li> <li><a href="/article/1949799588810518528.htm" title="Spring Boot Starter深度解析与实践" target="_blank">Spring Boot Starter深度解析与实践</a> <span class="text-muted">t0_54coder</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%89%8B%E5%86%8C/1.htm">编程问题解决手册</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%BC%80%E5%8F%91/1.htm">编程开发</a> <div>SpringBootStarter深度解析与实践简介SpringBoot是一个开源Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序。它设计时考虑了无需进行大量的XML配置,通过starters提供依赖管理,简化了项目配置。SpringBootStarter概览SpringBoot的starters是一组jar依赖,它们提供了一种快速配置应用程序的方式,而无需手动包含许多相关的</div> </li> <li><a href="/article/1949689002453954560.htm" title="Java基础之冒泡排序、二分查找、封装" target="_blank">Java基础之冒泡排序、二分查找、封装</a> <span class="text-muted">灌木丛中的微风</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Java基础1.冒泡排序publicstaticvoidmain(String[]args){/*TODO定义数组的冒泡排序*/int[]intAr={3,2,1,5,6,4,2,1,8};bubbleSort(intAr);System.out.println(getArrStr(intAr));}publicstaticint[]bubbleSort(int[]intArr){/*冒泡排序:对</div> </li> <li><a href="/article/1949667446227005440.htm" title="大数据编程基础" target="_blank">大数据编程基础</a> <span class="text-muted">芝麻开门-新的起点</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>3.1Java基础(重点)内容讲解Java是大数据领域最重要的编程语言之一。Hadoop、HBase、Elasticsearch等众多核心框架都是用Java开发的。因此,扎实的Java基础对于深入理解这些框架的底层原理和进行二次开发至关重要。为什么Java在大数据领域如此重要?生态系统:Hadoop生态系统原生就是Java构建的,使用Java进行开发可以无缝集成。跨平台性:Java的“一次编译,到</div> </li> <li><a href="/article/1949619542237966336.htm" title="JavaWeb(苍穹外卖)--学习笔记11(Filter(过滤器) 和 Interceptor(拦截器))" target="_blank">JavaWeb(苍穹外卖)--学习笔记11(Filter(过滤器) 和 Interceptor(拦截器))</a> <span class="text-muted">哈哈哈哈哈0627</span> <a class="tag" taget="_blank" href="/search/JavaWeb%EF%BC%88%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96%EF%BC%89/1.htm">JavaWeb(苍穹外卖)</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>前言本篇文章是学习B站黑马程序员苍穹外卖的学习笔记。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,又进入用户端的登陆界面的开发,我们可以看到在后续的请求当中,都会在请求头中携带能验证身份的凭证到服务端,而服务端需要统一拦截所有的请求,从而判断是否携带的有合法的JWT令牌,下面主要来说说负责拦截的Filter(过滤器)和Interceptor(拦截器)(感觉整个项目</div> </li> <li><a href="/article/1949295879261319168.htm" title="2025最新收集!java面试题、场景题、大厂真题!" target="_blank">2025最新收集!java面试题、场景题、大厂真题!</a> <span class="text-muted"></span> <div>以下是网上整理的非常全面的面试题,当然,绝大多数人不可能全部用到,但是都罗列在此,大家可根据自己的情况,选择对应的模块进行阅读。本文和其他面试题最大的区别就是——答案经过校正,完整题目及答案:si我”666“直接获取!不受米!面试题模块介绍这份面试题,包含的内容了十九个模块:Java基础、容器、多线程、反射、对象拷贝、JavaWeb模块、异常、网络、设计模式、Spring/SpringMVC、Sp</div> </li> <li><a href="/article/1949016700401807360.htm" title="(1)Java基础语法 --认识Java" target="_blank">(1)Java基础语法 --认识Java</a> <span class="text-muted">长安-TreeHole</span> <a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>目录1、计算机的基础知识2、什么是编程语言3、前世今生3.1Java语言发展简史4、Java语言的体系(分支版本)5、Java语言的特性6、JDK、JRE、JVM之间的关系1、计算机的基础知识计算机的存储单位:二进制人们生活中采用的是十进制数,而计算机中全部是二进制数表示,它只包含0、1两个数,逢2进1(1:01、2:10)。任何格式的文件在计算机中存储的时候,底层都是以0101001001101</div> </li> <li><a href="/article/1948896557663318016.htm" title="java基础--字符串用法" target="_blank">java基础--字符串用法</a> <span class="text-muted">灰太狼的大表哥</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、前言(在java中字符串的重要性)在Java编程中,字符串(String)的重要性不言而喻,它几乎贯穿于所有的应用程序和系统中。以下是Java中字符串重要性的几个方面:1.数据表示和处理文本数据:字符串是表示文本数据的主要方式。无论是用户输入、文件读取还是网络传输,文本数据通常都以字符串的形式存在。数据格式化:字符串用于格式化输出,如日志记录、用户界面显示等。2.用户交互输入输出:用户通过字符</div> </li> <li><a href="/article/1948767712373174272.htm" title="Java SpringBoot 调用大模型 AI 构建智能应用实战指南" target="_blank">Java SpringBoot 调用大模型 AI 构建智能应用实战指南</a> <span class="text-muted">程序员老陈头</span> <a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">AI大模型</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>一、基础知识(一)Java基础Java是一种广泛使用的高级编程语言,具有简单、面向对象、分布式、解释型、健壮、安全、架构中立、可移植、高性能、多线程和动态等特点。在构建基于SpringBoot的AI应用之前,您需要具备扎实的Java基础。基本语法数据类型:了解Java的基本数据类型,包括整数、浮点数、布尔值、字符等,以及它们的存储范围和特点。例如,int类型用于表示整数,double类型用于表示浮</div> </li> <li><a href="/article/1948738468632915968.htm" title="Java 的备忘录 01 — 入门篇" target="_blank">Java 的备忘录 01 — 入门篇</a> <span class="text-muted"></span> <div>Java的备忘录01—入门篇大家好呀!今天开始,我打算写一系列关于Java的备忘录,主要是整理一些Java基础知识,方便自己回顾,也希望能帮到刚入门的小伙伴们。这第一篇,就从最基础的入门内容开始吧。我的博客名叫《坐山听雨忆轮回》,后续示例也会围绕这个名字展开。想要学习Java,首先得写出我们的第一个Java程序。下面就是这个经典程序的代码,输出我的博客名:publicclassFirstJava{</div> </li> <li><a href="/article/1948603453060214784.htm" title="android 必备java,Android必备的Java知识点" target="_blank">android 必备java,Android必备的Java知识点</a> <span class="text-muted">weixin_39540704</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E5%BF%85%E5%A4%87java/1.htm">必备java</a> <div>Android应用程序开发是以Java语言为基础的,所以需要有扎实的Java基础知识。首先熟悉java基本语法,然后熟悉设计模式等。a)Java基础语法:看下面的《Java知识点列表》b)设计模式:由于在Android系统的框架层当中,使用了大量的设计模式,如果没有这个方面的知识,对于Android的理解就会大打折扣。设计模式的种类非常之多(设计模式大概有28种,具体请看设计模式系列),一个一个的</div> </li> <li><a href="/article/1948602063936090112.htm" title="Java 基础知识经典全面总结:从入门到精通的必备指南" target="_blank">Java 基础知识经典全面总结:从入门到精通的必备指南</a> <span class="text-muted"></span> <div>以下是一篇关于Java基础知识的总结文章,包含了技术方案和应用实例,帮助你学习Java:Java基础知识总结Java是一种广泛应用的高级编程语言,具有跨平台、面向对象等诸多特性。以下是对其基础知识的详细总结:Java语言核心特性面向对象:以“对象”为中心,将事物抽象为具有属性和方法的实例。如设计Car类,可封装品牌、速度等属性,以及启动、刹车等方法。平台无关:Java字节码可在不同操作系统和硬件上</div> </li> <li><a href="/article/1948579001345830912.htm" title="SpringAOP的实现原理和场景" target="_blank">SpringAOP的实现原理和场景</a> <span class="text-muted">雪碧聊技术</span> <a class="tag" taget="_blank" href="/search/Java%E5%85%AB%E8%82%A1%E6%96%87/1.htm">Java八股文</a><a class="tag" taget="_blank" href="/search/SpringAOP/1.htm">SpringAOP</a> <div>欢迎来到我的Java八股文专栏!各位程序员小伙伴们好呀~我是雪碧聊技术,很高兴能在CSDN与大家相遇!✨专栏介绍这个专栏将专注于分享Java面试中的经典"八股文"知识点,内容涵盖:Java基础核心概念JVM原理与性能调优多线程与并发编程️设计模式实战️常用框架源码解析⚙️系统架构设计思想为什么选择这个专栏?精准定位:直击大厂Java面试高频考点系统全面:从基础到进阶,构建完整知识体系实战导向:理论</div> </li> <li><a href="/article/1948419487933984768.htm" title="JAVA基础之方法的返回值" target="_blank">JAVA基础之方法的返回值</a> <span class="text-muted">sun_hehong</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>一:无参数有返回值的方法格式:修饰符关键字返回值类型方法名(){//方法体return返回值}返回值:方法执行完毕后要返回的数据(要与返回值类型相互匹配)调用格式:第一种调用格式:数据类型变量名=方法名();(因为return返回一个数据,这个数据是返回到方法,那么在调用方法的时候就可以定义一个变量来接收)在调用有返回值无参数方法时,通常会用一个变量来接收,.如果不接收,直接调用方法,就不能显示返</div> </li> <li><a href="/article/1948418352737218560.htm" title="Java基础方法重载的要求" target="_blank">Java基础方法重载的要求</a> <span class="text-muted">五度鱼Java</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/javase/1.htm">javase</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1.方法重载又被称为:overload2.什么时候考虑使用方法重载?功能相似的时候,尽可能然方法名相同【但是:功能不同/不相似的时候,尽可能让方法名不同】3.什么条件满足之后构成了方法重载?方法名相同参数列表不同:①数量不同②顺序不同③类型不同4.方法重载和什么有关系,和什么没有关系?①方法重载和方法名+参数列表有关系②方法重载和返回值类型无关③方法重载和修饰符列表无关被重载的方法可以改变返回类型</div> </li> <li><a href="/article/1948184784974966784.htm" title="Java面向对象基础(多态)04--Java基础学习08" target="_blank">Java面向对象基础(多态)04--Java基础学习08</a> <span class="text-muted"></span> <div>文章属于个人知识点总结名字:不懂技术的计科毕业生来源:尚学堂高棋老师的Java300课1、多态的定义多态指为不同数据类型的实体提供统一的接口。多态类型可以将自身所支持的操作套用到其它类型的值上。多态是指同一方法调用,由于对象不同可能会有不同的行为。现实生活中,同一方法具体实现会完全不同。2、多态的要点①多态是方法的多态,不是属性的多态(多态与属性无关)。②多态的存在有三个必要条件:继承、方法的重写</div> </li> <li><a href="/article/1948158779455500288.htm" title="java基础----HashMap,ConCurrentHashMap,HashTable的区别" target="_blank">java基础----HashMap,ConCurrentHashMap,HashTable的区别</a> <span class="text-muted">pgydbh</span> <div>引用了http://www.importnew.com/24822.html知识点①hash集合中,不能存在key相同键值对。后面插入的会替换前面的。put(1,100);put(1,200)。get(1)=200。②hashmap不是线程安全的。③hashtable是线程安全的。用的是整个数组加锁。④conCurrentHaskMap是线程安全的。用的是分段加锁,不同的段可以同时插入。所以速度比</div> </li> <li><a href="/article/1948143931627728896.htm" title="java 注释关键字_java基础 五 java注释 关键字 标识符" target="_blank">java 注释关键字_java基础 五 java注释 关键字 标识符</a> <span class="text-muted">weixin_39943926</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%B3%A8%E9%87%8A%E5%85%B3%E9%94%AE%E5%AD%97/1.htm">注释关键字</a> <div>一:java有三大注释:1:当行注释:使用://开始进行注释.2:多行注释:/**/在/*和*/之间的内容会被编译器忽略.3:文档注释:/***//**注释信息*/和多行注释是一样的,除此之外还能生成文档信息api.注意多行和文档注释不能交叉嵌套.二:java的关键字和保留字:关键字:在编程语言中有一些事先定义好的,有特殊含义和用途的单词.保留字:和关键字一样都是是实现定义好的,只是现在暂时没有特</div> </li> <li><a href="/article/1948139646433161216.htm" title="【java基础04:注释 关键字 标识符 字面值 字节】" target="_blank">【java基础04:注释 关键字 标识符 字面值 字节】</a> <span class="text-muted">蛋翼</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>目录注释关键字*在编写的过程中记忆标识符:程序员有权利自己命名的单词字面值注意:字节注释单行注释//这里是单行注释多行注释/*这里是多行注释里面的内容可以换行*/文档注释S/***@DescriptionHelloWorld*@Authorqishi*//**这里面的文档注释可以换行文档注释允许把关于程序的信息嵌入到程序内部,我们可以用javadoc来提取这些信息,形成帮助文档*/关键字*在编写的</div> </li> <li><a href="/article/1948136116049735680.htm" title="【Java编程动手学】带你走进Java基础:注释、标识符和关键字" target="_blank">【Java编程动手学】带你走进Java基础:注释、标识符和关键字</a> <span class="text-muted">JosieBook</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Java%E5%85%A8%E6%A0%88/1.htm">Java全栈</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录一、引言二、Java中的注释1、单行注释2、多行注释3、文档注释三、Java中的标识符四、Java中的关键字五、总结一、引言在Java编程的学习之旅中,有一些基础概念如同建筑的基石,至关重要。今天,Daniel将和大家一起深入探讨Java中的注释、标识符和关键字这三个基础且关键的部分。理解这些概念,不仅能帮助我们编写出更规范、易读的代码,还能让我们在后续的学习和开发中更加得心应手。二、Ja</div> </li> <li><a href="/article/1948056574404653056.htm" title="List和Map的区别" target="_blank">List和Map的区别</a> <span class="text-muted">雪碧聊技术</span> <a class="tag" taget="_blank" href="/search/Java%E5%85%AB%E8%82%A1%E6%96%87/1.htm">Java八股文</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>欢迎来到我的Java八股文专栏!各位程序员小伙伴们好呀~我是雪碧聊技术,很高兴能在CSDN与大家相遇!✨专栏介绍这个专栏将专注于分享Java面试中的经典"八股文"知识点,内容涵盖:Java基础核心概念JVM原理与性能调优多线程与并发编程️设计模式实战️常用框架源码解析⚙️系统架构设计思想为什么选择这个专栏?精准定位:直击大厂Java面试高频考点系统全面:从基础到进阶,构建完整知识体系实战导向:理论</div> </li> <li><a href="/article/1947943503422091264.htm" title="【集群】MySQL的主从复制了解吗?会有延迟吗,原因是什么?" target="_blank">【集群】MySQL的主从复制了解吗?会有延迟吗,原因是什么?</a> <span class="text-muted">雪碧聊技术</span> <a class="tag" taget="_blank" href="/search/Java%E5%85%AB%E8%82%A1%E6%96%87/1.htm">Java八股文</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/MySQL%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/1.htm">MySQL主从复制</a> <div>欢迎来到我的Java八股文专栏!各位程序员小伙伴们好呀~我是雪碧聊技术,很高兴能在CSDN与大家相遇!✨专栏介绍这个专栏将专注于分享Java面试中的经典"八股文"知识点,内容涵盖:Java基础核心概念JVM原理与性能调优多线程与并发编程️设计模式实战️常用框架源码解析⚙️系统架构设计思想为什么选择这个专栏?精准定位:直击大厂Java面试高频考点系统全面:从基础到进阶,构建完整知识体系实战导向:理论</div> </li> <li><a href="/article/1947943504202231808.htm" title="【锁】MySQL中有哪几种锁?" target="_blank">【锁】MySQL中有哪几种锁?</a> <span class="text-muted">雪碧聊技术</span> <a class="tag" taget="_blank" href="/search/Java%E5%85%AB%E8%82%A1%E6%96%87/1.htm">Java八股文</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E9%94%81/1.htm">锁</a> <div>欢迎来到我的Java八股文专栏!各位程序员小伙伴们好呀~我是雪碧聊技术,很高兴能在CSDN与大家相遇!✨专栏介绍这个专栏将专注于分享Java面试中的经典"八股文"知识点,内容涵盖:Java基础核心概念JVM原理与性能调优多线程与并发编程️设计模式实战️常用框架源码解析⚙️系统架构设计思想为什么选择这个专栏?精准定位:直击大厂Java面试高频考点系统全面:从基础到进阶,构建完整知识体系实战导向:理论</div> </li> <li><a href="/article/1947943505133367296.htm" title="MySQL的Binlog有几种格式?" target="_blank">MySQL的Binlog有几种格式?</a> <span class="text-muted">雪碧聊技术</span> <a class="tag" taget="_blank" href="/search/Java%E5%85%AB%E8%82%A1%E6%96%87/1.htm">Java八股文</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>欢迎来到我的Java八股文专栏!各位程序员小伙伴们好呀~我是雪碧聊技术,很高兴能在CSDN与大家相遇!✨专栏介绍这个专栏将专注于分享Java面试中的经典"八股文"知识点,内容涵盖:Java基础核心概念JVM原理与性能调优多线程与并发编程️设计模式实战️常用框架源码解析⚙️系统架构设计思想为什么选择这个专栏?精准定位:直击大厂Java面试高频考点系统全面:从基础到进阶,构建完整知识体系实战导向:理论</div> </li> <li><a href="/article/1947937705677615104.htm" title="Arraylist与LinkedList区别" target="_blank">Arraylist与LinkedList区别</a> <span class="text-muted">雪碧聊技术</span> <a class="tag" taget="_blank" href="/search/Java%E5%85%AB%E8%82%A1%E6%96%87/1.htm">Java八股文</a><a class="tag" taget="_blank" href="/search/ArrayList/1.htm">ArrayList</a><a class="tag" taget="_blank" href="/search/LinkedList/1.htm">LinkedList</a> <div>欢迎来到我的Java八股文专栏!各位程序员小伙伴们好呀~我是雪碧聊技术,很高兴能在CSDN与大家相遇!✨专栏介绍这个专栏将专注于分享Java面试中的经典"八股文"知识点,内容涵盖:Java基础核心概念JVM原理与性能调优多线程与并发编程️设计模式实战️常用框架源码解析⚙️系统架构设计思想为什么选择这个专栏?精准定位:直击大厂Java面试高频考点系统全面:从基础到进阶,构建完整知识体系实战导向:理论</div> </li> <li><a href="/article/1947726193386123264.htm" title="ffmpeg音视频开发实战6,flutter开源项目商业化" target="_blank">ffmpeg音视频开发实战6,flutter开源项目商业化</a> <span class="text-muted">2401_84408734</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/ffmpeg/1.htm">ffmpeg</a><a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a> <div>正文Java集合:使用场景、源码阅读GC机制虚拟机对象内存分配要学好Android,必须要有扎实的Java基础(当然,现在还有Kotlin)。这里只列出了四点,但Java的体系非常庞大,重难点当然不只这些,列出来的是在实际项目和面试中常用或常见的。Android常用/重要类ActivityHandlerHandlerThreadAsyncTaskBinderAndroid这几个类在编程时是比较高频</div> </li> <li><a href="/article/1947284713353834496.htm" title="Java程序设计笔记" target="_blank">Java程序设计笔记</a> <span class="text-muted">是程序蜂啊</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Java程序设计目录Java程序设计第一章java语言开发环境1.1工具篇1.2Eclipse调整字体第三章Java基础3.1java基本数据类型3.2关键字与标识符3.3常数3.4变量3.5.数据类型转换3.6由键盘输入数据4.1顺序结构4.2分支语句5.1什么是数组5.2数组赋值:5.3一维数组5.4二维数组6.1类的基本概念6.2定义类6.3对象的创建与使用6.4参数的传递第七章java语言</div> </li> <li><a href="/article/1947281436352507904.htm" title="绝佳组合 SpringBoot + Lua + Redis = 王炸!" target="_blank">绝佳组合 SpringBoot + Lua + Redis = 王炸!</a> <span class="text-muted"></span> <div>Java精选面试题(微信小程序):5000+道面试题和选择题,真实面经,简历模版,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!前言曾经有一位魔术师,他擅长将SpringBoot和Redis这两个强大的工具结合成一种令人惊叹的组合。他的魔法武器是Redis的</div> </li> <li><a href="/article/74.htm" title="sql统计相同项个数并按名次显示" target="_blank">sql统计相同项个数并按名次显示</a> <span class="text-muted">朱辉辉33</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>现在有如下这样一个表: A表 ID Name time ------------------------------ 0001 aaa 2006-11-18 0002 ccc 2006-11-18 0003 eee 2006-11-18 0004 aaa 2006-11-18 0005 eee 2006-11-18 0004 aaa 2006-11-18 0002 ccc 20</div> </li> <li><a href="/article/201.htm" title="Android+Jquery Mobile学习系列-目录" target="_blank">Android+Jquery Mobile学习系列-目录</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/JQuery+Mobile/1.htm">JQuery Mobile</a> <div>最近在研究学习基于Android的移动应用开发,准备给家里人做一个应用程序用用。向公司手机移动团队咨询了下,觉得使用Android的WebView上手最快,因为WebView等于是一个内置浏览器,可以基于html页面开发,不用去学习Android自带的七七八八的控件。然后加上Jquery mobile的样式渲染和事件等,就能非常方便的做动态应用了。 &nbsp; 从现在起,往后一段时间,我打算</div> </li> <li><a href="/article/328.htm" title="如何给线程池命名" target="_blank">如何给线程池命名</a> <span class="text-muted">daysinsun</span> <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a> <div>&nbsp; &nbsp; &nbsp; &nbsp; 在系统运行后,在线程快照里总是看到线程池的名字为pool-xx,这样导致很不好定位,怎么给线程池一个有意义的名字呢。参照ThreadPoolExecutor类的ThreadFactory,自己实现ThreadFactory接口,重写newThread方法即可。参考代码如下: &nbsp; &nbsp; public class Named</div> </li> <li><a href="/article/455.htm" title="IE 中"HTML Parsing Error:Unable to modify the parent container element before the" target="_blank">IE 中"HTML Parsing Error:Unable to modify the parent container element before the</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E8%A7%A3%E6%9E%90/1.htm">解析</a><a class="tag" taget="_blank" href="/search/error/1.htm">error</a><a class="tag" taget="_blank" href="/search/readyState/1.htm">readyState</a> <div>&nbsp; 错误: IE 中&quot;HTML Parsing Error:Unable to modify the parent container element before the child element is closed&quot; &nbsp; &nbsp; 现象: 同事之间几个IE 测试情况下,有的报这个错,有的不报。经查询资料后,可归纳以下原因。</div> </li> <li><a href="/article/582.htm" title="java上传" target="_blank">java上传</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>我们在做web项目中通常会遇到上传文件的情况,用struts等框架的会直接用的自带的标签和组件,今天说的是利用servlet来完成上传。 我们这里利用到commons-fileupload组件,相关jar包可以取apache官网下载:http://commons.apache.org/ 下面是servlet的代码: //定义一个磁盘文件工厂 DiskFileItemFactory fact</div> </li> <li><a href="/article/709.htm" title="SpringMVC配置学习" target="_blank">SpringMVC配置学习</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>spring MVC配置详解 现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。   一、Spring MVC环境搭建:(Spring 2.5.6 + Hi</div> </li> <li><a href="/article/836.htm" title="spring mvc-jfreeChart 柱图(1)" target="_blank">spring mvc-jfreeChart 柱图(1)</a> <span class="text-muted">布衣凌宇</span> <a class="tag" taget="_blank" href="/search/jfreechart/1.htm">jfreechart</a> <div>第一步:下载jfreeChart包,注意是jfreeChart文件lib目录下的,jcommon-1.0.23.jar和jfreechart-1.0.19.jar两个包即可; 第二步:配置web.xml; web.xml代码如下 &lt;servlet&gt; &nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;jfreechart&lt;/servlet-nam</div> </li> <li><a href="/article/963.htm" title="我的spring学习笔记13-容器扩展点之PropertyPlaceholderConfigurer" target="_blank">我的spring学习笔记13-容器扩展点之PropertyPlaceholderConfigurer</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring3/1.htm">Spring3</a> <div>PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现。关于BeanFactoryPostProcessor和BeanPostProcessor类似。我会在其他地方介绍。PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java P</div> </li> <li><a href="/article/1090.htm" title="java 线程池使用 Runnable&Callable&Future" target="_blank">java 线程池使用 Runnable&Callable&Future</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/Runnable/1.htm">Runnable</a><a class="tag" taget="_blank" href="/search/callable/1.htm">callable</a><a class="tag" taget="_blank" href="/search/future/1.htm">future</a> <div>1. 创建线程池 ExecutorService executorService = Executors.newCachedThreadPool(); &nbsp; 2. 执行一次线程,调用Runnable接口实现 Future&lt;?&gt; future = executorService.submit(new DefaultRunnable()); System.out.prin</div> </li> <li><a href="/article/1217.htm" title="XML语法元素结构的总结" target="_blank">XML语法元素结构的总结</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E6%A0%91%E7%BB%93%E6%9E%84/1.htm">树结构</a> <div>1.XML介绍1969年&nbsp;&nbsp; gml (主要目的是要在不同的机器进行通信的数据规范)1985年&nbsp;&nbsp; sgml&nbsp; standard generralized markup language1993年&nbsp;&nbsp; html(www网)1998年&nbsp; xml&nbsp;&nbsp; extensible markup language</div> </li> <li><a href="/article/1344.htm" title="改变eclipse编码格式" target="_blank">改变eclipse编码格式</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F/1.htm">编码格式</a> <div>1.改变整个工作空间的编码格式 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Eclipse-&gt;window-&gt;preferences-&gt;General-&gt;workspace-</div> </li> <li><a href="/article/1471.htm" title="javascript中return的设计缺陷" target="_blank">javascript中return的设计缺陷</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a> <div>代码1: &lt;script&gt; var gisService = (function(window) { return { name:function () { alert(1); } }; })(this); gisService.name(); &l</div> </li> <li><a href="/article/1598.htm" title="【持久化框架MyBatis3八】Spring集成MyBatis3" target="_blank">【持久化框架MyBatis3八】Spring集成MyBatis3</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Mybatis3/1.htm">Mybatis3</a> <div>pom.xml配置 Maven的pom中主要包括: MyBatis MyBatis-Spring Spring MySQL-Connector-Java Druid applicationContext.xml配置 &nbsp; &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &</div> </li> <li><a href="/article/1725.htm" title="java web项目启动时自动加载自定义properties文件" target="_blank">java web项目启动时自动加载自定义properties文件</a> <span class="text-muted">bitray</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC%E5%99%A8/1.htm">监听器</a><a class="tag" taget="_blank" href="/search/%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84/1.htm">相对路径</a> <div>创建一个类 public class ContextInitListener implements ServletContextListener 使得该类成为一个监听器。用于监听整个容器生命周期的,主要是初始化和销毁的。 类创建后要在web.xml配置文件中增加一个简单的监听器配置,即刚才我们定义的类。 &lt;listener&gt; &lt;des</div> </li> <li><a href="/article/1852.htm" title="用nginx区分文件大小做出不同响应" target="_blank">用nginx区分文件大小做出不同响应</a> <span class="text-muted">ronin47</span> <div>昨晚和前21v的同事聊天,说到我离职后一些技术上的更新。其中有个给某大客户(游戏下载类)的特殊需求设计,因为文件大小差距很大——估计是大版本和补丁的区别——又走的是同一个域名,而squid在响应比较大的文件时,尤其是初次下载的时候,性能比较差,所以拆成两组服务器,squid服务于较小的文件,通过pull方式从peer层获取,nginx服务于较大的文件,通过push方式由peer层分发同步。外部发布</div> </li> <li><a href="/article/1979.htm" title="java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大" target="_blank">java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>package com.ljn.base; import java.util.Arrays; import java.util.Random; public class ContinuousPoker { /** * Q67 扑克牌的顺子 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 * 2-10为数字本身,A为1,J为1</div> </li> <li><a href="/article/2106.htm" title="翟鸿燊老师语录" target="_blank">翟鸿燊老师语录</a> <span class="text-muted">ccii</span> <a class="tag" taget="_blank" href="/search/%E7%BF%9F%E9%B8%BF%E7%87%8A/1.htm">翟鸿燊</a> <div>一、国学应用智慧TAT之亮剑精神A 1. 角色就是人格 &nbsp;&nbsp;&nbsp; 就像你一回家的时候,你一进屋里面,你已经是儿子,是姑娘啦,给老爸老妈倒怀水吧,你还觉得你是老总呢?还拿派呢?就像今天一样,你们往这儿一坐,你们之间是什么,同学,是朋友。 &nbsp;&nbsp;&nbsp; 还有下属最忌讳的就是领导向他询问情况的时候,什么我不知道,我不清楚,该你知道的你凭什么不知道</div> </li> <li><a href="/article/2233.htm" title="[光速与宇宙]进行光速飞行的一些问题" target="_blank">[光速与宇宙]进行光速飞行的一些问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a> <div> &nbsp;&nbsp;&nbsp;&nbsp; 在人类整体进入宇宙时代,即将开展深空宇宙探索之前,我有几个猜想想告诉大家 &nbsp;&nbsp;&nbsp; 仅仅是猜想。。。未经官方证实 &nbsp;&nbsp;&nbsp;&nbsp; 1:要在宇宙中进行光速飞行,必须首先获得宇宙中的航行通行证,而这个航行通行证并不是我们平常认为的那种带钢印的证书,是什么呢? 下面我来告诉</div> </li> <li><a href="/article/2360.htm" title="oracle undo解析" target="_blank">oracle undo解析</a> <span class="text-muted">cwqcwqmax9</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>oracle undo解析2012-09-24 09:02:01&nbsp;&nbsp;&nbsp;&nbsp; 我来说两句&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者:虫师收藏&nbsp;&nbsp;&nbsp; 我要投稿 Undo是干嘛用的?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb</div> </li> <li><a href="/article/2487.htm" title="java中各种集合的详细介绍" target="_blank">java中各种集合的详细介绍</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E5%90%88/1.htm">集合</a> <div>一,java中各种集合的关系图&nbsp;Collection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接口的接口&nbsp;&nbsp;&nbsp;&nbsp; 对象的集合&nbsp; ├ List&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子接口&nbsp;&nbsp;&nbsp;&n</div> </li> <li><a href="/article/2614.htm" title="卸载windows服务的方法" target="_blank">卸载windows服务的方法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/service/1.htm">service</a> <div>卸载Windows服务的方法 在Windows中,有一类程序称为服务,在操作系统内核加载完成后就开始加载。这里程序往往运行在操作系统的底层,因此资源占用比较大、执行效率比较高,比较有代表性的就是杀毒软件。但是一旦因为特殊原因不能正确卸载这些程序了,其加载在Windows内的服务就不容易删除了。即便是删除注册表中的相 应项目,虽然不启动了,但是系统中仍然存在此项服务,只是没有加载而已。如果安装其他</div> </li> <li><a href="/article/2741.htm" title="Warning: The Copy Bundle Resources build phase contains this target's Info.plist" target="_blank">Warning: The Copy Bundle Resources build phase contains this target's Info.plist</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/xcode/1.htm">xcode</a> <div>&nbsp; &nbsp; http://developer.apple.com/iphone/library/qa/qa2009/qa1649.html Excerpt: You are getting this warning because you probably added your Info.plist file to your Copy Bundle </div> </li> <li><a href="/article/2868.htm" title="2014之C++学习笔记(一)" target="_blank">2014之C++学习笔记(一)</a> <span class="text-muted">Etwo</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/Etwo/1.htm">Etwo</a><a class="tag" taget="_blank" href="/search/Etwo/1.htm">Etwo</a><a class="tag" taget="_blank" href="/search/iterator/1.htm">iterator</a><a class="tag" taget="_blank" href="/search/%E8%BF%AD%E4%BB%A3%E5%99%A8/1.htm">迭代器</a> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;已经有很长一段时间没有写博客了,可能大家已经淡忘了Etwo这个人的存在,这一年多以来,本人从事了AS的相关开发工作,但最近一段时间,AS在天朝的没落,相信有很多码农也都清楚,现在的页游基本上达到饱和,手机上的游戏基本被unity3D与cocos占据,AS基本没有容身之处。so。。。最近我并不打算直接转型</div> </li> <li><a href="/article/2995.htm" title="js跨越获取数据问题记录" target="_blank">js跨越获取数据问题记录</a> <span class="text-muted">haifengwuch</span> <a class="tag" taget="_blank" href="/search/jsonp/1.htm">jsonp</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>js的跨越问题,普通的ajax无法获取服务器返回的值。 &nbsp; 第一种解决方案,通过getson,后台配合方式,实现。 Java后台代码: protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String ca</div> </li> <li><a href="/article/3122.htm" title="蓝色jQuery导航条" target="_blank">蓝色jQuery导航条</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/39.htmHTML文件代码: &lt;!DOCTYPE html&gt; &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt; &lt;head&gt; &lt;title&gt;jQuery鼠标悬停上下滑动导航条 - 柯乐义&lt;</div> </li> <li><a href="/article/3249.htm" title="linux部署jdk,tomcat,mysql" target="_blank">linux部署jdk,tomcat,mysql</a> <span class="text-muted">kerryg</span> <a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1、安装java环境jdk: &nbsp;&nbsp;&nbsp; 一般系统都会默认自带的JDK,但是不太好用,都会卸载了,然后重新安装。 &nbsp;&nbsp; 1.1)、卸载: &nbsp;&nbsp;&nbsp;&nbsp; (rpm -qa :查询已经安装哪些软件包; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rmp -q 软件包:查询指定包是否已</div> </li> <li><a href="/article/3376.htm" title="DOMContentLoaded VS onload VS onreadystatechange" target="_blank">DOMContentLoaded VS onload VS onreadystatechange</a> <span class="text-muted">mutongwu</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>1. DOMContentLoaded 在页面html、script、style加载完毕即可触发,无需等待所有资源(image/iframe)加载完毕。(IE9+) 2. onload是最早支持的事件,要求所有资源加载完毕触发。 3. onreadystatechange 开始在IE引入,后来其它浏览器也有一定的实现。涉及以下 document , applet, embed, fra</div> </li> <li><a href="/article/3503.htm" title="sql批量插入数据" target="_blank">sql批量插入数据</a> <span class="text-muted">qifeifei</span> <a class="tag" taget="_blank" href="/search/%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5/1.htm">批量插入</a> <div>hi, &nbsp; 自己在做工程的时候,遇到批量插入数据的数据修复场景。我的思路是在插入前准备一个临时表,临时表的整理就看当时的选择条件了,临时表就是要插入的数据集,最后再批量插入到数据库中。 &nbsp;&nbsp; WITH tempT AS ( SELECT item_id AS combo_id, item_id, now() AS create_date FROM a</div> </li> <li><a href="/article/3630.htm" title="log4j打印日志文件 如何实现相对路径到 项目工程下" target="_blank">log4j打印日志文件 如何实现相对路径到 项目工程下</a> <span class="text-muted">thinkfreer</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a> <div>最近为了实现统计一个网站的访问量,记录用户的登录信息,以方便站长实时了解自己网站的访问情况,选择了Apache 的log4j,但是在选择相对路径那块 卡主了,X度了好多方法(其实大多都是一样的内用,还一个字都不差的),都没有能解决问题,无奈搞了2天终于解决了,与大家分享一下 需求: 用户登录该网站时,把用户的登录名,ip,时间。统计到一个txt文档里,以方便其他系统调用此txt。项目名</div> </li> <li><a href="/article/3757.htm" title="linux下mysql-5.6.23.tar.gz安装与配置" target="_blank">linux下mysql-5.6.23.tar.gz安装与配置</a> <span class="text-muted">笑我痴狂</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a> <div>1.卸载系统默认的mysql [root@localhost ~]# rpm -qa | grep mysql mysql-libs-5.1.66-2.el6_3.x86_64 mysql-devel-5.1.66-2.el6_3.x86_64 mysql-5.1.66-2.el6_3.x86_64 [root@localhost ~]# rpm -e mysql-libs-5.1</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>